diff --git a/.codecov.yml b/.codecov.yml index 1ac3cc70a0d..4eb13688110 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -1,6 +1,5 @@ ignore: - '**/node_modules' - - 'protocol-library-kludge' - 'webpack-config' - 'hardware-testing' - '**/*.md' diff --git a/.eslintignore b/.eslintignore index 27885c64ce6..4460958686e 100644 --- a/.eslintignore +++ b/.eslintignore @@ -5,6 +5,7 @@ **/build/** **/venv/** .opentrons_config +**/tsconfig*.json # prettier **/package.json @@ -25,8 +26,10 @@ storybook-static api/** update-server/** robot-server/** -notify-server/** shared-data/python/** +hardware-testing/** # app-testing don't format the json protocols app-testing/files +# app testing don't format the snapshots +app-testing/tests/__snapshots__ diff --git a/.eslintrc.js b/.eslintrc.js index e4d018b52be..448aee6b072 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -7,9 +7,14 @@ module.exports = { project: require('path').join(__dirname, 'tsconfig-eslint.json'), }, - extends: ['standard-with-typescript', 'plugin:react/recommended', 'prettier'], + extends: [ + 'standard-with-typescript', + 'plugin:react/recommended', + 'prettier', + 'plugin:json/recommended', + ], - plugins: ['react', 'react-hooks', 'json', 'jest'], + plugins: ['react', 'react-hooks', 'json', 'jest', 'testing-library'], rules: { camelcase: 'off', @@ -50,7 +55,15 @@ module.exports = { overrides: [ { files: ['**/*.js'], - parser: '@babel/eslint-parser', + extends: ['plugin:@typescript-eslint/disable-type-checked'], + parserOptions: { + project: require('path').join(__dirname, 'tsconfig-eslint.json'), + }, + rules: { + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/explicit-function-return-type': 'warn', + '@typescript-eslint/no-unused-vars': 'warn', + }, }, { // TODO(mc, 2021-03-18): remove to default these rules back to errors @@ -65,6 +78,17 @@ module.exports = { '@typescript-eslint/no-floating-promises': 'warn', '@typescript-eslint/no-unnecessary-type-assertion': 'warn', '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'warn', + '@typescript-eslint/no-unsafe-argument': 'warn', + '@typescript-eslint/consistent-type-imports': 'warn', + '@typescript-eslint/consistent-indexed-object-style': 'warn', + '@typescript-eslint/no-confusing-void-expression': 'warn', + '@typescript-eslint/ban-types': 'warn', + '@typescript-eslint/non-nullable-type-assertion-style': 'warn', + '@typescript-eslint/await-thenable': 'warn', + '@typescript-eslint/ban-ts-comment': 'warn', + '@typescript-eslint/unbound-method': 'warn', + '@typescript-eslint/consistent-generic-constructors': 'warn', + '@typescript-eslint/no-misused-promises': 'warn', }, }, { @@ -88,11 +112,22 @@ module.exports = { '@typescript-eslint/consistent-type-assertions': 'off', '@typescript-eslint/no-var-requires': 'off', '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-confusing-void-expression': 'warn', 'node/handle-callback-err': 'off', // TODO(mc, 2021-01-29): fix these and remove warning overrides 'jest/no-deprecated-functions': 'warn', 'jest/valid-title': 'warn', 'jest/no-conditional-expect': 'warn', + 'jest/no-alias-methods': 'warn', + 'jest/valid-describe-callback': 'warn', + }, + }, + { + files: ['**/__tests__/**test.tsx'], + env: { jest: true }, + extends: ['plugin:testing-library/react'], + rules: { + 'testing-library/prefer-screen-queries': 'warn', }, }, { diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f0ee1890dd2..28f0fb7d1f8 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -12,7 +12,6 @@ /protocol-designer @Opentrons/app-and-uis /labware-designer @Opentrons/app-and-uis /labware-library @Opentrons/app-and-uis -/protocol-library-kludge @Opentrons/app-and-uis /update-server @Opentrons/robot-svcs /discovery-client @Opentrons/robot-svcs @Opentrons/app-and-uis /shared-data/pipette @Opentrons/embedded-sw @@ -24,6 +23,8 @@ # subprojects by language - some subprojects are shared by teams but united by a # language community (including makefiles and config) so mark them appropriately /app @Opentrons/js +/api-client @Opentrons/js +/react-api-client @Opentrons/js /app-shell @Opentrons/js /components @Opentrons/js /api @Opentrons/py diff --git a/.github/actions/python/pypi-deploy/action.yaml b/.github/actions/python/pypi-deploy/action.yaml index 1ce4ff67a1e..8f1d9407fe5 100644 --- a/.github/actions/python/pypi-deploy/action.yaml +++ b/.github/actions/python/pypi-deploy/action.yaml @@ -28,7 +28,7 @@ runs: fi fi status=0 - QUIET=1 BUILD_NUMBER=${OT_BUILD} make -C ${{ inputs.project }} clean deploy twine_repository_url=${{ inputs.repository_url }} pypi_username=opentrons pypi_password=${{ inputs.password }} || status=$? + CI=1 QUIET=1 BUILD_NUMBER=${OT_BUILD} make -C ${{ inputs.project }} clean deploy twine_repository_url=${{ inputs.repository_url }} pypi_username=opentrons pypi_password=${{ inputs.password }} || status=$? if [[ ${status} != 0 ]] && [[ ${{ inputs.repository_url }} =~ "test.pypi.org" ]]; then echo "upload failures allowed to test pypi" exit 0 diff --git a/.github/actions/python/setup/action.yaml b/.github/actions/python/setup/action.yaml index 6a6b02d9305..7fc81cc258f 100644 --- a/.github/actions/python/setup/action.yaml +++ b/.github/actions/python/setup/action.yaml @@ -27,6 +27,6 @@ runs: - shell: bash run: | npm install --global shx@0.3.3 - $OT_PYTHON -m pip install pipenv==2021.5.29 + $OT_PYTHON -m pip install pipenv==2023.11.15 - shell: bash run: 'make -C ${{ inputs.project }} setup' diff --git a/.github/actions/webstack/deploy-to-sandbox/action.yaml b/.github/actions/webstack/deploy-to-sandbox/action.yaml index e9b2eec7698..43c4716e05e 100644 --- a/.github/actions/webstack/deploy-to-sandbox/action.yaml +++ b/.github/actions/webstack/deploy-to-sandbox/action.yaml @@ -15,4 +15,4 @@ runs: steps: - shell: bash run: | - aws s3 sync ${{ inputs.distPath }} s3://sandbox.${{ inputs.domain }}/${{ inputs.destPrefix }} --acl=public-read + aws s3 sync ${{ inputs.distPath }} s3://sandbox.${{ inputs.domain }}/${{ inputs.destPrefix }} diff --git a/.github/workflows/analyses-snapshot-test.yaml b/.github/workflows/analyses-snapshot-test.yaml new file mode 100644 index 00000000000..28bfa2c53f7 --- /dev/null +++ b/.github/workflows/analyses-snapshot-test.yaml @@ -0,0 +1,72 @@ +name: Analyses Snapshot Test + +on: + workflow_dispatch: + inputs: + TARGET: + description: 'Target branch or tag' + required: true + default: 'edge' + TEST_SOURCE: + description: 'Target for the test code' + required: true + default: 'edge' + schedule: + - cron: '26 7 * * *' # 7:26 AM UTC + +jobs: + build-and-test: + timeout-minutes: 15 + runs-on: ubuntu-latest + env: + TARGET: ${{ github.event.inputs.TARGET || 'edge' }} + TEST_SOURCE: ${{ github.event.inputs.TEST_SOURCE || 'edge' }} + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + ref: ${{ env.TEST_SOURCE }} + + - name: Docker Build + working-directory: app-testing + run: make build-opentrons-analysis + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: '3.12' + cache: 'pipenv' + cache-dependency-path: app-testing/Pipfile.lock + + - name: Setup Python Dependencies + working-directory: app-testing + run: make setup + + - name: Run Test + id: run_test + working-directory: app-testing + run: make snapshot-test + + - name: Upload Report + if: '!cancelled()' + uses: actions/upload-artifact@v4 + with: + name: test-report + path: app-testing/results/ + + - name: Handle Test Failure + if: failure() + working-directory: app-testing + run: make snapshot-test-update + + - name: Create Snapshot update Request + if: failure() + uses: peter-evans/create-pull-request@v5 + with: + commit-message: 'fix(app-testing): snapshot failure capture' + title: 'Evaluate Analyses Snapshot Update ${{ env.TARGET }}' + body: 'This PR is an automated snapshot update request. Please review the changes and merge if they are acceptable or find you bug and fix it.' + branch: 'app-testing/${{ env.TARGET }}-from-${{ env.TEST_SOURCE}}' + base: ${{ env.TEST_SOURCE}} + diff --git a/.github/workflows/api-test-lint-deploy.yaml b/.github/workflows/api-test-lint-deploy.yaml index f4547dc9bdd..9b4e8068ec8 100644 --- a/.github/workflows/api-test-lint-deploy.yaml +++ b/.github/workflows/api-test-lint-deploy.yaml @@ -56,10 +56,10 @@ jobs: fetch-depth: 0 - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - uses: './.github/actions/python/setup' with: @@ -75,17 +75,13 @@ jobs: os: ['windows-2022', 'ubuntu-22.04', 'macos-latest'] # TODO(mc, 2022-02-24): expand this matrix to 3.8 and 3.9, # preferably in a nightly cronjob on edge or something - python: ['3.7', '3.10'] + python: ['3.10'] with-ot-hardware: ['true', 'false'] exclude: - os: 'windows-2022' with-ot-hardware: 'true' - os: 'macos-latest' with-ot-hardware: 'true' - - os: 'macos-latest' - python: '3.10' - - python: '3.10' - with-ot-hardware: 'true' runs-on: '${{ matrix.os }}' steps: - uses: 'actions/checkout@v3' @@ -99,7 +95,7 @@ jobs: git checkout ${{ github.ref }} - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: 'actions/setup-python@v4' with: python-version: ${{ matrix.python }} @@ -149,10 +145,10 @@ jobs: git checkout ${{ github.ref }} - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - name: 'set complex environment variables' uses: actions/github-script@v6 with: diff --git a/.github/workflows/app-test-build-deploy.yaml b/.github/workflows/app-test-build-deploy.yaml index cee26372bf5..2c0dc55b765 100644 --- a/.github/workflows/app-test-build-deploy.yaml +++ b/.github/workflows/app-test-build-deploy.yaml @@ -61,7 +61,7 @@ jobs: - uses: 'actions/checkout@v3' - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'install udev' run: sudo apt-get update && sudo apt-get install libudev-dev - name: 'set complex environment variables' @@ -85,7 +85,7 @@ jobs: make setup-js - name: 'test frontend packages' run: | - yarn jest --coverage=true --ci=true --collectCoverageFrom="app/src/**/*.(js|ts|tsx)" app/src components/src shared-data/js + make -C app test-cov - name: 'Upload coverage report' uses: codecov/codecov-action@v3 with: @@ -110,7 +110,7 @@ jobs: git checkout ${{ github.ref }} - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: actions/setup-python@v4 with: python-version: '3.10' @@ -141,8 +141,7 @@ jobs: yarn config set cache-folder ${{ github.workspace }}/.yarn-cache make setup-js - name: 'test native(er) packages' - run: | - yarn jest --coverage=true --ci=true --collectCoverageFrom="(app-shell|app-shell-odd| discovery-client)/src/**/*.(js|ts|tsx)" app-shell/src app-shell-odd/src discovery-client/src + run: make test-js-internal tests="app-shell/src app-shell-odd/src discovery-client/src" cov_opts="--coverage=true --ci=true --collectCoverageFrom='(app-shell|app-shell-odd| discovery-client)/src/**/*.(js|ts|tsx)'" - name: 'Upload coverage report' uses: 'codecov/codecov-action@v3' with: @@ -231,7 +230,7 @@ jobs: echo "Configuring project, bucket, and folder for ot3" echo "project=ot3" >> $GITHUB_OUTPUT echo "bucket=${{env._APP_DEPLOY_BUCKET_OT3}}" >> $GITHUB_OUTPUT - echo "folder=${{env._APP_DEPLOY_BUCKET_OT3}}" >> $GITHUB_OUTPUT + echo "folder=${{env._APP_DEPLOY_FOLDER_OT3}}" >> $GITHUB_OUTPUT fi - uses: 'actions/checkout@v3' with: @@ -244,7 +243,7 @@ jobs: git checkout ${{ github.ref }} - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: actions/setup-python@v4 with: python-version: '3.10' @@ -315,7 +314,8 @@ jobs: deploy-release-app: name: 'Deploy built app artifacts to S3' runs-on: 'ubuntu-22.04' - needs: ['js-unit-test', 'backend-unit-test', 'build-app', 'determine-build-type'] + needs: + ['js-unit-test', 'backend-unit-test', 'build-app', 'determine-build-type'] if: contains(fromJSON(needs.determine-build-type.outputs.variants), 'release') || contains(fromJSON(needs.determine-build-type.outputs.variants), 'internal-release') steps: - name: 'download run app builds' @@ -348,6 +348,7 @@ jobs: - name: 'deploy internal-release release builds to s3' run: | aws s3 --profile=deploy sync --acl=public-read to_upload_internal-release/ s3://${{ env._APP_DEPLOY_BUCKET_OT3 }}/${{ env._APP_DEPLOY_FOLDER_OT3 }} + - name: 'upload windows artifacts to GH release' uses: 'ncipollo/release-action@v1.12.0' if: needs.determine-build-type.outputs.type == 'release' @@ -400,7 +401,7 @@ jobs: uses: slackapi/slack-github-action@v1.14.0 if: contains(fromJSON(needs.determine-build-type.outputs.variants), 'internal-release') with: - payload: "{\"branch_or_tag\":\"${{ github.ref_name }}\",\"build_type\":\"${{ needs.determine-build-type.outputs.type }}\", \"gh_linkback\":\"https://github.com/Opentrons/opentrons/tree/${{ github.ref_name }}\", \"windows_build\":\"${{ env._ACCESS_URL }}/${{steps.names.outputs.windows-internal-release}}\", \"mac_build\":\"${{ env._ACCESS_URL }}/${{steps.names.outputs.mac-internal-release}}\", \"linux_build\":\"${{ env._ACCESS_URL }}/${{steps.names.outputs.linux-internal-release}}\"}" + payload: '{"branch_or_tag":"${{ github.ref_name }}","build_type":"${{ needs.determine-build-type.outputs.type }}", "gh_linkback":"https://github.com/Opentrons/opentrons/tree/${{ github.ref_name }}", "windows_build":"${{ env._ACCESS_URL }}/${{steps.names.outputs.windows-internal-release}}", "mac_build":"${{ env._ACCESS_URL }}/${{steps.names.outputs.mac-internal-release}}", "linux_build":"${{ env._ACCESS_URL }}/${{steps.names.outputs.linux-internal-release}}"}' env: SLACK_WEBHOOK_URL: ${{ secrets.OT_APP_OT3_SLACK_NOTIFICATION_WEBHOOK_URL }} _ACCESS_URL: https://${{env._APP_DEPLOY_BUCKET_OT3}}/${{env._APP_DEPLOY_FOLDER_OT3}} @@ -408,7 +409,57 @@ jobs: uses: slackapi/slack-github-action@v1.14.0 if: contains(fromJSON(needs.determine-build-type.outputs.variants), 'release') with: - payload: "{\"branch_or_tag\":\"${{ github.ref_name }}\",\"build_type\":\"${{ needs.determine-build-type.outputs.type }}\", \"gh_linkback\":\"https://github.com/Opentrons/opentrons/tree/${{ github.ref_name }}\", \"windows_build\":\"${{ env._ACCESS_URL }}/${{steps.names.outputs.windows-release}}\", \"mac_build\":\"${{ env._ACCESS_URL }}/${{steps.names.outputs.mac-release}}\", \"linux_build\":\"${{ env._ACCESS_URL }}/${{steps.names.outputs.linux-release}}\"}" + payload: '{"branch_or_tag":"${{ github.ref_name }}","build_type":"${{ needs.determine-build-type.outputs.type }}", "gh_linkback":"https://github.com/Opentrons/opentrons/tree/${{ github.ref_name }}", "windows_build":"${{ env._ACCESS_URL }}/${{steps.names.outputs.windows-release}}", "mac_build":"${{ env._ACCESS_URL }}/${{steps.names.outputs.mac-release}}", "linux_build":"${{ env._ACCESS_URL }}/${{steps.names.outputs.linux-release}}"}' env: SLACK_WEBHOOK_URL: ${{ secrets.OT_APP_ROBOTSTACK_SLACK_NOTIFICATION_WEBHOOK_URL }} _ACCESS_URL: https://${{env._APP_DEPLOY_BUCKET_ROBOTSTACK}}/${{env._APP_DEPLOY_FOLDER_ROBOTSTACK}} + + - name: 'pull repo for scripts' + uses: 'actions/checkout@v3' + with: + path: ./monorepo + # https://github.com/actions/checkout/issues/290 + - name: 'Fix actions/checkout odd handling of tags' + if: startsWith(github.ref, 'refs/tags') + run: | + cd ./monorepo + git fetch -f origin ${{ github.ref }}:${{ github.ref }} + git checkout ${{ github.ref }} + - uses: 'actions/setup-node@v3' + with: + node-version: '18.19.0' + - name: 'install udev' + run: sudo apt-get update && sudo apt-get install libudev-dev + - name: 'set complex environment variables' + id: 'set-vars' + uses: actions/github-script@v6 + with: + script: | + const { buildComplexEnvVars } = require(`${process.env.GITHUB_WORKSPACE}/monorepo/.github/workflows/utils.js`) + buildComplexEnvVars(core, context) + - name: 'cache yarn cache' + uses: actions/cache@v3 + with: + path: | + ${{ github.workspace }}/.npm-cache/_prebuild + ${{ github.workspace }}/.yarn-cache + key: js-${{ secrets.GH_CACHE_VERSION }}-${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }} + - name: 'setup-js' + run: | + npm config set cache ${{ github.workspace }}/.npm-cache + yarn config set cache-folder ${{ github.workspace }}/.yarn-cache + cd monorepo + make setup-js + - name: 'update internal-releases releases.json' + if: needs.determine-build-type.outputs.type == 'release' && contains(fromJSON(needs.determine-build-type.outputs.variants), 'internal-release') + run: | + aws --profile=deploy s3 cp s3://${{ env._APP_DEPLOY_BUCKET_OT3 }}/${{ env._APP_DEPLOY_FOLDER_OT3 }}/releases.json ./to_upload_internal-release/releases.json + node ./monorepo/scripts/update-releases-json ./to_upload_internal-release/releases.json ot3 ./to_upload_internal-release https://ot3-development.builds.opentrons.com/app/ + aws --profile=deploy s3 cp ./to_upload_internal-release/releases.json s3://${{ env._APP_DEPLOY_BUCKET_OT3 }}/${{ env._APP_DEPLOY_FOLDER_OT3 }}/releases.json + + - name: 'update release releases.json' + if: needs.determine-build-type.outputs.type == 'release' && contains(fromJSON(needs.determine-build-type.outputs.variants), 'release') + run: | + aws --profile=deploy s3 cp s3://${{ env._APP_DEPLOY_BUCKET_ROBOTSTACK }}/${{ env._APP_DEPLOY_FOLDER_ROBOTSTACK }}/releases.json ./to_upload_release/releases.json + node ./monorepo/scripts/update-releases-json ./to_upload_release/releases.json robot-stack ./to_upload_release https://builds.opentrons.com/app/ + aws --profile=deploy s3 cp ./to_upload_release/releases.json s3://${{ env._APP_DEPLOY_BUCKET_ROBOTSTACK }}/${{ env._APP_DEPLOY_FOLDER_ROBOTSTACK }}/releases.json diff --git a/.github/workflows/app-testing-lint.yaml b/.github/workflows/app-testing-lint.yaml index ec9b45bfe6c..446cea74306 100644 --- a/.github/workflows/app-testing-lint.yaml +++ b/.github/workflows/app-testing-lint.yaml @@ -19,20 +19,18 @@ jobs: lint: name: 'app-testing lint' timeout-minutes: 5 - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-latest' steps: - name: Checkout opentrons repo - uses: 'actions/checkout@v3' + uses: 'actions/checkout@v4' - name: Setup Python - uses: 'actions/setup-python@v4' + uses: 'actions/setup-python@v5' with: - python-version: '3.11' + python-version: '3.12' cache: 'pipenv' cache-dependency-path: app-testing/Pipfile.lock - - name: Install Pipenv - run: pip install -U pipenv - - name: Pipenv Install + - name: Setup id: install working-directory: ./app-testing run: make setup diff --git a/.github/workflows/components-test-build-deploy.yaml b/.github/workflows/components-test-build-deploy.yaml index 47f7593eba9..0ad3389fb03 100644 --- a/.github/workflows/components-test-build-deploy.yaml +++ b/.github/workflows/components-test-build-deploy.yaml @@ -44,7 +44,7 @@ jobs: - uses: 'actions/checkout@v3' - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'install udev for usb-detection' run: sudo apt-get update && sudo apt-get install libudev-dev - name: 'cache yarn cache' @@ -62,15 +62,14 @@ jobs: yarn config set cache-folder ./.yarn-cache make setup-js - name: 'run components unit tests' - run: | - yarn jest --coverage=true --ci=true --collectCoverageFrom="components/src/**/*.(js|ts|tsx)" components/src + run: make -C components test-cov - name: 'Upload coverage report' uses: codecov/codecov-action@v3 with: files: ./coverage/lcov.info flags: components - build-components: + build-components-storybook: name: 'build components artifact' runs-on: 'ubuntu-22.04' if: github.event_name != 'pull_request' @@ -79,7 +78,7 @@ jobs: - uses: 'actions/checkout@v3' - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'install udev for usb-detection' run: sudo apt-get update && sudo apt-get install libudev-dev - name: 'cache yarn cache' @@ -103,11 +102,33 @@ jobs: with: name: 'components-artifact' path: storybook-static + + determine-build-type: + runs-on: 'ubuntu-latest' + name: 'Determine build type' + outputs: + type: ${{steps.determine-build-type.outputs.type}} + steps: + - id: determine-build-type + run: | + echo "Determining build type for event ${{github.event_type}} and ref ${{github.ref}}" + if [ "${{ format('{0}', github.ref == 'refs/heads/edge') }}" = "true" ] ; then + echo "storybook s3 builds for edge" + echo 'type=storybook' >> $GITHUB_OUTPUT + elif [ "${{ format('{0}', startsWith(github.ref, 'refs/tags/components')) }}" = "true" ] ; then + echo "publish builds for components tags" + echo 'type=publish' >> $GITHUB_OUTPUT + else + echo "No build for ref ${{github.ref}} and event ${{github.event_type}}" + echo 'type=none' >> $GITHUB_OUTPUT + fi + deploy-components: - name: 'deploy components artifact to S3' + name: 'deploy components storybook artifact to S3' runs-on: 'ubuntu-22.04' - needs: ['js-unit-test', 'build-components'] - if: github.event_name != 'pull_request' + needs: + ['js-unit-test', 'build-components-storybook', 'determine-build-type'] + if: needs.determine-build-type.outputs.type != 'none' steps: - uses: 'actions/checkout@v3' # https://github.com/actions/checkout/issues/290 @@ -118,7 +139,7 @@ jobs: git checkout ${{ github.ref }} - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'set complex environment variables' id: 'set-vars' uses: actions/github-script@v6 @@ -138,3 +159,57 @@ jobs: AWS_DEFAULT_REGION: us-east-2 run: | aws s3 sync ./dist s3://opentrons-components/${{ env.OT_BRANCH}} --acl public-read + + publish-components: + name: 'publish components package to npm' + runs-on: 'ubuntu-latest' + needs: ['js-unit-test', 'determine-build-type'] + if: needs.determine-build-type.outputs.type == 'publish' + steps: + - uses: 'actions/checkout@v3' + # https://github.com/actions/checkout/issues/290 + - name: 'Fix actions/checkout odd handling of tags' + if: startsWith(github.ref, 'refs/tags') + run: | + git fetch -f origin ${{ github.ref }}:${{ github.ref }} + git checkout ${{ github.ref }} + - uses: 'actions/setup-node@v3' + with: + node-version: '18.19.0' + registry-url: 'https://registry.npmjs.org' + - name: 'cache yarn cache' + uses: actions/cache@v3 + with: + path: | + ${{ github.workspace }}/.yarn-cache + ${{ github.workspace }}/.npm-cache + key: js-${{ secrets.GH_CACHE_VERSION }}-${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }} + restore-keys: | + js-${{ secrets.GH_CACHE_VERSION }}-${{ runner.os }}-yarn- + - name: 'setup-js' + run: | + npm config set cache ./.npm-cache + yarn config set cache-folder ./.yarn-cache + yarn config set network-timeout 60000 + yarn + - name: 'build typescript' + run: make build-ts + - name: 'build library' + run: | + make -C components lib + # replace package.json stub version number with version from tag + - name: 'set version number' + run: | + npm install -g json + VERSION_STRING=$(echo ${{ github.ref }} | sed 's/refs\/tags\/components@//') + json -I -f ./components/package.json -e "this.version=\"$VERSION_STRING\"" + json -I -f ./components/package.json -e "this.dependencies['@opentrons/shared-data']=\"$VERSION_STRING\"" + - uses: 'actions/setup-node@v3' + with: + node-version: '18.19.0' + registry-url: 'https://registry.npmjs.org' + - name: 'publish to npm registry' + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + cd ./components && echo "//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}" > ./.npmrc && npm publish --access public diff --git a/.github/workflows/docs-build.yaml b/.github/workflows/docs-build.yaml index b954f7d1433..08b1c2b76cf 100644 --- a/.github/workflows/docs-build.yaml +++ b/.github/workflows/docs-build.yaml @@ -51,10 +51,10 @@ jobs: git checkout ${{ github.ref }} - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: 'actions/setup-python@v3' with: - python-version: '3.7' + python-version: '3.10' - uses: './.github/actions/python/setup' with: project: 'api' diff --git a/.github/workflows/g-code-confirm-tests.yaml b/.github/workflows/g-code-confirm-tests.yaml index 151ae13c3d1..146fa96b9a2 100644 --- a/.github/workflows/g-code-confirm-tests.yaml +++ b/.github/workflows/g-code-confirm-tests.yaml @@ -49,7 +49,7 @@ jobs: node-version: '12' - uses: 'actions/setup-python@v3' with: - python-version: '3.7' + python-version: '3.10' - uses: './.github/actions/python/setup' with: project: 'g-code-testing' diff --git a/.github/workflows/g-code-testing-lint-test.yaml b/.github/workflows/g-code-testing-lint-test.yaml index 3678e5c4a20..89fe00f4d2d 100644 --- a/.github/workflows/g-code-testing-lint-test.yaml +++ b/.github/workflows/g-code-testing-lint-test.yaml @@ -1,5 +1,5 @@ # This workflow runs test and lint on branch pushes that touch the -# notify-server project or its dependencies +# g-code-testing project or its dependencies name: 'G-Code Testing Lint & Test' @@ -49,7 +49,7 @@ jobs: run: sudo apt-get update && sudo apt-get install libudev-dev - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'set complex environment variables' id: 'set-vars' uses: actions/github-script@v6 @@ -59,7 +59,7 @@ jobs: buildComplexEnvVars(core, context) - uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - uses: './.github/actions/python/setup' with: project: 'g-code-testing' diff --git a/.github/workflows/hardware-lint-test.yaml b/.github/workflows/hardware-lint-test.yaml index 453adba1269..f5e701ea883 100644 --- a/.github/workflows/hardware-lint-test.yaml +++ b/.github/workflows/hardware-lint-test.yaml @@ -55,7 +55,7 @@ jobs: - name: Setup Python uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - name: Setup Hardware Project uses: './.github/actions/python/setup' diff --git a/.github/workflows/hardware-testing-protocols.yaml b/.github/workflows/hardware-testing-protocols.yaml index e962e3811e4..ee59d2dc25c 100644 --- a/.github/workflows/hardware-testing-protocols.yaml +++ b/.github/workflows/hardware-testing-protocols.yaml @@ -50,7 +50,7 @@ jobs: - name: Setup Python uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - name: Setup Project uses: './.github/actions/python/setup' diff --git a/.github/workflows/hardware-testing.yaml b/.github/workflows/hardware-testing.yaml index 3df5507d2b1..6977194ca2a 100644 --- a/.github/workflows/hardware-testing.yaml +++ b/.github/workflows/hardware-testing.yaml @@ -52,7 +52,7 @@ jobs: - name: Setup Python uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - name: Setup Project uses: './.github/actions/python/setup' diff --git a/.github/workflows/http-docs-build.yaml b/.github/workflows/http-docs-build.yaml index e9ad64d75e5..6294eeb2172 100644 --- a/.github/workflows/http-docs-build.yaml +++ b/.github/workflows/http-docs-build.yaml @@ -51,10 +51,10 @@ jobs: git checkout ${{ github.ref }} - uses: 'actions/setup-python@v3' with: - python-version: '3.7' + python-version: '3.10' - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: './.github/actions/python/setup' with: project: 'robot-server' diff --git a/.github/workflows/js-check.yaml b/.github/workflows/js-check.yaml index 53bcaa05781..57532b99ce2 100644 --- a/.github/workflows/js-check.yaml +++ b/.github/workflows/js-check.yaml @@ -45,7 +45,7 @@ jobs: - uses: 'actions/checkout@v3' - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'set complex environment variables' id: 'set-vars' uses: actions/github-script@v6 diff --git a/.github/workflows/ll-test-build-deploy.yaml b/.github/workflows/ll-test-build-deploy.yaml index c6dfede0bbb..e88d7ada743 100644 --- a/.github/workflows/ll-test-build-deploy.yaml +++ b/.github/workflows/ll-test-build-deploy.yaml @@ -11,6 +11,8 @@ on: - 'webpack-config/**' - 'package.json' - '.github/workflows/ll-test-build-deploy.yaml' + - '.github/actions/webstack/deploy-to-sandbox/**' + - '.github/workflows/utils.js' push: paths: - 'labware-library/**' @@ -45,7 +47,7 @@ jobs: - uses: 'actions/checkout@v3' - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' # https://github.com/actions/checkout/issues/290 - name: 'Fix actions/checkout odd handling of tags' if: startsWith(github.ref, 'refs/tags') @@ -69,8 +71,7 @@ jobs: yarn config set cache-folder ./.yarn-cache make setup-js - name: 'run labware library unit tests' - run: | - yarn jest --coverage=true --ci=true --collectCoverageFrom="labware-library/src/**/*.(js|ts|tsx)" labware-library/src + run: make -C labware-library test-cov - name: 'Upload coverage report' uses: codecov/codecov-action@v3 with: @@ -92,7 +93,7 @@ jobs: git checkout ${{ github.ref }} - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'install libudev for usb-detection' run: sudo apt-get update && sudo apt-get install libudev-dev - name: 'cache yarn cache' @@ -117,6 +118,7 @@ jobs: build-ll: name: 'build labware library artifact' needs: ['js-unit-test'] + timeout-minutes: 30 runs-on: 'ubuntu-20.04' if: github.event_name != 'pull_request' steps: @@ -131,7 +133,7 @@ jobs: git checkout ${{ github.ref }} - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'install libudev for usb-detection' run: sudo apt-get update && sudo apt-get install libudev-dev - name: 'cache yarn cache' @@ -174,7 +176,7 @@ jobs: git checkout ${{ github.ref }} - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'install udev for usb-detection' run: sudo apt-get update && sudo apt-get install libudev-dev - name: 'set complex environment variables' diff --git a/.github/workflows/notify-server-lint-test.yaml b/.github/workflows/notify-server-lint-test.yaml index dde68a9f0fa..e69de29bb2d 100644 --- a/.github/workflows/notify-server-lint-test.yaml +++ b/.github/workflows/notify-server-lint-test.yaml @@ -1,70 +0,0 @@ -# This workflow runs test and lint on branch pushes that touch the -# notify-server project or its dependencies - -name: 'Notify server lint/test' - -on: - # Most of the time, we run on pull requests, which lets us handle external PRs - push: - paths: - - 'Makefile' - - 'notify-server/**/*' - - '.github/workflows/notify-server-lint-test.yaml' - - 'api/**/*' - - 'hardware/**/*' - - 'scripts/**/*.mk' - - 'scripts/**/*.py' - - '.github/actions/python/**/*' - branches: - - 'edge' - - 'release' - - '*hotfix*' - tags-ignore: - - '*' - pull_request: - paths: - - 'Makefile' - - 'notify-server/**/*' - - 'api/**/*' - - 'hardware/**/*' - - 'scripts/**/*.mk' - - 'scripts/**/*.py' - - '.github/actions/python/**/*' - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}-${{ github.ref_name != 'edge' || github.run_id}}-${{ github.ref_type != 'tag' || github.run_id }} - cancel-in-progress: true - -defaults: - run: - shell: bash - -jobs: - lint-test: - name: 'notify server package linting and tests' - timeout-minutes: 20 - runs-on: 'ubuntu-22.04' - steps: - - uses: 'actions/checkout@v3' - with: - fetch-depth: 0 - - uses: 'actions/setup-node@v3' - with: - node-version: '16' - - uses: 'actions/setup-python@v4' - with: - python-version: '3.7' - - - uses: './.github/actions/python/setup' - with: - project: 'notify-server' - - name: Lint - run: make -C notify-server lint - - name: Test - run: make -C notify-server test-cov - - name: 'Upload coverage report' - uses: 'codecov/codecov-action@v3' - with: - files: ./notify-server/coverage.xml - flags: notify-server diff --git a/.github/workflows/pd-test-build-deploy.yaml b/.github/workflows/pd-test-build-deploy.yaml index 7a69d951856..c1e6eb832f4 100644 --- a/.github/workflows/pd-test-build-deploy.yaml +++ b/.github/workflows/pd-test-build-deploy.yaml @@ -53,7 +53,7 @@ jobs: git checkout ${{ github.ref }} - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'install udev for usb-detection' run: sudo apt-get update && sudo apt-get install libudev-dev - name: 'cache yarn cache' @@ -71,8 +71,7 @@ jobs: yarn config set cache-folder ./.yarn-cache make setup-js - name: 'run PD unit tests' - run: | - yarn jest --coverage=true --ci=true --collectCoverageFrom="protocol-designer/src/**/*.(js|ts|tsx)" protocol-designer/src + run: make -C protocol-designer test-cov - name: 'Upload coverage report' uses: codecov/codecov-action@v3 with: @@ -99,7 +98,7 @@ jobs: git checkout ${{ github.ref }} - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'install udev for usb-detection' if: startsWith(matrix.os, 'ubuntu') run: sudo apt-get update && sudo apt-get install libudev-dev @@ -136,7 +135,7 @@ jobs: git checkout ${{ github.ref }} - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'install udev for usb-detection' run: sudo apt-get update && sudo apt-get install libudev-dev - name: 'cache yarn cache' @@ -179,7 +178,7 @@ jobs: git checkout ${{ github.ref }} - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'install udev for usb-detection' run: sudo apt-get update && sudo apt-get install libudev-dev - name: 'set complex environment variables' diff --git a/.github/workflows/react-api-client-test.yaml b/.github/workflows/react-api-client-test.yaml index 7d91462b011..af8e4015497 100644 --- a/.github/workflows/react-api-client-test.yaml +++ b/.github/workflows/react-api-client-test.yaml @@ -39,7 +39,7 @@ jobs: - uses: 'actions/checkout@v3' - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'install libudev for usb-detection' run: sudo apt-get update && sudo apt-get install libudev-dev - name: 'cache yarn cache' @@ -57,8 +57,7 @@ jobs: yarn config set cache-folder ./.yarn-cache make setup-js - name: 'run react-api-client unit tests' - run: | - yarn jest --coverage=true --ci=true --collectCoverageFrom="react-api-client/src/**/*.(js|ts|tsx)" react-api-client/src + run: make -C react-api-client test-cov - name: 'Upload coverage report' uses: codecov/codecov-action@v3 with: diff --git a/.github/workflows/robot-server-lint-test.yaml b/.github/workflows/robot-server-lint-test.yaml index 98e2d0174cd..96d1969121b 100644 --- a/.github/workflows/robot-server-lint-test.yaml +++ b/.github/workflows/robot-server-lint-test.yaml @@ -14,7 +14,6 @@ on: - 'server-utils/**/*' - '!shared-data/js/**/*' - 'robot-server/**/*' - - 'notify-server/**/*' - 'scripts/**/*.mk' - 'scripts/**/*.py' - '.github/workflows/robot-server-lint-test.yaml' @@ -34,7 +33,6 @@ on: - 'server-utils/**/*' - '!shared-data/js/**/*' - 'robot-server/**/*' - - 'notify-server/**/*' - 'scripts/**/*.mk' - 'scripts/**/*.py' - '.github/workflows/robot-server-lint-test.yaml' @@ -52,7 +50,7 @@ defaults: jobs: lint-test: name: 'robot server package linting and tests' - timeout-minutes: 20 + timeout-minutes: 40 runs-on: 'ubuntu-22.04' strategy: matrix: @@ -63,10 +61,10 @@ jobs: fetch-depth: 0 - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - uses: './.github/actions/python/setup' with: diff --git a/.github/workflows/server-utils-lint-test.yaml b/.github/workflows/server-utils-lint-test.yaml index c7039652bf9..240d9e0bd25 100644 --- a/.github/workflows/server-utils-lint-test.yaml +++ b/.github/workflows/server-utils-lint-test.yaml @@ -46,10 +46,10 @@ jobs: fetch-depth: 0 - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - uses: './.github/actions/python/setup' with: @@ -67,10 +67,10 @@ jobs: fetch-depth: 0 - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - uses: './.github/actions/python/setup' with: project: 'server-utils' diff --git a/.github/workflows/shared-data-test-lint-deploy.yaml b/.github/workflows/shared-data-test-lint-deploy.yaml index 18fba9dcb90..97228ea2d70 100644 --- a/.github/workflows/shared-data-test-lint-deploy.yaml +++ b/.github/workflows/shared-data-test-lint-deploy.yaml @@ -19,6 +19,8 @@ on: - '*hotfix*' tags: - 'v*' + - 'shared-data*' + - 'components*' pull_request: paths: - 'Makefile' @@ -49,10 +51,10 @@ jobs: fetch-depth: 0 - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: 'actions/setup-python@v3' with: - python-version: '3.7' + python-version: '3.10' - uses: './.github/actions/python/setup' with: @@ -69,10 +71,8 @@ jobs: os: ['windows-2022', 'ubuntu-22.04', 'macos-latest'] # TODO(mc, 2022-02-24): expand this matrix to 3.8 and 3.9, # preferably in a nightly cronjob on edge or something - python: ['3.7', '3.10'] - exclude: - - os: 'macos-latest' - python: '3.10' + python: ['3.10'] + runs-on: '${{ matrix.os }}' steps: - uses: 'actions/checkout@v3' @@ -83,7 +83,7 @@ jobs: run: sudo apt-get update && sudo apt-get install libudev-dev - uses: 'actions/setup-node@v1' with: - node-version: '16' + node-version: '18.19.0' - uses: 'actions/setup-python@v4' with: python-version: ${{ matrix.python }} @@ -115,7 +115,7 @@ jobs: - uses: 'actions/checkout@v3' - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'install udev' run: sudo apt-get update && sudo apt-get install libudev-dev - name: 'cache yarn cache' @@ -127,14 +127,13 @@ jobs: key: js-${{ secrets.GH_CACHE_VERSION }}-${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }} restore-keys: | js-${{ secrets.GH_CACHE_VERSION }}-${{ runner.os }}-yarn- - - name: 'setup-js' + - name: 'js deps' run: | npm config set cache ./.npm-cache yarn config set cache-folder ./.yarn-cache make setup-js - name: 'run shared-data JS unit tests' - run: | - yarn jest --coverage=true --ci=true --collectCoverageFrom="shared-data/js/**/*.(js|ts|tsx)" shared-data/js + run: make -C shared-data test-cov - name: 'Upload coverage report' uses: codecov/codecov-action@v3 with: @@ -158,12 +157,12 @@ jobs: git checkout ${{ github.ref }} - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'install udev for usb-detection' run: sudo apt-get update && sudo apt-get install libudev-dev - uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - uses: './.github/actions/python/setup' with: project: 'shared-data/python' @@ -188,3 +187,77 @@ jobs: project: 'shared-data/python' repository_url: 'https://upload.pypi.org/legacy/' password: '${{ secrets.OT_PYPI_PASSWORD }}' + + publish-switch: + runs-on: 'ubuntu-latest' + name: 'Determine whether or not to publish artifacts' + outputs: + should_publish: ${{steps.publish-switch.outputs.should_publish}} + steps: + - id: publish-switch + run: | + echo "Determining whether to publish artifacts for event ${{github.event_type}} and ref ${{github.ref}}" + if [ "${{ format('{0}', startsWith(github.ref, 'refs/tags/shared-data')) }}" = "true" ] ; then + echo "Publishing builds for shared-data@ tags" + echo 'should_publish=true' >> $GITHUB_OUTPUT + elif [ "${{ format('{0}', startsWith(github.ref, 'refs/tags/components')) }}" = "true" ] ; then + echo "Publishing builds for components@ tags" + echo 'should_publish=true' >> $GITHUB_OUTPUT + else + echo "No publish for ref ${{github.ref}} and event ${{github.event_type}}" + echo 'should_publish=false' >> $GITHUB_OUTPUT + fi + + publish-to-npm: + name: 'publish shared-data package to npm' + runs-on: 'ubuntu-latest' + needs: ['js-test', 'publish-switch'] + if: needs.publish-switch.outputs.should_publish == 'true' + steps: + - uses: 'actions/checkout@v3' + # https://github.com/actions/checkout/issues/290 + - name: 'Fix actions/checkout odd handling of tags' + if: startsWith(github.ref, 'refs/tags') + run: | + git fetch -f origin ${{ github.ref }}:${{ github.ref }} + git checkout ${{ github.ref }} + - uses: 'actions/setup-node@v3' + with: + node-version: '18.19.0' + registry-url: 'https://registry.npmjs.org' + - name: 'cache yarn cache' + uses: actions/cache@v3 + with: + path: | + ${{ github.workspace }}/.yarn-cache + ${{ github.workspace }}/.npm-cache + key: js-${{ secrets.GH_CACHE_VERSION }}-${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }} + restore-keys: | + js-${{ secrets.GH_CACHE_VERSION }}-${{ runner.os }}-yarn- + - name: 'js deps' + run: | + npm config set cache ./.npm-cache + yarn config set cache-folder ./.yarn-cache + yarn config set network-timeout 60000 + yarn + - name: 'build typescript' + run: make build-ts + - name: 'build library' + run: | + make -C shared-data lib-js + # replace package.json stub version number with version from tag + - name: 'set version number' + run: | + npm install -g json + VERSION_STRING=$(echo ${{ github.ref }} | sed -E 's/refs\/tags\/(components|shared-data)@//') + json -I -f ./shared-data/package.json -e "this.version=\"$VERSION_STRING\"" + cd ./shared-data + - uses: 'actions/setup-node@v3' + with: + node-version: '18.19.0' + registry-url: 'https://registry.npmjs.org' + - name: 'publish to npm registry' + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + cd ./shared-data && echo "//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}" > ./.npmrc && npm publish --access public diff --git a/.github/workflows/step-generation-test.yaml b/.github/workflows/step-generation-test.yaml index 0d0ef384c76..d61fbcbcfdc 100644 --- a/.github/workflows/step-generation-test.yaml +++ b/.github/workflows/step-generation-test.yaml @@ -40,7 +40,7 @@ jobs: - uses: 'actions/checkout@v3' - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'install udev for usb-detection' run: sudo apt-get update && sudo apt-get install libudev-dev - name: 'cache yarn cache' @@ -58,8 +58,7 @@ jobs: yarn config set cache-folder ./.yarn-cache make setup-js - name: 'run step generation unit tests' - run: | - yarn jest --coverage=true --ci=true --collectCoverageFrom="step-generation/src/**/*.(js|ts|tsx)" step-generation/src + run: make -C step-generation test-cov - name: 'Upload coverage report' uses: codecov/codecov-action@v3 with: diff --git a/.github/workflows/system-server-lint-test.yaml b/.github/workflows/system-server-lint-test.yaml index 0fecec47e83..720ca905bd7 100644 --- a/.github/workflows/system-server-lint-test.yaml +++ b/.github/workflows/system-server-lint-test.yaml @@ -48,10 +48,10 @@ jobs: fetch-depth: 0 - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - uses: './.github/actions/python/setup' with: @@ -69,10 +69,10 @@ jobs: fetch-depth: 0 - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - uses: './.github/actions/python/setup' with: project: 'system-server' diff --git a/.github/workflows/tag-releases.yaml b/.github/workflows/tag-releases.yaml index 120c1c462df..d867d3bf8ca 100644 --- a/.github/workflows/tag-releases.yaml +++ b/.github/workflows/tag-releases.yaml @@ -24,7 +24,7 @@ jobs: fetch-depth: 0 - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - name: 'cache yarn cache' uses: actions/cache@v3 with: diff --git a/.github/workflows/update-server-lint-test.yaml b/.github/workflows/update-server-lint-test.yaml index fe908f9f9e6..b4d1435838f 100644 --- a/.github/workflows/update-server-lint-test.yaml +++ b/.github/workflows/update-server-lint-test.yaml @@ -46,10 +46,10 @@ jobs: fetch-depth: 0 - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - uses: './.github/actions/python/setup' with: @@ -67,10 +67,10 @@ jobs: fetch-depth: 0 - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - uses: './.github/actions/python/setup' with: project: 'update-server' diff --git a/.github/workflows/usb-bridge-lint-test.yaml b/.github/workflows/usb-bridge-lint-test.yaml index 1ee0d62c53d..2888291871a 100644 --- a/.github/workflows/usb-bridge-lint-test.yaml +++ b/.github/workflows/usb-bridge-lint-test.yaml @@ -46,10 +46,10 @@ jobs: fetch-depth: 0 - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - uses: './.github/actions/python/setup' with: @@ -67,10 +67,10 @@ jobs: fetch-depth: 0 - uses: 'actions/setup-node@v3' with: - node-version: '16' + node-version: '18.19.0' - uses: 'actions/setup-python@v4' with: - python-version: '3.7' + python-version: '3.10' - uses: './.github/actions/python/setup' with: project: 'usb-bridge' diff --git a/.gitignore b/.gitignore index c387a3c75a4..bbd1d9bbf80 100755 --- a/.gitignore +++ b/.gitignore @@ -126,7 +126,6 @@ calibrations/ api/pyproject.toml robot-server/pyproject.toml update-server/pyproject.toml -notify-server/pyproject.toml shared-data/python/pyproject.toml hardware/pyproject.toml @@ -135,7 +134,6 @@ hardware/pyproject.toml # file api/LICENSE update-server/LICENSE -notify-server/LICENSE shared-data/python/LICENSE shared-data/LICENSE robot-server/LICENSE @@ -158,3 +156,6 @@ opentrons-robot-app.tar.gz # ignore linux swap files *.swp + +# asdf versions file +.tool-versions diff --git a/.nvmrc b/.nvmrc index 19c7bdba7b1..3c032078a4a 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -16 \ No newline at end of file +18 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e4460fecda9..ab5c27921ef 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -160,7 +160,7 @@ You will need the following tools installed to develop on the Opentrons platform - git - curl - ssh -- Python v3.7 +- Python v3.10 - Node.js v16 - [Yarn 1][yarn] diff --git a/Config.in b/Config.in index 182fa0643b6..6c607c38e30 100644 --- a/Config.in +++ b/Config.in @@ -3,6 +3,6 @@ source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/api/Config.in" source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/update-server/Config.in" source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/robot-server/Config.in" source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/shared-data/python/Config.in" -source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/notify-server/Config.in" source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/system-server/Config.in" -source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/server-utils/Config.in" \ No newline at end of file +source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/server-utils/Config.in" +source "$BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH/hardware/Config.in" diff --git a/DEV_SETUP.md b/DEV_SETUP.md index 9cb07992c5a..d6522e65d25 100644 --- a/DEV_SETUP.md +++ b/DEV_SETUP.md @@ -12,7 +12,7 @@ You will need the following tools installed to develop on the Opentrons platform - git - curl - ssh -- Python v3.7 +- Python v3.10 - Node.js v16 ### macOS @@ -124,10 +124,10 @@ Close and re-open your terminal to verify that `pyenv` is installed pyenv --version ``` -Now, install the required version of Python. Use the latest available version of `3.7.x`, which is `3.7.15` at the time of writing. +Now, install the required version of Python. Use the latest available version of `3.10.x`, which is `3.10.13` at the time of writing. ```shell -pyenv install 3.7.15 +pyenv install 3.10.13 ``` If your `pyenv` command isn't working, confirm that your shell is set up properly. If you print out the contents of `~/.zprofile` and `~/.zshrc`, you should see something similar to the following: @@ -198,15 +198,15 @@ cd ./opentrons Once you are inside the repository for the first time, you should do two things: 1. Confirm that `nvs` selected the proper version of Node.js to use -2. Tell `pyenv` to use Python 3.7 -3. Run `python --version` to confirm your chosen version. If you get the incorrect version and you're using an Apple silicon Mac, try running `eval "$(pyenv init --path)"` and then `pyenv local 3.7.15`. Then check `python --version` again. +2. Tell `pyenv` to use Python 3.10 +3. Run `python --version` to confirm your chosen version. If you get the incorrect version and you're using an Apple silicon Mac, try running `eval "$(pyenv init --path)"` and then `pyenv local 3.10.13`. Then check `python --version` again. ```shell # confirm Node v16 node --version # set Python version, and confirm -pyenv local 3.7.15 +pyenv local 3.10.13 python --version ``` @@ -216,6 +216,12 @@ Once you've confirmed you're running the correct versions of Node.js and Python, npm install --global yarn@1 ``` +If you are using [Corepack][], you can install `yarn` via `corepack`. + +```shell +corepack enable +``` + Finally, you need to download and install all of our various development dependencies. **This step will take several minutes** the first time you run it! ```shell @@ -236,3 +242,4 @@ Once `make setup` completes, you're ready to start developing! Check out our gen [yarn]: https://classic.yarnpkg.com/ [pipenv]: https://github.com/pypa/pipenv [contributing guide]: ./CONTRIBUTING.md +[corepack]: https://github.com/nodejs/corepack diff --git a/Dockerfile b/Dockerfile index 60bd111736c..6bc38b9bab5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM ubuntu as base ENV TZ=Etc/UTC RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone -RUN apt-get update && apt-get install --yes python3 pip pkg-config libsystemd-dev +RUN apt-get update && apt-get install --yes python3 pip pkg-config libsystemd-dev git FROM base as builder COPY scripts scripts @@ -9,21 +9,20 @@ COPY LICENSE LICENSE COPY shared-data shared-data +COPY server-utils/setup.py server-utils/setup.py +COPY server-utils/server_utils server-utils/server_utils + COPY api/MANIFEST.in api/MANIFEST.in COPY api/setup.py api/setup.py COPY api/pypi-readme.rst api/pypi-readme.rst COPY api/src/opentrons api/src/opentrons -COPY notify-server/setup.py notify-server/setup.py -COPY notify-server/README.rst notify-server/README.rst -COPY notify-server/notify_server notify-server/notify_server - COPY robot-server/setup.py robot-server/setup.py COPY robot-server/robot_server robot-server/robot_server RUN cd shared-data/python && python3 setup.py bdist_wheel -d /dist/ +RUN cd server-utils && python3 setup.py bdist_wheel -d /dist/ RUN cd api && python3 setup.py bdist_wheel -d /dist/ -RUN cd notify-server && python3 setup.py bdist_wheel -d /dist/ RUN cd robot-server && python3 setup.py bdist_wheel -d /dist/ FROM base diff --git a/Makefile b/Makefile index a61101f362b..a01d2308eaf 100755 --- a/Makefile +++ b/Makefile @@ -5,24 +5,27 @@ include ./scripts/python.mk API_DIR := api +API_CLIENT_DIR := api-client +APP_DIR := app APP_SHELL_DIR := app-shell APP_SHELL_ODD_DIR := app-shell-odd COMPONENTS_DIR := components DISCOVERY_CLIENT_DIR := discovery-client G_CODE_TESTING_DIR := g-code-testing LABWARE_LIBRARY_DIR := labware-library -NOTIFY_SERVER_DIR := notify-server PROTOCOL_DESIGNER_DIR := protocol-designer SHARED_DATA_DIR := shared-data UPDATE_SERVER_DIR := update-server +REACT_API_CLIENT_DIR := react-api-client ROBOT_SERVER_DIR := robot-server SERVER_UTILS_DIR := server-utils +STEP_GENERATION_DIR := step-generation SYSTEM_SERVER_DIR := system-server HARDWARE_DIR := hardware USB_BRIDGE_DIR := usb-bridge NODE_USB_BRIDGE_CLIENT_DIR := usb-bridge/node-client -PYTHON_DIRS := $(API_DIR) $(UPDATE_SERVER_DIR) $(NOTIFY_SERVER_DIR) $(ROBOT_SERVER_DIR) $(SERVER_UTILS_DIR) $(SHARED_DATA_DIR)/python $(G_CODE_TESTING_DIR) $(HARDWARE_DIR) $(USB_BRIDGE_DIR) +PYTHON_DIRS := $(API_DIR) $(UPDATE_SERVER_DIR) $(ROBOT_SERVER_DIR) $(SERVER_UTILS_DIR) $(SHARED_DATA_DIR)/python $(G_CODE_TESTING_DIR) $(HARDWARE_DIR) $(USB_BRIDGE_DIR) # This may be set as an environment variable (and is by CI tasks that upload # to test pypi) to add a .dev extension to the python package versions. If @@ -50,20 +53,24 @@ usb_host=$(shell yarn run -s discovery find -i 169.254) .PHONY: setup setup: setup-js setup-py +# Both the python and JS setup targets depend on a minimal python setup so they can create +# virtual envs using pipenv. +.PHONY: setup-py-toolchain +setup-py-toolchain: + $(OT_PYTHON) -m pip install pipenv==2023.11.15 + # front-end dependecies handled by yarn .PHONY: setup-js -setup-js: +setup-js: setup-py-toolchain yarn config set network-timeout 60000 yarn $(MAKE) -C $(APP_SHELL_DIR) setup $(MAKE) -C $(APP_SHELL_ODD_DIR) setup - $(MAKE) -C $(SHARED_DATA_DIR) setup-js PYTHON_SETUP_TARGETS := $(addsuffix -py-setup, $(PYTHON_DIRS)) .PHONY: setup-py -setup-py: - $(OT_PYTHON) -m pip install pipenv==2021.5.29 +setup-py: setup-py-toolchain $(MAKE) $(PYTHON_SETUP_TARGETS) @@ -137,8 +144,6 @@ push: sleep 1 $(MAKE) -C $(SERVER_UTILS_DIR) push sleep 1 - $(MAKE) -C $(NOTIFY_SERVER_DIR) push - sleep 1 $(MAKE) -C $(SYSTEM_SERVER_DIR) push sleep 1 $(MAKE) -C $(ROBOT_SERVER_DIR) push @@ -153,7 +158,6 @@ push-ot3: $(MAKE) -C $(HARDWARE_DIR) push-no-restart-ot3 $(MAKE) -C $(API_DIR) push-no-restart-ot3 $(MAKE) -C $(SERVER_UTILS_DIR) push-ot3 - $(MAKE) -C $(NOTIFY_SERVER_DIR) push-ot3 $(MAKE) -C $(ROBOT_SERVER_DIR) push-ot3 $(MAKE) -C $(SYSTEM_SERVER_DIR) push-ot3 $(MAKE) -C $(UPDATE_SERVER_DIR) push-ot3 @@ -190,17 +194,11 @@ test-py: test-py-windows $(MAKE) -C $(UPDATE_SERVER_DIR) test $(MAKE) -C $(ROBOT_SERVER_DIR) test $(MAKE) -C $(SERVER_UTILS_DIR) test - $(MAKE) -C $(NOTIFY_SERVER_DIR) test $(MAKE) -C $(G_CODE_TESTING_DIR) test $(MAKE) -C $(USB_BRIDGE_DIR) test .PHONY: test-js -test-js: - yarn jest \ - --coverage=$(cover) \ - --watch=$(watch) \ - --updateSnapshot=$(updateSnapshot) \ - --ci=$(if $(CI),true,false) +test-js: test-js-internal # lints and typechecks .PHONY: lint @@ -261,3 +259,11 @@ circular-dependencies-js: yarn madge $(and $(CI),--no-spinner --no-color) --circular labware-library/src/index.tsx yarn madge $(and $(CI),--no-spinner --no-color) --circular app/src/index.tsx yarn madge $(and $(CI),--no-spinner --no-color) --circular components/src/index.ts + +.PHONY: test-js-internal +test-js-internal: + yarn jest $(tests) $(test_opts) $(cov_opts) + +.PHONY: test-js-% +test-js-%: + $(MAKE) test-js-internal tests="$(if $(tests),$(foreach test,$(tests),$*/$(test)),$*)" test_opts="$(test_opts)" cov_opts="$(cov_opts)" diff --git a/api-client/Makefile b/api-client/Makefile index 77292e25c64..1ac1ecbc08d 100644 --- a/api-client/Makefile +++ b/api-client/Makefile @@ -17,3 +17,7 @@ clean: .PHONY: build build: rollup --config rollup.config.js + +.PHONY: test +test: + $(MAKE) -C .. test-js-api-client diff --git a/api-client/src/deck_configuration/getDeckConfiguration.ts b/api-client/src/deck_configuration/getDeckConfiguration.ts new file mode 100644 index 00000000000..900f5e381e9 --- /dev/null +++ b/api-client/src/deck_configuration/getDeckConfiguration.ts @@ -0,0 +1,16 @@ +import { GET, request } from '../request' + +import type { ResponsePromise } from '../request' +import type { HostConfig } from '../types' +import type { DeckConfigurationResponse } from './types' + +export function getDeckConfiguration( + config: HostConfig +): ResponsePromise { + return request( + GET, + `/deck_configuration`, + null, + config + ) +} diff --git a/api-client/src/deck_configuration/index.ts b/api-client/src/deck_configuration/index.ts new file mode 100644 index 00000000000..3da16feea96 --- /dev/null +++ b/api-client/src/deck_configuration/index.ts @@ -0,0 +1,7 @@ +export { getDeckConfiguration } from './getDeckConfiguration' +export { updateDeckConfiguration } from './updateDeckConfiguration' + +export type { + DeckConfigurationResponse, + UpdateDeckConfigurationRequest, +} from './types' diff --git a/api-client/src/deck_configuration/types.ts b/api-client/src/deck_configuration/types.ts new file mode 100644 index 00000000000..8ed7db78658 --- /dev/null +++ b/api-client/src/deck_configuration/types.ts @@ -0,0 +1,14 @@ +import type { DeckConfiguration } from '@opentrons/shared-data' + +export interface UpdateDeckConfigurationRequest { + data: { + cutoutFixtures: DeckConfiguration + } +} + +export interface DeckConfigurationResponse { + data: { + cutoutFixtures: DeckConfiguration + lastModifiedAt: string + } +} diff --git a/api-client/src/deck_configuration/updateDeckConfiguration.ts b/api-client/src/deck_configuration/updateDeckConfiguration.ts new file mode 100644 index 00000000000..236aef59904 --- /dev/null +++ b/api-client/src/deck_configuration/updateDeckConfiguration.ts @@ -0,0 +1,21 @@ +import { PUT, request } from '../request' + +import type { DeckConfiguration } from '@opentrons/shared-data' +import type { ResponsePromise } from '../request' +import type { HostConfig } from '../types' +import type { + DeckConfigurationResponse, + UpdateDeckConfigurationRequest, +} from './types' + +export function updateDeckConfiguration( + config: HostConfig, + deckConfig: DeckConfiguration +): ResponsePromise { + return request( + PUT, + '/deck_configuration', + { data: { cutoutFixtures: deckConfig } }, + config + ) +} diff --git a/api-client/src/index.ts b/api-client/src/index.ts index fff01e6e91c..f6957a49e8f 100644 --- a/api-client/src/index.ts +++ b/api-client/src/index.ts @@ -1,5 +1,6 @@ // api client entry point export * from './calibration' +export * from './deck_configuration' export * from './health' export * from './instruments' export * from './maintenance_runs' diff --git a/api-client/src/instruments/types.ts b/api-client/src/instruments/types.ts index 5dbc47b4809..03235953e5b 100644 --- a/api-client/src/instruments/types.ts +++ b/api-client/src/instruments/types.ts @@ -1,8 +1,12 @@ +import type { PipetteModel } from '@opentrons/shared-data' + export type InstrumentData = PipetteData | GripperData | BadPipette | BadGripper // pipettes module already exports type `Mount` type Mount = 'left' | 'right' | 'extension' +export const INCONSISTENT_PIPETTE_OFFSET = 'inconsistent-pipette-offset' + export interface InconsistentCalibrationFailure { kind: 'inconsistent-pipette-offset' offsets: Map<'left' | 'right', { x: number; y: number; z: number }> @@ -46,10 +50,13 @@ export interface PipetteData { } firmwareVersion?: string instrumentName: string - instrumentModel: string + instrumentModel: PipetteModel instrumentType: 'pipette' mount: 'left' | 'right' serialNumber: string + state?: { + tipDetected: boolean + } subsystem: 'pipette_left' | 'pipette_right' ok: true } diff --git a/api-client/src/maintenance_runs/createMaintenanceCommand.ts b/api-client/src/maintenance_runs/createMaintenanceCommand.ts index 833290ce7c5..2d48e58d2c7 100644 --- a/api-client/src/maintenance_runs/createMaintenanceCommand.ts +++ b/api-client/src/maintenance_runs/createMaintenanceCommand.ts @@ -1,6 +1,6 @@ import { POST, request } from '../request' -import type { CreateCommand } from '@opentrons/shared-data/protocol/types/schemaV7' +import type { CreateCommand } from '@opentrons/shared-data' import type { ResponsePromise } from '../request' import type { HostConfig } from '../types' import type { CommandData, CreateCommandParams } from '../runs/types' diff --git a/api-client/src/pipettes/index.ts b/api-client/src/pipettes/index.ts index cc19fe7ed15..f2fa52365fc 100644 --- a/api-client/src/pipettes/index.ts +++ b/api-client/src/pipettes/index.ts @@ -1,5 +1,6 @@ export { getPipettes } from './getPipettes' export { getPipetteSettings } from './getPipetteSettings' +export { updatePipetteSettings } from './updatePipetteSettings' export * from './types' export * from './__fixtures__' diff --git a/api-client/src/pipettes/types.ts b/api-client/src/pipettes/types.ts index dff905cca82..c637b64d967 100644 --- a/api-client/src/pipettes/types.ts +++ b/api-client/src/pipettes/types.ts @@ -51,8 +51,8 @@ export interface FetchPipettesResponseBody { right: FetchPipettesResponsePipette } -interface PipetteSettingsField { - value: number | null | undefined +export interface PipetteSettingsField { + value: number | null | boolean | undefined default: number min?: number max?: number @@ -66,7 +66,7 @@ interface PipetteQuirksField { interface QuirksField { quirks?: PipetteQuirksField } -type PipetteSettingsFieldsMap = QuirksField & { +export type PipetteSettingsFieldsMap = QuirksField & { [fieldId: string]: PipetteSettingsField } export interface IndividualPipetteSettings { @@ -77,3 +77,15 @@ export interface IndividualPipetteSettings { type PipetteSettingsById = Partial<{ [id: string]: IndividualPipetteSettings }> export type PipetteSettings = PipetteSettingsById + +export interface PipetteSettingsUpdateFieldsMap { + [fieldId: string]: PipetteSettingsUpdateField +} + +export type PipetteSettingsUpdateField = { + value: PipetteSettingsField['value'] +} | null + +export interface UpdatePipetteSettingsData { + fields: { [fieldId: string]: PipetteSettingsUpdateField } +} diff --git a/api-client/src/pipettes/updatePipetteSettings.ts b/api-client/src/pipettes/updatePipetteSettings.ts new file mode 100644 index 00000000000..7ed76178914 --- /dev/null +++ b/api-client/src/pipettes/updatePipetteSettings.ts @@ -0,0 +1,21 @@ +import { PATCH, request } from '../request' + +import type { ResponsePromise } from '../request' +import type { HostConfig } from '../types' +import type { + IndividualPipetteSettings, + UpdatePipetteSettingsData, +} from './types' + +export function updatePipetteSettings( + config: HostConfig, + pipetteId: string, + data: UpdatePipetteSettingsData +): ResponsePromise { + return request( + PATCH, + `/settings/pipettes/${pipetteId}`, + data, + config + ) +} diff --git a/api-client/src/protocols/__tests__/utils.test.ts b/api-client/src/protocols/__tests__/utils.test.ts index 82019ec9cc3..f5f6f24dbd1 100644 --- a/api-client/src/protocols/__tests__/utils.test.ts +++ b/api-client/src/protocols/__tests__/utils.test.ts @@ -13,7 +13,7 @@ import { } from '../utils' import { simpleAnalysisFileFixture } from '../__fixtures__' -import type { RunTimeCommand } from '@opentrons/shared-data' +import { RunTimeCommand } from '@opentrons/shared-data' const mockRunTimeCommands: RunTimeCommand[] = simpleAnalysisFileFixture.commands as any const mockLoadLiquidRunTimeCommands = [ @@ -261,7 +261,7 @@ describe('parseInitialLoadedLabwareByAdapter', () => { }) }) describe('parseInitialLoadedLabwareBySlot', () => { - it('returns only labware loaded in slots', () => { + it('returns labware loaded in slots', () => { const expected = { 2: mockRunTimeCommands.find( c => @@ -282,6 +282,48 @@ describe('parseInitialLoadedLabwareBySlot', () => { expected ) }) + it('returns labware loaded in addressable areas', () => { + const mockAddressableAreaLoadedLabwareCommand = ([ + { + id: 'commands.LOAD_LABWARE-3', + createdAt: '2022-04-01T15:46:01.745870+00:00', + commandType: 'loadLabware', + key: 'commands.LOAD_LABWARE-3', + status: 'succeeded', + params: { + location: { + addressableAreaName: 'D4', + }, + loadName: 'nest_96_wellplate_100ul_pcr_full_skirt', + namespace: 'opentrons', + version: 1, + labwareId: null, + displayName: 'NEST 96 Well Plate 100 µL PCR Full Skirt', + }, + result: { + labwareId: 'labware-3', + definition: {}, + offsetId: null, + }, + error: null, + startedAt: '2022-04-01T15:46:01.745870+00:00', + completedAt: '2022-04-01T15:46:01.745870+00:00', + }, + ] as any) as RunTimeCommand[] + + const expected = { + D4: mockAddressableAreaLoadedLabwareCommand.find( + c => + c.commandType === 'loadLabware' && + typeof c.params.location === 'object' && + 'addressableAreaName' in c.params?.location && + c.params?.location?.addressableAreaName === 'D4' + ), + } + expect( + parseInitialLoadedLabwareBySlot(mockAddressableAreaLoadedLabwareCommand) + ).toEqual(expected) + }) }) describe('parseInitialLoadedLabwareByModuleId', () => { it('returns only labware loaded in modules', () => { diff --git a/api-client/src/protocols/utils.ts b/api-client/src/protocols/utils.ts index 6e682d8757a..5b7eef86be9 100644 --- a/api-client/src/protocols/utils.ts +++ b/api-client/src/protocols/utils.ts @@ -1,23 +1,20 @@ // set of functions that parse details out of a protocol record and it's internals import reduce from 'lodash/reduce' -import { COLORS } from '@opentrons/components/src/ui-style-constants' -import { getLabwareDefURI } from '@opentrons/shared-data' +import { getLabwareDefURI, DEFAULT_LIQUID_COLORS } from '@opentrons/shared-data' import type { - ModuleModel, - PipetteName, Liquid, - LoadedPipette, LoadedLabware, LoadedModule, -} from '@opentrons/shared-data' -import type { RunTimeCommand } from '@opentrons/shared-data/protocol/types/schemaV7' -import type { + LoadedPipette, LoadLabwareRunTimeCommand, + LoadLiquidRunTimeCommand, LoadModuleRunTimeCommand, LoadPipetteRunTimeCommand, - LoadLiquidRunTimeCommand, -} from '@opentrons/shared-data/protocol/types/schemaV7/command/setup' + ModuleModel, + PipetteName, + RunTimeCommand, +} from '@opentrons/shared-data' interface PipetteNamesByMount { left: PipetteName | null @@ -118,11 +115,14 @@ export function parseInitialLoadedLabwareBySlot( return reduce( loadLabwareCommandsReversed, (acc, command) => { - if ( - typeof command.params.location === 'object' && - 'slotName' in command.params.location - ) { - return { ...acc, [command.params.location.slotName]: command } + if (typeof command.params.location === 'object') { + let slot: string + if ('slotName' in command.params.location) { + slot = command.params.location.slotName + } else if ('addressableAreaName' in command.params.location) { + slot = command.params.location.addressableAreaName + } else return acc + return { ...acc, [slot]: command } } else { return acc } @@ -131,7 +131,7 @@ export function parseInitialLoadedLabwareBySlot( ) } -interface LoadedLabwareByAdapter { +export interface LoadedLabwareByAdapter { [labwareId: string]: LoadLabwareRunTimeCommand } export function parseInitialLoadedLabwareByAdapter( @@ -210,14 +210,14 @@ interface LoadedModulesBySlot { export function parseInitialLoadedModulesBySlot( commands: RunTimeCommand[] ): LoadedModulesBySlot { - const loadLabwareCommandsReversed = commands + const loadModuleCommandsReversed = commands .filter( (command): command is LoadModuleRunTimeCommand => command.commandType === 'loadModule' ) .reverse() return reduce( - loadLabwareCommandsReversed, + loadModuleCommandsReversed, (acc, command) => 'slotName' in command.params.location ? { ...acc, [command.params.location.slotName]: command } @@ -253,7 +253,7 @@ export function parseLiquidsInLoadOrder( ...liquid, displayColor: liquid.displayColor ?? - COLORS.liquidColors[index % COLORS.liquidColors.length], + DEFAULT_LIQUID_COLORS[index % DEFAULT_LIQUID_COLORS.length], } }) @@ -275,10 +275,12 @@ interface LabwareLiquidInfo { volumeByWell: { [well: string]: number } } +/** @deprecated instead use LabwareByLiquidId from components/src/hardware-sim/ProtocolDeck/types */ export interface LabwareByLiquidId { [liquidId: string]: LabwareLiquidInfo[] } +/** @deprecated instead use getLabwareInfoByLiquidId from components/src/hardware-sim/ProtocolDeck/utils */ export function parseLabwareInfoByLiquidId( commands: RunTimeCommand[] ): LabwareByLiquidId { diff --git a/api-client/src/runs/commands/createCommand.ts b/api-client/src/runs/commands/createCommand.ts index d5e5e74defa..4484c913b4f 100644 --- a/api-client/src/runs/commands/createCommand.ts +++ b/api-client/src/runs/commands/createCommand.ts @@ -1,10 +1,10 @@ import { POST, request } from '../../request' +import type { CreateCommand } from '@opentrons/shared-data' import type { ResponsePromise } from '../../request' import type { HostConfig } from '../../types' import type { CommandData } from '../types' import type { CreateCommandParams } from './types' -import type { CreateCommand } from '@opentrons/shared-data/protocol/types/schemaV7' export function createCommand( config: HostConfig, diff --git a/api-client/src/runs/commands/createLiveCommand.ts b/api-client/src/runs/commands/createLiveCommand.ts index 567f76d7c59..2638a2ec647 100644 --- a/api-client/src/runs/commands/createLiveCommand.ts +++ b/api-client/src/runs/commands/createLiveCommand.ts @@ -1,10 +1,10 @@ import { POST, request } from '../../request' +import type { CreateCommand } from '@opentrons/shared-data' import type { ResponsePromise } from '../../request' import type { HostConfig } from '../../types' import type { CommandData } from '../types' import type { CreateCommandParams } from './types' -import type { CreateCommand } from '@opentrons/shared-data/protocol/types/schemaV7' export function createLiveCommand( config: HostConfig, diff --git a/api/.flake8 b/api/.flake8 index 58cf97e19e9..7cf00cb00ec 100644 --- a/api/.flake8 +++ b/api/.flake8 @@ -26,7 +26,6 @@ noqa-require-code = true per-file-ignores = setup.py:ANN,D src/opentrons/__init__.py:ANN,D - src/opentrons/broker.py:ANN,D src/opentrons/execute.py:ANN,D src/opentrons/simulate.py:ANN,D src/opentrons/types.py:ANN,D @@ -40,11 +39,14 @@ per-file-ignores = src/opentrons/resources/*:ANN,D src/opentrons/system/*:ANN,D src/opentrons/tools/*:ANN,D - src/opentrons/util/*:ANN,D + src/opentrons/util/async_helpers.py:ANN,D + src/opentrons/util/logging_config.py:ANN,D + src/opentrons/util/linal.py:ANN,D + src/opentrons/util/entrypoint_util.py:ANN,D + src/opentrons/util/helpers.py:ANN,D tests/opentrons/test_init.py:ANN,D tests/opentrons/test_types.py:ANN,D tests/opentrons/conftest.py:ANN,D - tests/opentrons/broker/*:ANN,D tests/opentrons/calibration_storage/*:ANN,D tests/opentrons/commands/*:ANN,D tests/opentrons/config/*:ANN,D @@ -55,4 +57,6 @@ per-file-ignores = tests/opentrons/protocols/*:ANN,D tests/opentrons/system/*:ANN,D tests/opentrons/tools/*:ANN,D - tests/opentrons/util/*:ANN,D + tests/opentrons/util/test_async_helpers.py:ANN,D + tests/opentrons/util/test_linal.py:ANN,D + tests/opentrons/util/test_entrypoint_util.py:ANN,D diff --git a/api/Makefile b/api/Makefile index 770a5026743..a10b737ed8d 100755 --- a/api/Makefile +++ b/api/Makefile @@ -79,7 +79,7 @@ setup: .PHONY: setup-ot2 setup-ot2: $(pipenv) sync $(pipenv_opts) - $(pipenv) run pip uninstall -y opentrons_hardware + $(pipenv) run pip uninstall -y python-can $(pipenv) run pip freeze .PHONY: clean @@ -130,14 +130,11 @@ format: $(python) -m black src tests setup.py docs/build/html/v%: docs/v% - $(sphinx_build_allow_warnings) -b html -d docs/build/doctrees -n $< $@ -# sphinx wont automatically do this because it's only in a template - $(SHX) cp docs/img/lightbulb.jpg $@/_images/ + $(sphinx_build) -b html -d docs/build/doctrees -n $< $@ docs/build/html/hardware: docs/hardware src/opentrons/hardware_control $(sphinx_build_allow_warnings) -b html -d docs/build/doctrees -n $< $@ $(SHX) mkdir $@/_images/ - $(SHX) cp docs/img/lightbulb.jpg $@/_images/ docs/dist/v%: docs/build/html/v% $(SHX) mkdir -p $@ @@ -184,7 +181,8 @@ push-no-restart-ot3: sdist echo $(sdist_file) $(call push-python-sdist,$(host),$(ssh_key),$(ssh_opts),$(sdist_file),/opt/opentrons-robot-server,opentrons,src,,$(version_file)) ssh $(ssh_helper) root@$(host) "mount -o remount,rw / && mkdir -p /usr/local/bin" - scp $(ssh_helper) ./src/opentrons/hardware_control/scripts/{ot3repl,ot3gripper} root@$(host):/usr/local/bin/ + scp $(ssh_helper) ./src/opentrons/hardware_control/scripts/ot3repl root@$(host):/usr/local/bin/ + scp $(ssh_helper) ./src/opentrons/hardware_control/scripts/ot3gripper root@$(host):/usr/local/bin/ ssh $(ssh_helper) root@$(host) "mount -o remount,ro /" .PHONY: push-ot3 @@ -201,8 +199,8 @@ emulator: -$(python) -m opentrons.hardware_control.emulation.app .PHONY: deploy -deploy: wheel - $(call python_upload_package,$(twine_auth_args),$(twine_repository_url),$(wheel_file)) +deploy: wheel sdist + $(call python_upload_package,$(twine_auth_args),$(twine_repository_url),$(wheel_file),$(sdist_file)) # User must currently specify host, e.g.: `make term host=169.254.202.176` .PHONY: term diff --git a/api/Pipfile b/api/Pipfile index 6f18398fd2d..710a5cb6f22 100755 --- a/api/Pipfile +++ b/api/Pipfile @@ -3,43 +3,48 @@ url = "https://pypi.python.org/simple" verify_ssl = true name = "pypi" +[packages] +jsonschema = "==4.17.3" +pydantic = "==1.10.12" +anyio = "==3.7.1" +opentrons-shared-data = { editable = true, path = "../shared-data/python" } +opentrons = { editable = true, path = "." } +opentrons-hardware = { editable = true, path = "./../hardware", extras=["FLEX"] } +numpy = "==1.22.3" + [dev-packages] # atomicwrites and colorama are pytest dependencies on windows, # spec'd here to force lockfile inclusion # https://github.com/pypa/pipenv/issues/4408#issuecomment-668324177 -atomicwrites = { version = "==1.4.0", sys_platform = "== 'win32'" } -colorama = { version = "==0.4.4", sys_platform = "== 'win32'" } -coverage = "==5.1" -mypy = "==0.910" +atomicwrites = { version = "==1.4.0", markers="sys_platform=='win32'" } +colorama = { version = "==0.4.4", markers="sys_platform=='win32'" } +coverage = "==7.4.1" +mypy = "==1.8.0" numpydoc = "==0.9.1" -pytest = "==7.0.1" -pytest-asyncio = "~=0.18" -pytest-cov = "==2.10.1" +pytest = "==7.4.4" +pytest-asyncio = "~=0.23.0" +pytest-cov = "==4.1.0" pytest-lazy-fixture = "==0.6.3" -pytest-xdist = "~=2.2.1" -pygments = "==2.9.0" +pytest-xdist = "~=2.5.0" sphinx = "==5.0.1" -twine = "==2.0.0" -wheel = "==0.30.0" -typeguard = "==2.12.1" +twine = "==4.0.0" +wheel = "==0.37.0" +typeguard = "==4.1.5" sphinx-substitution-extensions = "==2020.9.30.0" sphinxext-opengraph = "==0.8.1" sphinx-tabs = ">=3.4.1,<4" -mock = "~=4.0.2" -flake8 = "~=3.9.0" -flake8-annotations = "~=2.6.2" -flake8-docstrings = "~=1.6.0" -flake8-noqa = "~=1.2.1" -decoy = "~=1.11" +mock = "==5.1.0" +flake8 = "==7.0.0" +flake8-annotations = "~=3.0.1" +flake8-docstrings = "~=1.7.0" +flake8-noqa = "~=1.4.0" +decoy = "==2.1.1" black = "==22.3.0" -types-mock = "==4.0.1" +types-mock = "~=5.1.0" types-setuptools = "==57.0.2" -opentrons-shared-data = { editable = true, path = "../shared-data/python" } -opentrons = { editable = true, path = "." } -opentrons-hardware = { editable = true, path = "./../hardware" } # specify typing-extensions explicitly to force lockfile inclusion on Python >= 3.8 typing-extensions = ">=4.0.0,<5" pytest-profiling = "~=1.7.0" # TODO(mc, 2022-03-31): upgrade sphinx, remove this subdep pin jinja2 = ">=2.3,<3.1" -hypothesis = ">=6.36,<7" +hypothesis = "==6.96.1" diff --git a/api/Pipfile.lock b/api/Pipfile.lock index 279798a84a3..cc9f3163e51 100644 --- a/api/Pipfile.lock +++ b/api/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "20a4273bec8ce91f1718a83db4076e66ffa583d27b35d038215bdb6970342cb5" + "sha256": "f0d4979ecb4f125cef848e0ce31e3a5e9cded69abaf773ad90d00016f6d2a65d" }, "pipfile-spec": 6, "requires": {}, @@ -13,16 +13,7 @@ } ] }, - "default": {}, - "develop": { - "aenum": { - "hashes": [ - "sha256:1d60e15f2e2d4ba66371c19c691edb085ecf82027e773309a9c4291b5cbccc17", - "sha256:7c4b04b5c9621533d6311e6ca23ea2ee213c7a992ed0be79a2b944cdaf2a45ec", - "sha256:93ba417f1c461d2aab6d107204110381d1b3e53561193ae53df3a17701821777" - ], - "version": "==3.1.14" - }, + "default": { "aionotify": { "hashes": [ "sha256:385e1becfaac2d9f4326673033d53912ef9565b6febdedbec593ee966df392c6", @@ -30,21 +21,373 @@ ], "version": "==0.2.0" }, - "alabaster": { + "anyio": { "hashes": [ - "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3", - "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2" + "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", + "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5" ], - "markers": "python_version >= '3.6'", - "version": "==0.7.13" + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==3.7.1" }, - "anyio": { + "attrs": { "hashes": [ - "sha256:929a6852074397afe1d989002aa96d457e3e1e5441357c60d03e7eea0e65e1b0", - "sha256:ae57a67583e5ff8b4af47666ff5651c3732d45fd26c929253748e796af860374" + "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], - "markers": "python_full_version >= '3.6.2'", - "version": "==3.3.0" + "markers": "python_version >= '3.7'", + "version": "==23.2.0" + }, + "click": { + "hashes": [ + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + ], + "markers": "python_version >= '3.7'", + "version": "==8.1.7" + }, + "exceptiongroup": { + "hashes": [ + "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", + "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" + ], + "markers": "python_version < '3.11'", + "version": "==1.2.0" + }, + "idna": { + "hashes": [ + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" + ], + "markers": "python_version >= '3.5'", + "version": "==3.6" + }, + "jsonschema": { + "hashes": [ + "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d", + "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==4.17.3" + }, + "msgpack": { + "hashes": [ + "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862", + "sha256:0bfdd914e55e0d2c9e1526de210f6fe8ffe9705f2b1dfcc4aecc92a4cb4b533d", + "sha256:1dc93e8e4653bdb5910aed79f11e165c85732067614f180f70534f056da97db3", + "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672", + "sha256:235a31ec7db685f5c82233bddf9858748b89b8119bf4538d514536c485c15fe0", + "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9", + "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee", + "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46", + "sha256:36e17c4592231a7dbd2ed09027823ab295d2791b3b1efb2aee874b10548b7524", + "sha256:384d779f0d6f1b110eae74cb0659d9aa6ff35aaf547b3955abf2ab4c901c4819", + "sha256:38949d30b11ae5f95c3c91917ee7a6b239f5ec276f271f28638dec9156f82cfc", + "sha256:3967e4ad1aa9da62fd53e346ed17d7b2e922cba5ab93bdd46febcac39be636fc", + "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1", + "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82", + "sha256:484ae3240666ad34cfa31eea7b8c6cd2f1fdaae21d73ce2974211df099a95d81", + "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6", + "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d", + "sha256:4e71bc4416de195d6e9b4ee93ad3f2f6b2ce11d042b4d7a7ee00bbe0358bd0c2", + "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c", + "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87", + "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84", + "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e", + "sha256:5b6ccc0c85916998d788b295765ea0e9cb9aac7e4a8ed71d12e7d8ac31c23c95", + "sha256:5ed82f5a7af3697b1c4786053736f24a0efd0a1b8a130d4c7bfee4b9ded0f08f", + "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b", + "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93", + "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf", + "sha256:822ea70dc4018c7e6223f13affd1c5c30c0f5c12ac1f96cd8e9949acddb48a61", + "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c", + "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8", + "sha256:8dd178c4c80706546702c59529ffc005681bd6dc2ea234c450661b205445a34d", + "sha256:8f5b234f567cf76ee489502ceb7165c2a5cecec081db2b37e35332b537f8157c", + "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4", + "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba", + "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415", + "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee", + "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d", + "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9", + "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075", + "sha256:bfef2bb6ef068827bbd021017a107194956918ab43ce4d6dc945ffa13efbc25f", + "sha256:cab3db8bab4b7e635c1c97270d7a4b2a90c070b33cbc00c99ef3f9be03d3e1f7", + "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681", + "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329", + "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1", + "sha256:dc43f1ec66eb8440567186ae2f8c447d91e0372d793dfe8c222aec857b81a8cf", + "sha256:dd632777ff3beaaf629f1ab4396caf7ba0bdd075d948a69460d13d44357aca4c", + "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5", + "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b", + "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5", + "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e", + "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b", + "sha256:f26a07a6e877c76a88e3cecac8531908d980d3d5067ff69213653649ec0f60ad", + "sha256:f64e376cd20d3f030190e8c32e1c64582eba56ac6dc7d5b0b49a9d44021b52fd", + "sha256:f6ffbc252eb0d229aeb2f9ad051200668fc3a9aaa8994e49f0cb2ffe2b7867e7", + "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002", + "sha256:ff1d0899f104f3921d94579a5638847f783c9b04f2d5f229392ca77fba5b82fc" + ], + "markers": "platform_system != 'Windows'", + "version": "==1.0.7" + }, + "numpy": { + "hashes": [ + "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676", + "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4", + "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce", + "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123", + "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1", + "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e", + "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5", + "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d", + "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a", + "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab", + "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75", + "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168", + "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4", + "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f", + "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18", + "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62", + "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe", + "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430", + "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802", + "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==1.22.3" + }, + "opentrons": { + "editable": true, + "path": "." + }, + "opentrons-hardware": { + "editable": true, + "extras": [ + "FLEX" + ], + "path": "./../hardware" + }, + "opentrons-shared-data": { + "editable": true, + "path": "../shared-data/python" + }, + "packaging": { + "hashes": [ + "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", + "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" + ], + "markers": "python_version >= '3.7'", + "version": "==23.2" + }, + "pydantic": { + "hashes": [ + "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303", + "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe", + "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47", + "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494", + "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33", + "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86", + "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d", + "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c", + "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a", + "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565", + "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb", + "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62", + "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62", + "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0", + "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523", + "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d", + "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405", + "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f", + "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b", + "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718", + "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed", + "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb", + "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5", + "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc", + "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942", + "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe", + "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246", + "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350", + "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303", + "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09", + "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33", + "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8", + "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a", + "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1", + "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6", + "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==1.10.12" + }, + "pyrsistent": { + "hashes": [ + "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f", + "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e", + "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958", + "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34", + "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca", + "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d", + "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d", + "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4", + "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714", + "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf", + "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee", + "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8", + "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224", + "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d", + "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054", + "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656", + "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7", + "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423", + "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce", + "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e", + "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3", + "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0", + "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f", + "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b", + "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce", + "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a", + "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174", + "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86", + "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f", + "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b", + "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98", + "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022" + ], + "markers": "python_version >= '3.8'", + "version": "==0.20.0" + }, + "pyserial": { + "hashes": [ + "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb", + "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0" + ], + "version": "==3.5" + }, + "python-can": { + "hashes": [ + "sha256:6ad50f4613289f3c4d276b6d2ac8901d776dcb929994cce93f55a69e858c595f", + "sha256:7eea9b81b0ff908000a825db024313f622895bd578e8a17433e0474cd7d2da83" + ], + "markers": "python_version >= '3.7'", + "version": "==4.2.2" + }, + "setuptools": { + "hashes": [ + "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05", + "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78" + ], + "markers": "python_version >= '3.8'", + "version": "==69.0.3" + }, + "sniffio": { + "hashes": [ + "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", + "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" + ], + "markers": "python_version >= '3.7'", + "version": "==1.3.0" + }, + "typing-extensions": { + "hashes": [ + "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" + ], + "markers": "python_version >= '3.8'", + "version": "==4.9.0" + }, + "wrapt": { + "hashes": [ + "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc", + "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81", + "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09", + "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e", + "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca", + "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0", + "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb", + "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487", + "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40", + "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c", + "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060", + "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202", + "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41", + "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9", + "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b", + "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664", + "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d", + "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362", + "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00", + "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc", + "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1", + "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267", + "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956", + "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966", + "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1", + "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228", + "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72", + "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d", + "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292", + "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0", + "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0", + "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36", + "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c", + "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5", + "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f", + "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73", + "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b", + "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2", + "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593", + "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39", + "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389", + "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf", + "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf", + "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89", + "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c", + "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c", + "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f", + "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440", + "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465", + "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136", + "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b", + "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8", + "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3", + "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8", + "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6", + "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e", + "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f", + "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c", + "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e", + "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8", + "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2", + "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020", + "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35", + "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d", + "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3", + "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537", + "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809", + "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d", + "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a", + "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4" + ], + "markers": "python_version >= '3.6'", + "version": "==1.16.0" + } + }, + "develop": { + "alabaster": { + "hashes": [ + "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", + "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92" + ], + "markers": "python_version >= '3.9'", + "version": "==0.7.16" }, "atomicwrites": { "hashes": [ @@ -56,19 +399,19 @@ }, "attrs": { "hashes": [ - "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", - "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" + "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], "markers": "python_version >= '3.7'", - "version": "==23.1.0" + "version": "==23.2.0" }, "babel": { "hashes": [ - "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610", - "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455" + "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363", + "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287" ], "markers": "python_version >= '3.7'", - "version": "==2.12.1" + "version": "==2.14.0" }, "black": { "hashes": [ @@ -97,112 +440,120 @@ "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d" ], "index": "pypi", + "markers": "python_full_version >= '3.6.2'", "version": "==22.3.0" }, - "bleach": { - "hashes": [ - "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414", - "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4" - ], - "markers": "python_version >= '3.7'", - "version": "==6.0.0" - }, "certifi": { "hashes": [ - "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7", - "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" + "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", + "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" ], "markers": "python_version >= '3.6'", - "version": "==2023.5.7" + "version": "==2023.11.17" }, "charset-normalizer": { "hashes": [ - "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6", - "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1", - "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e", - "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373", - "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62", - "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230", - "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be", - "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c", - "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0", - "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448", - "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f", - "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649", - "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d", - "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0", - "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", - "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a", - "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59", - "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23", - "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5", - "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb", - "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e", - "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e", - "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c", - "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28", - "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d", - "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41", - "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974", - "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce", - "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f", - "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1", - "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d", - "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8", - "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017", - "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31", - "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7", - "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8", - "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e", - "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14", - "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd", - "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d", - "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795", - "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b", - "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b", - "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b", - "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203", - "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f", - "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19", - "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1", - "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a", - "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac", - "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9", - "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0", - "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137", - "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f", - "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6", - "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5", - "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909", - "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f", - "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0", - "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324", - "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755", - "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb", - "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854", - "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c", - "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60", - "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84", - "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0", - "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b", - "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1", - "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531", - "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1", - "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11", - "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326", - "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df", - "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.0" + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.3.2" }, "click": { "hashes": [ - "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", - "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" ], "markers": "python_version >= '3.7'", - "version": "==8.1.3" + "version": "==8.1.7" }, "colorama": { "hashes": [ @@ -212,58 +563,134 @@ "markers": "sys_platform == 'win32'", "version": "==0.4.4" }, + "contourpy": { + "hashes": [ + "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8", + "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956", + "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5", + "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063", + "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286", + "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a", + "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686", + "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9", + "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f", + "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4", + "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e", + "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0", + "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e", + "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488", + "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399", + "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431", + "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779", + "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9", + "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab", + "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0", + "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd", + "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e", + "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc", + "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6", + "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316", + "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808", + "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0", + "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f", + "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843", + "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9", + "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95", + "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9", + "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de", + "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4", + "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4", + "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa", + "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8", + "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776", + "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41", + "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108", + "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e", + "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8", + "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727", + "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a" + ], + "markers": "python_version >= '3.9'", + "version": "==1.2.0" + }, "coverage": { - "hashes": [ - "sha256:00f1d23f4336efc3b311ed0d807feb45098fc86dee1ca13b3d6768cdab187c8a", - "sha256:01333e1bd22c59713ba8a79f088b3955946e293114479bbfc2e37d522be03355", - "sha256:0cb4be7e784dcdc050fc58ef05b71aa8e89b7e6636b99967fadbdba694cf2b65", - "sha256:0e61d9803d5851849c24f78227939c701ced6704f337cad0a91e0972c51c1ee7", - "sha256:1601e480b9b99697a570cea7ef749e88123c04b92d84cedaa01e117436b4a0a9", - "sha256:2742c7515b9eb368718cd091bad1a1b44135cc72468c731302b3d641895b83d1", - "sha256:2d27a3f742c98e5c6b461ee6ef7287400a1956c11421eb574d843d9ec1f772f0", - "sha256:402e1744733df483b93abbf209283898e9f0d67470707e3c7516d84f48524f55", - "sha256:5c542d1e62eece33c306d66fe0a5c4f7f7b3c08fecc46ead86d7916684b36d6c", - "sha256:5f2294dbf7875b991c381e3d5af2bcc3494d836affa52b809c91697449d0eda6", - "sha256:6402bd2fdedabbdb63a316308142597534ea8e1895f4e7d8bf7476c5e8751fef", - "sha256:66460ab1599d3cf894bb6baee8c684788819b71a5dc1e8fa2ecc152e5d752019", - "sha256:782caea581a6e9ff75eccda79287daefd1d2631cc09d642b6ee2d6da21fc0a4e", - "sha256:79a3cfd6346ce6c13145731d39db47b7a7b859c0272f02cdb89a3bdcbae233a0", - "sha256:7a5bdad4edec57b5fb8dae7d3ee58622d626fd3a0be0dfceda162a7035885ecf", - "sha256:8fa0cbc7ecad630e5b0f4f35b0f6ad419246b02bc750de7ac66db92667996d24", - "sha256:a027ef0492ede1e03a8054e3c37b8def89a1e3c471482e9f046906ba4f2aafd2", - "sha256:a3f3654d5734a3ece152636aad89f58afc9213c6520062db3978239db122f03c", - "sha256:a82b92b04a23d3c8a581fc049228bafde988abacba397d57ce95fe95e0338ab4", - "sha256:acf3763ed01af8410fc36afea23707d4ea58ba7e86a8ee915dfb9ceff9ef69d0", - "sha256:adeb4c5b608574a3d647011af36f7586811a2c1197c861aedb548dd2453b41cd", - "sha256:b83835506dfc185a319031cf853fa4bb1b3974b1f913f5bb1a0f3d98bdcded04", - "sha256:bb28a7245de68bf29f6fb199545d072d1036a1917dca17a1e75bbb919e14ee8e", - "sha256:bf9cb9a9fd8891e7efd2d44deb24b86d647394b9705b744ff6f8261e6f29a730", - "sha256:c317eaf5ff46a34305b202e73404f55f7389ef834b8dbf4da09b9b9b37f76dd2", - "sha256:dbe8c6ae7534b5b024296464f387d57c13caa942f6d8e6e0346f27e509f0f768", - "sha256:de807ae933cfb7f0c7d9d981a053772452217df2bf38e7e6267c9cbf9545a796", - "sha256:dead2ddede4c7ba6cb3a721870f5141c97dc7d85a079edb4bd8d88c3ad5b20c7", - "sha256:dec5202bfe6f672d4511086e125db035a52b00f1648d6407cc8e526912c0353a", - "sha256:e1ea316102ea1e1770724db01998d1603ed921c54a86a2efcb03428d5417e489", - "sha256:f90bfc4ad18450c80b024036eaf91e4a246ae287701aaa88eaebebf150868052" + "extras": [ + "toml" + ], + "hashes": [ + "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61", + "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1", + "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7", + "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7", + "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75", + "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd", + "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35", + "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04", + "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6", + "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042", + "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166", + "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1", + "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d", + "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c", + "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66", + "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70", + "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1", + "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676", + "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630", + "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a", + "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74", + "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad", + "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19", + "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6", + "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448", + "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018", + "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218", + "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756", + "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54", + "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45", + "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628", + "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968", + "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d", + "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25", + "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60", + "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950", + "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06", + "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295", + "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b", + "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c", + "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc", + "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74", + "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1", + "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee", + "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011", + "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156", + "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766", + "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5", + "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581", + "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016", + "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c", + "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3" ], "index": "pypi", - "version": "==5.1" + "markers": "python_version >= '3.8'", + "version": "==7.4.1" }, "cycler": { "hashes": [ - "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3", - "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f" + "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", + "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" ], - "markers": "python_version >= '3.6'", - "version": "==0.11.0" + "markers": "python_version >= '3.8'", + "version": "==0.12.1" }, "decoy": { "hashes": [ - "sha256:57327a6ec24c4f4804d978f9c770cb0ff778d2ed751a45ffc61226bf10fc9f90", - "sha256:dea3634ed92eca686f71e66dfd43350adc1a96c814fb5492a08d3c251c531149" + "sha256:575bdbe81afb4c152cd99a34568a9aa4369461f79d6172c678279c5d5585befe", + "sha256:7ddcc08b8ce991f7705cee76fae9061dcb17352e0a1ca2d9a0d4a0306ebd51cd" ], "index": "pypi", - "version": "==1.11.3" + "markers": "python_version >= '3.7' and python_version < '4.0'", + "version": "==2.1.1" }, "docutils": { "hashes": [ @@ -275,59 +702,103 @@ }, "exceptiongroup": { "hashes": [ - "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e", - "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785" + "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", + "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" ], "markers": "python_version < '3.11'", - "version": "==1.1.1" + "version": "==1.2.0" }, "execnet": { "hashes": [ - "sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5", - "sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142" + "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41", + "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.9.0" + "markers": "python_version >= '3.7'", + "version": "==2.0.2" }, "flake8": { "hashes": [ - "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b", - "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907" + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", - "version": "==3.9.2" + "markers": "python_full_version >= '3.8.1'", + "version": "==7.0.0" }, "flake8-annotations": { "hashes": [ - "sha256:0d6cd2e770b5095f09689c9d84cc054c51b929c41a68969ea1beb4b825cac515", - "sha256:d10c4638231f8a50c0a597c4efce42bd7b7d85df4f620a0ddaca526138936a4f" + "sha256:af78e3216ad800d7e144745ece6df706c81b3255290cbf870e54879d495e8ade", + "sha256:ff37375e71e3b83f2a5a04d443c41e2c407de557a884f3300a7fa32f3c41cb0a" ], "index": "pypi", - "version": "==2.6.2" + "markers": "python_full_version >= '3.8.1'", + "version": "==3.0.1" }, "flake8-docstrings": { "hashes": [ - "sha256:99cac583d6c7e32dd28bbfbef120a7c0d1b6dde4adb5a9fd441c4227a6534bde", - "sha256:9fe7c6a306064af8e62a055c2f61e9eb1da55f84bb39caef2b84ce53708ac34b" + "sha256:4c8cc748dc16e6869728699e5d0d685da9a10b0ea718e090b1ba088e67a941af", + "sha256:51f2344026da083fc084166a9353f5082b01f72901df422f74b4d953ae88ac75" ], "index": "pypi", - "version": "==1.6.0" + "markers": "python_version >= '3.7'", + "version": "==1.7.0" }, "flake8-noqa": { "hashes": [ - "sha256:26d92ca6b72dec732d294e587a2bdeb66dab01acc609ed6a064693d6baa4e789", - "sha256:445618162e0bbae1b9d983326d4e39066c5c6de71ba0c444ca2d4d1fa5b2cdb7" + "sha256:4465e16a19be433980f6f563d05540e2e54797eb11facb9feb50fed60624dc45", + "sha256:771765ab27d1efd157528379acd15131147f9ae578a72d17fb432ca197881243" ], "index": "pypi", - "version": "==1.2.9" + "markers": "python_version >= '3.7'", + "version": "==1.4.0" }, "fonttools": { "hashes": [ - "sha256:2bb244009f9bf3fa100fc3ead6aeb99febe5985fa20afbfbaa2f8946c2fbdaf1", - "sha256:820466f43c8be8c3009aef8b87e785014133508f0de64ec469e4efb643ae54fb" - ], - "markers": "python_version >= '3.7'", - "version": "==4.38.0" + "sha256:0255dbc128fee75fb9be364806b940ed450dd6838672a150d501ee86523ac61e", + "sha256:0a00bd0e68e88987dcc047ea31c26d40a3c61185153b03457956a87e39d43c37", + "sha256:0a1d313a415eaaba2b35d6cd33536560deeebd2ed758b9bfb89ab5d97dc5deac", + "sha256:0f750037e02beb8b3569fbff701a572e62a685d2a0e840d75816592280e5feae", + "sha256:13819db8445a0cec8c3ff5f243af6418ab19175072a9a92f6cc8ca7d1452754b", + "sha256:254d9a6f7be00212bf0c3159e0a420eb19c63793b2c05e049eb337f3023c5ecc", + "sha256:29495d6d109cdbabe73cfb6f419ce67080c3ef9ea1e08d5750240fd4b0c4763b", + "sha256:32ab2e9702dff0dd4510c7bb958f265a8d3dd5c0e2547e7b5f7a3df4979abb07", + "sha256:3480eeb52770ff75140fe7d9a2ec33fb67b07efea0ab5129c7e0c6a639c40c70", + "sha256:3a808f3c1d1df1f5bf39be869b6e0c263570cdafb5bdb2df66087733f566ea71", + "sha256:3b629108351d25512d4ea1a8393a2dba325b7b7d7308116b605ea3f8e1be88df", + "sha256:3d71606c9321f6701642bd4746f99b6089e53d7e9817fc6b964e90d9c5f0ecc6", + "sha256:3e2b95dce2ead58fb12524d0ca7d63a63459dd489e7e5838c3cd53557f8933e1", + "sha256:4a5a5318ba5365d992666ac4fe35365f93004109d18858a3e18ae46f67907670", + "sha256:4c811d3c73b6abac275babb8aa439206288f56fdb2c6f8835e3d7b70de8937a7", + "sha256:4e743935139aa485fe3253fc33fe467eab6ea42583fa681223ea3f1a93dd01e6", + "sha256:4ec558c543609e71b2275c4894e93493f65d2f41c15fe1d089080c1d0bb4d635", + "sha256:5465df494f20a7d01712b072ae3ee9ad2887004701b95cb2cc6dcb9c2c97a899", + "sha256:5b60e3afa9635e3dfd3ace2757039593e3bd3cf128be0ddb7a1ff4ac45fa5a50", + "sha256:63fbed184979f09a65aa9c88b395ca539c94287ba3a364517698462e13e457c9", + "sha256:69731e8bea0578b3c28fdb43dbf95b9386e2d49a399e9a4ad736b8e479b08085", + "sha256:6dd58cc03016b281bd2c74c84cdaa6bd3ce54c5a7f47478b7657b930ac3ed8eb", + "sha256:740947906590a878a4bde7dd748e85fefa4d470a268b964748403b3ab2aeed6c", + "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3", + "sha256:7eb7ad665258fba68fd22228a09f347469d95a97fb88198e133595947a20a184", + "sha256:7ee48bd9d6b7e8f66866c9090807e3a4a56cf43ffad48962725a190e0dd774c8", + "sha256:86e0427864c6c91cf77f16d1fb9bf1bbf7453e824589e8fb8461b6ee1144f506", + "sha256:8f57ecd742545362a0f7186774b2d1c53423ed9ece67689c93a1055b236f638c", + "sha256:90f898cdd67f52f18049250a6474185ef6544c91f27a7bee70d87d77a8daf89c", + "sha256:94208ea750e3f96e267f394d5588579bb64cc628e321dbb1d4243ffbc291b18b", + "sha256:a1c154bb85dc9a4cf145250c88d112d88eb414bad81d4cb524d06258dea1bdc0", + "sha256:a5d77479fb885ef38a16a253a2f4096bc3d14e63a56d6246bfdb56365a12b20c", + "sha256:a86a5ab2873ed2575d0fcdf1828143cfc6b977ac448e3dc616bb1e3d20efbafa", + "sha256:ac71e2e201df041a2891067dc36256755b1229ae167edbdc419b16da78732c2f", + "sha256:b3e1304e5f19ca861d86a72218ecce68f391646d85c851742d265787f55457a4", + "sha256:b8be28c036b9f186e8c7eaf8a11b42373e7e4949f9e9f370202b9da4c4c3f56c", + "sha256:c19044256c44fe299d9a73456aabee4b4d06c6b930287be93b533b4737d70aa1", + "sha256:d49ce3ea7b7173faebc5664872243b40cf88814ca3eb135c4a3cdff66af71946", + "sha256:e040f905d542362e07e72e03612a6270c33d38281fd573160e1003e43718d68d", + "sha256:eabae77a07c41ae0b35184894202305c3ad211a93b2eb53837c2a1143c8bc952", + "sha256:f791446ff297fd5f1e2247c188de53c1bfb9dd7f0549eba55b73a3c2087a2703", + "sha256:f83a4daef6d2a202acb9bf572958f91cfde5b10c8ee7fb1d09a4c81e5d851fd8" + ], + "markers": "python_version >= '3.8'", + "version": "==4.47.2" }, "gprof2dot": { "hashes": [ @@ -339,19 +810,20 @@ }, "hypothesis": { "hashes": [ - "sha256:245bed0fcf7612caa0ca1ecaa5c1e3a7100bbf9fd0fe4a24bdd9e46249b2774f", - "sha256:69b55ee1dae2c7edd214e273a977d0dfba542946a211c9ef1f958743b49e430e" + "sha256:848ea0952f0bdfd02eac59e41b03f1cbba8fa2cffeffa8db328bbd6cfe159974", + "sha256:955a57e56be4607c81c17ca53e594af54aadeed91e07b88bb7f84e8208ea7739" ], "index": "pypi", - "version": "==6.79.3" + "markers": "python_version >= '3.8'", + "version": "==6.96.1" }, "idna": { "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" ], "markers": "python_version >= '3.5'", - "version": "==3.4" + "version": "==3.6" }, "imagesize": { "hashes": [ @@ -363,11 +835,11 @@ }, "importlib-metadata": { "hashes": [ - "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116", - "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d" + "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e", + "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc" ], - "markers": "python_version < '3.10'", - "version": "==4.13.0" + "markers": "python_version >= '3.8'", + "version": "==7.0.1" }, "iniconfig": { "hashes": [ @@ -377,279 +849,371 @@ "markers": "python_version >= '3.7'", "version": "==2.0.0" }, + "jaraco.classes": { + "hashes": [ + "sha256:10afa92b6743f25c0cf5f37c6bb6e18e2c5bb84a16527ccfc0040ea377e7aaeb", + "sha256:c063dd08e89217cee02c8d5e5ec560f2c8ce6cdc2fcdc2e68f7b2e5547ed3621" + ], + "markers": "python_version >= '3.8'", + "version": "==3.3.0" + }, "jinja2": { "hashes": [ "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8", "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==3.0.3" }, - "jsonschema": { + "keyring": { "hashes": [ - "sha256:5f9c0a719ca2ce14c5de2fd350a64fd2d13e8539db29836a86adc990bb1a068f", - "sha256:8d4a2b7b6c2237e0199c8ea1a6d3e05bf118e289ae2b9d7ba444182a2959560d" + "sha256:4446d35d636e6a10b8bce7caa66913dd9eca5fd222ca03a3d42c38608ac30836", + "sha256:e730ecffd309658a08ee82535a3b5ec4b4c8669a9be11efb66249d8e0aeb9a25" ], - "version": "==3.0.2" + "markers": "python_version >= '3.8'", + "version": "==24.3.0" }, "kiwisolver": { "hashes": [ - "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b", - "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166", - "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c", - "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c", - "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0", - "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4", - "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9", - "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286", - "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767", - "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c", - "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6", - "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b", - "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004", - "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf", - "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494", - "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac", - "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626", - "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766", - "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514", - "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6", - "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f", - "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d", - "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191", - "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d", - "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51", - "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f", - "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8", - "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454", - "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb", - "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da", - "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8", - "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de", - "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a", - "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9", - "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008", - "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3", - "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32", - "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938", - "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1", - "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9", - "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d", - "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824", - "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b", - "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd", - "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2", - "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5", - "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69", - "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3", - "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae", - "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597", - "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e", - "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955", - "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca", - "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a", - "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea", - "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede", - "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4", - "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6", - "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686", - "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408", - "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871", - "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29", - "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750", - "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897", - "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0", - "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2", - "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09", - "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c" + "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf", + "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e", + "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af", + "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f", + "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046", + "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3", + "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5", + "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71", + "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee", + "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3", + "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9", + "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b", + "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985", + "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea", + "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16", + "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89", + "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c", + "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9", + "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712", + "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342", + "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a", + "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958", + "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d", + "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a", + "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130", + "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff", + "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898", + "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b", + "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f", + "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265", + "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93", + "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929", + "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635", + "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709", + "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b", + "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb", + "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a", + "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920", + "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e", + "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544", + "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45", + "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390", + "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77", + "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355", + "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff", + "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4", + "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7", + "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20", + "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c", + "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162", + "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228", + "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437", + "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc", + "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a", + "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901", + "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4", + "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770", + "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525", + "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad", + "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a", + "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29", + "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90", + "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250", + "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d", + "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3", + "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54", + "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f", + "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1", + "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da", + "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238", + "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa", + "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523", + "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0", + "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205", + "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3", + "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4", + "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac", + "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9", + "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb", + "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced", + "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd", + "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0", + "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da", + "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18", + "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9", + "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276", + "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333", + "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b", + "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db", + "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126", + "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9", + "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09", + "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0", + "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec", + "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7", + "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff", + "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9", + "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192", + "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8", + "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d", + "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6", + "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797", + "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892", + "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f" ], "markers": "python_version >= '3.7'", - "version": "==1.4.4" + "version": "==1.4.5" + }, + "markdown-it-py": { + "hashes": [ + "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", + "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb" + ], + "markers": "python_version >= '3.8'", + "version": "==3.0.0" }, "markupsafe": { "hashes": [ - "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", - "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", - "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", - "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", - "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", - "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", - "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", - "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", - "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", - "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", - "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", - "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", - "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", - "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", - "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", - "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", - "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", - "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", - "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", - "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", - "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", - "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", - "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", - "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", - "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0", - "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", - "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", - "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", - "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", - "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", - "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", - "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", - "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", - "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", - "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", - "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee", - "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc", - "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2", - "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48", - "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7", - "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e", - "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b", - "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa", - "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5", - "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e", - "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb", - "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", - "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", - "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", - "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2" + "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69", + "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0", + "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d", + "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec", + "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5", + "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411", + "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3", + "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74", + "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0", + "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949", + "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d", + "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279", + "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f", + "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6", + "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc", + "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e", + "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954", + "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656", + "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc", + "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518", + "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56", + "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc", + "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa", + "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565", + "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4", + "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb", + "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250", + "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4", + "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959", + "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc", + "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474", + "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863", + "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8", + "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f", + "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2", + "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e", + "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e", + "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb", + "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f", + "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a", + "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26", + "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d", + "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2", + "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131", + "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789", + "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6", + "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a", + "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858", + "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e", + "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb", + "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e", + "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84", + "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7", + "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea", + "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b", + "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6", + "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475", + "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74", + "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a", + "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00" ], "markers": "python_version >= '3.7'", - "version": "==2.1.3" + "version": "==2.1.4" }, "matplotlib": { "hashes": [ - "sha256:0bcdfcb0f976e1bac6721d7d457c17be23cf7501f977b6a38f9d38a3762841f7", - "sha256:1e64ac9be9da6bfff0a732e62116484b93b02a0b4d4b19934fb4f8e7ad26ad6a", - "sha256:22227c976ad4dc8c5a5057540421f0d8708c6560744ad2ad638d48e2984e1dbc", - "sha256:2886cc009f40e2984c083687251821f305d811d38e3df8ded414265e4583f0c5", - "sha256:2e6d184ebe291b9e8f7e78bbab7987d269c38ea3e062eace1fe7d898042ef804", - "sha256:3211ba82b9f1518d346f6309df137b50c3dc4421b4ed4815d1d7eadc617f45a1", - "sha256:339cac48b80ddbc8bfd05daae0a3a73414651a8596904c2a881cfd1edb65f26c", - "sha256:35a8ad4dddebd51f94c5d24bec689ec0ec66173bf614374a1244c6241c1595e0", - "sha256:3b4fa56159dc3c7f9250df88f653f085068bcd32dcd38e479bba58909254af7f", - "sha256:43e9d3fa077bf0cc95ded13d331d2156f9973dce17c6f0c8b49ccd57af94dbd9", - "sha256:57f1b4e69f438a99bb64d7f2c340db1b096b41ebaa515cf61ea72624279220ce", - "sha256:5c096363b206a3caf43773abebdbb5a23ea13faef71d701b21a9c27fdcef72f4", - "sha256:6bb93a0492d68461bd458eba878f52fdc8ac7bdb6c4acdfe43dba684787838c2", - "sha256:6ea6aef5c4338e58d8d376068e28f80a24f54e69f09479d1c90b7172bad9f25b", - "sha256:6fe807e8a22620b4cd95cfbc795ba310dc80151d43b037257250faf0bfcd82bc", - "sha256:73dd93dc35c85dece610cca8358003bf0760d7986f70b223e2306b4ea6d1406b", - "sha256:839d47b8ead7ad9669aaacdbc03f29656dc21f0d41a6fea2d473d856c39c8b1c", - "sha256:874df7505ba820e0400e7091199decf3ff1fde0583652120c50cd60d5820ca9a", - "sha256:879c7e5fce4939c6aa04581dfe08d57eb6102a71f2e202e3314d5fbc072fd5a0", - "sha256:94ff86af56a3869a4ae26a9637a849effd7643858a1a04dd5ee50e9ab75069a7", - "sha256:99482b83ebf4eb6d5fc6813d7aacdefdd480f0d9c0b52dcf9f1cc3b2c4b3361a", - "sha256:9ab29589cef03bc88acfa3a1490359000c18186fc30374d8aa77d33cc4a51a4a", - "sha256:9befa5954cdbc085e37d974ff6053da269474177921dd61facdad8023c4aeb51", - "sha256:a206a1b762b39398efea838f528b3a6d60cdb26fe9d58b48265787e29cd1d693", - "sha256:ab8d26f07fe64f6f6736d635cce7bfd7f625320490ed5bfc347f2cdb4fae0e56", - "sha256:b28de401d928890187c589036857a270a032961411934bdac4cf12dde3d43094", - "sha256:b428076a55fb1c084c76cb93e68006f27d247169f056412607c5c88828d08f88", - "sha256:bf618a825deb6205f015df6dfe6167a5d9b351203b03fab82043ae1d30f16511", - "sha256:c995f7d9568f18b5db131ab124c64e51b6820a92d10246d4f2b3f3a66698a15b", - "sha256:cd45a6f3e93a780185f70f05cf2a383daed13c3489233faad83e81720f7ede24", - "sha256:d2484b350bf3d32cae43f85dcfc89b3ed7bd2bcd781ef351f93eb6fb2cc483f9", - "sha256:d62880e1f60e5a30a2a8484432bcb3a5056969dc97258d7326ad465feb7ae069", - "sha256:dacddf5bfcec60e3f26ec5c0ae3d0274853a258b6c3fc5ef2f06a8eb23e042be", - "sha256:f3840c280ebc87a48488a46f760ea1c0c0c83fcf7abbe2e6baf99d033fd35fd8", - "sha256:f814504e459c68118bf2246a530ed953ebd18213dc20e3da524174d84ed010b2" - ], - "markers": "python_version >= '3.7'", - "version": "==3.5.3" + "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1", + "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0", + "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4", + "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7", + "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630", + "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89", + "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d", + "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717", + "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a", + "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627", + "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31", + "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213", + "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843", + "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788", + "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367", + "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4", + "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a", + "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8", + "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b", + "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18", + "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6", + "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa", + "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917", + "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20", + "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331", + "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63", + "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f", + "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8" + ], + "markers": "python_version >= '3.9'", + "version": "==3.8.2" }, "mccabe": { "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "mdurl": { + "hashes": [ + "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", + "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" ], - "version": "==0.6.1" + "markers": "python_version >= '3.7'", + "version": "==0.1.2" }, "mock": { "hashes": [ - "sha256:122fcb64ee37cfad5b3f48d7a7d51875d7031aaf3d8be7c42e2bee25044eee62", - "sha256:7d3fbbde18228f4ff2f1f119a45cdffa458b4c0dee32eb4d2bb2f82554bac7bc" + "sha256:18c694e5ae8a208cdb3d2c20a993ca1a7b0efa258c247a1e565150f477f83744", + "sha256:5e96aad5ccda4718e0a229ed94b2024df75cc2d55575ba5762d31f5767b8767d" ], "index": "pypi", - "version": "==4.0.3" + "markers": "python_version >= '3.6'", + "version": "==5.1.0" + }, + "more-itertools": { + "hashes": [ + "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684", + "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1" + ], + "markers": "python_version >= '3.8'", + "version": "==10.2.0" }, "mypy": { "hashes": [ - "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9", - "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a", - "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9", - "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e", - "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2", - "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212", - "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b", - "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885", - "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150", - "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703", - "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072", - "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457", - "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e", - "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0", - "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb", - "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97", - "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8", - "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811", - "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6", - "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de", - "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504", - "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921", - "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d" + "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6", + "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d", + "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02", + "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d", + "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3", + "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3", + "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3", + "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66", + "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259", + "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835", + "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd", + "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d", + "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8", + "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07", + "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b", + "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e", + "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6", + "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae", + "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9", + "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d", + "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a", + "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592", + "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218", + "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817", + "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4", + "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410", + "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55" ], "index": "pypi", - "version": "==0.910" + "markers": "python_version >= '3.8'", + "version": "==1.8.0" }, "mypy-extensions": { "hashes": [ - "sha256:c8b707883a96efe9b4bb3aaf0dcc07e7e217d7d8368eec4db4049ee9e142f4fd" + "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", + "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" ], - "markers": "python_version >= '2.7'", - "version": "==0.4.4" + "markers": "python_version >= '3.5'", + "version": "==1.0.0" + }, + "nh3": { + "hashes": [ + "sha256:0d02d0ff79dfd8208ed25a39c12cbda092388fff7f1662466e27d97ad011b770", + "sha256:3277481293b868b2715907310c7be0f1b9d10491d5adf9fce11756a97e97eddf", + "sha256:3b803a5875e7234907f7d64777dfde2b93db992376f3d6d7af7f3bc347deb305", + "sha256:427fecbb1031db085eaac9931362adf4a796428ef0163070c484b5a768e71601", + "sha256:5f0d77272ce6d34db6c87b4f894f037d55183d9518f948bba236fe81e2bb4e28", + "sha256:60684857cfa8fdbb74daa867e5cad3f0c9789415aba660614fe16cd66cbb9ec7", + "sha256:6f42f99f0cf6312e470b6c09e04da31f9abaadcd3eb591d7d1a88ea931dca7f3", + "sha256:86e447a63ca0b16318deb62498db4f76fc60699ce0a1231262880b38b6cff911", + "sha256:8d595df02413aa38586c24811237e95937ef18304e108b7e92c890a06793e3bf", + "sha256:9c0d415f6b7f2338f93035bba5c0d8c1b464e538bfbb1d598acd47d7969284f0", + "sha256:a5167a6403d19c515217b6bcaaa9be420974a6ac30e0da9e84d4fc67a5d474c5", + "sha256:ac19c0d68cd42ecd7ead91a3a032fdfff23d29302dbb1311e641a130dfefba97", + "sha256:b1e97221cedaf15a54f5243f2c5894bb12ca951ae4ddfd02a9d4ea9df9e1a29d", + "sha256:bc2d086fb540d0fa52ce35afaded4ea526b8fc4d3339f783db55c95de40ef02e", + "sha256:d1e30ff2d8d58fb2a14961f7aac1bbb1c51f9bdd7da727be35c63826060b0bf3", + "sha256:f3b53ba93bb7725acab1e030bc2ecd012a817040fd7851b332f86e2f9bb98dc6" + ], + "version": "==0.2.15" }, "numpy": { "hashes": [ - "sha256:1dbe1c91269f880e364526649a52eff93ac30035507ae980d2fed33aaee633ac", - "sha256:357768c2e4451ac241465157a3e929b265dfac85d9214074985b1786244f2ef3", - "sha256:3820724272f9913b597ccd13a467cc492a0da6b05df26ea09e78b171a0bb9da6", - "sha256:4391bd07606be175aafd267ef9bea87cf1b8210c787666ce82073b05f202add1", - "sha256:4aa48afdce4660b0076a00d80afa54e8a97cd49f457d68a4342d188a09451c1a", - "sha256:58459d3bad03343ac4b1b42ed14d571b8743dc80ccbf27444f266729df1d6f5b", - "sha256:5c3c8def4230e1b959671eb959083661b4a0d2e9af93ee339c7dada6759a9470", - "sha256:5f30427731561ce75d7048ac254dbe47a2ba576229250fb60f0fb74db96501a1", - "sha256:643843bcc1c50526b3a71cd2ee561cf0d8773f062c8cbaf9ffac9fdf573f83ab", - "sha256:67c261d6c0a9981820c3a149d255a76918278a6b03b6a036800359aba1256d46", - "sha256:67f21981ba2f9d7ba9ade60c9e8cbaa8cf8e9ae51673934480e45cf55e953673", - "sha256:6aaf96c7f8cebc220cdfc03f1d5a31952f027dda050e5a703a0d1c396075e3e7", - "sha256:7c4068a8c44014b2d55f3c3f574c376b2494ca9cc73d2f1bd692382b6dffe3db", - "sha256:7c7e5fa88d9ff656e067876e4736379cc962d185d5cd808014a8a928d529ef4e", - "sha256:7f5ae4f304257569ef3b948810816bc87c9146e8c446053539947eedeaa32786", - "sha256:82691fda7c3f77c90e62da69ae60b5ac08e87e775b09813559f8901a88266552", - "sha256:8737609c3bbdd48e380d463134a35ffad3b22dc56295eff6f79fd85bd0eeeb25", - "sha256:9f411b2c3f3d76bba0865b35a425157c5dcf54937f82bbeb3d3c180789dd66a6", - "sha256:a6be4cb0ef3b8c9250c19cc122267263093eee7edd4e3fa75395dfda8c17a8e2", - "sha256:bcb238c9c96c00d3085b264e5c1a1207672577b93fa666c3b14a45240b14123a", - "sha256:bf2ec4b75d0e9356edea834d1de42b31fe11f726a81dfb2c2112bc1eaa508fcf", - "sha256:d136337ae3cc69aa5e447e78d8e1514be8c3ec9b54264e680cf0b4bd9011574f", - "sha256:d4bf4d43077db55589ffc9009c0ba0a94fa4908b9586d6ccce2e0b164c86303c", - "sha256:d6a96eef20f639e6a97d23e57dd0c1b1069a7b4fd7027482a4c5c451cd7732f4", - "sha256:d9caa9d5e682102453d96a0ee10c7241b72859b01a941a397fd965f23b3e016b", - "sha256:dd1c8f6bd65d07d3810b90d02eba7997e32abbdf1277a481d698969e921a3be0", - "sha256:e31f0bb5928b793169b87e3d1e070f2342b22d5245c755e2b81caa29756246c3", - "sha256:ecb55251139706669fdec2ff073c98ef8e9a84473e51e716211b41aa0f18e656", - "sha256:ee5ec40fdd06d62fe5d4084bef4fd50fd4bb6bfd2bf519365f569dc470163ab0", - "sha256:f17e562de9edf691a42ddb1eb4a5541c20dd3f9e65b09ded2beb0799c0cf29bb", - "sha256:fdffbfb6832cd0b300995a2b08b8f6fa9f6e856d562800fea9182316d99c4e8e" - ], - "markers": "python_version < '3.11' and python_version >= '3.7'", - "version": "==1.21.6" + "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676", + "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4", + "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce", + "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123", + "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1", + "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e", + "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5", + "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d", + "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a", + "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab", + "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75", + "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168", + "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4", + "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f", + "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18", + "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62", + "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe", + "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430", + "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802", + "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==1.22.3" }, "numpydoc": { "hashes": [ @@ -658,105 +1222,95 @@ "index": "pypi", "version": "==0.9.1" }, - "opentrons": { - "editable": true, - "path": "." - }, - "opentrons-hardware": { - "editable": true, - "path": "./../hardware" - }, - "opentrons-shared-data": { - "editable": true, - "path": "./../shared-data/python" - }, "packaging": { "hashes": [ - "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", - "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" + "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", + "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" ], "markers": "python_version >= '3.7'", - "version": "==23.1" + "version": "==23.2" }, "pathspec": { "hashes": [ - "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687", - "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293" + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" ], - "markers": "python_version >= '3.7'", - "version": "==0.11.1" + "markers": "python_version >= '3.8'", + "version": "==0.12.1" }, "pillow": { "hashes": [ - "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1", - "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba", - "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a", - "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799", - "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51", - "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb", - "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5", - "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270", - "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6", - "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47", - "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf", - "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e", - "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b", - "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66", - "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865", - "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec", - "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c", - "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1", - "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38", - "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906", - "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705", - "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef", - "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc", - "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f", - "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf", - "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392", - "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d", - "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe", - "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32", - "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5", - "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7", - "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44", - "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d", - "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3", - "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625", - "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e", - "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829", - "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089", - "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3", - "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78", - "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96", - "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964", - "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597", - "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99", - "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a", - "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140", - "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7", - "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16", - "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903", - "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1", - "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296", - "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572", - "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115", - "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a", - "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd", - "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4", - "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1", - "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb", - "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa", - "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a", - "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569", - "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c", - "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf", - "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082", - "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062", - "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579" - ], - "markers": "python_version >= '3.7'", - "version": "==9.5.0" + "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8", + "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39", + "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac", + "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869", + "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e", + "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04", + "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9", + "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e", + "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe", + "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef", + "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56", + "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa", + "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f", + "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f", + "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e", + "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a", + "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2", + "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2", + "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5", + "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a", + "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2", + "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213", + "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563", + "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591", + "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c", + "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2", + "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb", + "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757", + "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0", + "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452", + "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad", + "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01", + "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f", + "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5", + "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61", + "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e", + "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b", + "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068", + "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9", + "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588", + "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483", + "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f", + "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67", + "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7", + "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311", + "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6", + "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72", + "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6", + "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129", + "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13", + "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67", + "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c", + "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516", + "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e", + "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e", + "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364", + "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023", + "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1", + "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04", + "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d", + "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a", + "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7", + "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb", + "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4", + "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e", + "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1", + "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48", + "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868" + ], + "markers": "python_version >= '3.8'", + "version": "==10.2.0" }, "pkginfo": { "hashes": [ @@ -768,19 +1322,19 @@ }, "platformdirs": { "hashes": [ - "sha256:b0cabcb11063d21a0b261d557acb0a9d2126350e63b70cdf7db6347baea456dc", - "sha256:ca9ed98ce73076ba72e092b23d3c93ea6c4e186b3f1c3dad6edd98ff6ffcca2e" + "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", + "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" ], - "markers": "python_version >= '3.7'", - "version": "==3.8.0" + "markers": "python_version >= '3.8'", + "version": "==4.2.0" }, "pluggy": { "hashes": [ - "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849", - "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3" + "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", + "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be" ], - "markers": "python_version >= '3.7'", - "version": "==1.2.0" + "markers": "python_version >= '3.8'", + "version": "==1.4.0" }, "py": { "hashes": [ @@ -792,39 +1346,11 @@ }, "pycodestyle": { "hashes": [ - "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068", - "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef" + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.7.0" - }, - "pydantic": { - "hashes": [ - "sha256:021ea0e4133e8c824775a0cfe098677acf6fa5a3cbf9206a376eed3fc09302cd", - "sha256:05ddfd37c1720c392f4e0d43c484217b7521558302e7069ce8d318438d297739", - "sha256:05ef5246a7ffd2ce12a619cbb29f3307b7c4509307b1b49f456657b43529dc6f", - "sha256:10e5622224245941efc193ad1d159887872776df7a8fd592ed746aa25d071840", - "sha256:18b5ea242dd3e62dbf89b2b0ec9ba6c7b5abaf6af85b95a97b00279f65845a23", - "sha256:234a6c19f1c14e25e362cb05c68afb7f183eb931dd3cd4605eafff055ebbf287", - "sha256:244ad78eeb388a43b0c927e74d3af78008e944074b7d0f4f696ddd5b2af43c62", - "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b", - "sha256:41b542c0b3c42dc17da70554bc6f38cbc30d7066d2c2815a94499b5684582ecb", - "sha256:4a03cbbe743e9c7247ceae6f0d8898f7a64bb65800a45cbdc52d65e370570820", - "sha256:4be75bebf676a5f0f87937c6ddb061fa39cbea067240d98e298508c1bda6f3f3", - "sha256:54cd5121383f4a461ff7644c7ca20c0419d58052db70d8791eacbbe31528916b", - "sha256:589eb6cd6361e8ac341db97602eb7f354551482368a37f4fd086c0733548308e", - "sha256:8621559dcf5afacf0069ed194278f35c255dc1a1385c28b32dd6c110fd6531b3", - "sha256:8b223557f9510cf0bfd8b01316bf6dd281cf41826607eada99662f5e4963f316", - "sha256:99a9fc39470010c45c161a1dc584997f1feb13f689ecf645f59bb4ba623e586b", - "sha256:a7c6002203fe2c5a1b5cbb141bb85060cbff88c2d78eccbc72d97eb7022c43e4", - "sha256:a83db7205f60c6a86f2c44a61791d993dff4b73135df1973ecd9eed5ea0bda20", - "sha256:ac8eed4ca3bd3aadc58a13c2aa93cd8a884bcf21cb019f8cfecaae3b6ce3746e", - "sha256:e710876437bc07bd414ff453ac8ec63d219e7690128d925c6e82889d674bb505", - "sha256:ea5cb40a3b23b3265f6325727ddfc45141b08ed665458be8c6285e7b85bd73a1", - "sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833" - ], - "markers": "python_full_version >= '3.6.1'", - "version": "==1.8.2" + "markers": "python_version >= '3.8'", + "version": "==2.11.1" }, "pydocstyle": { "hashes": [ @@ -836,91 +1362,54 @@ }, "pyflakes": { "hashes": [ - "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3", - "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db" + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.3.1" + "markers": "python_version >= '3.8'", + "version": "==3.2.0" }, "pygments": { "hashes": [ - "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f", - "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e" + "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", + "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" ], - "index": "pypi", - "version": "==2.9.0" + "markers": "python_version >= '3.7'", + "version": "==2.17.2" }, "pyparsing": { "hashes": [ - "sha256:d554a96d1a7d3ddaf7183104485bc19fd80543ad6ac5bdb6426719d766fb06c1", - "sha256:edb662d6fe322d6e990b1594b5feaeadf806803359e3d4d42f11e295e588f0ea" + "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb", + "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db" ], "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.0" - }, - "pyrsistent": { - "hashes": [ - "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8", - "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440", - "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a", - "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c", - "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3", - "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393", - "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9", - "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da", - "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf", - "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64", - "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a", - "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3", - "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98", - "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2", - "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8", - "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf", - "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc", - "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7", - "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28", - "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2", - "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b", - "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a", - "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64", - "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19", - "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1", - "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9", - "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c" - ], - "markers": "python_version >= '3.7'", - "version": "==0.19.3" - }, - "pyserial": { - "hashes": [ - "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb", - "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0" - ], - "version": "==3.5" + "version": "==3.1.1" }, "pytest": { "hashes": [ - "sha256:9ce3ff477af913ecf6321fe337b93a2c0dcf2a0a1439c43f5452112c1e4280db", - "sha256:e30905a0c131d3d94b89624a1cc5afec3e0ba2fbdb151867d8e0ebd49850f171" + "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", + "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8" ], "index": "pypi", - "version": "==7.0.1" + "markers": "python_version >= '3.7'", + "version": "==7.4.4" }, "pytest-asyncio": { "hashes": [ - "sha256:2b38a496aef56f56b0e87557ec313e11e1ab9276fc3863f6a7be0f1d0e415e1b", - "sha256:f2b3366b7cd501a4056858bd39349d5af19742aed2d81660b7998b6341c7eb9c" + "sha256:2143d9d9375bf372a73260e4114541485e84fca350b0b6b92674ca56ff5f7ea2", + "sha256:b0079dfac14b60cd1ce4691fbfb1748fe939db7d0234b5aba97197d10fbe0fef" ], "index": "pypi", - "version": "==0.21.0" + "markers": "python_version >= '3.8'", + "version": "==0.23.4" }, "pytest-cov": { "hashes": [ - "sha256:45ec2d5182f89a81fc3eb29e3d1ed3113b9e9a873bcddb2a71faaab066110191", - "sha256:47bd0ce14056fdd79f93e1713f88fad7bdcc583dcd7783da86ef2f085a0bb88e" + "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6", + "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a" ], "index": "pypi", - "version": "==2.10.1" + "markers": "python_version >= '3.7'", + "version": "==4.1.0" }, "pytest-forked": { "hashes": [ @@ -950,18 +1439,12 @@ }, "pytest-xdist": { "hashes": [ - "sha256:2447a1592ab41745955fb870ac7023026f20a5f0bfccf1b52a879bd193d46450", - "sha256:718887296892f92683f6a51f25a3ae584993b06f7076ce1e1fd482e59a8220a2" + "sha256:4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf", + "sha256:6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65" ], "index": "pypi", - "version": "==2.2.1" - }, - "python-can": { - "hashes": [ - "sha256:2d3c223b7adc4dd46ce258d4a33b7e0dbb6c339e002faa40ee4a69d5fdce9449" - ], - "markers": "python_version >= '2.7'", - "version": "==3.3.4" + "markers": "python_version >= '3.6'", + "version": "==2.5.0" }, "python-dateutil": { "hashes": [ @@ -971,21 +1454,13 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.8.2" }, - "pytz": { - "hashes": [ - "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588", - "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb" - ], - "markers": "python_version < '3.9'", - "version": "==2023.3" - }, "readme-renderer": { "hashes": [ - "sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273", - "sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343" + "sha256:13d039515c1f24de668e2c93f2e877b9dbe6c6c32328b90a40a49d8b2b85f36d", + "sha256:2d55489f83be4992fe4454939d1a051c33edbab778e82761d060c9fc6b308cd1" ], - "markers": "python_version >= '3.7'", - "version": "==37.3" + "markers": "python_version >= '3.8'", + "version": "==42.0" }, "requests": { "hashes": [ @@ -1003,6 +1478,22 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.0.0" }, + "rfc3986": { + "hashes": [ + "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", + "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.0" + }, + "rich": { + "hashes": [ + "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa", + "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==13.7.0" + }, "six": { "hashes": [ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", @@ -1011,14 +1502,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, - "sniffio": { - "hashes": [ - "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", - "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" - ], - "markers": "python_version >= '3.7'", - "version": "==1.3.0" - }, "snowballstemmer": { "hashes": [ "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", @@ -1039,6 +1522,7 @@ "sha256:f4da1187785a5bc7312cc271b0e867a93946c319d106363e102936a3d9857306" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==5.0.1" }, "sphinx-prompt": { @@ -1057,35 +1541,36 @@ }, "sphinx-tabs": { "hashes": [ - "sha256:7cea8942aeccc5d01a995789c01804b787334b55927f29b36ba16ed1e7cb27c6", - "sha256:d2a09f9e8316e400d57503f6df1c78005fdde220e5af589cc79d493159e1b832" + "sha256:92cc9473e2ecf1828ca3f6617d0efc0aa8acb06b08c56ba29d1413f2f0f6cf09", + "sha256:ba9d0c1e3e37aaadd4b5678449eb08176770e0fc227e769b6ce747df3ceea531" ], "index": "pypi", - "version": "==3.4.1" + "markers": "python_version ~= '3.7'", + "version": "==3.4.5" }, "sphinxcontrib-applehelp": { "hashes": [ - "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a", - "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58" + "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619", + "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4" ], - "markers": "python_version >= '3.5'", - "version": "==1.0.2" + "markers": "python_version >= '3.9'", + "version": "==1.0.8" }, "sphinxcontrib-devhelp": { "hashes": [ - "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", - "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4" + "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f", + "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3" ], - "markers": "python_version >= '3.5'", - "version": "==1.0.2" + "markers": "python_version >= '3.9'", + "version": "==1.0.6" }, "sphinxcontrib-htmlhelp": { "hashes": [ - "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07", - "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2" + "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015", + "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04" ], - "markers": "python_version >= '3.6'", - "version": "==2.0.0" + "markers": "python_version >= '3.9'", + "version": "==2.0.5" }, "sphinxcontrib-jsmath": { "hashes": [ @@ -1097,19 +1582,19 @@ }, "sphinxcontrib-qthelp": { "hashes": [ - "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", - "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6" + "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6", + "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182" ], - "markers": "python_version >= '3.5'", - "version": "==1.0.3" + "markers": "python_version >= '3.9'", + "version": "==1.0.7" }, "sphinxcontrib-serializinghtml": { "hashes": [ - "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd", - "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952" + "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7", + "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f" ], - "markers": "python_version >= '3.5'", - "version": "==1.1.5" + "markers": "python_version >= '3.9'", + "version": "==1.1.10" }, "sphinxext-opengraph": { "hashes": [ @@ -1117,16 +1602,9 @@ "sha256:64fe993d4974c65202d1c8f1c986abb559154a814a6378f9d3aaf8c7c9bd62bc" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.8.1" }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.10.2" - }, "tomli": { "hashes": [ "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", @@ -1135,73 +1613,32 @@ "markers": "python_version < '3.11'", "version": "==2.0.1" }, - "tqdm": { - "hashes": [ - "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5", - "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671" - ], - "markers": "python_version >= '3.7'", - "version": "==4.65.0" - }, "twine": { "hashes": [ - "sha256:5319dd3e02ac73fcddcd94f035b9631589ab5d23e1f4699d57365199d85261e1", - "sha256:9fe7091715c7576df166df8ef6654e61bada39571783f2fd415bdcba867c6993" + "sha256:6f7496cf14a3a8903474552d5271c79c71916519edb42554f23f42a8563498a9", + "sha256:817aa0c0bdc02a5ebe32051e168e23c71a0608334e624c793011f120dbbc05b7" ], "index": "pypi", - "version": "==2.0.0" - }, - "typed-ast": { - "hashes": [ - "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace", - "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff", - "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266", - "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528", - "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6", - "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808", - "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4", - "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363", - "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341", - "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04", - "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41", - "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e", - "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3", - "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899", - "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805", - "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c", - "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c", - "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39", - "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a", - "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3", - "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7", - "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f", - "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075", - "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0", - "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40", - "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428", - "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927", - "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3", - "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f", - "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65" - ], - "markers": "python_version < '3.8' and implementation_name == 'cpython'", - "version": "==1.4.3" + "markers": "python_version >= '3.7'", + "version": "==4.0.0" }, "typeguard": { "hashes": [ - "sha256:c2af8b9bdd7657f4bd27b45336e7930171aead796711bc4cfc99b4731bb9d051", - "sha256:cc15ef2704c9909ef9c80e19c62fb8468c01f75aad12f651922acf4dbe822e02" + "sha256:8923e55f8873caec136c892c3bed1f676eae7be57cdb94819281b3d3bc9c0953", + "sha256:ea0a113bbc111bcffc90789ebb215625c963411f7096a7e9062d4e4630c155fd" ], "index": "pypi", - "version": "==2.12.1" + "markers": "python_version >= '3.8'", + "version": "==4.1.5" }, "types-mock": { "hashes": [ - "sha256:1a470543be8de673e2ea14739622de3bfb8c9b10429f50338ba9ca1e868c15e9", - "sha256:1ad09970f4f5ec45a138ab1e88d032f010e851bccef7765b34737ed390bbc5c8" + "sha256:13ca379d5710ccb3f18f69ade5b08881874cb83383d8fb49b1d4dac9d5c5d090", + "sha256:3d116955495935b0bcba14954b38d97e507cd43eca3e3700fc1b8e4f5c6bf2c7" ], "index": "pypi", - "version": "==4.0.1" + "markers": "python_version >= '3.8'", + "version": "==5.1.0.20240106" }, "types-setuptools": { "hashes": [ @@ -1213,123 +1650,36 @@ }, "typing-extensions": { "hashes": [ - "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26", - "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5" + "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" ], - "index": "pypi", - "version": "==4.6.3" + "markers": "python_version >= '3.8'", + "version": "==4.9.0" }, "urllib3": { "hashes": [ - "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1", - "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825" + "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20", + "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224" ], - "markers": "python_version >= '3.7'", - "version": "==2.0.3" - }, - "webencodings": { - "hashes": [ - "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", - "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" - ], - "version": "==0.5.1" + "markers": "python_version >= '3.8'", + "version": "==2.2.0" }, "wheel": { "hashes": [ - "sha256:9515fe0a94e823fd90b08d22de45d7bde57c90edce705b22f5e1ecf7e1b653c8", - "sha256:e721e53864f084f956f40f96124a74da0631ac13fbbd1ba99e8e2b5e9cafdf64" + "sha256:21014b2bd93c6d0034b6ba5d35e4eb284340e09d63c59aef6fc14b0f346146fd", + "sha256:e2ef7239991699e3355d54f8e968a21bb940a1dbf34a4d226741e64462516fad" ], "index": "pypi", - "version": "==0.30.0" - }, - "wrapt": { - "hashes": [ - "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0", - "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420", - "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a", - "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c", - "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079", - "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923", - "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f", - "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1", - "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8", - "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86", - "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0", - "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364", - "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e", - "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c", - "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e", - "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c", - "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727", - "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff", - "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e", - "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29", - "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7", - "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72", - "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475", - "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a", - "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317", - "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2", - "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd", - "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640", - "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98", - "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248", - "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e", - "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d", - "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec", - "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1", - "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e", - "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9", - "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92", - "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb", - "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094", - "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46", - "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29", - "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd", - "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705", - "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8", - "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975", - "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb", - "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e", - "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b", - "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418", - "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019", - "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1", - "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba", - "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6", - "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2", - "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3", - "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7", - "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752", - "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416", - "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f", - "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1", - "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc", - "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145", - "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee", - "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a", - "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7", - "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b", - "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653", - "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0", - "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90", - "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29", - "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6", - "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034", - "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09", - "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559", - "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639" - ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.15.0" + "version": "==0.37.0" }, "zipp": { "hashes": [ - "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", - "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556" + "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31", + "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0" ], - "markers": "python_version >= '3.7'", - "version": "==3.15.0" + "markers": "python_version >= '3.8'", + "version": "==3.17.0" } } } diff --git a/api/docs/hardware/conf.py b/api/docs/hardware/conf.py index bbaadf2cf67..e8c7dac6a65 100644 --- a/api/docs/hardware/conf.py +++ b/api/docs/hardware/conf.py @@ -93,7 +93,7 @@ # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = 'en' # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: diff --git a/api/docs/img/Flex-and-OT-2-decks.svg b/api/docs/img/Flex-and-OT-2-decks.svg deleted file mode 100644 index d8615b34752..00000000000 --- a/api/docs/img/Flex-and-OT-2-decks.svg +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/api/docs/img/OT-2-deck.svg b/api/docs/img/OT-2-deck.svg new file mode 100644 index 00000000000..36d15a77d1b --- /dev/null +++ b/api/docs/img/OT-2-deck.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/docs/img/feature_flags/door_safety_switch.png b/api/docs/img/feature_flags/door_safety_switch.png deleted file mode 100644 index 7705e02aee7..00000000000 Binary files a/api/docs/img/feature_flags/door_safety_switch.png and /dev/null differ diff --git a/api/docs/img/flex-deck.svg b/api/docs/img/flex-deck.svg new file mode 100644 index 00000000000..50681b9e01d --- /dev/null +++ b/api/docs/img/flex-deck.svg @@ -0,0 +1,477 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/docs/img/lightbulb.jpg b/api/docs/img/lightbulb.jpg deleted file mode 100644 index 41f67329264..00000000000 Binary files a/api/docs/img/lightbulb.jpg and /dev/null differ diff --git a/api/docs/v1/atomic_commands.rst b/api/docs/v1/atomic_commands.rst index c629188b2af..0c942b9259a 100644 --- a/api/docs/v1/atomic_commands.rst +++ b/api/docs/v1/atomic_commands.rst @@ -22,19 +22,19 @@ This section demonstrates the options available for controlling tips ''' from opentrons import labware, instruments, robot - tiprack = labware.load('opentrons_96_tiprack_300ul', '2') + tiprack = labware.load("opentrons_96_tiprack_300ul", "2") - pipette = instruments.P300_Single(mount='left') + pipette = instruments.P300_Single(mount="left") Pick Up Tip =========== -Before any liquid handling can be done, your pipette must have a tip on it. The command ``pick_up_tip()`` will move the pipette over to the specified tip, the press down into it to create a vacuum seal. The below example picks up the tip at location ``'A1'``. +Before any liquid handling can be done, your pipette must have a tip on it. The command ``pick_up_tip()`` will move the pipette over to the specified tip, the press down into it to create a vacuum seal. The below example picks up the tip at location ``"A1"``. .. code-block:: python - pipette.pick_up_tip(tiprack.wells('A1')) + pipette.pick_up_tip(tiprack.wells("A1")) Drop Tip =========== @@ -44,24 +44,24 @@ If no location is specified, it will go to the fixed trash location on the deck. .. code-block:: python - pipette.drop_tip(tiprack.wells('A1')) + pipette.drop_tip(tiprack.wells("A1")) Instead of returning a tip to the tip rack, we can also drop it in an alternative trash container besides the fixed trash on the deck. .. code-block:: python - trash = labware.load('trash-box', '1') - pipette.pick_up_tip(tiprack.wells('A2')) + trash = labware.load("trash-box", "1") + pipette.pick_up_tip(tiprack.wells("A2")) pipette.drop_tip(trash) Return Tip =========== -When we need to return the tip to its originating location on the tip rack, we can simply call ``return_tip()``. The example below will automatically return the tip to ``'A3'`` on the tip rack. +When we need to return the tip to its originating location on the tip rack, we can simply call ``return_tip()``. The example below will automatically return the tip to ``"A3"`` on the tip rack. .. code-block:: python - pipette.pick_up_tip(tiprack.wells('A3')) + pipette.pick_up_tip(tiprack.wells("A3")) pipette.return_tip() @@ -80,9 +80,9 @@ If no location is specified, the pipette will move to the next available tip by ''' from opentrons import labware, instruments, robot - trash = labware.load('trash-box', '1') - tip_rack_1 = containers.load('opentrons_96_tiprack_300ul', '2') - tip_rack_2 = containers.load('opentrons_96_tiprack_300ul', '3') + trash = labware.load("trash-box", "1") + tip_rack_1 = containers.load("opentrons_96_tiprack_300ul", "2") + tip_rack_2 = containers.load("opentrons_96_tiprack_300ul", "3") Attach Tip Rack to Pipette -------------------------- @@ -95,7 +95,7 @@ Multiple tip racks are can be attached with the option ``tip_racks=[RACK_1, RACK .. code-block:: python - pipette = instruments.P300_Single(mount='left', + pipette = instruments.P300_Single(mount="left", tip_racks=[tip_rack_1, tip_rack_2], trash_container=trash) @@ -147,18 +147,18 @@ If you plan to change out tipracks during the protocol run, you must reset tip t Select Starting Tip ------------------- -Calls to ``pick_up_tip()`` will by default start at the attached tip rack's ``'A1'`` location in order of tipracks listed. If you however want to start automatic tip iterating at a different tip, you can use ``start_at_tip()``. +Calls to ``pick_up_tip()`` will by default start at the attached tip rack's ``"A1"`` location in order of tipracks listed. If you however want to start automatic tip iterating at a different tip, you can use ``start_at_tip()``. .. code-block:: python - pipette.start_at_tip(tip_rack_1.well('C3')) + pipette.start_at_tip(tip_rack_1.well("C3")) pipette.pick_up_tip() # pick up C3 from "tip_rack_1" pipette.return_tip() Get Current Tip --------------- -Get the source location of the pipette's current tip by calling ``current_tip()``. If the tip was from the ``'A1'`` position on our tip rack, ``current_tip()`` will return that position. +Get the source location of the pipette's current tip by calling ``current_tip()``. If the tip was from the ``"A1"`` position on our tip rack, ``current_tip()`` will return that position. .. code-block:: python @@ -191,8 +191,8 @@ Please note that the default now for pipette aspirate and dispense location is a ''' Examples in this section expect the following: ''' - plate = labware.load('96-flat', '1') - pipette = instruments.P300_Single(mount='left') + plate = labware.load("96-flat", "1") + pipette = instruments.P300_Single(mount="left") pipette.pick_up_tip() @@ -203,11 +203,11 @@ To aspirate is to pull liquid up into the pipette's tip. When calling aspirate o .. code-block:: python - pipette.aspirate(50, plate.wells('A1')) # aspirate 50uL from plate:A1 + pipette.aspirate(50, plate.wells("A1")) # aspirate 50uL from plate:A1 Now our pipette's tip is holding 50uL. -We can also simply specify how many microliters to aspirate, and not mention a location. The pipette in this circumstance will aspirate from it's current location (which we previously set as ``plate.wells('A1'))``. +We can also simply specify how many microliters to aspirate, and not mention a location. The pipette in this circumstance will aspirate from it's current location (which we previously set as ``plate.wells("A1"))``. .. code-block:: python @@ -219,7 +219,7 @@ We can also specify only the location to aspirate from. If we do not tell the pi .. code-block:: python - pipette.aspirate(plate.wells('A2')) # aspirate until pipette fills from plate:A2 + pipette.aspirate(plate.wells("A2")) # aspirate until pipette fills from plate:A2 Dispense @@ -229,11 +229,11 @@ To dispense is to push out liquid from the pipette's tip. It's usage in the Open .. code-block:: python - pipette.dispense(50, plate.wells('B1')) # dispense 50uL to plate:B1 + pipette.dispense(50, plate.wells("B1")) # dispense 50uL to plate:B1 pipette.dispense(50) # dispense 50uL to current position - pipette.dispense(plate.wells('B2')) # dispense until pipette empties to plate:B2 + pipette.dispense(plate.wells("B2")) # dispense until pipette empties to plate:B2 -That final dispense without specifying a micoliter amount will dispense all remaining liquids in the tip to ``plate.wells('B2')``, and now our pipette is empty. +That final dispense without specifying a micoliter amount will dispense all remaining liquids in the tip to ``plate.wells("B2")``, and now our pipette is empty. Blow Out ======== @@ -245,7 +245,7 @@ When calling ``blow_out()`` on a pipette, we have the option to specify a locati .. code-block:: python pipette.blow_out() # blow out in current location - pipette.blow_out(plate.wells('B3')) # blow out in current plate:B3 + pipette.blow_out(plate.wells("B3")) # blow out in current plate:B3 Touch Tip @@ -259,7 +259,7 @@ When calling ``touch_tip()`` on a pipette, we have the option to specify a locat pipette.touch_tip() # touch tip within current location pipette.touch_tip(v_offset=-2) # touch tip 2mm below the top of the current location - pipette.touch_tip(plate.wells('B1')) # touch tip within plate:B1 + pipette.touch_tip(plate.wells("B1")) # touch tip within plate:B1 Mix @@ -271,7 +271,7 @@ The mix command takes three arguments: ``mix(repetitions, volume, location)`` .. code-block:: python - pipette.mix(4, 100, plate.wells('A2')) # mix 4 times, 100uL, in plate:A2 + pipette.mix(4, 100, plate.wells("A2")) # mix 4 times, 100uL, in plate:A2 pipette.mix(3, 50) # mix 3 times, 50uL, in current location pipette.mix(2) # mix 2 times, pipette's max volume, in current location @@ -283,7 +283,7 @@ Some liquids need an extra amount of air in the pipette's tip to prevent it from .. code-block:: python - pipette.aspirate(100, plate.wells('B4')) + pipette.aspirate(100, plate.wells("B4")) pipette.air_gap(20) pipette.drop_tip() @@ -297,10 +297,10 @@ Some liquids need an extra amount of air in the pipette's tip to prevent it from ''' Examples in this section expect the following ''' - tiprack = labware.load('opentrons_96_tiprack_300ul', '1') - plate = labware.load('96-flat', '2') + tiprack = labware.load("opentrons_96_tiprack_300ul", "1") + plate = labware.load("96-flat", "2") - pipette = instruments.P300_Single(mount='right', tip_racks=[tiprack]) + pipette = instruments.P300_Single(mount="right", tip_racks=[tiprack]) Controlling Speed ================= @@ -316,10 +316,10 @@ using our `set_flow_rate` function. This can be called at any time during the pr ''' Examples in this section expect the following ''' - tiprack = labware.load('opentrons_96_tiprack_300ul', '1') - plate = labware.load('96-flat', '2') + tiprack = labware.load("opentrons_96_tiprack_300ul", "1") + plate = labware.load("96-flat", "2") - pipette = instruments.P300_Single(mount='right', tip_racks=[tiprack]) + pipette = instruments.P300_Single(mount="right", tip_racks=[tiprack]) pipette.set_flow_rate(aspirate=50, dispense=100) @@ -341,35 +341,35 @@ For example, we can move to the first tip in our tip rack: .. code-block:: python - pipette.move_to(tiprack.wells('A1')) + pipette.move_to(tiprack.wells("A1")) You can also specify at what height you would like the robot to move to inside of a location using ``top()`` and ``bottom()`` methods on that location. .. code-block:: python - pipette.move_to(plate.wells('A1').bottom()) # move to the bottom of well A1 - pipette.move_to(plate.wells('A1').top()) # move to the top of well A1 - pipette.move_to(plate.wells('A1').bottom(2)) # move to 2mm above the bottom of well A1 - pipette.move_to(plate.wells('A1').top(-2)) # move to 2mm below the top of well A1 + pipette.move_to(plate.wells("A1").bottom()) # move to the bottom of well A1 + pipette.move_to(plate.wells("A1").top()) # move to the top of well A1 + pipette.move_to(plate.wells("A1").bottom(2)) # move to 2mm above the bottom of well A1 + pipette.move_to(plate.wells("A1").top(-2)) # move to 2mm below the top of well A1 -The above commands will cause the robot's head to first move upwards, then over to above the target location, then finally downwards until the target location is reached. If instead you would like the robot to move in a straight line to the target location, you can set the movement strategy to ``'direct'``. +The above commands will cause the robot's head to first move upwards, then over to above the target location, then finally downwards until the target location is reached. If instead you would like the robot to move in a straight line to the target location, you can set the movement strategy to ``"direct"``. .. code-block:: python - pipette.move_to(plate.wells('A1'), strategy='direct') + pipette.move_to(plate.wells("A1"), strategy="direct") .. note:: - Moving with ``strategy='direct'`` will run the risk of colliding with things on your deck. Be very careful when using this option. + Moving with ``strategy="direct"`` will run the risk of colliding with things on your deck. Be very careful when using this option. -Usually the ``strategy='direct'`` option is useful when moving inside of a well. Take a look at the below sequence of movements, which first move the head to a well, and use 'direct' movements inside that well, then finally move on to a different well. +Usually the ``strategy="direct"`` option is useful when moving inside of a well. Take a look at the below sequence of movements, which first move the head to a well, and use "direct" movements inside that well, then finally move on to a different well. .. code-block:: python - pipette.move_to(plate.wells('A1')) - pipette.move_to(plate.wells('A1').bottom(1), strategy='direct') - pipette.move_to(plate.wells('A1').top(-2), strategy='direct') - pipette.move_to(plate.wells('A1')) + pipette.move_to(plate.wells("A1")) + pipette.move_to(plate.wells("A1").bottom(1), strategy="direct") + pipette.move_to(plate.wells("A1").top(-2), strategy="direct") + pipette.move_to(plate.wells("A1")) Delay ===== diff --git a/api/docs/v1/complex_commands.rst b/api/docs/v1/complex_commands.rst index 7c30bffe51a..1106408384d 100644 --- a/api/docs/v1/complex_commands.rst +++ b/api/docs/v1/complex_commands.rst @@ -12,12 +12,12 @@ The examples below will use the following set-up: from opentrons import robot, labware, instruments - plate = labware.load('96-flat', '1') + plate = labware.load("96-flat", "1") - tiprack = labware.load('opentrons_96_tiprack_300ul', '2') + tiprack = labware.load("opentrons_96_tiprack_300ul", "2") pipette = instruments.P300_Single( - mount='left', + mount="left", tip_racks=[tiprack]) You could simulate the protocol using our protocol simulator, which can be installed by following the instructions `here. `_ @@ -33,11 +33,11 @@ For transferring with a multi-channel, please refer to the :ref:`multi-channel-l Basic ----- -The example below will transfer 100 uL from well ``'A1'`` to well ``'B1'``, automatically picking up a new tip and then disposing it when finished. +The example below will transfer 100 uL from well ``"A1"`` to well ``"B1"``, automatically picking up a new tip and then disposing it when finished. .. code-block:: python - pipette.transfer(100, plate.wells('A1'), plate.wells('B1')) + pipette.transfer(100, plate.wells("A1"), plate.wells("B1")) Transfer commands will automatically create entire series of ``aspirate()``, ``dispense()``, and other ``Pipette`` commands. @@ -49,7 +49,7 @@ Volumes larger than the pipette's ``max_volume`` will automatically divide into .. code-block:: python - pipette.transfer(700, plate.wells('A2'), plate.wells('B2')) + pipette.transfer(700, plate.wells("A2"), plate.wells("B2")) will have the steps... @@ -72,7 +72,7 @@ Transfer commands are most useful when moving liquid between multiple wells. .. code-block:: python - pipette.transfer(100, plate.cols('1'), plate.cols('2')) + pipette.transfer(100, plate.cols("1"), plate.cols("2")) will have the steps... @@ -105,7 +105,7 @@ You can transfer from a single source to multiple destinations, and the other wa .. code-block:: python - pipette.transfer(100, plate.wells('A1'), plate.cols('2')) + pipette.transfer(100, plate.wells("A1"), plate.cols("2")) will have the steps... @@ -141,8 +141,8 @@ What happens if, for example, you tell your pipette to transfer from 2 source we pipette.transfer( 100, - plate.wells('A1', 'A2'), - plate.wells('B1', 'B2', 'B3', 'B4')) + plate.wells("A1", "A2"), + plate.wells("B1", "B2", "B3", "B4")) will have the steps... @@ -169,8 +169,8 @@ Instead of applying a single volume amount to all source/destination wells, you pipette.transfer( [20, 40, 60], - plate.wells('A1'), - plate.wells('B1', 'B2', 'B3')) + plate.wells("A1"), + plate.wells("B1", "B2", "B3")) will have the steps... @@ -196,8 +196,8 @@ Create a linear gradient between a start and ending volume (uL). The start and e pipette.transfer( (100, 30), - plate.wells('A1'), - plate.cols('2')) + plate.wells("A1"), + plate.cols("2")) will have the steps... @@ -238,7 +238,7 @@ Volumes going to the same destination well are combined within the same tip, so .. code-block:: python - pipette.consolidate(30, plate.cols('2'), plate.wells('A1')) + pipette.consolidate(30, plate.cols("2"), plate.wells("A1")) will have the steps... @@ -262,7 +262,7 @@ If there are multiple destination wells, the pipette will never combine their vo .. code-block:: python - pipette.consolidate(30, plate.cols('1'), plate.wells('A1', 'A2')) + pipette.consolidate(30, plate.cols("1"), plate.wells("A1", "A2")) will have the steps... @@ -291,7 +291,7 @@ Volumes from the same source well are combined within the same tip, so that one .. code-block:: python - pipette.distribute(55, plate.wells('A1'), plate.rows('A')) + pipette.distribute(55, plate.wells("A1"), plate.rows("A")) will have the steps... @@ -326,7 +326,7 @@ If there are multiple source wells, the pipette will never combine their volumes .. code-block:: python - pipette.distribute(30, plate.wells('A1', 'A2'), plate.rows('A')) + pipette.distribute(30, plate.wells("A1", "A2"), plate.rows("A")) will have the steps... @@ -362,8 +362,8 @@ When dispensing multiple times from the same tip, it is recommended to aspirate pipette.distribute( 30, - plate.wells('A1', 'A2'), - plate.cols('2'), + plate.wells("A1", "A2"), + plate.cols("2"), disposal_vol=10) # include extra liquid to make dispenses more accurate @@ -406,9 +406,9 @@ The pipette can optionally get a new tip at the beginning of each aspirate, to h pipette.transfer( 100, - plate.wells('A1', 'A2', 'A3'), - plate.wells('B1', 'B2', 'B3'), - new_tip='always') # always pick up a new tip + plate.wells("A1", "A2", "A3"), + plate.wells("B1", "B2", "B3"), + new_tip="always") # always pick up a new tip will have the steps... @@ -440,9 +440,9 @@ For scenarios where you instead are calling ``pick_up_tip()`` and ``drop_tip()`` ... pipette.transfer( 100, - plate.wells('A1', 'A2', 'A3'), - plate.wells('B1', 'B2', 'B3'), - new_tip='never') # never pick up or drop a tip + plate.wells("A1", "A2", "A3"), + plate.wells("B1", "B2", "B3"), + new_tip="never") # never pick up or drop a tip ... pipette.drop_tip() @@ -473,9 +473,9 @@ The default behavior of complex commands is to use one tip: pipette.transfer( 100, - plate.wells('A1', 'A2', 'A3'), - plate.wells('B1', 'B2', 'B3'), - new_tip='once') # use one tip (default behavior) + plate.wells("A1", "A2", "A3"), + plate.wells("B1", "B2", "B3"), + new_tip="once") # use one tip (default behavior) will have the steps... @@ -500,8 +500,8 @@ By default, the transfer command will drop the pipette's tips in the trash conta pipette.transfer( 100, - plate.wells('A1'), - plate.wells('B1'), + plate.wells("A1"), + plate.wells("B1"), trash=False) # do not trash tip @@ -525,8 +525,8 @@ A touch-tip can be performed after every aspirate and dispense by setting ``touc pipette.transfer( 100, - plate.wells('A1'), - plate.wells('A2'), + plate.wells("A1"), + plate.wells("A2"), touch_tip=True) # touch tip to each well's edge @@ -551,8 +551,8 @@ A blow-out can be performed after every dispense that leaves the tip empty by se pipette.transfer( 100, - plate.wells('A1'), - plate.wells('A2'), + plate.wells("A1"), + plate.wells("A2"), blow_out=True) # blow out droplets when tip is empty @@ -576,8 +576,8 @@ A mix can be performed before every aspirate by setting ``mix_before=``. The val pipette.transfer( 100, - plate.wells('A1'), - plate.wells('A2'), + plate.wells("A1"), + plate.wells("A2"), mix_before=(2, 50), # mix 2 times with 50uL before aspirating mix_after=(3, 75)) # mix 3 times with 75uL after dispensing @@ -613,8 +613,8 @@ An air gap can be performed after every aspirate by setting ``air_gap=int``, whe pipette.transfer( 100, - plate.wells('A1'), - plate.wells('A2'), + plate.wells("A1"), + plate.wells("A2"), air_gap=20) # add 20uL of air after each aspirate @@ -648,14 +648,14 @@ We will be using the code-block below to perform our examples. from opentrons import robot, labware, instruments - plate_96 = labware.load('96-flat', '1') - plate_384 = labware.load('384-plate', '3') - trough = labware.load('trough-12row', '4') + plate_96 = labware.load("96-flat", "1") + plate_384 = labware.load("384-plate", "3") + trough = labware.load("trough-12row", "4") - tiprack = labware.load('opentrons_96_tiprack_300ul', '2') + tiprack = labware.load("opentrons_96_tiprack_300ul", "2") multi_pipette = instruments.P300_Multi( - mount='left', + mount="left", tip_racks=[tiprack]) Transfer in a 96 Well Plate @@ -666,7 +666,7 @@ following: .. code-block:: python - multi_pipette.transfer(50, plate_96.columns('1'), plate_96.columns('2', to='12')) + multi_pipette.transfer(50, plate_96.columns("1"), plate_96.columns("2", to="12")) will have the steps @@ -702,7 +702,7 @@ or .. code-block:: python - multi_pipette.transfer(50, plate_96.wells('A1'), plate_96.columns('2', to='12')) + multi_pipette.transfer(50, plate_96.wells("A1"), plate_96.columns("2", to="12")) will have the steps @@ -740,14 +740,14 @@ will have the steps .. code-block:: python - multi_pipette.transfer(50, plate_96.wells('A1'), plate_96.wells()) + multi_pipette.transfer(50, plate_96.wells("A1"), plate_96.wells()) The multi-channel would visit **every** well in the plate and dispense liquid outside of the plate boundaries so be careful! .. code-block:: python - multi_pipette.transfer(50, plate_96.wells('A1'), plate_96.rows('A')) + multi_pipette.transfer(50, plate_96.wells("A1"), plate_96.rows("A")) In this scenario, the multi-channel would only visit the first column of the plate. @@ -755,8 +755,8 @@ will have the steps Transfer in a 384 Well Plate ---------------------------- -In a 384 Well plate, there are 2 sets of 'columns' that the multi-channel can -dispense into ['A1', 'C1'...'A2', 'C2'...] and ['B1', 'D1'...'B2', 'D2']. +In a 384 Well plate, there are 2 sets of "columns" that the multi-channel can +dispense into ["A1", "C1"..."A2", "C2"...] and ["B1", "D1"..."B2", "D2"]. If you want to transfer to a 384 well plate in order, you can do: @@ -764,9 +764,9 @@ If you want to transfer to a 384 well plate in order, you can do: alternating_wells = [] for row in plate_384.rows(): - alternating_wells.append(row.wells('A')) - alternating_wells.append(row.wells('B')) - multi_pipette.transfer(50, trough.wells('A1'), alternating_wells) + alternating_wells.append(row.wells("A")) + alternating_wells.append(row.wells("B")) + multi_pipette.transfer(50, trough.wells("A1"), alternating_wells) or you can choose to dispense by row first, moving first through row A @@ -774,5 +774,5 @@ and then through row B of the 384 well plate. .. code-block:: python - list_of_wells = [for well in plate_384.rows('A')] + [for well in plate_384.rows('B')] - multi_pipette.transfer(50, trough.wells('A1'), list_of_wells) + list_of_wells = [for well in plate_384.rows("A")] + [for well in plate_384.rows("B")] + multi_pipette.transfer(50, trough.wells("A1"), list_of_wells) diff --git a/api/docs/v1/conf.py b/api/docs/v1/conf.py index a3a09ec6a65..f0e14dee1be 100644 --- a/api/docs/v1/conf.py +++ b/api/docs/v1/conf.py @@ -85,7 +85,7 @@ # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = "en" # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: diff --git a/api/docs/v1/examples.rst b/api/docs/v1/examples.rst index 89c86401f60..d5775c41a8d 100644 --- a/api/docs/v1/examples.rst +++ b/api/docs/v1/examples.rst @@ -10,14 +10,14 @@ All examples on this page assume the following labware and pipette: from opentrons import robot, labware, instruments - plate = labware.load('96-flat', '1') - trough = labware.load('trough-12row', '2') + plate = labware.load("96-flat", "1") + trough = labware.load("trough-12row", "2") - tiprack_1 = labware.load('opentrons_96_tiprack_300ul', '3') - tiprack_2 = labware.load('opentrons_96_tiprack_300ul', '4') + tiprack_1 = labware.load("opentrons_96_tiprack_300ul", "3") + tiprack_2 = labware.load("opentrons_96_tiprack_300ul", "4") p300 = instruments.P300_Single( - mount='left', + mount="left", tip_racks=[tiprack_2]) ****************************** @@ -30,15 +30,15 @@ Moving 100uL from one well to another: .. code-block:: python - p300.transfer(100, plate.wells('A1'), plate.wells('B1')) + p300.transfer(100, plate.wells("A1"), plate.wells("B1")) If you prefer to not use the ``.transfer()`` command, the following pipette commands will create the some results: .. code-block:: python p300.pick_up_tip() - p300.aspirate(100, plate.wells('A1')) - p300.dispense(100, plate.wells('A1')) + p300.aspirate(100, plate.wells("A1")) + p300.dispense(100, plate.wells("A1")) p300.return_tip() ****************************** @@ -74,7 +74,7 @@ The Opentrons liquid handler can do some things that a human cannot do with a pi for well in trough.wells(): p300.aspirate(35, well).air_gap(10) - p300.dispense(plate.wells('A1')) + p300.dispense(plate.wells("A1")) p300.return_tip() @@ -88,7 +88,7 @@ This example first spreads a dilutent to all wells of a plate. It then dilutes 8 .. code-block:: python - p300.distribute(50, trough.wells('A12'), plate.wells()) # dilutent + p300.distribute(50, trough.wells("A12"), plate.wells()) # dilutent # loop through each row for i in range(8): @@ -98,11 +98,11 @@ This example first spreads a dilutent to all wells of a plate. It then dilutes 8 row = plate.rows(i) # transfer 30uL of source to first well in column - p300.transfer(30, source, column.wells('1')) + p300.transfer(30, source, column.wells("1")) # dilute the sample down the column p300.transfer( - 30, row.wells('1', to='11'), row.wells('2', to='12'), + 30, row.wells("1", to="11"), row.wells("2", to="12"), mix_after=(3, 25)) ****************************** @@ -131,7 +131,7 @@ Deposit various volumes of liquids into the same plate of wells, and automatical 89, 90, 91, 92, 93, 94, 95, 96 ] - p300.distribute(water_volumes, trough.wells('A12'), plate) + p300.distribute(water_volumes, trough.wells("A12"), plate) The final volumes can also be read from a CSV, and opened by your protocol. @@ -155,7 +155,7 @@ The final volumes can also be read from a CSV, and opened by your protocol. # open file with absolute path (will be different depending on operating system) # file paths on Windows look more like 'C:\\path\\to\\your\\csv_file.csv' - with open('/path/to/your/csv_file.csv') as my_file: + with open("/path/to/your/csv_file.csv") as my_file: # save all volumes from CSV file into a list volumes = [] @@ -163,11 +163,11 @@ The final volumes can also be read from a CSV, and opened by your protocol. # loop through each line (the plate's columns) for l in my_file.read().splitlines(): # loop through each comma-separated value (the plate's rows) - for v in l.split(','): + for v in l.split(","): volumes.append(float(v)) # save the volume # distribute those volumes to the plate - p300.distribute(volumes, trough.wells('A1'), plate.wells()) + p300.distribute(volumes, trough.wells("A1"), plate.wells()) @@ -183,16 +183,16 @@ This example shows how to deposit liquid around the edge of a well using .. code-block:: python p300.pick_up_tip() - p300.aspirate(200, trough.wells('A1')) + p300.aspirate(200, trough.wells("A1")) # rotate around the edge of the well, dropping 20ul at a time theta = 0.0 while p300.current_volume > 0: # we can move around a circle with radius (r) and theta (degrees) - well_edge = plate.wells('B1').from_center(r=1.0, theta=theta, h=0.9) + well_edge = plate.wells("B1").from_center(r=1.0, theta=theta, h=0.9) # combine a Well with a Vector in a tuple - destination = (plate.wells('B1'), well_edge) - p300.move_to(destination, strategy='direct') # move straight there + destination = (plate.wells("B1"), well_edge) + p300.move_to(destination, strategy="direct") # move straight there p300.dispense(20) theta += 0.314 diff --git a/api/docs/v1/hardware_control.rst b/api/docs/v1/hardware_control.rst index 58ba29a6957..9781d6aaf49 100644 --- a/api/docs/v1/hardware_control.rst +++ b/api/docs/v1/hardware_control.rst @@ -22,16 +22,16 @@ The robot module can be thought of as the parent for all aspects of the Opentron ''' from opentrons import robot, labware, instruments - plate = labware.load('96-flat', 'B1', 'my-plate') - tiprack = labware.load('opentrons_96_tiprack_300ul', 'A1', 'my-rack') + plate = labware.load("96-flat", "B1", "my-plate") + tiprack = labware.load("opentrons_96_tiprack_300ul", "A1", "my-rack") - pipette = instruments.P300_Single(mount='left', tip_racks=[tiprack]) + pipette = instruments.P300_Single(mount="left", tip_racks=[tiprack]) User-Specified Pause ==================== -This will pause your protocol at a specific step. You can resume by pressing 'resume' in your OT App. +This will pause your protocol at a specific step. You can resume by pressing "resume" in your OT App. .. code-block:: python @@ -42,7 +42,7 @@ Head Speed The speed of the robot's motors can be set using ``robot.head_speed()``. The units are all millimeters-per-second (mm/sec). The ``x``, ``y``, ``z``, ``a``, ``b``, ``c`` parameters set the maximum speed of the corresponding axis on Smoothie. -'x': lateral motion, 'y': front to back motion, 'z': vertical motion of the left mount, 'a': vertical motion of the right mount, 'b': plunger motor for the left pipette, 'c': plunger motor for the right pipette. +"x": lateral motion, "y": front to back motion, "z": vertical motion of the left mount, "a": vertical motion of the right mount, "b": plunger motor for the left pipette, "c": plunger motor for the right pipette. The ``combined_speed`` parameter sets the speed across all axes to either the specified value or the axis max, whichever is lower. Defaults are specified by ``DEFAULT_MAX_SPEEDS`` in `robot_configs.py`__. @@ -51,7 +51,7 @@ __ https://github.com/Opentrons/opentrons/blob/edge/api/src/opentrons/config/rob .. code-block:: python max_speed_per_axis = { - 'x': 600, 'y': 400, 'z': 125, 'a': 125, 'b': 50, 'c': 50} + "x": 600, "y": 400, "z": 125, "a": 125, "b": 50, "c": 50} robot.head_speed( combined_speed=max(max_speed_per_axis.values()), **max_speed_per_axis) @@ -65,7 +65,7 @@ You can `home` the robot by calling ``home()``. You can also specify axes. The r .. code-block:: python robot.home() # home the robot on all axis - robot.home('z') # home the Z axis only + robot.home("z") # home the Z axis only Commands ======== @@ -76,8 +76,8 @@ __ https://docs.python.org/3.5/tutorial/datastructures.html#more-on-lists .. code-block:: python - pipette.pick_up_tip(tiprack.wells('A1')) - pipette.drop_tip(tiprack.wells('A1')) + pipette.pick_up_tip(tiprack.wells("A1")) + pipette.drop_tip(tiprack.wells("A1")) for c in robot.commands(): print(c) @@ -97,11 +97,11 @@ We can erase the robot command history by calling ``robot.clear_commands()``. An .. code-block:: python robot.clear_commands() - pipette.pick_up_tip(tiprack['A1']) - print('There is', len(robot.commands()), 'command') + pipette.pick_up_tip(tiprack["A1"]) + print("There is", len(robot.commands()), "command") robot.clear_commands() - print('There are now', len(robot.commands()), 'commands') + print("There are now", len(robot.commands()), "commands") will print out... @@ -119,10 +119,10 @@ You can add a custom message to the list of command descriptions you see when ru robot.clear_commands() - pipette.pick_up_tip(tiprack['A1']) + pipette.pick_up_tip(tiprack["A1"]) robot.comment("Hello, just picked up tip A1") - pipette.pick_up_tip(tiprack['A1']) + pipette.pick_up_tip(tiprack["A1"]) robot.comment("Goodbye, just dropped tip A1") for c in robot.commands(): diff --git a/api/docs/v1/index.rst b/api/docs/v1/index.rst index 0e62e948c7f..0c82b900185 100644 --- a/api/docs/v1/index.rst +++ b/api/docs/v1/index.rst @@ -36,7 +36,7 @@ Overview How it Looks ++++++++++++ -The design goal of the Opentrons API is to make code readable and easy to understand. For example, below is a short set of instruction to transfer from well ``'A1'`` to well ``'B1'`` that even a computer could understand: +The design goal of the Opentrons API is to make code readable and easy to understand. For example, below is a short set of instruction to transfer from well ``"A1"`` to well ``"B1"`` that even a computer could understand: .. code-block:: none @@ -44,12 +44,12 @@ The design goal of the Opentrons API is to make code readable and easy to unders This protocol is by me; it’s called Opentrons Protocol Tutorial and is used for demonstrating the Opentrons API - Add a 96 well plate, and place it in slot '2' of the robot deck - Add a 200uL tip rack, and place it in slot '1' of the robot deck + Add a 96 well plate, and place it in slot "2" of the robot deck + Add a 200uL tip rack, and place it in slot "1" of the robot deck Add a single-channel 300uL pipette to the left mount, and tell it to use that tip rack - Transfer 100uL from the plate's 'A1' well to it's 'B2' well + Transfer 100uL from the plate's "A1" well to it's "B2" well If we were to rewrite this with the Opentrons API, it would look like the following: @@ -60,20 +60,20 @@ If we were to rewrite this with the Opentrons API, it would look like the follow # metadata metadata = { - 'protocolName': 'My Protocol', - 'author': 'Name ', - 'description': 'Simple protocol to get started using OT2', + "protocolName": "My Protocol", + "author": "Name ", + "description": "Simple protocol to get started using OT2", } # labware - plate = labware.load('96-flat', '2') - tiprack = labware.load('opentrons_96_tiprack_300ul', '1') + plate = labware.load("96-flat", "2") + tiprack = labware.load("opentrons_96_tiprack_300ul", "1") # pipettes - pipette = instruments.P300_Single(mount='left', tip_racks=[tiprack]) + pipette = instruments.P300_Single(mount="left", tip_racks=[tiprack]) # commands - pipette.transfer(100, plate.wells('A1'), plate.wells('B2')) + pipette.transfer(100, plate.wells("A1"), plate.wells("B2")) How it's Organized @@ -118,21 +118,21 @@ Labware While the imports section is usually the same across protocols, the labware section is different depending on the tip racks, well plates, troughs, or tubes you're using on the robot. -Each labware is given a type (ex: ``'96-flat'``), and the slot on the robot it will be placed (ex: ``'2'``). +Each labware is given a type (ex: ``"96-flat"``), and the slot on the robot it will be placed (ex: ``"2"``). From the example above, the "labware" section looked like: .. code-block:: python - plate = labware.load('96-flat', '2') - tiprack = labware.load('opentrons_96_tiprack_300ul', '1') + plate = labware.load("96-flat", "2") + tiprack = labware.load("opentrons_96_tiprack_300ul", "1") .. _index-pipettes: Pipettes ^^^^^^^^ -Next, pipettes are created and attached to a specific mount on the OT-2 (``'left'`` or ``'right'``). +Next, pipettes are created and attached to a specific mount on the OT-2 (``"left"`` or ``"right"``). There are other parameters for pipettes, but the most important are the tip rack(s) it will use during the protocol. @@ -140,7 +140,7 @@ From the example above, the "pipettes" section looked like: .. code-block:: python - pipette = instruments.P300_Single(mount='left', tip_racks=[tiprack]) + pipette = instruments.P300_Single(mount="left", tip_racks=[tiprack]) .. _index-commands: @@ -155,7 +155,7 @@ From the example above, the "commands" section looked like: .. code-block:: python - pipette.transfer(100, plate.wells('A1'), plate.wells('B1')) + pipette.transfer(100, plate.wells("A1"), plate.wells("B1")) ****************** diff --git a/api/docs/v1/labware.rst b/api/docs/v1/labware.rst index 0d45e079ebd..bdc4ab06245 100644 --- a/api/docs/v1/labware.rst +++ b/api/docs/v1/labware.rst @@ -65,7 +65,7 @@ To tell the robot what labware will be on the deck for your protocol, use # ... - tiprack = labware.load('opentrons_96_tiprack_300ul', slot='1') + tiprack = labware.load("opentrons_96_tiprack_300ul", slot="1") ********************** @@ -89,16 +89,16 @@ labware in a certain slot. .. code-block:: python - my_labware = labware.load('usascientific_12_reservoir_22ml', slot='1') + my_labware = labware.load("usascientific_12_reservoir_22ml", slot="1") A third optional argument can be used to give a labware a nickname for display in the Opentrons App. .. code-block:: python - my_labware = labware.load('usascientific_12_reservoir_22ml', - slot='2', - label='any-name-you-want') + my_labware = labware.load("usascientific_12_reservoir_22ml", + slot="2", + label="any-name-you-want") Sometimes, you may need to place a labware on top of something else on the @@ -108,9 +108,9 @@ deck, like modules. For this, you should use the ``share`` parameter. from opentrons import labware, modules - td = modules.load('tempdeck', slot='1') - plate = labware.load('opentrons_96_aluminumblock_biorad_wellplate_200ul', - slot='1', + td = modules.load("tempdeck", slot="1") + plate = labware.load("opentrons_96_aluminumblock_biorad_wellplate_200ul", + slot="1", share=True) To specify the version of the labware definition to use, you can use the ``version`` @@ -120,16 +120,16 @@ parameter: from opentrons import labware block1 = labware.load( - 'opentrons_96_aluminumblock_biorad_wellplate_200ul', - slot='1', + "opentrons_96_aluminumblock_biorad_wellplate_200ul", + slot="1", version=2) # version 2 of the aluminum block definition block2 = labware.load( - 'opentrons_96_aluminumblock_biorad_wellplate_200ul', - slot='2', + "opentrons_96_aluminumblock_biorad_wellplate_200ul", + slot="2", version=1) # version 1 of the aluminum block definition block3 = labware.load( - 'opentrons_96_aluminumblock_biorad_wellplate_200ul', - slot='2') # if you don't specify version, version 1 is used + "opentrons_96_aluminumblock_biorad_wellplate_200ul", + slot="2") # if you don't specify version, version 1 is used Create @@ -147,7 +147,7 @@ regularly-spaced columns and rows. .. code-block:: python - custom_plate_name = 'custom_18_wellplate_200ul' + custom_plate_name = "custom_18_wellplate_200ul" if plate_name not in labware.list(): labware.create( @@ -158,7 +158,7 @@ regularly-spaced columns and rows. depth=10, # depth (mm) of each well volume=200) # volume (µL) of each well - custom_plate = labware.load(custom_plate_name, slot='3') + custom_plate = labware.load(custom_plate_name, slot="3") for well in custom_plate.wells(): print(well) @@ -202,7 +202,7 @@ If you would like to delete a labware you have already added to the database from opentrons.data_storage import database - database.delete_container('custom_18_wellplate_200ul') + database.delete_container("custom_18_wellplate_200ul") .. Note:: There is some specialty labware that will require you to specify the @@ -239,8 +239,8 @@ transfer liquids to and from. The OT-2 deck and labware are all set up with the same coordinate system -- Lettered rows ``['A']-['END']`` -- Numbered columns ``['1']-['END']``. +- Lettered rows ``["A"]-["END"]`` +- Numbered columns ``["1"]-["END"]``. .. image:: ../img/well_iteration/Well_Iteration.png @@ -251,7 +251,7 @@ The OT-2 deck and labware are all set up with the same coordinate system ''' from opentrons import labware - plate = labware.load('corning_24_wellplate_3.4ml_flat', slot='1') + plate = labware.load("corning_24_wellplate_3.4ml_flat", slot="1") Wells by Name ------------- @@ -262,8 +262,8 @@ well as an argument, and will return the well at that location. .. code-block:: python - a1 = plate.wells('A1') - d6 = plate.wells('D6') + a1 = plate.wells("A1") + d6 = plate.wells("D6") Wells by Index -------------- @@ -289,8 +289,8 @@ Columns and Rows A labware's wells are organized within a series of columns and rows, which are also labelled on standard labware. In the API, rows are given letter names -(``'A'`` through ``'D'`` for example) and go left to right, while columns are -given numbered names (``'1'`` through ``'6'`` for example) and go from front to +(``"A"`` through ``"D"`` for example) and go left to right, while columns are +given numbered names (``"1"`` through ``"6"`` for example) and go from front to back. You can access a specific row or column by using the ``rows()`` and @@ -299,8 +299,8 @@ or column. .. code-block:: python - row = plate.rows('A') - column = plate.columns('1') + row = plate.rows("A") + column = plate.columns("1") print('Column "1" has', len(column), 'wells') print('Row "A" has', len(row), 'wells') @@ -314,16 +314,16 @@ will print out... The ``rows()`` or ``cols()`` methods can be used in combination with the ``wells()`` method to access wells within that row or column. In the example -below, both lines refer to well ``'A1'``. +below, both lines refer to well ``"A1"``. .. code-block:: python - plate.cols('1').wells('A') - plate.rows('A').wells('1') + plate.cols("1").wells("A") + plate.rows("A").wells("1") .. Tip:: The example above works but is a little convoluted. If you can, always get - individual wells like A1 with ``wells('A1')`` or ``wells(0)`` + individual wells like A1 with ``wells("A1")`` or ``wells(0)`` Multiple Wells @@ -344,7 +344,7 @@ liquid's source and/or destination. Or, we can get a group of wells and loop ''' from opentrons import labware - plate = labware.load('corning_24_wellplate_3.4ml_flat', slot='1') + plate = labware.load("corning_24_wellplate_3.4ml_flat", slot="1") Wells ----- @@ -356,7 +356,7 @@ Here is an example or accessing a list of wells, each specified by name: .. code-block:: python - w = plate.wells('A1', 'B2', 'C3', 'D4') + w = plate.wells("A1", "B2", "C3", "D4") print(w) @@ -371,7 +371,7 @@ iterated through: .. code-block:: python - for w in plate.wells('A1', 'B2', 'C3', 'D4'): + for w in plate.wells("A1", "B2", "C3", "D4"): print(w) will print out... @@ -392,7 +392,7 @@ the ``to=`` argument is the last well. .. code-block:: python - for w in plate.wells('A1', to='D1'): + for w in plate.wells("A1", to="D1"): print(w) will print out... @@ -410,7 +410,7 @@ starting position is allowed: .. code-block:: python - for w in plate.wells('D1', to='A1'): + for w in plate.wells("D1", to="A1"): print(w) will print out... @@ -427,11 +427,11 @@ Wells Length Another way you can create a list of wells is by specifying the length of the well list you need, including the starting well. The example below will -return 4 wells, starting at well ``'A1'``: +return 4 wells, starting at well ``"A1"``: .. code-block:: python - for w in plate.wells('A1', length=4): + for w in plate.wells("A1", length=4): print(w) will print out... @@ -453,7 +453,7 @@ Here is an example of iterating through rows: .. code-block:: python - for r in plate.rows('A', length=3): + for r in plate.rows("A", length=3): print(r) will print out... @@ -468,7 +468,7 @@ And here is an example of iterating through columns: .. code-block:: python - for c in plate.cols('1', to='6'): + for c in plate.cols("1", to="6"): print(c) will print out... @@ -511,7 +511,7 @@ The API's labware are also prepared to take string values for the slice's .. code-block:: python - for w in plate['A1':'A2':2]: + for w in plate["A1":"A2":2]: print(w) will print out... @@ -523,7 +523,7 @@ will print out... .. code-block:: python - for w in plate.rows['B']['1'::2]: + for w in plate.rows["B"]["1"::2]: print(w) will print out... diff --git a/api/docs/v1/modules.rst b/api/docs/v1/modules.rst index 1090287b781..23749419c91 100644 --- a/api/docs/v1/modules.rst +++ b/api/docs/v1/modules.rst @@ -18,7 +18,7 @@ within a protocol. To do this, you call: from opentrons import modules - module = modules.load('Module Name', slot) + module = modules.load("Module Name", slot) Above, `Module Name` represents either `tempdeck` or `magdeck`. @@ -29,7 +29,7 @@ To add a labware onto a given module, you will need to use the `share=True` call from opentrons import labware - labware = labware.load('96-flat', slot, share=True) + labware = labware.load("96-flat", slot, share=True) Where slot is the same slot in which you loaded your module. @@ -49,7 +49,7 @@ be done like the following: robot.connect() robot.discover_modules() - module = modules.load('Module Name', slot) + module = modules.load("Module Name", slot) ... etc Checking the status of your Module @@ -60,7 +60,7 @@ Both modules have the ability to check what state they are currently in. To do t from opentrons import modules - module = modules.load('Module Name', slot) + module = modules.load("Module Name", slot) status = module.status For the temperature module this will return a string stating whether it's `heating`, `cooling`, `holding at target` or `idle`. @@ -84,8 +84,8 @@ To set the temperature module to a given temperature in degrees celsius do the f from opentrons import modules, labware - module = modules.load('tempdeck', slot) - plate = labware.load('96-flat', slot, share=True) + module = modules.load("tempdeck", slot) + plate = labware.load("96-flat", slot, share=True) module.set_temperature(4) @@ -99,8 +99,8 @@ This function will pause your protocol until your target temperature is reached. from opentrons import modules, labware - module = modules.load('tempdeck', slot) - plate = labware.load('96-flat', slot, share=True) + module = modules.load("tempdeck", slot) + plate = labware.load("96-flat", slot, share=True) module.set_temperature(4) module.wait_for_temp() @@ -120,8 +120,8 @@ You can read the current real-time temperature of the module by the following: from opentrons import modules, labware - module = modules.load('tempdeck', slot) - plate = labware.load('96-flat', slot, share=True) + module = modules.load("tempdeck", slot) + plate = labware.load("96-flat", slot, share=True) temperature = module.temperature @@ -135,8 +135,8 @@ We can read the target temperature of the module by the following: from opentrons import modules, labware - module = modules.load('tempdeck', slot) - plate = labware.load('96-flat', slot, share=True) + module = modules.load("tempdeck", slot) + plate = labware.load("96-flat", slot, share=True) temperature = module.target @@ -152,8 +152,8 @@ or cooling phase again. from opentrons import modules, labware - module = modules.load('tempdeck', slot) - plate = labware.load('96-flat', slot, share=True) + module = modules.load("tempdeck", slot) + plate = labware.load("96-flat", slot, share=True) module.set_temperature(4) module.wait_for_temp() @@ -192,8 +192,8 @@ Engage from opentrons import modules, labware - module = modules.load('magdeck', slot) - plate = labware.load('biorad-hardshell-96-PCR', slot, share=True) + module = modules.load("magdeck", slot) + plate = labware.load("biorad-hardshell-96-PCR", slot, share=True) module.engage() @@ -213,8 +213,8 @@ You can also use a custom height parameter with engage(): from opentrons import modules, labware - module = modules.load('magdeck', slot) - plate = labware.load('96-deep-well', slot, share=True) + module = modules.load("magdeck", slot) + plate = labware.load("96-deep-well", slot, share=True) module.engage(height=12) @@ -232,8 +232,8 @@ Disengage from opentrons import modules, labware - module = modules.load('magdeck', slot) - plate = labware.load('biorad-hardshell-96-PCR', slot, share=True) + module = modules.load("magdeck", slot) + plate = labware.load("biorad-hardshell-96-PCR", slot, share=True) module.engage() ## OTHER PROTOCOL ACTIONS diff --git a/api/docs/v1/pipettes.rst b/api/docs/v1/pipettes.rst index 1e4d59eaf2d..72dc73d349f 100644 --- a/api/docs/v1/pipettes.rst +++ b/api/docs/v1/pipettes.rst @@ -36,12 +36,12 @@ They are as follows: For every pipette type you are using in a protocol, you must use one of the model names specified above and call it out as ``instruments.(Model Name)``. -You must also specify a mount. The mount can be either ``'left'`` or ``'right'``. +You must also specify a mount. The mount can be either ``"left"`` or ``"right"``. In this example, we are using a Single-Channel 300uL pipette. .. code-block:: python - pipette = instruments.P300_Single(mount='left') + pipette = instruments.P300_Single(mount="left") Pipette GEN2 Backwards Compatibility ==================================== @@ -72,7 +72,7 @@ The speeds at which the pipette will aspirate and dispense can be set through `` .. code-block:: python pipette = instruments.P300_Single( - mount='right', + mount="right", aspirate_flow_rate=200, dispense_flow_rate=600, blow_out_flow_rate=600) @@ -89,7 +89,7 @@ varying defaults depending on the model. .. code-block:: python pipette = instruments.P10_Single( - mount='right', + mount="right", min_volume=2, max_volume=8) diff --git a/api/docs/v1/writing.rst b/api/docs/v1/writing.rst index 675ccbaf6e1..df2ac455f52 100644 --- a/api/docs/v1/writing.rst +++ b/api/docs/v1/writing.rst @@ -115,7 +115,7 @@ This also provides an entrypoint to use the Opentrons simulation package from ot from opentrons.simulate import simulate, format_runlog # read the file - protocol_file = open('/path/to/protocol.py') + protocol_file = open("/path/to/protocol.py") # simulate() the protocol, keeping the runlog runlog, _bundle = simulate(protocol_file) # print the runlog diff --git a/api/docs/v2/adapting_ot2_flex.rst b/api/docs/v2/adapting_ot2_flex.rst index b9ada274495..6b788273d9b 100644 --- a/api/docs/v2/adapting_ot2_flex.rst +++ b/api/docs/v2/adapting_ot2_flex.rst @@ -18,9 +18,9 @@ Metadata and Requirements Flex requires you to specify an ``apiLevel`` of 2.15 or higher. If your OT-2 protocol specified ``apiLevel`` in the ``metadata`` dictionary, it's best to move it to the ``requirements`` dictionary. You can't specify it in both places, or the API will raise an error. .. note:: - Consult the list of :ref:`version-notes` to see what effect raising the ``apiLevel`` will have. If you increased it by multiple minor versions to get your protocol running on Flex, make sure that your protocol isn't using removed commands or commands whose behavior has changed in a way that may affect your scientific results. + Consult the :ref:`list of changes in API versions ` to see what effect raising the ``apiLevel`` will have. If you increased it by multiple minor versions to get your protocol running on Flex, make sure that your protocol isn't using removed commands or commands whose behavior has changed in a way that may affect your scientific results. -You also need to specify ``'robotType': 'Flex'``. If you omit ``robotType`` in the ``requirements`` dictionary, the API will assume the protocol is designed for the OT-2. +You also need to specify ``"robotType": "Flex"``. If you omit ``robotType`` in the ``requirements`` dictionary, the API will assume the protocol is designed for the OT-2. .. tabs:: @@ -34,7 +34,7 @@ You also need to specify ``'robotType': 'Flex'``. If you omit ``robotType`` in t metadata = { "protocolName": "My Protocol", "description": "This protocol uses the OT-2", - "apiLevel": "2.14" + "apiLevel": "|apiLevel|" } .. tab:: Updated Flex code @@ -84,10 +84,17 @@ This example converts OT-2 code that uses a P300 Single-Channel GEN2 pipette and "flex_1channel_1000", "left", tip_racks[tips] ) +Trash Container +=============== + +OT-2 protocols always have a :py:obj:`.fixed_trash` in slot 12. In Flex protocols specifying API version 2.16 or later, you need to :ref:`load a trash bin `. Put it in slot A3 to match the physical position of the OT-2 fixed trash:: + + trash = protocol.load_trash_bin("A3") + Deck Slot Labels ================ -It's good practice to update numeric labels for :ref:`deck-slots` (which match the labels on an OT-2) to coordinate ones (which match the labels on Flex). This is an optional step, since the two formats are interchangeable. +It's good practice to update numeric labels for :ref:`deck slots ` (which match the labels on an OT-2) to coordinate ones (which match the labels on Flex). This is an optional step, since the two formats are interchangeable. For example, the code in the previous section changed the location of the tip rack from ``1`` to ``"D1"``. @@ -102,7 +109,7 @@ If your OT-2 protocol uses older generations of the Temperature Module or Thermo The Heater-Shaker Module only has one generation, ``heaterShakerModuleV1``, which is compatible with Flex and OT-2. -The Magnetic Module is not compatible with Flex. For protocols that load ``magnetic module``, ``magdeck``, or ``magnetic module gen2``, you will need to make further modifications to use the :ref:`magnetic-block` and Flex Gripper instead. This will require reworking some of your protocol steps, and you should verify that your new protocol design achieves similar results. +The Magnetic Module is not compatible with Flex. For protocols that load ``magnetic module``, ``magdeck``, or ``magnetic module gen2``, you will need to make further modifications to use the :ref:`Magnetic Block ` and Flex Gripper instead. This will require reworking some of your protocol steps, and you should verify that your new protocol design achieves similar results. This simplified example, taken from a DNA extraction protocol, shows how using the Flex Gripper and the Magnetic Block can save time. Instead of pipetting an entire plate's worth of liquid from the Heater-Shaker to the Magnetic Module and then engaging the module, the gripper moves the plate to the Magnetic Block in one step. diff --git a/api/docs/v2/basic_commands/liquids.rst b/api/docs/v2/basic_commands/liquids.rst new file mode 100644 index 00000000000..f5f4d670319 --- /dev/null +++ b/api/docs/v2/basic_commands/liquids.rst @@ -0,0 +1,256 @@ +:og:description: Basic commands for working with liquids. + +.. _liquid-control: + +************** +Liquid Control +************** + +After attaching a tip, your robot is ready to aspirate, dispense, and perform other liquid handling tasks. The API includes methods that help you perform these actions and the following sections show how to use them. The examples used here assume that you've loaded the pipettes and labware from the basic :ref:`protocol template `. + +.. _new-aspirate: + +Aspirate +======== + +To draw liquid up into a pipette tip, call the :py:meth:`.InstrumentContext.aspirate` method. Using this method, you can specify the aspiration volume in µL, the well location, and pipette flow rate. Other parameters let you position the pipette within a well. For example, this snippet tells the robot to aspirate 200 µL from well location A1. + +.. code-block:: python + + pipette.pick_up_tip() + pipette.aspirate(200, plate["A1"]) + +If the pipette doesn't move, you can specify an additional aspiration action without including a location. To demonstrate, this code snippet pauses the protocol, automatically resumes it, and aspirates a second time from ``plate["A1"]``). + +.. code-block:: python + + pipette.pick_up_tip() + pipette.aspirate(200, plate["A1"]) + protocol.delay(seconds=5) # pause for 5 seconds + pipette.aspirate(100) # aspirate 100 µL at current position + +Now our pipette holds 300 µL. + +Aspirate by Well or Location +---------------------------- + +The :py:meth:`~.InstrumentContext.aspirate` method includes a ``location`` parameter that accepts either a :py:class:`.Well` or a :py:class:`~.types.Location`. + +If you specify a well, like ``plate["A1"]``, the pipette will aspirate from a default position 1 mm above the bottom center of that well. To change the default clearance, first set the ``aspirate`` attribute of :py:obj:`.well_bottom_clearance`:: + + pipette.pick_up_tip + pipette.well_bottom_clearance.aspirate = 2 # tip is 2 mm above well bottom + pipette.aspirate(200, plate["A1"]) + +You can also aspirate from a location along the center vertical axis within a well using the :py:meth:`.Well.top` and :py:meth:`.Well.bottom` methods. These methods move the pipette to a specified distance relative to the top or bottom center of a well:: + + pipette.pick_up_tip() + depth = plate["A1"].bottom(z=2) # tip is 2 mm above well bottom + pipette.aspirate(200, depth) + +See also: + +- :ref:`new-default-op-positions` for information about controlling pipette height for a particular pipette. +- :ref:`position-relative-labware` for information about controlling pipette height from within a well. +- :ref:`move-to` for information about moving a pipette to any reachable deck location. + +Aspiration Flow Rates +--------------------- + +Flex and OT-2 pipettes aspirate at :ref:`default flow rates ` measured in µL/s. Specifying the ``rate`` parameter multiplies the flow rate by that value. As a best practice, don't set the flow rate higher than 3x the default. For example, this code causes the pipette to aspirate at twice its normal rate:: + + + pipette.aspirate(200, plate["A1"], rate=2.0) + +.. versionadded:: 2.0 + +.. _new-dispense: + +Dispense +======== + +To dispense liquid from a pipette tip, call the :py:meth:`.InstrumentContext.dispense` method. Using this method, you can specify the dispense volume in µL, the well location, and pipette flow rate. Other parameters let you position the pipette within a well. For example, this snippet tells the robot to dispense 200 µL into well location B1. + +.. code-block:: python + + pipette.dispense(200, plate["B1"]) + +If the pipette doesn’t move, you can specify an additional dispense action without including a location. To demonstrate, this code snippet pauses the protocol, automatically resumes it, and dispense a second time from location B1. + +.. code-block:: python + + pipette.dispense(100, plate["B1"]) + protocol.delay(seconds=5) # pause for 5 seconds + pipette.dispense(100) # dispense 100 µL at current position + +Dispense by Well or Location +---------------------------- + +The :py:meth:`~.InstrumentContext.dispense` method includes a ``location`` parameter that accepts either a :py:class:`.Well` or a :py:class:`~.types.Location`. + +If you specify a well, like ``plate["B1"]``, the pipette will dispense from a default position 1 mm above the bottom center of that well. To change the default clearance, you would call :py:obj:`.well_bottom_clearance`:: + + pipette.well_bottom_clearance.dispense=2 # tip is 2 mm above well bottom + pipette.dispense(200, plate["B1"]) + +You can also dispense from a location along the center vertical axis within a well using the :py:meth:`.Well.top` and :py:meth:`.Well.bottom` methods. These methods move the pipette to a specified distance relative to the top or bottom center of a well:: + + depth = plate["B1"].bottom(z=2) # tip is 2 mm above well bottom + pipette.dispense(200, depth) + +See also: + +- :ref:`new-default-op-positions` for information about controlling pipette height for a particular pipette. +- :ref:`position-relative-labware` for formation about controlling pipette height from within a well. +- :ref:`move-to` for information about moving a pipette to any reachable deck location. + +Dispense Flow Rates +------------------- + +Flex and OT-2 pipettes dispense at :ref:`default flow rates ` measured in µL/s. Adding a number to the ``rate`` parameter multiplies the flow rate by that value. As a best practice, don't set the flow rate higher than 3x the default. For example, this code causes the pipette to dispense at twice its normal rate:: + + pipette.dispense(200, plate["B1"], rate=2.0) + +.. versionadded:: 2.0 + +.. _push-out-dispense: + +Push Out After Dispense +----------------------- + +The optional ``push_out`` parameter of ``dispense()`` helps ensure all liquid leaves the tip. Use ``push_out`` for applications that require moving the pipette plunger lower than the default, without performing a full :ref:`blow out `. + +For example, this dispense action moves the plunger the equivalent of an additional 5 µL beyond where it would stop if ``push_out`` was set to zero or omitted:: + + pipette.pick_up_tip() + pipette.aspirate(100, plate["A1"]) + pipette.dispense(100, plate["B1"], push_out=5) + pipette.drop_tip() + +.. versionadded:: 2.15 + +.. note:: + In version 7.0.2 and earlier of the robot software, you could accomplish a similar result by dispensing a volume greater than what was aspirated into the pipette. In version 7.1.0 and later, the API will return an error. Calculate the difference between the two amounts and use that as the value of ``push_out``. + +.. _new-blow-out: + +.. _blow-out: + +Blow Out +======== + +To blow an extra amount of air through the pipette's tip, call the :py:meth:`.InstrumentContext.blow_out` method. You can use a specific well in a well plate or reservoir as the blowout location. If no location is specified, the pipette will blowout from its current well position:: + + pipette.blow_out() + +You can also specify a particular well as the blowout location:: + + pipette.blow_out(plate["B1"]) + +Many protocols use a trash container for blowing out the pipette. You can specify the pipette's current trash container as the blowout location by using the :py:obj:`.InstrumentContext.trash_container` property:: + + pipette.blow_out(pipette.trash_container) + +.. versionadded:: 2.0 +.. versionchanged:: 2.16 + Added support for ``TrashBin`` and ``WasteChute`` locations. + +.. _touch-tip: + +Touch Tip +========= + +The :py:meth:`.InstrumentContext.touch_tip` method moves the pipette so the tip touches each wall of a well. A touch tip procedure helps knock off any droplets that might cling to the pipette's tip. This method includes optional arguments that allow you to control where the tip will touch the inner walls of a well and the touch speed. Calling :py:meth:`~.InstrumentContext.touch_tip` without arguments causes the pipette to touch the well walls from its current location:: + + pipette.touch_tip() + +Touch Location +-------------- + +These optional location arguments give you control over where the tip will touch the side of a well. + +This example demonstrates touching the tip in a specific well:: + + pipette.touch_tip(plate["B1"]) + +This example uses an offset to set the touch tip location 2mm below the top of the current well:: + + pipette.touch_tip(v_offset=-2) + +This example moves the pipette 75% of well's total radius and 2 mm below the top of well:: + + pipette.touch_tip(plate["B1"], + radius=0.75, + v_offset=-2) + +The ``touch_tip`` feature allows the pipette to touch the edges of a well gently instead of crashing into them. It includes the ``radius`` argument. When ``radius=1`` the robot moves the centerline of the pipette’s plunger axis to the edge of a well. This means a pipette tip may sometimes touch the well wall too early, causing it to bend inwards. A smaller radius helps avoid premature wall collisions and a lower speed produces gentler motion. Different liquid droplets behave differently, so test out these parameters in a single well before performing a full protocol run. + +.. warning:: + *Do not* set the ``radius`` value greater than ``1.0``. When ``radius`` is > ``1.0``, the robot will forcibly move the pipette tip across a well wall or edge. This type of aggressive movement can damage the pipette tip and the pipette. + +Touch Speed +----------- + +Touch speed controls how fast the pipette moves in mm/s during a touch tip step. The default movement speed is 60 mm/s, the minimum is 1 mm/s, and the maximum is 80 mm/s. Calling ``touch_tip`` without any arguments moves a tip at the default speed in the current well:: + + pipette.touch_tip() + +This example specifies a well location and sets the speed to 20 mm/s:: + + pipette.touch_tip(plate["B1"], speed=20) + +This example uses the current well and sets the speed to 80 mm/s:: + + pipette.touch_tip(speed=80) + +.. versionadded:: 2.0 + +.. versionchanged:: 2.4 + Lowered minimum speed to 1 mm/s. + +.. _mix: + +Mix +==== + +The :py:meth:`~.InstrumentContext.mix` method aspirates and dispenses repeatedly in a single location. It's designed to mix the contents of a well together using a single command rather than using multiple ``aspirate()`` and ``dispense()`` calls. This method includes arguments that let you specify the number of times to mix, the volume (in µL) of liquid, and the well that contains the liquid you want to mix. + +This example draws 100 µL from the current well and mixes it three times:: + + pipette.mix(repetitions=3, volume=100) + +This example draws 100 µL from well B1 and mixes it three times:: + + pipette.mix(3, 100, plate["B1"]) + +This example draws an amount equal to the pipette's maximum rated volume and mixes it three times:: + + pipette.mix(repetitions=3) + +.. note:: + + In API versions 2.2 and earlier, during a mix, the pipette moves up and out of the target well. In API versions 2.3 and later, the pipette does not move while mixing. + +.. versionadded:: 2.0 + +.. _air-gap: + +Air Gap +======= + +The :py:meth:`.InstrumentContext.air_gap` method tells the pipette to draw in air before or after a liquid. Creating an air gap helps keep liquids from seeping out of a pipette after drawing it from a well. This method includes arguments that give you control over the amount of air to aspirate and the pipette's height (in mm) above the well. By default, the pipette moves 5 mm above a well before aspirating air. Calling :py:meth:`~.InstrumentContext.air_gap` with no arguments uses the entire remaining volume in the pipette. + +This example aspirates 200 µL of air 5 mm above the current well:: + + pipette.air_gap(volume=200) + +This example aspirates 200 µL of air 20 mm above the the current well:: + + pipette.air_gap(volume=200, height=20) + +This example aspirates enough air to fill the remaining volume in a pipette:: + + pipette.air_gap() + +.. versionadded:: 2.0 + diff --git a/api/docs/v2/basic_commands/pipette_tips.rst b/api/docs/v2/basic_commands/pipette_tips.rst new file mode 100644 index 00000000000..f4871540391 --- /dev/null +++ b/api/docs/v2/basic_commands/pipette_tips.rst @@ -0,0 +1,126 @@ +:og:description: Basic commands for working with pipette tips. + +.. _pipette-tips: + +************************* +Manipulating Pipette Tips +************************* + +Your robot needs to attach a disposable tip to the pipette before it can aspirate or dispense liquids. The API provides three basic functions that help the robot attach and manage pipette tips during a protocol run. These methods are :py:meth:`.InstrumentContext.pick_up_tip`, :py:meth:`.InstrumentContext.drop_tip`, and :py:meth:`.InstrumentContext.return_tip`. Respectively, these methods tell the robot to pick up a tip from a tip rack, drop a tip into the trash (or another location), and return a tip to its location in the tip rack. + +The following sections demonstrate how to use each method and include sample code. The examples used here assume that you've loaded the pipettes and labware from the basic :ref:`protocol template `. + +.. _basic-tip-pickup: + +Picking Up a Tip +================ + +To pick up a tip, call the :py:meth:`~.InstrumentContext.pick_up_tip` method without any arguments:: + + pipette.pick_up_tip() + +This simple statement works because the variable ``tiprack_1`` in the sample protocol includes the on-deck location of the tip rack (Flex ``location="D3"``, OT-2 ``location=3``) *and* the ``pipette`` variable includes the argument ``tip_racks=[tiprack_1]``. Given this information, the robot moves to the tip rack and picks up a tip from position A1 in the rack. On subsequent calls to ``pick_up_tip()``, the robot will use the next available tip. For example:: + + pipette.pick_up_tip() # picks up tip from rack location A1 + pipette.drop_tip() # drops tip in trash bin + pipette.pick_up_tip() # picks up tip from rack location B1 + pipette.drop_tip() # drops tip in trash bin + +If you omit the ``tip_rack`` argument from the ``pipette`` variable, the API will raise an error. You must pass in the tip rack's location to ``pick_up_tip`` like this:: + + pipette.pick_up_tip(tiprack_1["A1"]) + pipette.drop_tip() + pipette.pick_up_tip(tiprack_1["B1"]) + +If coding the location of each tip seems inefficient or tedious, try using a ``for`` loop to automate a sequential tip pick up process. When using a loop, the API keeps track of tips and manages tip pickup for you. But ``pick_up_tip`` is still a powerful feature. It gives you direct control over tip use when that’s important in your protocol. + +.. versionadded:: 2.0 + +Automating Tip Pick Up +====================== + +When used with Python's :py:class:`range` class, a ``for`` loop brings automation to the tip pickup and tracking process. It also eliminates the need to call ``pick_up_tip()`` multiple times. For example, this snippet tells the robot to sequentially use all the tips in a 96-tip rack:: + + for i in range(96): + pipette.pick_up_tip() + # liquid handling commands + pipette.drop_tip() + +If your protocol requires a lot of tips, add a second tip rack to the protocol. Then, associate it with your pipette and increase the number of repetitions in the loop. The robot will work through both racks. + +First, add another tip rack to the sample protocol:: + + tiprack_2 = protocol.load_labware( + load_name="opentrons_flex_96_tiprack_1000ul", + location="C3" + ) + +Next, append the new tip rack to the pipette's ``tip_rack`` property:: + + pipette = protocol.load_instrument( + instrument_name="flex_1channel_1000", + mount="left", + tip_racks=[tiprack_1, tiprack_2], + ) + pipette_1.tip_racks.append(tiprack_2) + +Finally, sum the tip count in the range:: + + for i in range(192): + pipette.pick_up_tip() + pipette.drop_tip() + +For a more advanced "real-world" example, review the :ref:`off-deck location protocol ` on the :ref:`moving-labware` page. This example also uses a ``for`` loop to iterate through a tip rack, but it includes other commands that pause the protocol and let you replace an on-deck tip rack with another rack stored in an off-deck location. + +.. _pipette-drop-tip: + +Dropping a Tip +============== + +To drop a tip in the pipette's trash container, call the :py:meth:`~.InstrumentContext.drop_tip` method with no arguments:: + + pipette.pick_up_tip() + +You can also specify where to drop the tip by passing in a location. For example, this code drops a tip in the trash bin and returns another tip to to a previously used well in a tip rack:: + + pipette.pick_up_tip() # picks up tip from rack location A1 + pipette.drop_tip() # drops tip in trash bin + pipette.pick_up_tip() # picks up tip from rack location B1 + pipette.drop_tip(tiprack["A1"]) # drops tip in rack location A1 + +.. versionadded:: 2.0 + +.. _pipette-return-tip: + +Returning a Tip +=============== + +To return a tip to its original location, call the :py:meth:`~.InstrumentContext.return_tip` method with no arguments:: + + pipette.return_tip() + +.. versionadded:: 2.0 + +.. note:: + You can't return tips with a pipette that's configured to use :ref:`partial tip pickup `. This restriction ensures that the pipette has clear access to unused tips. For example, a 96-channel pipette in column configuration can't reach column 2 unless column 1 is empty. + + If you call ``return_tip()`` while using partial tip pickup, the API will raise an error. Use ``drop_tip()`` to dispose the tips instead. + +Working With Used Tips +====================== + +Currently, the API considers tips as "used" after being picked up. For example, if the robot picked up a tip from rack location A1 and then returned it to the same location, it will not attempt to pick up this tip again, unless explicitly specified. Instead, the robot will pick up a tip starting from rack location B1. For example:: + + pipette.pick_up_tip() # picks up tip from rack location A1 + pipette.return_tip() # drops tip in rack location A1 + pipette.pick_up_tip() # picks up tip from rack location B1 + pipette.drop_tip() # drops tip in trash bin + pipette.pick_up_tip(tiprack_1["A1"]) # picks up tip from rack location A1 + +Early API versions treated returned tips as unused items. They could be picked up again without an explicit argument. For example:: + + pipette.pick_up_tip() # picks up tip from rack location A1 + pipette.return_tip() # drops tip in rack location A1 + pipette.pick_up_tip() # picks up tip from rack location A1 + +.. versionchanged:: 2.2 diff --git a/api/docs/v2/basic_commands/utilities.rst b/api/docs/v2/basic_commands/utilities.rst new file mode 100644 index 00000000000..b1593785d31 --- /dev/null +++ b/api/docs/v2/basic_commands/utilities.rst @@ -0,0 +1,105 @@ +:og:description: Basic commands for working with robot utility features. + +.. _new-utility-commands: + +**************** +Utility Commands +**************** + +With utility commands, you can control various robot functions such as pausing or delaying a protocol, checking the robot's door, turning robot lights on/off, and more. The following sections show you how to these utility commands and include sample code. The examples used here assume that you’ve loaded the pipettes and labware from the basic :ref:`protocol template `. + +Delay and Resume +================ + +Call the :py:meth:`.ProtocolContext.delay` method to insert a timed delay into your protocol. This method accepts time increments in seconds, minutes, or combinations of both. Your protocol resumes automatically after the specified time expires. + +This example delays a protocol for 10 seconds:: + + protocol.delay(seconds=10) + +This example delays a protocol for 5 minutes:: + + protocol.delay(minutes=5) + +This example delays a protocol for 5 minutes and 10 seconds:: + + protocol.delay(minutes=5, seconds=10) + +Pause Until Resumed +=================== + +Call the :py:meth:`.ProtocolContext.pause` method to stop a protocol at a specific step. Unlike a delay, :py:meth:`~.ProtocolContext.pause` does not restart your protocol automatically. To resume, you'll respond to a prompt on the touchscreen or in the Opentrons App. This method also lets you specify an optional message that provides on-screen or in-app instructions on how to proceed. This example inserts a pause and includes a brief message:: + + protocol.pause("Remember to get more pipette tips") + +.. versionadded:: 2.0 + +.. _utility-homing: + +Homing +====== + +Homing commands the robot to move the gantry, a pipette, or a pipette plunger to a defined position. For example, homing the gantry moves it to the back right of the working area. With the available homing methods you can home the gantry, home the mounted pipette and plunger, and home the pipette plunger. These functions take no arguments. + +To home the gantry, call :py:meth:`.ProtocolContext.home`:: + + protocol.home() + +To home a specific pipette's Z axis and plunger, call :py:meth:`.InstrumentContext.home`:: + + pipette = protocol.load_instrument("flex_1channel_1000", "right") + pipette.home() + +To home a specific pipette's plunger only, you can call :py:meth:`.InstrumentContext.home_plunger`:: + + pipette = protocol.load_instrument("flex_1channel_1000", "right") + pipette.home_plunger() + +.. versionadded:: 2.0 + +Comment +======= + +Call the :py:meth:`.ProtocolContext.comment` method if you want to write and display a brief message in the Opentrons App during a protocol run:: + + protocol.comment("Hello, world!") + +.. versionadded:: 2.0 + +Control and Monitor Robot Rail Lights +===================================== + +Call the :py:meth:`.ProtocolContext.set_rail_lights` method to turn the robot's rail lights on or off during a protocol. This method accepts Boolean ``True`` (lights on) or ``False`` (lights off) arguments. Rail lights are off by default. + +This example turns the rail lights on:: + + protocol.set_rail_lights(True) + + +This example turns the rail lights off:: + + protocol.set_rail_lights(False) + +.. versionadded:: 2.5 + +You can also check whether the rail lights are on or off in the protocol by using :py:obj:`.ProtocolContext.rail_lights_on`. This method returns ``True`` when lights are on and ``False`` when the lights are off. + +.. versionadded:: 2.5 + + +OT-2 Door Safety Switch +======================= + +Introduced with :ref:`robot software version ` 3.19, the safety switch feature prevents the OT-2, and your protocol, from running if the door is open. To operate properly, the front door and top window of your OT-2 must be closed. You can toggle the door safety switch on or off from **Robot Settings > Advanced > Usage Settings**. + +To check if the robot's door is closed at a specific point during a protocol run, call :py:obj:`.ProtocolContext.door_closed`. It returns a Boolean ``True`` (door closed) or ``False`` (door open) response. + +.. code-block:: python + + protocol.door_closed + +.. warning:: + + :py:obj:`~.ProtocolContext.door_closed` is a status check only. It does not control the robot's behavior. If you wish to implement a custom method to pause or resume a protocol using ``door_closed``, disable the door safety feature first (not recommended). + +.. versionadded:: 2.5 diff --git a/api/docs/v2/complex_commands/order_operations.rst b/api/docs/v2/complex_commands/order_operations.rst index d3a05c12663..a55143e33e3 100644 --- a/api/docs/v2/complex_commands/order_operations.rst +++ b/api/docs/v2/complex_commands/order_operations.rst @@ -6,14 +6,14 @@ Order of Operations ******************* -Complex commands perform a series of :ref:`v2-atomic-commands` in order. In fact, the run preview for your protocol in the Opentrons App lists all of these commands as separate steps. This lets you examine what effect your complex commands will have before running them. +Complex commands perform a series of :ref:`building block commands ` in order. In fact, the run preview for your protocol in the Opentrons App lists all of these commands as separate steps. This lets you examine what effect your complex commands will have before running them. This page describes what steps you should expect the robot to perform when using different complex commands with different required and :ref:`optional ` parameters. Step Sequence ============= -The order of steps is fixed within complex commands. Aspiration and dispensing are the only required actions. You can enable or disable all of the other actions with :ref:`complex_params`. A complex command designed to perform every possible action will proceed in this order: +The order of steps is fixed within complex commands. Aspiration and dispensing are the only required actions. You can enable or disable all of the other actions with :ref:`complex liquid handling parameters `. A complex command designed to perform every possible action will proceed in this order: 1. Pick up tip 2. Mix at source diff --git a/api/docs/v2/complex_commands/sources_destinations.rst b/api/docs/v2/complex_commands/sources_destinations.rst index b06003a9a68..3c8e725a9aa 100644 --- a/api/docs/v2/complex_commands/sources_destinations.rst +++ b/api/docs/v2/complex_commands/sources_destinations.rst @@ -53,7 +53,7 @@ The following table summarizes the source and destination restrictions for each - **Source:** Any number of wells. - **Destination:** Exactly one well. -A single well can be passed by itself or as a list with one item: ``source=plate['A1']`` and ``source=[plate['A1']]`` are equivalent. +A single well can be passed by itself or as a list with one item: ``source=plate["A1"]`` and ``source=[plate["A1"]]`` are equivalent. The section on :ref:`many-to-many transfers ` below covers how ``transfer()`` works when specifying sources and destinations of different sizes. However, if they don't meet the even divisibility requirement, the API will raise an error. You can work around such situations by making multiple calls to ``transfer()`` in sequence or by using a :ref:`list of volumes ` to skip certain wells. @@ -103,7 +103,7 @@ Aspirating and Dispensing See :ref:`complex-tip-refilling` below for cases where the total amount to be dispensed is greater than the capacity of the tip. .. figure:: ../../img/complex_commands/robot_distribute.png - :name: Transfer + :name: Distribute :scale: 35% :align: center @@ -120,7 +120,7 @@ See :ref:`complex-tip-refilling` below for cases where the total amount to be di See :ref:`complex-tip-refilling` below for cases where the total amount to be aspirated is greater than the capacity of the tip. .. figure:: ../../img/complex_commands/robot_consolidate.png - :name: Transfer + :name: Consolidate :scale: 35% :align: center @@ -175,7 +175,7 @@ When the source and destination both contain the same number of wells, the mappi - B11 - B12 -There's no requirement that the source and destination lists be mutually exclusive. In fact, this command adapted from the :ref:`tutorial` deliberately uses slices of the same list, saved to the variable ``row``, with the effect that each aspiration happens in the same location as the previous dispense:: +There's no requirement that the source and destination lists be mutually exclusive. In fact, this command adapted from the :ref:`tutorial ` deliberately uses slices of the same list, saved to the variable ``row``, with the effect that each aspiration happens in the same location as the previous dispense:: row = plate.rows()[0] pipette.transfer( diff --git a/api/docs/v2/conf.py b/api/docs/v2/conf.py index 29524982522..33885181e59 100644 --- a/api/docs/v2/conf.py +++ b/api/docs/v2/conf.py @@ -96,13 +96,10 @@ # setup the code block substitution extension to auto-update apiLevel extensions += ['sphinx-prompt', 'sphinx_substitution_extensions'] -# get the max API level -from opentrons.protocol_api import MAX_SUPPORTED_VERSION # noqa -max_apiLevel = str(MAX_SUPPORTED_VERSION) - # use rst_prolog to hold the subsitution +# update the apiLevel value whenever a new minor version is released rst_prolog = f""" -.. |apiLevel| replace:: {max_apiLevel} +.. |apiLevel| replace:: 2.16 .. |release| replace:: {release} """ @@ -427,3 +424,25 @@ # -- Options for tabs ----------------------------------------------------- sphinx_tabs_disable_tab_closing = True + +# -- Suppress autodoc warnings -------------------------------------------- + +# Ignore warnings for deliberately missing/undocumented things that appear +# in automatically generated type signatures. +# +# The goal here is to pass through any warnings for bad targets of MANUALLY +# created links. +nitpick_ignore_regex = [ + ("py:class", r".*Optional\[.*"), # any Optional with bad members + ("py:class", r".*commands\.types.*"), + ("py:class", r".*hardware_control.*"), + ("py:class", r".*legacy_broker.*"), + ("py:class", r".*protocol_api\.core.*"), + ("py:class", r".*api_support.*"), + ("py:class", r".*duration\.estimator.*"), + ("py:class", r".*protocols\.types.*"), + ("py:class", r".*protocol_api\.deck.*"), + ("py:class", r".*protocol_api\.config.*"), + ("py:class", r".*opentrons_shared_data.*"), + ("py:class", r'.*AbstractLabware|APIVersion|LabwareLike|LoadedCoreMap|ModuleTypes|NoneType|OffDeckType|ProtocolCore|WellCore'), # laundry list of not fully qualified things +] diff --git a/api/docs/v2/deck_slots.rst b/api/docs/v2/deck_slots.rst index 83781227e3c..2c38e70755f 100644 --- a/api/docs/v2/deck_slots.rst +++ b/api/docs/v2/deck_slots.rst @@ -1,33 +1,31 @@ :og:description: How to specify deck slots in the Python Protocol API. -.. - Allow concise cross-referencing to ProtocolContext.load_labware() et. al., without barfing out the whole import path. -.. py:currentmodule:: opentrons.protocol_api - - .. _deck-slots: ********** Deck Slots ********** -When you load an item onto the robot's deck, like with :py:obj:`ProtocolContext.load_labware()` or :py:obj:`ProtocolContext.load_module()`, you need to specify which slot to put it in. The API accepts values that correspond to the physical deck slot labels on an OT-2 or Flex robot. +Deck slots are where you place hardware items on the deck surface of your Opentrons robot. In the API, you load the corresponding items into your protocol with methods like :py:obj:`.ProtocolContext.load_labware`, :py:obj:`.ProtocolContext.load_module`, or :py:obj:`.ProtocolContext.load_trash_bin`. When you call these methods, you need to specify which slot to load the item in. Physical Deck Labels ==================== -The Opentrons Flex uses a coordinate labeling system for slots A1 (back left) through D3 (front right). +Flex uses a coordinate labeling system for slots A1 (back left) through D4 (front right). Columns 1 through 3 are in the *working area* and are accessible by pipettes and the gripper. Column 4 is in the *staging area* and is only accessible by the gripper. For more information on staging area slots, see :ref:`deck-configuration` below. + +.. image:: ../img/flex-deck.svg + :width: 80% -The Opentrons OT-2 uses a numeric labeling system for slots 1 (front left) through 11 (back center). The back right slot is occupied by the fixed trash. +OT-2 uses a numeric labeling system for slots 1 (front left) through 11 (back center). The back right slot is occupied by the fixed trash. -.. image:: ../img/Flex-and-OT-2-decks.svg - :width: 100% +.. image:: ../img/OT-2-deck.svg + :width: 55% API Deck Labels =============== -Specify a slot in either the Flex or OT-2 format: +The API accepts values that correspond to the physical deck slot labels on a Flex or OT-2 robot. Specify a slot in either format: * A coordinate like ``"A1"``. This format must be a string. * A number like ``"10"`` or ``10``. This format can be a string or an integer. @@ -83,3 +81,113 @@ The correspondence between deck labels is based on the relative locations of the - 3 .. TODO staging slots and error handling of A4–D4 in OT-2 protocols + +Slots A4, B4, C4, and D4 on Flex have no equivalent on OT-2. + +.. _deck-configuration: + +Deck Configuration +================== + +A Flex running robot system version 7.1.0 or higher lets you specify its deck configuration on the touchscreen or in the Opentrons App. This tells the robot the positions of unpowered *deck fixtures*: items that replace standard deck slots. The following table lists currently supported deck fixtures and their allowed deck locations. + +.. list-table:: + :header-rows: 1 + + * - Fixture + - Slots + * - Staging area slots + - A3–D3 + * - Trash bin + - A1–D1, A3-D3 + * - Waste chute + - D3 + +Which fixtures you need to configure depend on both load methods and the effects of other methods called in your protocol. The following sections explain how to configure each type of fixture. + +.. _configure-staging-area-slots: + +Staging Area Slots +------------------ + +Slots A4 through D4 are the staging area slots. Pipettes can't reach the staging area, but these slots are always available in the API for loading and moving labware. Using a slot in column 4 as the ``location`` argument of :py:meth:`~.ProtocolContext.load_labware` or the ``new_location`` argument of :py:meth:`.move_labware` will require the corresponding staging area slot in the robot's deck configuration:: + + plate_1 = protocol.load_labware( + load_name="corning_96_wellplate_360ul_flat", location="C3" + ) # no staging slots required + plate_2 = protocol.load_labware( + load_name="corning_96_wellplate_360ul_flat", location="D4" + ) # one staging slot required + protocol.move_labware( + labware=plate_1, new_location="C4" + ) # two staging slots required + +.. versionadded:: 2.16 + +Since staging area slots also include a standard deck slot in column 3, they are physically incompatible with powered modules in the same row of column 3. For example, if you try to load a module in C3 and labware in C4, the API will raise an error:: + + temp_mod = protocol.load_module( + module_name="temperature module gen2", + location="C3" + ) + staging_plate = protocol.load_labware( + load_name="corning_96_wellplate_360ul_flat", location="C4" + ) # deck conflict error + +It is possible to use slot D4 along with the waste chute. See the :ref:`Waste Chute ` section below for details. + +.. _configure-trash-bin: + +Trash Bin +--------- + +In version 2.15 of the API, Flex can only have a single trash bin in slot A3. You do not have to (and cannot) load the trash in version 2.15 protocols. + +Starting in API version 2.16, you must load trash bin fixtures in your protocol in order to use them. Use :py:meth:`.load_trash_bin` to load a movable trash bin. This example loads a single bin in the default location:: + + default_trash = protocol.load_trash_bin(location = "A3") + +.. versionadded:: 2.16 + +.. note:: + The :py:class:`.TrashBin` class doesn't have any callable methods, so you don't have to save the result of ``load_trash_bin()`` to a variable, especially if your protocol only loads a single trash container. Being able to reference the trash bin by name is useful when dealing with multiple trash containers. + +Call ``load_trash_bin()`` multiple times to add more than one bin. See :ref:`pipette-trash-containers` for more information on using pipettes with multiple trash bins. + +.. _configure-waste-chute: + +Waste Chute +----------- + +The waste chute accepts various materials from Flex pipettes or the Flex Gripper and uses gravity to transport them outside of the robot for disposal. Pipettes can dispose of liquid or drop tips into the chute. The gripper can drop tip racks and other labware into the chute. + +To use the waste chute, first use :py:meth:`.load_waste_chute` to load it in slot D3:: + + chute = protocol.load_waste_chute() + +.. versionadded:: 2.16 + +The ``load_waste_chute()`` method takes no arguments, since D3 is the only valid location for the chute. However, there are multiple variant configurations of the waste chute, depending on how other methods in your protocol use it. + +The waste chute is installed either on a standard deck plate adapter or on a deck plate adapter with a staging area. If any :py:meth:`~.ProtocolContext.load_labware` or :py:meth:`.move_labware` calls in your protocol reference slot D4, you have to use the deck plate adapter with staging area. + +The waste chute has a removable cover with a narrow opening which helps prevent aerosols and droplets from contaminating the working area. 1- and 8-channel pipettes can dispense liquid, blow out, or drop tips through the opening in the cover. Any of the following require you to remove the cover. + + - :py:meth:`.dispense`, :py:meth:`.blow_out`, or :py:meth:`.drop_tip` with a 96-channel pipette. + - :py:meth:`.move_labware` with the chute as ``new_location`` and ``use_gripper=True``. + +If your protocol *does not* call any of these methods, your deck configuration should include the cover. + +In total, there are four possible deck configurations for the waste chute. + - Waste chute only + - Waste chute with cover + - Waste chute with staging area slot + - Waste chute with staging area slot and cover + +Deck Conflicts +============== + +A deck conflict check occurs when preparing to run a Python protocol on a Flex running robot system version 7.1.0 or higher. The Opentrons App and touchscreen will prevent you from starting the protocol run until any conflicts are resolved. You can resolve them one of two ways: + + - Physically move hardware around the deck, and update the deck configuration. + - Alter your protocol to work with the current deck configuration, and resend the protocol to your Flex. diff --git a/api/docs/v2/example_protocols/dilution_tutorial.py b/api/docs/v2/example_protocols/dilution_tutorial.py index 9ed16902095..a7d38c53eb4 100644 --- a/api/docs/v2/example_protocols/dilution_tutorial.py +++ b/api/docs/v2/example_protocols/dilution_tutorial.py @@ -1,24 +1,24 @@ from opentrons import protocol_api metadata = { - 'apiLevel': '2.15', - 'protocolName': 'Serial Dilution Tutorial – OT-2 single-channel', - 'description': '''This protocol is the outcome of following the + "apiLevel": "2.16", + "protocolName": "Serial Dilution Tutorial – OT-2 single-channel", + "description": """This protocol is the outcome of following the Python Protocol API Tutorial located at https://docs.opentrons.com/v2/tutorial.html. It takes a solution and progressively dilutes it by transferring it - stepwise across a plate.''', - 'author': 'New API User' + stepwise across a plate.""", + "author": "New API User" } def run(protocol: protocol_api.ProtocolContext): - tips = protocol.load_labware('opentrons_96_tiprack_300ul', 1) - reservoir = protocol.load_labware('nest_12_reservoir_15ml', 2) - plate = protocol.load_labware('nest_96_wellplate_200ul_flat', 3) - left_pipette = protocol.load_instrument('p300_single_gen2', 'left', tip_racks=[tips]) + tips = protocol.load_labware("opentrons_96_tiprack_300ul", 1) + reservoir = protocol.load_labware("nest_12_reservoir_15ml", 2) + plate = protocol.load_labware("nest_96_wellplate_200ul_flat", 3) + left_pipette = protocol.load_instrument("p300_single_gen2", "left", tip_racks=[tips]) # distribute diluent - left_pipette.transfer(100, reservoir['A1'], plate.wells()) + left_pipette.transfer(100, reservoir["A1"], plate.wells()) # loop through each row for i in range(8): @@ -27,7 +27,7 @@ def run(protocol: protocol_api.ProtocolContext): row = plate.rows()[i] # transfer solution to first well in column - left_pipette.transfer(100, reservoir['A2'], row[0], mix_after=(3, 50)) + left_pipette.transfer(100, reservoir["A2"], row[0], mix_after=(3, 50)) # dilute the sample down the row left_pipette.transfer(100, row[:11], row[1:], mix_after=(3, 50)) \ No newline at end of file diff --git a/api/docs/v2/example_protocols/dilution_tutorial_flex.py b/api/docs/v2/example_protocols/dilution_tutorial_flex.py index 04f03388db0..bc3cad10dd7 100644 --- a/api/docs/v2/example_protocols/dilution_tutorial_flex.py +++ b/api/docs/v2/example_protocols/dilution_tutorial_flex.py @@ -1,28 +1,29 @@ from opentrons import protocol_api metadata = { - 'protocolName': 'Serial Dilution Tutorial – Flex 1-channel', - 'description': '''This protocol is the outcome of following the + "protocolName": "Serial Dilution Tutorial – Flex 1-channel", + "description": """This protocol is the outcome of following the Python Protocol API Tutorial located at https://docs.opentrons.com/v2/tutorial.html. It takes a solution and progressively dilutes it by transferring it - stepwise across a plate.''', - 'author': 'New API User' + stepwise across a plate.""", + "author": "New API User" } requirements = { - 'robotType': 'Flex', - 'apiLevel': '2.15' + "robotType": "Flex", + "apiLevel": "2.16" } def run(protocol: protocol_api.ProtocolContext): - tips = protocol.load_labware('opentrons_flex_96_tiprack_200ul', 'D1') - reservoir = protocol.load_labware('nest_12_reservoir_15ml', 'D2') - plate = protocol.load_labware('nest_96_wellplate_200ul_flat', 'D3') - left_pipette = protocol.load_instrument('flex_1channel_1000', 'left', tip_racks=[tips]) + tips = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "D1") + reservoir = protocol.load_labware("nest_12_reservoir_15ml", "D2") + plate = protocol.load_labware("nest_96_wellplate_200ul_flat", "D3") + trash = protocol.load_trash_bin("A3") + left_pipette = protocol.load_instrument("flex_1channel_1000", "left", tip_racks=[tips]) # distribute diluent - left_pipette.transfer(100, reservoir['A1'], plate.wells()) + left_pipette.transfer(100, reservoir["A1"], plate.wells()) # loop through each row for i in range(8): @@ -31,7 +32,7 @@ def run(protocol: protocol_api.ProtocolContext): row = plate.rows()[i] # transfer solution to first well in column - left_pipette.transfer(100, reservoir['A2'], row[0], mix_after=(3, 50)) + left_pipette.transfer(100, reservoir["A2"], row[0], mix_after=(3, 50)) # dilute the sample down the row left_pipette.transfer(100, row[:11], row[1:], mix_after=(3, 50)) \ No newline at end of file diff --git a/api/docs/v2/example_protocols/dilution_tutorial_multi.py b/api/docs/v2/example_protocols/dilution_tutorial_multi.py index dee28ff86ff..a121d345a58 100644 --- a/api/docs/v2/example_protocols/dilution_tutorial_multi.py +++ b/api/docs/v2/example_protocols/dilution_tutorial_multi.py @@ -1,24 +1,24 @@ from opentrons import protocol_api metadata = { - 'apiLevel': '2.15', - 'protocolName': 'Serial Dilution Tutorial – OT-2 8-channel', - 'description': '''This protocol is the outcome of following the + "apiLevel": "2.16", + "protocolName": "Serial Dilution Tutorial – OT-2 8-channel", + "description": """This protocol is the outcome of following the Python Protocol API Tutorial located at https://docs.opentrons.com/v2/tutorial.html. It takes a solution and progressively dilutes it by transferring it - stepwise across a plate.''', - 'author': 'New API User' + stepwise across a plate.""", + "author": "New API User" } def run(protocol: protocol_api.ProtocolContext): - tips = protocol.load_labware('opentrons_96_tiprack_300ul', 1) - reservoir = protocol.load_labware('nest_12_reservoir_15ml', 2) - plate = protocol.load_labware('nest_96_wellplate_200ul_flat', 3) - left_pipette = protocol.load_instrument('p300_multi_gen2', 'right', tip_racks=[tips]) + tips = protocol.load_labware("opentrons_96_tiprack_300ul", 1) + reservoir = protocol.load_labware("nest_12_reservoir_15ml", 2) + plate = protocol.load_labware("nest_96_wellplate_200ul_flat", 3) + left_pipette = protocol.load_instrument("p300_multi_gen2", "right", tip_racks=[tips]) # distribute diluent - left_pipette.transfer(100, reservoir['A1'], plate.rows()[0]) + left_pipette.transfer(100, reservoir["A1"], plate.rows()[0]) # no loop, 8-channel pipette @@ -26,7 +26,7 @@ def run(protocol: protocol_api.ProtocolContext): row = plate.rows()[0] # transfer solution to first well in column - left_pipette.transfer(100, reservoir['A2'], row[0], mix_after=(3, 50)) + left_pipette.transfer(100, reservoir["A2"], row[0], mix_after=(3, 50)) # dilute the sample down the row left_pipette.transfer(100, row[:11], row[1:], mix_after=(3, 50)) \ No newline at end of file diff --git a/api/docs/v2/example_protocols/dilution_tutorial_multi_flex.py b/api/docs/v2/example_protocols/dilution_tutorial_multi_flex.py index 704eff20218..21f659db62c 100644 --- a/api/docs/v2/example_protocols/dilution_tutorial_multi_flex.py +++ b/api/docs/v2/example_protocols/dilution_tutorial_multi_flex.py @@ -1,36 +1,37 @@ from opentrons import protocol_api metadata = { - 'protocolName': 'Serial Dilution Tutorial – Flex 8-channel', - 'description': '''This protocol is the outcome of following the + "protocolName": "Serial Dilution Tutorial – Flex 8-channel", + "description": """This protocol is the outcome of following the Python Protocol API Tutorial located at https://docs.opentrons.com/v2/tutorial.html. It takes a solution and progressively dilutes it by transferring it - stepwise across a plate.''', - 'author': 'New API User' + stepwise across a plate.""", + "author": "New API User" } requirements = { - 'robotType': 'Flex', - 'apiLevel': '2.15' + "robotType": "Flex", + "apiLevel": "2.16" } def run(protocol: protocol_api.ProtocolContext): - tips = protocol.load_labware('opentrons_96_tiprack_300ul', 'D1') - reservoir = protocol.load_labware('nest_12_reservoir_15ml', 'D2') - plate = protocol.load_labware('nest_96_wellplate_200ul_flat', 'D3') - left_pipette = protocol.load_instrument('flex_8channel_1000', 'right', tip_racks=[tips]) + tips = protocol.load_labware("opentrons_96_tiprack_300ul", "D1") + reservoir = protocol.load_labware("nest_12_reservoir_15ml", "D2") + plate = protocol.load_labware("nest_96_wellplate_200ul_flat", "D3") + trash = protocol.load_trash_bin("A3") + left_pipette = protocol.load_instrument("flex_8channel_1000", "right", tip_racks=[tips]) - # distribute diluent - left_pipette.transfer(100, reservoir['A1'], plate.rows()[0]) + # distribute diluent + left_pipette.transfer(100, reservoir["A1"], plate.rows()[0]) - # no loop, 8-channel pipette + # no loop, 8-channel pipette - # save the destination row to a variable - row = plate.rows()[0] + # save the destination row to a variable + row = plate.rows()[0] - # transfer solution to first well in column - left_pipette.transfer(100, reservoir['A2'], row[0], mix_after=(3, 50)) + # transfer solution to first well in column + left_pipette.transfer(100, reservoir["A2"], row[0], mix_after=(3, 50)) - # dilute the sample down the row - left_pipette.transfer(100, row[:11], row[1:], mix_after=(3, 50)) \ No newline at end of file + # dilute the sample down the row + left_pipette.transfer(100, row[:11], row[1:], mix_after=(3, 50)) \ No newline at end of file diff --git a/api/docs/v2/index.rst b/api/docs/v2/index.rst index c64af1c1082..743bf425c91 100644 --- a/api/docs/v2/index.rst +++ b/api/docs/v2/index.rst @@ -36,7 +36,7 @@ Getting Started If you want to **dive right into code**, take a look at our :ref:`new-examples` and the comprehensive :ref:`protocol-api-reference`. -When you're ready to **try out a protocol**, download the `Opentrons App `_, import the protocol file, and run it on your robot. +When you're ready to **try out a protocol**, download the `Opentrons App `__, import the protocol file, and run it on your robot. .. _overview-section-v2: @@ -75,6 +75,7 @@ For example, if we wanted to transfer liquid from well A1 to well B1 on a plate, # protocol run function def run(protocol: protocol_api.ProtocolContext): # labware + trash = protocol.load_trash_bin("A3") plate = protocol.load_labware( "corning_96_wellplate_360ul_flat", location="D1" ) @@ -123,7 +124,7 @@ For example, if we wanted to transfer liquid from well A1 to well B1 on a plate, } # requirements - requirements = {"robotType": "OT-2", "apiLevel": "2.14"} + requirements = {"robotType": "OT-2", "apiLevel": "|apiLevel|"} # protocol run function def run(protocol: protocol_api.ProtocolContext): @@ -149,7 +150,7 @@ For example, if we wanted to transfer liquid from well A1 to well B1 on a plate, This example proceeds completely linearly. Following it line-by-line, you can see that it has the following effects: 1. Gives the name, contact information, and a brief description for the protocol. - 2. Indicates the protocol should run on an OT-2 robot, using API version 2.14. + 2. Indicates the protocol should run on an OT-2 robot, using API version |apiLevel|. 3. Tells the robot that there is: a. A 96-well flat plate in slot 1. b. A rack of 300 µL tips in slot 2. @@ -170,7 +171,7 @@ More Resources Opentrons App +++++++++++++ -The `Opentrons App `_ is the easiest way to run your Python protocols. The app `supports `_ the latest versions of macOS, Windows, and Ubuntu. +The `Opentrons App `__ is the easiest way to run your Python protocols. The app `supports `_ the latest versions of macOS, Windows, and Ubuntu. Support +++++++ diff --git a/api/docs/v2/modules/heater_shaker.rst b/api/docs/v2/modules/heater_shaker.rst index fb74aa5f23e..b56d0dcfb28 100644 --- a/api/docs/v2/modules/heater_shaker.rst +++ b/api/docs/v2/modules/heater_shaker.rst @@ -10,10 +10,9 @@ The Heater-Shaker Module provides on-deck heating and orbital shaking. The modul The Heater-Shaker Module is represented in code by a :py:class:`.HeaterShakerContext` object. For example:: - def run(protocol: protocol_api.ProtocolContext): - hs_mod = protocol.load_module( - module_name='heaterShakerModuleV1', - location="D1") + hs_mod = protocol.load_module( + module_name="heaterShakerModuleV1", location="D1" + ) .. versionadded:: 2.13 @@ -74,14 +73,45 @@ To prepare the deck before running a protocol, use the labware latch controls in Loading Labware =============== -Like with all modules, use the Heater-Shaker’s :py:meth:`~.HeaterShakerContext.load_labware` method to specify what you will place on the module. For the Heater-Shaker, you must use a definition that describes the combination of a thermal adapter and labware that fits it. See the :ref:`load-labware-module` section for an example of how to place labware on a module. +Use the Heater-Shaker’s :py:meth:`~.HeaterShakerContext.load_adapter` and :py:meth:`~.HeaterShakerContext.load_labware` methods to specify what you will place on the module. For the Heater-Shaker, use one of the thermal adapters listed below and labware that fits on the adapter. See :ref:`labware-on-adapters` for examples of loading labware on modules. + +The `Opentrons Labware Library `_ includes definitions for both standalone adapters and adapter–labware combinations. These labware definitions help make the Heater-Shaker ready to use right out of the box. + +.. note:: + If you plan to :ref:`move labware ` onto or off of the Heater-Shaker during your protocol, you must use a standalone adapter definition, not an adapter–labware combination definiton. + +Standalone Adapters +------------------- + +You can use these standalone adapter definitions to load Opentrons verified or custom labware on top of the Heater-Shaker. + +.. list-table:: + :header-rows: 1 + + * - Adapter Type + - API Load Name + * - Opentrons Universal Flat Heater-Shaker Adapter + - ``opentrons_universal_flat_adapter`` + * - Opentrons 96 PCR Heater-Shaker Adapter + - ``opentrons_96_pcr_adapter`` + * - Opentrons 96 Deep Well Heater-Shaker Adapter + - ``opentrons_96_deep_well_adapter`` + * - Opentrons 96 Flat Bottom Heater-Shaker Adapter + - ``opentrons_96_flat_bottom_adapter`` + +For example, these commands load a well plate on top of the flat bottom adapter:: + + hs_adapter = hs_mod.load_adapter("opentrons_96_flat_bottom_adapter") + hs_plate = hs_adapter.load_labware("nest_96_wellplate_200ul_flat") + +.. versionadded:: 2.15 + The ``load_adapter()`` method. -Currently, the `Opentrons Labware Library `_ includes several pre-configured adapter–labware combinations and standalone adapter definitions that help make the Heater-Shaker ready to use right out of the box. See :ref:`labware-on-adapters` for examples of loading labware on modules. Pre-configured Combinations --------------------------- -The Heater-Shaker supports these thermal adapter and labware combinations by default. These let you load the adapter and labware with a single definition. +The Heater-Shaker supports these thermal adapter and labware combinations for backwards compatibility. If your protocol specifies an ``apiLevel`` of 2.15 or higher, you should use the standalone adapter definitions instead. .. list-table:: :header-rows: 1 @@ -99,24 +129,13 @@ The Heater-Shaker supports these thermal adapter and labware combinations by def * - Opentrons Universal Flat Adapter with Corning 384 Well Plate 112 µL Flat - ``opentrons_universal_flat_adapter_corning_384_wellplate_112ul_flat`` -Standalone Well-Plate Adapters ------------------------------- +This command loads the same physical adapter and labware as the example in the previous section, but it is also compatible with API versions 2.13 and 2.14:: -You can use these standalone adapter definitions to load Opentrons verified or custom labware on top of the Heater-Shaker. - -.. list-table:: - :header-rows: 1 + hs_combo = hs_mod.load_labware( + "opentrons_96_flat_bottom_adapter_nest_wellplate_200ul_flat" + ) - * - Adapter Type - - API Load Name - * - Opentrons Universal Flat Adapter - - ``opentrons_universal_flat_adapter`` - * - Opentrons 96 PCR Adapter - - ``opentrons_96_pcr_adapter`` - * - Opentrons 96 Deep Well Adapter - - ``opentrons_96_deep_well_adapter`` - * - Opentrons 96 Flat Bottom Adapter - - ``opentrons_96_flat_bottom_adapter`` +.. versionadded:: 2.13 Custom Flat-Bottom Labware -------------------------- @@ -164,8 +183,8 @@ To pipette while the Heater-Shaker is heating, use :py:meth:`~.HeaterShakerConte hs_mod.set_target_temperature(75) pipette.pick_up_tip() - pipette.aspirate(50, plate['A1']) - pipette.dispense(50, plate['B1']) + pipette.aspirate(50, plate["A1"]) + pipette.dispense(50, plate["B1"]) pipette.drop_tip() hs_mod.wait_for_temperature() protocol.delay(minutes=1) @@ -180,8 +199,8 @@ Additionally, if you want to pipette while the module holds a temperature for a hs_mod.set_and_wait_for_temperature(75) start_time = time.monotonic() # set reference time pipette.pick_up_tip() - pipette.aspirate(50, plate['A1']) - pipette.dispense(50, plate['B1']) + pipette.aspirate(50, plate["A1"]) + pipette.dispense(50, plate["B1"]) pipette.drop_tip() # delay for the difference between now and 60 seconds after the reference time protocol.delay(max(0, start_time+60 - time.monotonic())) diff --git a/api/docs/v2/modules/magnetic_block.rst b/api/docs/v2/modules/magnetic_block.rst index 275ea19b649..843e0b2e80b 100644 --- a/api/docs/v2/modules/magnetic_block.rst +++ b/api/docs/v2/modules/magnetic_block.rst @@ -7,7 +7,7 @@ Magnetic Block ************** .. note:: - The Magnetic Block is compatible with Opentrons Flex only. If you have an OT-2, use the :ref:`magnetic-module`. + The Magnetic Block is compatible with Opentrons Flex only. If you have an OT-2, use the :ref:`Magnetic Module `. The Magnetic Block is an unpowered, 96-well plate that holds labware close to its high-strength neodymium magnets. This module is suitable for many magnetic bead-based protocols, but does not move beads up or down in solution. @@ -17,20 +17,17 @@ The Magnetic Block is represented by a :py:class:`~opentrons.protocol_api.Magnet .. code-block:: python - def run(protocol: protocol_api.ProtocolContext): - - # Load the Magnetic Block in deck slot D1 - magnetic_block = protocol.load_module( - module_name='magneticBlockV1', - location='D1') - - # Load a 96-well plate on the magnetic block - well_plate = magnetic_block.load_labware( - name="biorad_96_wellplate_200ul_pcr") - - # Use the Gripper to move labware - protocol.move_labware(well_plate, - new_location="B2", - use_gripper=True) + # Load the Magnetic Block in deck slot D1 + magnetic_block = protocol.load_module( + module_name="magneticBlockV1", location="D1" + ) + + # Load a 96-well plate on the magnetic block + mag_plate = magnetic_block.load_labware( + name="biorad_96_wellplate_200ul_pcr" + ) + + # Use the Gripper to move labware + protocol.move_labware(mag_plate, new_location="B2", use_gripper=True) .. versionadded:: 2.15 diff --git a/api/docs/v2/modules/magnetic_module.rst b/api/docs/v2/modules/magnetic_module.rst index efe55aa8e7c..ae293811927 100644 --- a/api/docs/v2/modules/magnetic_module.rst +++ b/api/docs/v2/modules/magnetic_module.rst @@ -7,7 +7,7 @@ Magnetic Module *************** .. note:: - The Magnetic Module is compatible with the OT-2 only. If you have a Flex, use the :ref:`magnetic-block`. + The Magnetic Module is compatible with the OT-2 only. If you have a Flex, use the :ref:`Magnetic Block `. The Magnetic Module controls a set of permanent magnets which can move vertically to induce a magnetic field in the labware loaded on the module. @@ -19,10 +19,10 @@ The examples in this section apply to an OT-2 with a Magnetic Module GEN2 loaded def run(protocol: protocol_api.ProtocolContext): mag_mod = protocol.load_module( - module_name='magnetic module gen2', - location='6') + module_name="magnetic module gen2", + location="6") plate = mag_mod.load_labware( - name='nest_96_wellplate_100ul_pcr_full_skirt') + name="nest_96_wellplate_100ul_pcr_full_skirt") .. versionadded:: 2.3 diff --git a/api/docs/v2/modules/multiple_same_type.rst b/api/docs/v2/modules/multiple_same_type.rst index ce44065487a..386f8d7f281 100644 --- a/api/docs/v2/modules/multiple_same_type.rst +++ b/api/docs/v2/modules/multiple_same_type.rst @@ -28,12 +28,12 @@ When working with multiple modules of the same type, load them in your protocol def run(protocol: protocol_api.ProtocolContext): # Load Temperature Module 1 in deck slot D1 on USB port 2 temperature_module_1 = protocol.load_module( - module_name='temperature module gen2', + module_name="temperature module gen2", location="D1") # Load Temperature Module 2 in deck slot C1 on USB port 6 temperature_module_2 = protocol.load_module( - module_name='temperature module gen2', + module_name="temperature module gen2", location="C1") The Temperature Modules are connected as shown here: @@ -46,21 +46,23 @@ When working with multiple modules of the same type, load them in your protocol In this example, ``temperature_module_1`` loads first because it's connected to USB port 1. ``temperature_module_2`` loads next because it's connected to USB port 3. .. code-block:: python + :substitutions: - from opentrons import protocol_api + from opentrons import protocol_api - metadata = { 'apiLevel': '2.14'} + metadata = {"apiLevel": "|apiLevel|"} - def run(protocol: protocol_api.ProtocolContext): - # Load Temperature Module 1 in deck slot C1 on USB port 1 - temperature_module_1 = protocol.load_module( - load_name='temperature module gen2', - location="1") - # Load Temperature Module 2 in deck slot D3 on USB port 2 - temperature_module_2 = protocol.load_module( - load_name='temperature module gen2', - location="3") + def run(protocol: protocol_api.ProtocolContext): + # Load Temperature Module 1 in deck slot C1 on USB port 1 + temperature_module_1 = protocol.load_module( + load_name="temperature module gen2", location="1" + ) + + # Load Temperature Module 2 in deck slot D3 on USB port 2 + temperature_module_2 = protocol.load_module( + load_name="temperature module gen2", location="3" + ) The Temperature Modules are connected as shown here: diff --git a/api/docs/v2/modules/setup.rst b/api/docs/v2/modules/setup.rst index 89b39692edb..c6badd82954 100644 --- a/api/docs/v2/modules/setup.rst +++ b/api/docs/v2/modules/setup.rst @@ -22,16 +22,16 @@ Use :py:meth:`.ProtocolContext.load_module` to load a module. from opentrons import protocol_api - requirements = {'robotType': 'Flex', 'apiLevel': '|apiLevel|'} + requirements = {"robotType": "Flex", "apiLevel": "|apiLevel|"} def run(protocol: protocol_api.ProtocolContext): # Load a Heater-Shaker Module GEN1 in deck slot D1. heater_shaker = protocol.load_module( - module_name='heaterShakerModuleV1', location='D1') + module_name="heaterShakerModuleV1", location="D1") # Load a Temperature Module GEN2 in deck slot D3. temperature_module = protocol.load_module( - module_name='temperature module gen2', location='D3') + module_name="temperature module gen2", location="D3") After the ``load_module()`` method loads the modules into your protocol, it returns the :py:class:`~opentrons.protocol_api.HeaterShakerContext` and :py:class:`~opentrons.protocol_api.TemperatureModuleContext` objects. @@ -42,16 +42,16 @@ Use :py:meth:`.ProtocolContext.load_module` to load a module. from opentrons import protocol_api - metadata = {'apiLevel': '2.14'} + metadata = {"apiLevel": "|apiLevel|"} def run(protocol: protocol_api.ProtocolContext): # Load a Magnetic Module GEN2 in deck slot 1. magnetic_module = protocol.load_module( - module_name='magnetic module gen2', location=1) + module_name="magnetic module gen2", location=1) # Load a Temperature Module GEN1 in deck slot 3. temperature_module = protocol.load_module( - module_name='temperature module', location=3) + module_name="temperature module", location=3) After the ``load_module()`` method loads the modules into your protocol, it returns the :py:class:`~opentrons.protocol_api.MagneticModuleContext` and :py:class:`~opentrons.protocol_api.TemperatureModuleContext` objects. @@ -96,7 +96,7 @@ The first parameter of :py:meth:`.ProtocolContext.load_module` is the module's | GEN1 | | | +--------------------+-------------------------------+---------------------------+ -Some modules were added to our Python API later than others, and others span multiple hardware generations. When writing a protocol that requires a module, make sure your ``requirements`` or ``metadata`` code block specifies a :ref:`Protocol API version ` high enough to support all the module generations you want to use. +Some modules were added to our Python API later than others, and others span multiple hardware generations. When writing a protocol that requires a module, make sure your ``requirements`` or ``metadata`` code block specifies an :ref:`API version ` high enough to support all the module generations you want to use. .. _load-labware-module: @@ -117,7 +117,7 @@ Use the ``load_labware()`` method on the module context to load labware on a mod When you load labware on a module, you don’t need to specify the deck slot. In the above example, the ``load_module()`` method already specifies where the module is on the deck: ``location= "D1"``. -Any :ref:`v2-custom-labware` added to your Opentrons App is also accessible when loading labware onto a module. You can find and copy its load name by going to its card on the Labware page. +Any :ref:`custom labware ` added to your Opentrons App is also accessible when loading labware onto a module. You can find and copy its load name by going to its card on the Labware page. .. versionadded:: 2.1 diff --git a/api/docs/v2/modules/temperature_module.rst b/api/docs/v2/modules/temperature_module.rst index 095215ca6f7..5debe628a95 100644 --- a/api/docs/v2/modules/temperature_module.rst +++ b/api/docs/v2/modules/temperature_module.rst @@ -11,17 +11,107 @@ The Temperature Module acts as both a cooling and heating device. It can control The Temperature Module is represented in code by a :py:class:`.TemperatureModuleContext` object, which has methods for setting target temperatures and reading the module's status. This example demonstrates loading a Temperature Module GEN2 and loading a well plate on top of it. .. code-block:: python - :substitutions: - def run(protocol: protocol_api.ProtocolContext): - temp_mod = protocol.load_module( - module_name='temperature module gen2', - location='D3') - plate = temp_mod.load_labware( - name='corning_96_wellplate_360ul_flat') + temp_mod = protocol.load_module( + module_name="temperature module gen2", location="D3" + ) .. versionadded:: 2.3 +Loading Labware +=============== + +Use the Temperature Module’s :py:meth:`~.TemperatureModuleContext.load_adapter` and :py:meth:`~.TemperatureModuleContext.load_labware` methods to specify what you will place on the module. You may use one or both of the methods, depending on the labware you're using. See :ref:`labware-on-adapters` for examples of loading labware on modules. + +The `Opentrons Labware Library `_ includes definitions for both standalone adapters and adapter–labware combinations. These labware definitions help make the Temperature Module ready to use right out of the box. + +Standalone Adapters +------------------- + +You can use these standalone adapter definitions to load Opentrons verified or custom labware on top of the Temperature Module. + +.. list-table:: + :header-rows: 1 + + * - Adapter Type + - API Load Name + * - Opentrons Aluminum Flat Bottom Plate + - ``opentrons_aluminum_flat_bottom_plate`` + * - Opentrons 96 Well Aluminum Block + - ``opentrons_96_well_aluminum_block`` + +For example, these commands load a PCR plate on top of the 96-well block:: + + temp_adapter = temp_mod.load_adapter( + "opentrons_96_well_aluminum_block" + ) + temp_plate = temp_adapter.load_labware( + "nest_96_wellplate_100ul_pcr_full_skirt" + ) + +.. versionadded:: 2.15 + The ``load_adapter()`` method. + +.. note:: + You can also load labware directly onto the Temperature Module. In API version 2.14 and earlier, this was the correct way to load labware on top of the flat bottom plate. In API version 2.15 and later, you should load both the adapter and the labware with separate commands. + +Block-and-tube combinations +--------------------------- + +You can use these combination labware definitions to load various types of tubes into the 24-well thermal block on top of the Temperature Module. There is no standalone definition for the 24-well block. + +.. list-table:: + :header-rows: 1 + + * - Tube Type + - API Load Name + * - Generic 2 mL screw cap + - ``opentrons_24_aluminumblock_generic_2ml_screwcap`` + * - NEST 0.5 mL screw cap + - ``opentrons_24_aluminumblock_nest_0.5ml_screwcap`` + * - NEST 1.5 mL screw cap + - ``opentrons_24_aluminumblock_nest_1.5ml_screwcap`` + * - NEST 1.5 mL snap cap + - ``opentrons_24_aluminumblock_nest_1.5ml_snapcap`` + * - NEST 2 mL screw cap + - ``opentrons_24_aluminumblock_nest_2ml_screwcap`` + * - NEST 2 mL snap cap + - ``opentrons_24_aluminumblock_nest_2ml_snapcap`` + +For example, this command loads the 24-well block with generic 2 mL tubes:: + + temp_tubes = temp_mod.load_labware( + "opentrons_24_aluminumblock_generic_2ml_screwcap" + ) + +.. versionadded:: 2.0 + +Block-and-plate combinations +---------------------------- + +The Temperature Module supports these 96-well block and labware combinations for backwards compatibility. If your protocol specifies an ``apiLevel`` of 2.15 or higher, you should use the standalone 96-well block definition instead. + +.. list-table:: + :header-rows: 1 + + * - 96-well block contents + - API Load Name + * - Bio-Rad well plate 200 μL + - ``opentrons_96_aluminumblock_biorad_wellplate_200uL`` + * - Generic PCR strip 200 μL + - ``opentrons_96_aluminumblock_generic_pcr_strip_200uL`` + * - NEST well plate 100 μL + - ``opentrons_96_aluminumblock_nest_wellplate_100uL`` + +This command loads the same physical adapter and labware as the example in the Standalone Adapters section above, but it is also compatible with earlier API versions:: + + temp_combo = temp_mod.load_labware( + "opentrons_96_aluminumblock_nest_wellplate_100uL" + ) + +.. versionadded:: 2.0 + + Temperature Control =================== @@ -47,9 +137,9 @@ If you need to confirm in software whether the Temperature Module is holding at .. code-block:: python temp_mod.set_temperature(celsius=90) - temp_mod.status # 'holding at target' + temp_mod.status # "holding at target" temp_mod.deactivate() - temp_mod.status # 'idle' + temp_mod.status # "idle" If you don't need to use the status value in your code, and you have physical access to the module, you can read its status and temperature from the LED and display on the module. diff --git a/api/docs/v2/modules/thermocycler.rst b/api/docs/v2/modules/thermocycler.rst index 13aa1d3600a..9322e0a96f0 100644 --- a/api/docs/v2/modules/thermocycler.rst +++ b/api/docs/v2/modules/thermocycler.rst @@ -14,9 +14,8 @@ The examples in this section will use a Thermocycler Module GEN2 loaded as follo .. code-block:: python - def run(protocol: protocol_api.ProtocolContext): - tc_mod = protocol.load_module(module_name='thermocyclerModuleV2') - plate = tc_mod.load_labware(name='nest_96_wellplate_100ul_pcr_full_skirt') + tc_mod = protocol.load_module(module_name="thermocyclerModuleV2") + plate = tc_mod.load_labware(name="nest_96_wellplate_100ul_pcr_full_skirt") .. versionadded:: 2.13 @@ -106,8 +105,8 @@ For example, this profile commands the Thermocycler to reach 10 °C and hold for .. code-block:: python profile = [ - {'temperature':10, 'hold_time_seconds':30}, - {'temperature':60, 'hold_time_seconds':45} + {"temperature":10, "hold_time_seconds":30}, + {"temperature":60, "hold_time_seconds":45} ] Once you have written the steps of your profile, execute it with :py:meth:`~.ThermocyclerContext.execute_profile`. This function executes your profile steps multiple times depending on the ``repetitions`` parameter. It also takes a ``block_max_volume`` parameter, which is the same as that of the :py:meth:`~.ThermocyclerContext.set_block_temperature` function. @@ -117,9 +116,9 @@ For instance, a PCR prep protocol might define and execute a profile like this: .. code-block:: python profile = [ - {'temperature':95, 'hold_time_seconds':30}, - {'temperature':57, 'hold_time_seconds':30}, - {'temperature':72, 'hold_time_seconds':60} + {"temperature":95, "hold_time_seconds":30}, + {"temperature":57, "hold_time_seconds":30}, + {"temperature":72, "hold_time_seconds":60} ] tc_mod.execute_profile(steps=profile, repetitions=20, block_max_volume=32) diff --git a/api/docs/v2/moving_labware.rst b/api/docs/v2/moving_labware.rst index a1d94449132..7dc67f1921a 100644 --- a/api/docs/v2/moving_labware.rst +++ b/api/docs/v2/moving_labware.rst @@ -17,8 +17,8 @@ Use the :py:meth:`.ProtocolContext.move_labware` method to initiate a move, rega :substitutions: def run(protocol: protocol_api.ProtocolContext): - plate = protocol.load_labware('nest_96_wellplate_200ul_flat', 'D1') - protocol.move_labware(labware=plate, new_location='D2') + plate = protocol.load_labware("nest_96_wellplate_200ul_flat", "D1") + protocol.move_labware(labware=plate, new_location="D2") .. versionadded:: 2.15 @@ -26,11 +26,12 @@ The required arguments of ``move_labware()`` are the ``labware`` you want to mov When the move step is complete, the API updates the labware's location, so you can move the plate multiple times:: - protocol.move_labware(labware=plate, new_location='D2') - protocol.move_labware(labware=plate, new_location='D3') + protocol.move_labware(labware=plate, new_location="D2") + protocol.move_labware(labware=plate, new_location="D3") For the first move, the API knows to find the plate in its initial load location, slot D1. For the second move, the API knows to find the plate in D2. +.. _automatic-manual-moves: Automatic vs Manual Moves ========================= @@ -45,23 +46,23 @@ The ``use_gripper`` parameter of :py:meth:`~.ProtocolContext.move_labware` deter .. code-block:: python def run(protocol: protocol_api.ProtocolContext): - plate = protocol.load_labware('nest_96_wellplate_200ul_flat', 'D1') + plate = protocol.load_labware("nest_96_wellplate_200ul_flat", "D1") # have the gripper move the plate from D1 to D2 - protocol.move_labware(labware=plate, new_location='D2', use_gripper=True) + protocol.move_labware(labware=plate, new_location="D2", use_gripper=True) # pause to move the plate manually from D2 to D3 - protocol.move_labware(labware=plate, new_location='D3', use_gripper=False) + protocol.move_labware(labware=plate, new_location="D3", use_gripper=False) # pause to move the plate manually from D3 to C1 - protocol.move_labware(labware=plate, new_location='C1') + protocol.move_labware(labware=plate, new_location="C1") .. versionadded:: 2.15 .. note:: Don't add a ``pause()`` command before ``move_labware()``. When ``use_gripper`` is unset or ``False``, the protocol pauses when it reaches the movement step. The Opentrons App or the touchscreen on Flex shows an animation of the labware movement that you need to perform manually. The protocol only resumes when you press **Confirm and resume**. -The above example is a complete and valid ``run()`` function. You don't have to load the gripper as an instrument, and there is no ``InstrumentContext`` for the gripper. All you have to do to specify that a protocol requires the gripper is to include at least one ``move_labware()`` command with ``use_labware=True``. +The above example is a complete and valid ``run()`` function. You don't have to load the gripper as an instrument, and there is no ``InstrumentContext`` for the gripper. All you have to do to specify that a protocol requires the gripper is to include at least one ``move_labware()`` command with ``use_gripper=True``. If you attempt to use the gripper to move labware in an OT-2 protocol, the API will raise an error. @@ -129,6 +130,22 @@ Also note the ``hs_mod.open_labware_latch()`` command in the above example. To m If the labware is inaccessible, the API will raise an error. +Movement into the Waste Chute +============================= + +Move used tip racks and well plates to the waste chute to dispose of them. This requires you to first :ref:`configure the waste chute ` in your protocol. Then use the loaded :py:class:`.WasteChute` object as the value of ``new_location``:: + + chute = protocol.load_waste_chute() + protocol.move_labware( + labware=plate, new_location=chute, use_gripper=True + ) + +.. versionadded:: 2.16 + +This will pick up ``plate`` from its current location and drop it into the chute. + +Always specify ``use_gripper=True`` when moving labware into the waste chute. The chute is not designed for manual movement. You can still manually move labware to other locations, including off-deck, with the chute installed. + .. _off-deck-location: The Off-Deck Location @@ -144,31 +161,34 @@ Remove labware from the deck to perform tasks like retrieving samples or discard Moving labware off-deck always requires user intervention, because the gripper can't reach outside of the robot. Omit the ``use_gripper`` parameter or explicitly set it to ``False``. If you try to move labware off-deck with ``use_gripper=True``, the API will raise an error. -You can also load labware off-deck, in preparation for a ``move_labware()`` command that brings it `onto` the deck. For example, you could assign two tip racks to a pipette — one on-deck, and one off-deck — and then swap out the first rack for the second one:: - - from opentrons import protocol_api - - metadata = {"apiLevel": "2.15", "protocolName": "Tip rack replacement"} - requirements = {"robotType": "OT-2"} - - - def run(protocol: protocol_api.ProtocolContext): - tips1 = protocol.load_labware("opentrons_96_tiprack_1000ul", 1) - # load another tip rack but don't put it in a slot yet - tips2 = protocol.load_labware( - "opentrons_96_tiprack_1000ul", protocol_api.OFF_DECK - ) - pipette = protocol.load_instrument( - "p1000_single_gen2", "left", tip_racks=[tips1, tips2] - ) - # use all the on-deck tips - for i in range(96): +You can also load labware off-deck, in preparation for a ``move_labware()`` command that brings it *onto* the deck. For example, you could assign two tip racks to a pipette — one on-deck, and one off-deck — and then swap out the first rack for the second one: + + .. code-block:: python + :substitutions: + + from opentrons import protocol_api + + metadata = {"apiLevel": "|apiLevel|", "protocolName": "Tip rack replacement"} + requirements = {"robotType": "OT-2"} + + + def run(protocol: protocol_api.ProtocolContext): + tips1 = protocol.load_labware("opentrons_96_tiprack_1000ul", 1) + # load another tip rack but don't put it in a slot yet + tips2 = protocol.load_labware( + "opentrons_96_tiprack_1000ul", protocol_api.OFF_DECK + ) + pipette = protocol.load_instrument( + "p1000_single_gen2", "left", tip_racks=[tips1, tips2] + ) + # use all the on-deck tips + for i in range(96): + pipette.pick_up_tip() + pipette.drop_tip() + # pause to move the spent tip rack off-deck + protocol.move_labware(labware=tips1, new_location=protocol_api.OFF_DECK) + # pause to move the fresh tip rack on-deck + protocol.move_labware(labware=tips2, new_location=1) pipette.pick_up_tip() - pipette.drop_tip() - # pause to move the spent tip rack off-deck - protocol.move_labware(labware=tips1, new_location=protocol_api.OFF_DECK) - # pause to move the fresh tip rack on-deck - protocol.move_labware(labware=tips2, new_location=1) - pipette.pick_up_tip() Using the off-deck location to remove or replace labware lets you continue your workflow in a single protocol, rather than needing to end a protocol, reset the deck, and start a new protocol run. diff --git a/api/docs/v2/new_advanced_running.rst b/api/docs/v2/new_advanced_running.rst index bb7d69e931a..5a867c0d172 100644 --- a/api/docs/v2/new_advanced_running.rst +++ b/api/docs/v2/new_advanced_running.rst @@ -14,10 +14,7 @@ Jupyter Notebook The Flex and OT-2 run `Jupyter Notebook `_ servers on port 48888, which you can connect to with your web browser. This is a convenient environment for writing and debugging protocols, since you can define different parts of your protocol in different notebook cells and run a single cell at a time. -.. note:: - Currently, the Jupyter Notebook server does not work with Python Protocol API versions 2.14 and 2.15. It does work with API versions 2.13 and earlier. Use the Opentrons App to run protocols that require functionality added in newer versions. - -Access your robot's Jupyter Notebook by either: +Access your robot’s Jupyter Notebook by either: - Going to the **Advanced** tab of Robot Settings and clicking **Launch Jupyter Notebook**. - Going directly to ``http://:48888`` in your web browser (if you know your robot's IP address). @@ -32,9 +29,10 @@ Jupyter Notebook is structured around `cells`: discrete chunks of code that can Rather than writing a ``run`` function and embedding commands within it, start your notebook by importing ``opentrons.execute`` and calling :py:meth:`opentrons.execute.get_protocol_api`. This function also replaces the ``metadata`` block of a standalone protocol by taking the minimum :ref:`API version ` as its argument. Then you can call :py:class:`~opentrons.protocol_api.ProtocolContext` methods in subsequent lines or cells: .. code-block:: python + :substitutions: import opentrons.execute - protocol = opentrons.execute.get_protocol_api("2.13") + protocol = opentrons.execute.get_protocol_api("|apiLevel|") protocol.home() The first command you execute should always be :py:meth:`~opentrons.protocol_api.ProtocolContext.home`. If you try to execute other commands first, you will get a ``MustHomeError``. (When running protocols through the Opentrons App, the robot homes automatically.) @@ -57,8 +55,9 @@ You can also use Jupyter to run a protocol that you have already written. To do Since a typical protocol only `defines` the ``run`` function but doesn't `call` it, this won't immediately cause the robot to move. To begin the run, instantiate a :py:class:`.ProtocolContext` and pass it to the ``run`` function you just defined: .. code-block:: python + :substitutions: - protocol = opentrons.execute.get_protocol_api("2.13") + protocol = opentrons.execute.get_protocol_api("|apiLevel|") run(protocol) # your protocol will now run .. _using_lpc: @@ -78,7 +77,7 @@ Creating the dummy protocol requires you to: 1. Use the ``metadata`` or ``requirements`` dictionary to specify the API version. (See :ref:`v2-versioning` for details.) Use the same API version as you did in :py:meth:`opentrons.execute.get_protocol_api`. 2. Define a ``run()`` function. 3. Load all of your labware in their initial locations. - 4. Load your smallest capacity pipette and specify its ``tipracks``. + 4. Load your smallest capacity pipette and specify its ``tip_racks``. 5. Call ``pick_up_tip()``. Labware Position Check can't run if you don't pick up a tip. For example, the following dummy protocol will use a P300 Single-Channel GEN2 pipette to enable Labware Position Check for an OT-2 tip rack, NEST reservoir, and NEST flat well plate. @@ -117,13 +116,13 @@ This automatically generated code uses generic names for the loaded labware. If .. versionadded:: 2.12 -Once you've executed this code in Jupyter Notebook, all subsequent positional calculations for this reservoir in slot D2 will be adjusted 0.1 mm to the right, 0.2 mm to the back, and 0.3 mm up. +Once you've executed this code in Jupyter Notebook, all subsequent positional calculations for this reservoir in slot 2 will be adjusted 0.1 mm to the right, 0.2 mm to the back, and 0.3 mm up. -Remember, you should only add ``.set_offset()`` commands to protocols run outside of the Opentrons App. And you should follow the behavior of Labware Position Check, i.e., *do not* reuse offset measurements unless they apply to the *same labware* in the *same deck slot* on the *same robot*. +Remember, you should only add ``set_offset()`` commands to protocols run outside of the Opentrons App. And you should follow the behavior of Labware Position Check, i.e., *do not* reuse offset measurements unless they apply to the *same labware* in the *same deck slot* on the *same robot*. .. warning:: - Improperly reusing offset data may cause your robot to move to an unexpected position or crash against other labware, which can lead to incorrect protocol execution or damage your equipment. The same applies when running protocols with ``.set_offset()`` commands in the Opentrons App. When in doubt: run Labware Position Check again and update your code! + Improperly reusing offset data may cause your robot to move to an unexpected position or crash against labware, which can lead to incorrect protocol execution or damage your equipment. The same applies when running protocols with ``set_offset()`` commands in the Opentrons App. When in doubt: run Labware Position Check again and update your code! Using Custom Labware -------------------- @@ -133,7 +132,7 @@ If you have custom labware definitions you want to use with Jupyter, make a new Using Modules ------------- -If your protocol uses :ref:`new_modules`, you need to take additional steps to make sure that Jupyter Notebook doesn't send commands that conflict with the robot server. Sending commands to modules while the robot server is running will likely cause errors, and the module commands may not execute as expected. +If your protocol uses :ref:`modules `, you need to take additional steps to make sure that Jupyter Notebook doesn't send commands that conflict with the robot server. Sending commands to modules while the robot server is running will likely cause errors, and the module commands may not execute as expected. To disable the robot server, open a Jupyter terminal session by going to **New > Terminal** and run ``systemctl stop opentrons-robot-server``. Then you can run code from cells in your notebook as usual. When you are done using Jupyter Notebook, you should restart the robot server with ``systemctl start opentrons-robot-server``. @@ -145,6 +144,8 @@ To disable the robot server, open a Jupyter terminal session by going to **New > Command Line ------------ +.. TODO update with separate links to OT-2 and Flex setup, when new Flex process is in manual or on help site + The robot's command line is accessible either by going to **New > Terminal** in Jupyter or `via SSH `_. To execute a protocol from the robot's command line, copy the protocol file to the robot with ``scp`` and then run the protocol with ``opentrons_execute``: diff --git a/api/docs/v2/new_atomic_commands.rst b/api/docs/v2/new_atomic_commands.rst index 4fc44958f68..d72a16bd765 100644 --- a/api/docs/v2/new_atomic_commands.rst +++ b/api/docs/v2/new_atomic_commands.rst @@ -1,547 +1,20 @@ -:og:description: Building block commands are the smallest individual actions that Opentrons robots can perform. +:og:description: Basic commands that Opentrons robots can perform with pipette tips, for liquid handling, and other utility features. .. _v2-atomic-commands: -####################### +*********************** Building Block Commands -####################### +*********************** -Building block, or basic, commands are the smallest individual actions that can be completed on an Opentrons robot. -For example, the complex command ``transfer`` (see :ref:`v2-complex-commands`) executes a series of ``pick_up_tip()``, ``aspirate()``, ``dispense()`` and ``drop_tip()`` basic commands. +.. toctree:: + basic_commands/pipette_tips + basic_commands/liquids + basic_commands/utilities -The examples in this section would be added to the following: +Building block commands execute some of the most basic actions that your robot can complete. But basic doesn’t mean these commands lack capabilities. They perform important tasks in your protocols. They're also foundational to the :ref:`complex commands ` that help you combine multiple actions into fewer lines of code. -.. code-block:: python - :substitutions: - - from opentrons import protocol_api - - metadata = {'apiLevel': '2.14'} - - def run(protocol: protocol_api.ProtocolContext): - tiprack = protocol.load_labware('corning_96_wellplate_360ul_flat', 2) - plate = protocol.load_labware('opentrons_96_tiprack_300ul', 3) - pipette = protocol.load_instrument('p300_single_gen2', mount='left') - # the example code below would go here, inside the run function - - -This loads a `Corning 96 Well Plate `_ in slot 2 and a `Opentrons 300 µL Tiprack `_ in slot 3, and uses a P300 Single GEN2 pipette. - - -************ -Tip Handling -************ - -By default, the robot constantly exchanges old, used tips for new ones to prevent cross-contamination between wells. Tip handling uses the functions :py:meth:`.InstrumentContext.pick_up_tip`, :py:meth:`.InstrumentContext.drop_tip`, and :py:meth:`.InstrumentContext.return_tip`. - -Pick Up Tip -=========== - -Before any liquid handling can be done, your pipette must have a tip on it. The command :py:meth:`.InstrumentContext.pick_up_tip` will move the pipette over to the specified tip, then press down into it to create a vacuum seal. The below example picks up the tip at location ``'A1'`` of the tiprack previously loaded in slot 3. - -.. code-block:: python - - pipette.pick_up_tip(tiprack['A1']) - -If you have associated a tiprack with your pipette such as in the :ref:`new-pipette` or :ref:`protocol_api-protocols-and-instruments` sections, then you can simply call - -.. code-block:: python - - pipette.pick_up_tip() - -This will use the next available tip from the list of tipracks passed in to the ``tip_racks`` argument of :py:meth:`.ProtocolContext.load_instrument`. - -.. versionadded:: 2.0 - -Drop Tip -======== - -Once finished with a tip, the pipette will remove the tip when we call :py:meth:`.InstrumentContext.drop_tip`. You can specify where to drop the tip by passing in a location. The below example drops the tip back at its original location on the tip rack. -If no location is specified, the OT-2 will drop the tip in the fixed trash in slot 12 of the deck. - -.. code-block:: python - - pipette.pick_up_tip() - pipette.drop_tip(tiprack['A1']) # drop back in A1 of the tiprack - pipette.pick_up_tip() - pipette.drop_tip() # drop in the fixed trash on the deck - - -.. versionadded:: 2.0 - -.. _pipette-return-tip: - -Return Tip -=========== - -To return the tip to the original location, you can call :py:meth:`.InstrumentContext.return_tip`. The example below will automatically return the tip to ``'A3'`` on the tip rack. - -.. code-block:: python - - pipette.pick_up_tip(tiprack['A3']) - pipette.return_tip() - -.. note: - - In API Version 2.0 and 2.1, the returned tips are added back into the tip-tracker and thus treated as `unused`. If you make a subsequent call to `pick_up_tip` then the software will treat returned tips as valid locations. - In API Version 2.2, returned tips are no longer added back into the tip tracker. This means that returned tips are no longer valid locations and the pipette will not attempt to pick up tips from these locations. - Also in API Version 2.2, the return tip height was corrected to utilize values determined by hardware testing. This is more in-line with return tip behavior from Python Protocol API Version 1. - -In API version 2.2 or above: - -.. code-block:: python - - tip_rack = protocol.load_labware( - 'opentrons_96_tiprack_300ul', 1) - pipette = protocol.load_instrument( - 'p300_single_gen2', mount='left', tip_racks=[tip_rack]) - - pipette.pick_up_tip() # picks up tip_rack:A1 - pipette.return_tip() - pipette.pick_up_tip() # picks up tip_rack:B1 - -In API version 2.0 and 2.1: - -.. code-block:: python - - tip_rack = protocol.load_labware( - 'opentrons_96_tiprack_300ul', 1) - pipette = protocol.load_instrument( - 'p300_single_gen2', mount='left', tip_racks=[tip_rack]) - - pipette.pick_up_tip() # picks up tip_rack:A1 - pipette.return_tip() - pipette.pick_up_tip() # picks up tip_rack:A1 - -Iterating Through Tips ----------------------- - -For this section, instead of using the protocol defined above, consider this setup: - -.. code-block:: python - :substitutions: - - from opentrons import protocol_api - - metadata = {'apiLevel': '2.14'} - - def run(protocol: protocol_api.ProtocolContext): - plate = protocol.load_labware( - 'corning_96_wellplate_360ul_flat', 2) - tip_rack_1 = protocol.load_labware( - 'opentrons_96_tiprack_300ul', 3) - tip_rack_2 = protocol.load_labware( - 'opentrons_96_tiprack_300ul', 4) - pipette = protocol.load_instrument( - 'p300_single_gen2', mount='left', tip_racks=[tip_rack_1, tip_rack_2]) - -This loads a `Corning 96 Well Plate `_ in slot 2 and two `Opentrons 300ul Tiprack `_ in slots 3 and 4 respectively, and uses a P300 Single GEN2 pipette. - -When a list of tip racks is associated with a pipette in its ``tip_racks`` argument, the pipette will automatically pick up the next unused tip in the list whenever you call :py:meth:`.InstrumentContext.pick_up_tip`. The pipette will first use all tips in the first tiprack, then move on to the second, and so on: - -.. code-block:: python - - pipette.pick_up_tip() # picks up tip_rack_1:A1 - pipette.return_tip() - pipette.pick_up_tip() # picks up tip_rack_1:A2 - pipette.drop_tip() # automatically drops in trash - - # use loop to pick up tips tip_rack_1:A3 through tip_rack_2:H12 - tips_left = 94 + 96 # add up the number of tips leftover in both tipracks - for _ in range(tips_left): - pipette.pick_up_tip() - pipette.return_tip() - -If you try to :py:meth:`.InstrumentContext.pick_up_tip()` again when all the tips have been used, the Protocol API will show you an error: - -.. code-block:: python - - # this will raise an exception if run after the previous code block - pipette.pick_up_tip() - -To change the location of the first tip used by the pipette, you can use :py:obj:`.InstrumentContext.starting_tip`: - -.. code-block:: python - - pipette.starting_tip = tip_rack_1.well('C3') - pipette.pick_up_tip() # pick up C3 from "tip_rack_1" - pipette.return_tip() - -To reset the tip tracking, you can call :py:meth:`.InstrumentContext.reset_tipracks`: - -.. code-block:: python - - # Use up all tips - for _ in range(96+96): - pipette.pick_up_tip() - pipette.return_tip() - - # Reset the tip tracker - pipette.reset_tipracks() - - # Picks up a tip from well A1 of the first tip rack - pipette.pick_up_tip() - - -.. versionadded:: 2.0 - -To check whether you should pick up a tip or not, you can utilize :py:meth:`.InstrumentContext.has_tip`: - -.. code-block:: python - - for block in range(3): - if block == 0 and not pipette.has_tip: - pipette.pick_up_tip() - else: - m300.mix(mix_repetitions, 250, d) - m300.blow_out(s.bottom(10)) - m300.return_tip() - -.. versionadded:: 2.7 - -********************** - -**************** -Liquid Control -**************** - -This section describes the :py:class:`.InstrumentContext` 's liquid-handling commands. - -The examples in this section should be inserted in the following: - -.. code-block:: python - :substitutions: - - metadata = {'apiLevel': '2.14'} - - def run(protocol): - plate = protocol.load_labware('corning_96_wellplate_360ul_flat', 2) - tiprack = protocol.load_labware('opentrons_96_tiprack_300ul', 3) - pipette = protocol.load_instrument('p300_single_gen2', mount='left', tip_racks=[tiprack]) - pipette.pick_up_tip() - # example code goes here - - -This loads a `Corning 96 Well Plate `_ in slot 2 and a `Opentrons 300ul Tiprack `_ in slot 3, and uses a P300 Single GEN2 pipette. - - -.. _new-aspirate: - -Aspirate -======== - -To aspirate is to pull liquid up into the pipette's tip. When calling :py:meth:`.InstrumentContext.aspirate` on a pipette, you can specify the volume to aspirate in µL, where to aspirate from, and how fast to aspirate liquid. - -.. code-block:: python - - pipette.aspirate(50, plate['A1'], rate=2.0) # aspirate 50uL from plate:A1 - -Now the pipette's tip is holding 50 µL. - -The ``location`` parameter is either a well (like ``plate['A1']``) or a position within a well, like the return value of ``plate['A1'].bottom``. - -The ``rate`` parameter is a multiplication factor of the pipette's default aspiration flow rate. The default aspiration flow rate for all pipettes is in the :ref:`defaults` section. - -You can also simply specify the volume to aspirate, and not mention a location. The pipette will aspirate from its current location (which we previously set as ``plate['A1'])``. - -.. code-block:: python - - pipette.aspirate(50) # aspirate 50uL from current position - -Now our pipette's tip is holding 100 µL. - -.. note:: - - In version 1 of this API, ``aspirate`` (and ``dispense``) would inspect the types of the ``volume`` and ``location`` arguments and do the right thing if you specified only a location or specified location and volume out of order. In this and future versions of the Python Protocol API, this is no longer true. Like any other Python function, if you are specifying arguments by position without using their names, you must always specify them in order. - -.. note:: - - By default, the pipette will move to 1 mm above the bottom of the target well before aspirating. - You can change this by using a well position function like :py:meth:`.Well.bottom` (see - :ref:`v2-location-within-wells`) every time you call ``aspirate``, or - if you want to change - the default throughout your protocol - you can change the default offset with - :py:obj:`.InstrumentContext.well_bottom_clearance` (see :ref:`new-default-op-positions`). - -.. versionadded:: 2.0 - -.. _new-dispense: - -Dispense -======== - -To dispense is to push out liquid from the pipette's tip. The usage of :py:meth:`.InstrumentContext.dispense` in the Protocol API is similar to :py:meth:`.InstrumentContext.aspirate`, in that you can specify volume in µL and location, or only volume. - -.. code-block:: python - - pipette.dispense(50, plate['B1'], rate=2.0) # dispense 50uL to plate:B1 at twice the normal rate - pipette.dispense(50) # dispense 50uL to current position at the normal rate - - -The ``location`` parameter is either a well (like ``plate['A1']``) or a position within a well, like the return value of ``plate['A1'].bottom``. - -The ``rate`` parameter is a multiplication factor of the pipette's default dispense flow rate. The default dispense flow rate for all pipettes is in the :ref:`defaults` section. - -.. note:: - - By default, the pipette will move to 1 mm above the bottom of the target well before dispensing. - You can change this by using a well position function like :py:meth:`.Well.bottom` (see - :ref:`v2-location-within-wells`) every time you call ``dispense``, or - if you want to change - the default throughout your protocol - you can change the default offset with - :py:obj:`.InstrumentContext.well_bottom_clearance` (see :ref:`new-default-op-positions`). - -.. note:: - - In version 1 of this API, ``dispense`` (and ``aspirate``) would inspect the types of the ``volume`` and ``location`` arguments and do the right thing if you specified only a location or specified location and volume out of order. In this and future versions of the Python Protocol API, this is no longer true. Like any other Python function, if you are specifying arguments by position without using their names, you must always specify them in order. - -.. versionadded:: 2.0 - -.. _new-blow-out: - -.. _blow-out: - -Blow Out -======== - -To blow out is to push an extra amount of air through the pipette's tip, to make sure that any remaining droplets are expelled. - -When calling :py:meth:`.InstrumentContext.blow_out`, you can specify a location to blow out the remaining liquid. If no location is specified, the pipette will blow out from its current position. - -.. code-block:: python - - pipette.blow_out() # blow out in current location - pipette.blow_out(plate['B3']) # blow out in current plate:B3 - - -.. versionadded:: 2.0 - -.. _touch-tip: - -Touch Tip -========= - -To touch tip is to move the pipette's currently attached tip to four opposite edges of a well, to knock off any droplets that might be hanging from the tip. - -When calling :py:meth:`.InstrumentContext.touch_tip` on a pipette, you have the option to specify a location where the tip will touch the inner walls. - -:py:meth:`.InstrumentContext.touch_tip` can take up to 4 arguments: ``touch_tip(location, radius, v_offset, speed)``. - -.. code-block:: python - - pipette.touch_tip() # touch tip within current location - pipette.touch_tip(v_offset=-2) # touch tip 2mm below the top of the current location - pipette.touch_tip(plate['B1']) # touch tip within plate:B1 - pipette.touch_tip(plate['B1'], speed=100) # touch tip within plate:B1 at 100 mm/s - pipette.touch_tip(plate['B1'], # touch tip in plate:B1, at 75% of total radius and -2mm from top of well - radius=0.75, - v_offset=-2) - - -.. versionadded:: 2.0 - -.. note: - - It is recommended that you change your API version to 2.4 to take advantage of new - features added into `touch_tip` such as: - - A lower minimum speed (1 mm/s) - - Better handling around near by geometry considerations - - Removed certain extraneous behaviors such as a diagonal move from X -> Y and - moving directly to the height offset specified. - -.. _mix: - -Mix -=== - -To mix is to perform a series of ``aspirate`` and ``dispense`` commands in a row on a single location. Instead of having to write those commands out every time, you can call :py:meth:`.InstrumentContext.mix`. - -The ``mix`` command takes up to three arguments: ``mix(repetitions, volume, location)``: - -.. code-block:: python - - # mix 4 times, 100uL, in plate:A2 - pipette.mix(4, 100, plate['A2']) - # mix 3 times, 50uL, in current location - pipette.mix(3, 50) - # mix 2 times, pipette's max volume, in current location - pipette.mix(2) - -.. note:: - - In API Versions 2.2 and earlier, mixes consist of aspirates and then immediate dispenses. In between these actions, the pipette moves up and out of the target well. In API Version 2.3 and later, the pipette will not move between actions. - -.. versionadded:: 2.0 - -.. _air-gap: - -Air Gap -======= - -When dealing with certain liquids, you may need to aspirate air after aspirating the liquid to prevent it from sliding out of the pipette's tip. A call to :py:meth:`.InstrumentContext.air_gap` with a volume in µL will aspirate that much air into the tip. ``air_gap`` takes up to two arguments: ``air_gap(volume, height)``: - -.. code-block:: python - - pipette.aspirate(100, plate['B4']) - pipette.air_gap(20) - pipette.drop_tip() - -.. versionadded:: 2.0 - -********************** - -.. _new-utility-commands: - -**************** -Utility Commands -**************** - -Delay for an Amount of Time -=========================== - -Sometimes you need to wait as a step in your protocol, for instance to wait for something to incubate. You can use :py:meth:`.ProtocolContext.delay` to wait your protocol for a specific amount of time. ``delay`` is a method of :py:class:`.ProtocolContext` since it concerns the protocol as a whole. - -The values passed into ``delay()`` specify the number of minutes and seconds that the robot will wait until moving on to the next command. - -.. code-block:: python - - protocol.delay(seconds=2) # delay for 2 seconds - protocol.delay(minutes=5) # delay for 5 minutes - protocol.delay(minutes=5, seconds=2) # delay for 5 minutes and 2 seconds - - -Pause Until Resumed -=================== - -The method :py:meth:`.ProtocolContext.pause` will pause protocol execution at a specific step. -You can resume by pressing 'resume' in your Opentrons App. You can optionally specify a message that -will be displayed in the Opentrons App when protocol execution pauses. - -.. code-block:: python - :substitutions: - - from opentrons import protocol_api - - metadata = {'apiLevel': '2.14'} - - def run(protocol: protocol_api.ProtocolContext): - # The start of your protocol goes here... - - # The protocol stops here until you press resume. The optional message appears in - # the Opentrons App. You do not need to specify a message, but it makes things - # more clear. - protocol.pause('Time to take a break') - -.. versionadded:: 2.0 - -Homing -====== - -You can manually request for the robot to home during protocol execution. This is typically -not necessary; however, if at any point you will disengage motors or move -the gantry with your hand, you may want to command a home afterwards. - -To home the all axes, you can call :py:meth:`.ProtocolContext.home`. - -To home a specific pipette's Z axis and plunger, you can call :py:meth:`.InstrumentContext.home`. - -To home a specific pipette's plunger only, you can call :py:meth:`.InstrumentContext.home_plunger`. - -None of these functions take any arguments: - -.. code-block:: python - :substitutions: - - from opentrons import protocol_api, types - - metadata = {'apiLevel': '2.14'} - - def run(protocol: protocol_api.ProtocolContext): - pipette = protocol.load_instrument('p300_single', 'right') - protocol.home() # Homes the gantry, z axes, and plungers - pipette.home() # Homes the right z axis and plunger - pipette.home_plunger() # Homes the right plunger - -.. versionadded:: 2.0 - - -Comment -======= - -The method :py:meth:`.ProtocolContext.comment` lets you display messages in the Opentrons App during protocol execution: - - -.. code-block:: python - :substitutions: - - from opentrons import protocol_api, types - - metadata = {'apiLevel': '2.14'} - - def run(protocol: protocol_api.ProtocolContext): - protocol.comment('Hello, world!') - -.. versionadded:: 2.0 - - -Control and Monitor Robot Rail Lights -===================================== - -You can turn the robot rail lights on or off in the protocol using :py:meth:`.ProtocolContext.set_rail_lights`: - - -.. code-block:: python - :substitutions: - - from opentrons import protocol_api - - metadata = {'apiLevel': '2.14'} - - def run(protocol: protocol_api.ProtocolContext): - # turn on robot rail lights - protocol.set_rail_lights(True) - - # turn off robot rail lights - protocol.set_rail_lights(False) - -.. versionadded:: 2.5 - - -You can also check whether the rail lights are on or off in the protocol using :py:obj:`.ProtocolContext.rail_lights_on`: - - -.. code-block:: python - - protocol.rail_lights_on # returns True when the lights are on, - # False when the lights are off - -.. versionadded:: 2.5 - - -.. TODO clarify that this is specific to OT-2 (Flex always pauses when door open) or remove this section if OT-2 will also always pause in the future - -Monitor Robot Door -================== - -The door safety switch feature flag has been added to the OT-2 software since the 3.19.0 release. Enabling the feature flag allows your robot to pause a running protocol and prohibit the protocol from running when the robot door is open. - -.. image:: ../img/feature_flags/door_safety_switch.png - -You can also check whether or not the robot door is closed at a specific point in time in the protocol using :py:obj:`.ProtocolContext.door_closed`: - - -.. code-block:: python - - protocol.door_closed # return True when the door is closed, - # False when the door is open - - -.. note:: - - Both the top window and the front door must be closed in order for the robot to report the door is closed. - - -.. warning:: - - If you chose to enable the door safety switch feature flag, you should only use :py:obj:`.ProtocolContext.door_closed` as a form of status check, and should not use it to control robot behavior. If you wish to implement custom method to pause or resume protocol using :py:obj:`.ProtocolContext.door_closed`, make sure you have first disabled the feature flag. - -.. versionadded:: 2.5 +Pages in this section of the documentation cover: +- :ref:`pipette-tips`: Get started with commands for picking up pipette tips, dropping tips, returning tips, and working with used tips. +- :ref:`liquid-control`: Learn about aspirating and dispensing liquids, blow out and touch tip procedures, mixing, and creating air gaps. +- :ref:`new-utility-commands`: Control various robot functions such as pausing or delaying a protocol, checking the robot’s door, turning robot lights on/off, and more. diff --git a/api/docs/v2/new_complex_commands.rst b/api/docs/v2/new_complex_commands.rst index a15f9eeda0e..161a6dc8549 100644 --- a/api/docs/v2/new_complex_commands.rst +++ b/api/docs/v2/new_complex_commands.rst @@ -11,7 +11,7 @@ Complex Commands complex_commands/order_operations complex_commands/parameters -Complex liquid handling commands combine multiple :ref:`v2-atomic-commands` into a single method call. These commands make it easier to handle larger groups of wells and repeat actions without having to write your own control flow code. They integrate tip-handling behavior and can pick up, use, and drop multiple tips depending on how you want to handle your liquids. They can optionally perform other actions, like adding air gaps, knocking droplets off the tip, mixing, and blowing out excess liquid from the tip. +Complex liquid handling commands combine multiple :ref:`building block commands ` into a single method call. These commands make it easier to handle larger groups of wells and repeat actions without having to write your own control flow code. They integrate tip-handling behavior and can pick up, use, and drop multiple tips depending on how you want to handle your liquids. They can optionally perform other actions, like adding air gaps, knocking droplets off the tip, mixing, and blowing out excess liquid from the tip. There are three complex liquid handling commands, each optimized for a different liquid handling scenario: @@ -25,4 +25,4 @@ Pages in this section of the documentation cover: - :ref:`complex-command-order`: The order of basic commands that are part of a complex commmand. - :ref:`complex_params`: Additional keyword arguments that affect complex command behavior. -Code samples throughout these pages assume that you've loaded the pipettes and labware from the basic :ref:`protocol-template`. +Code samples throughout these pages assume that you've loaded the pipettes and labware from the :ref:`basic protocol template `. diff --git a/api/docs/v2/new_examples.rst b/api/docs/v2/new_examples.rst index baf658aada4..3d1fd4b35f4 100644 --- a/api/docs/v2/new_examples.rst +++ b/api/docs/v2/new_examples.rst @@ -6,7 +6,7 @@ Protocol Examples ***************** -This page provides simple, ready-made protocols for Flex and OT-2. Feel free to copy and modify these examples to create unique protocols that help automate your laboratory workflows. Also, experimenting with these protocols is another way to build upon the skills you've learned from working through the :ref:`tutorial`. Try adding different hardware, labware, and commands to a sample protocol and test its validity after importing it into the Opentrons App. +This page provides simple, ready-made protocols for Flex and OT-2. Feel free to copy and modify these examples to create unique protocols that help automate your laboratory workflows. Also, experimenting with these protocols is another way to build upon the skills you've learned from working through the :ref:`tutorial `. Try adding different hardware, labware, and commands to a sample protocol and test its validity after importing it into the Opentrons App. Using These Protocols ===================== @@ -15,13 +15,13 @@ These sample protocols are designed for anyone using an Opentrons Flex or OT-2 l # This code uses named arguments tiprack_1 = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_200ul', - location='D2') + load_name="opentrons_flex_96_tiprack_200ul", + location="D2") # This code uses positional arguments - tiprack_1 = protocol.load_labware('opentrons_flex_96_tiprack_200ul','D2') + tiprack_1 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "D2") -Both examples instantiate the variable ``tiprack_1`` with a Flex tip rack, but the former is more explicit. It shows the parameter name and its value together (e.g. ``location='D2'``), which may be helpful when you're unsure about what's going on in a protocol code sample. +Both examples instantiate the variable ``tiprack_1`` with a Flex tip rack, but the former is more explicit. It shows the parameter name and its value together (e.g. ``location="D2"``), which may be helpful when you're unsure about what's going on in a protocol code sample. Python developers with more experience should feel free to ignore the code styling used here and work with these examples as you like. @@ -91,6 +91,8 @@ This code only loads the instruments and labware listed above, and performs no o reservoir = protocol.load_labware( load_name="usascientific_12_reservoir_22ml", location="D1" ) + # load trash bin in deck slot A3 + trash = protocol.load_trash_bin("A3") # Put protocol commands here .. tab:: OT-2 @@ -100,7 +102,7 @@ This code only loads the instruments and labware listed above, and performs no o from opentrons import protocol_api - metadata = {'apiLevel': '2.14'} + metadata = {"apiLevel": "|apiLevel|"} def run(protocol: protocol_api.ProtocolContext): # load tip rack in deck slot 3 @@ -131,7 +133,7 @@ These protocols demonstrate how to move 100 µL of liquid from one well to anoth Basic Method ------------ -This protocol uses some :ref:`basic commands ` to tell the robot, explicitly, where to go to aspirate and dispense liquid. These commands include the :py:meth:`~.InstrumentContext.pick_up_tip`, :py:meth:`~.InstrumentContext.aspirate`, and :py:meth:`~.InstrumentContext.dispense` methods. +This protocol uses some :ref:`building block commands ` to tell the robot, explicitly, where to go to aspirate and dispense liquid. These commands include the :py:meth:`~.InstrumentContext.pick_up_tip`, :py:meth:`~.InstrumentContext.aspirate`, and :py:meth:`~.InstrumentContext.dispense` methods. .. tabs:: @@ -142,24 +144,25 @@ This protocol uses some :ref:`basic commands ` to tell the r from opentrons import protocol_api - requirements = {'robotType': 'Flex', 'apiLevel':'|apiLevel|'} + requirements = {"robotType": "Flex", "apiLevel":"|apiLevel|"} def run(protocol: protocol_api.ProtocolContext): plate = protocol.load_labware( - load_name='corning_96_wellplate_360ul_flat', - location='D1') + load_name="corning_96_wellplate_360ul_flat", + location="D1") tiprack_1 = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_200ul', - location='D2') - pipette_1 = protocol.load_instrument( - instrument_name='flex_1channel_1000', - mount='left', + load_name="opentrons_flex_96_tiprack_200ul", + location="D2") + trash = protocol.load_trash_bin("A3") + pipette = protocol.load_instrument( + instrument_name="flex_1channel_1000", + mount="left", tip_racks=[tiprack_1]) - pipette_1.pick_up_tip() - pipette_1.aspirate(100, plate['A1']) - pipette_1.dispense(100, plate['B1']) - pipette_1.drop_tip() + pipette.pick_up_tip() + pipette.aspirate(100, plate["A1"]) + pipette.dispense(100, plate["B1"]) + pipette.drop_tip() .. tab:: OT-2 @@ -168,29 +171,29 @@ This protocol uses some :ref:`basic commands ` to tell the r from opentrons import protocol_api - metadata = {'apiLevel': '2.14'} + metadata = {"apiLevel": "|apiLevel|"} def run(protocol: protocol_api.ProtocolContext): plate = protocol.load_labware( - load_name='corning_96_wellplate_360ul_flat', + load_name="corning_96_wellplate_360ul_flat", location=1) tiprack_1 = protocol.load_labware( - load_name='opentrons_96_tiprack_300ul', + load_name="opentrons_96_tiprack_300ul", location=2) p300 = protocol.load_instrument( - instrument_name='p300_single', - mount='left', + instrument_name="p300_single", + mount="left", tip_racks=[tiprack_1]) p300.pick_up_tip() - p300.aspirate(100, plate['A1']) - p300.dispense(100, plate['B1']) + p300.aspirate(100, plate["A1"]) + p300.dispense(100, plate["B1"]) p300.drop_tip() Advanced Method --------------- -This protocol accomplishes the same thing as the previous example, but does it a little more efficiently. Notice how it uses the :py:meth:`.InstrumentContext.transfer` method to move liquid between well plates. The source and destination well arguments (e.g., ``plate['A1'], plate['B1']``) are part of ``transfer()`` method parameters. You don't need separate calls to ``aspirate`` or ``dispense`` here. +This protocol accomplishes the same thing as the previous example, but does it a little more efficiently. Notice how it uses the :py:meth:`.InstrumentContext.transfer` method to move liquid between well plates. The source and destination well arguments (e.g., ``plate["A1"], plate["B1"]``) are part of ``transfer()`` method parameters. You don't need separate calls to ``aspirate`` or ``dispense`` here. .. tabs:: @@ -201,21 +204,22 @@ This protocol accomplishes the same thing as the previous example, but does it a from opentrons import protocol_api - requirements = {'robotType': 'Flex', 'apiLevel': '|apiLevel|'} + requirements = {"robotType": "Flex", "apiLevel": "|apiLevel|"} def run(protocol: protocol_api.ProtocolContext): plate = protocol.load_labware( - load_name='corning_96_wellplate_360ul_flat', - location='D1') + load_name="corning_96_wellplate_360ul_flat", + location="D1") tiprack_1 = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_200ul', - location='D2') - pipette_1 = protocol.load_instrument( - instrument_name='flex_1channel_1000', - mount='left', + load_name="opentrons_flex_96_tiprack_200ul", + location="D2") + trash = protocol.load_trash_bin("A3") + pipette = protocol.load_instrument( + instrument_name="flex_1channel_1000", + mount="left", tip_racks=[tiprack_1]) # transfer 100 µL from well A1 to well B1 - pipette_1.transfer(100, plate['A1'], plate['B1']) + pipette.transfer(100, plate["A1"], plate["B1"]) .. tab:: OT-2 @@ -224,21 +228,21 @@ This protocol accomplishes the same thing as the previous example, but does it a from opentrons import protocol_api - metadata = {'apiLevel': '2.14'} + metadata = {"apiLevel": "|apiLevel|"} def run(protocol: protocol_api.ProtocolContext): plate = protocol.load_labware( - load_name='corning_96_wellplate_360ul_flat', + load_name="corning_96_wellplate_360ul_flat", location=1) tiprack_1 = protocol.load_labware( - load_name='opentrons_96_tiprack_300ul', + load_name="opentrons_96_tiprack_300ul", location=2) p300 = protocol.load_instrument( - instrument_name='p300_single', - mount='left', + instrument_name="p300_single", + mount="left", tip_racks=[tiprack_1]) # transfer 100 µL from well A1 to well B1 - p300.transfer(100, plate['A1'], plate['B1']) + p300.transfer(100, plate["A1"], plate["B1"]) Loops @@ -257,21 +261,22 @@ When used in a protocol, loops automate repetitive steps such as aspirating and from opentrons import protocol_api - requirements = {'robotType': 'Flex', 'apiLevel':'|apiLevel|'} + requirements = {"robotType": "Flex", "apiLevel":"|apiLevel|"} def run(protocol: protocol_api.ProtocolContext): plate = protocol.load_labware( - load_name='corning_96_wellplate_360ul_flat', - location='D1') + load_name="corning_96_wellplate_360ul_flat", + location="D1") tiprack_1 = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_200ul', - location='D2') + load_name="opentrons_flex_96_tiprack_200ul", + location="D2") reservoir = protocol.load_labware( - load_name='usascientific_12_reservoir_22ml', - location='D3') - pipette_1 = protocol.load_instrument( - instrument_name='flex_1channel_1000', - mount='left', + load_name="usascientific_12_reservoir_22ml", + location="D3") + trash = protocol.load_trash_bin("A3") + pipette = protocol.load_instrument( + instrument_name="flex_1channel_1000", + mount="left", tip_racks=[tiprack_1]) # distribute 20 µL from reservoir:A1 -> plate:row:1 @@ -279,7 +284,7 @@ When used in a protocol, loops automate repetitive steps such as aspirating and # etc... # range() starts at 0 and stops before 8, creating a range of 0-7 for i in range(8): - pipette_1.distribute(200, reservoir.wells()[i], plate.rows()[i]) + pipette.distribute(200, reservoir.wells()[i], plate.rows()[i]) .. tab:: OT-2 @@ -288,21 +293,21 @@ When used in a protocol, loops automate repetitive steps such as aspirating and from opentrons import protocol_api - metadata = {'apiLevel': '2.14'} + metadata = {"apiLevel": "|apiLevel|"} def run(protocol: protocol_api.ProtocolContext): plate = protocol.load_labware( - load_name='corning_96_wellplate_360ul_flat', + load_name="corning_96_wellplate_360ul_flat", location=1) tiprack_1 = protocol.load_labware( - load_name='opentrons_96_tiprack_300ul', + load_name="opentrons_96_tiprack_300ul", location=2) reservoir = protocol.load_labware( - load_name='usascientific_12_reservoir_22ml', + load_name="usascientific_12_reservoir_22ml", location=4) p300 = protocol.load_instrument( - instrument_name='p300_single', - mount='left', + instrument_name="p300_single", + mount="left", tip_racks=[tiprack_1]) # distribute 20 µL from reservoir:A1 -> plate:row:1 @@ -328,33 +333,34 @@ Opentrons electronic pipettes can do some things that a human cannot do with a p from opentrons import protocol_api - requirements = {'robotType': 'Flex', 'apiLevel':'|apiLevel|'} + requirements = {"robotType": "Flex", "apiLevel":"|apiLevel|"} def run(protocol: protocol_api.ProtocolContext): plate = protocol.load_labware( - load_name='corning_96_wellplate_360ul_flat', - location='D1') + load_name="corning_96_wellplate_360ul_flat", + location="D1") tiprack_1 = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_200ul', - location='D2') + load_name="opentrons_flex_96_tiprack_1000ul", + location="D2") reservoir = protocol.load_labware( - load_name='usascientific_12_reservoir_22ml', - location='D3') - pipette_1 = protocol.load_instrument( - instrument_name='flex_1channel_1000', - mount='left', + load_name="usascientific_12_reservoir_22ml", + location="D3") + trash = protocol.load_trash_bin("A3") + pipette = protocol.load_instrument( + instrument_name="flex_1channel_1000", + mount="left", tip_racks=[tiprack_1]) - pipette_1.pick_up_tip() + pipette.pick_up_tip() # aspirate from the first 5 wells - for well in reservoir.wells()[:4]: - pipette_1.aspirate(volume=35, location=well) - pipette_1.air_gap(10) - - pipette_1.dispense(225, plate['A1']) + for well in reservoir.wells()[:5]: + pipette.aspirate(volume=35, location=well) + pipette.air_gap(10) - pipette_1.return_tip() + pipette.dispense(225, plate["A1"]) + + pipette.return_tip() .. tab:: OT-2 @@ -363,31 +369,31 @@ Opentrons electronic pipettes can do some things that a human cannot do with a p from opentrons import protocol_api - metadata = {'apiLevel': '2.14'} + metadata = {"apiLevel": "|apiLevel|"} def run(protocol: protocol_api.ProtocolContext): plate = protocol.load_labware( - load_name='corning_96_wellplate_360ul_flat', + load_name="corning_96_wellplate_360ul_flat", location=1) tiprack_1 = protocol.load_labware( - load_name='opentrons_96_tiprack_300ul', + load_name="opentrons_96_tiprack_300ul", location=2) reservoir = protocol.load_labware( - load_name='usascientific_12_reservoir_22ml', + load_name="usascientific_12_reservoir_22ml", location=3) p300 = protocol.load_instrument( - instrument_name='p300_single', - mount='right', + instrument_name="p300_single", + mount="right", tip_racks=[tiprack_1]) p300.pick_up_tip() # aspirate from the first 5 wells - for well in reservoir.wells()[:4]: + for well in reservoir.wells()[:5]: p300.aspirate(volume=35, location=well) p300.air_gap(10) - p300.dispense(225, plate['A1']) + p300.dispense(225, plate["A1"]) p300.return_tip() @@ -407,27 +413,28 @@ This protocol dispenses diluent to all wells of a Corning 96-well plate. Next, i from opentrons import protocol_api - requirements = {'robotType': 'Flex', 'apiLevel': '|apiLevel|'} + requirements = {"robotType": "Flex", "apiLevel": "|apiLevel|"} def run(protocol: protocol_api.ProtocolContext): plate = protocol.load_labware( - load_name='corning_96_wellplate_360ul_flat', - location='D1') + load_name="corning_96_wellplate_360ul_flat", + location="D1") tiprack_1 = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_200ul', - location='D2') + load_name="opentrons_flex_96_tiprack_200ul", + location="D2") tiprack_2 = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_200ul', - location='D3') + load_name="opentrons_flex_96_tiprack_200ul", + location="D3") reservoir = protocol.load_labware( - load_name='usascientific_12_reservoir_22ml', - location='C1') - pipette_1 = protocol.load_instrument( - instrument_name='flex_1channel_1000', - mount='left', + load_name="usascientific_12_reservoir_22ml", + location="C1") + trash = protocol.load_trash_bin("A3") + pipette = protocol.load_instrument( + instrument_name="flex_1channel_1000", + mount="left", tip_racks=[tiprack_1, tiprack_2]) # Dispense diluent - pipette_1.distribute(50, reservoir['A12'], plate.wells()) + pipette.distribute(50, reservoir["A12"], plate.wells()) # loop through each row for i in range(8): @@ -436,10 +443,10 @@ This protocol dispenses diluent to all wells of a Corning 96-well plate. Next, i row = plate.rows()[i] # transfer 30 µL of source to first well in column - pipette_1.transfer(30, source, row[0], mix_after=(3, 25)) + pipette.transfer(30, source, row[0], mix_after=(3, 25)) # dilute the sample down the column - pipette_1.transfer( + pipette.transfer( 30, row[:11], row[1:], mix_after=(3, 25)) @@ -450,27 +457,27 @@ This protocol dispenses diluent to all wells of a Corning 96-well plate. Next, i from opentrons import protocol_api - metadata = {'apiLevel': '2.14'} + metadata = {"apiLevel": "|apiLevel|"} def run(protocol: protocol_api.ProtocolContext): plate = protocol.load_labware( - load_name='corning_96_wellplate_360ul_flat', + load_name="corning_96_wellplate_360ul_flat", location=1) tiprack_1 = protocol.load_labware( - load_name='opentrons_96_tiprack_300ul', + load_name="opentrons_96_tiprack_300ul", location=2) tiprack_2 = protocol.load_labware( - load_name='opentrons_96_tiprack_300ul', + load_name="opentrons_96_tiprack_300ul", location=3) reservoir = protocol.load_labware( - load_name='usascientific_12_reservoir_22ml', + load_name="usascientific_12_reservoir_22ml", location=4) p300 = protocol.load_instrument( - instrument_name='p300_single', - mount='right', + instrument_name="p300_single", + mount="right", tip_racks=[tiprack_1, tiprack_2]) # Dispense diluent - p300.distribute(50, reservoir['A12'], plate.wells()) + p300.distribute(50, reservoir["A12"], plate.wells()) # loop through each row for i in range(8): @@ -503,24 +510,25 @@ This protocol dispenses different volumes of liquids to a well plate and automat from opentrons import protocol_api - requirements = {'robotType': 'Flex', 'apiLevel': '2.15'} + requirements = {"robotType": "Flex", "apiLevel": "|apiLevel|"} def run(protocol: protocol_api.ProtocolContext): plate = protocol.load_labware( - load_name='corning_96_wellplate_360ul_flat', - location='D1') + load_name="corning_96_wellplate_360ul_flat", + location="D1") tiprack_1 = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_200ul', - location='D2') + load_name="opentrons_flex_96_tiprack_200ul", + location="D2") tiprack_2 = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_200ul', - location='D3') + load_name="opentrons_flex_96_tiprack_200ul", + location="D3") reservoir = protocol.load_labware( - load_name='usascientific_12_reservoir_22ml', - location='C1') - pipette_1 = protocol.load_instrument( - instrument_name='flex_1channel_1000', - mount='right', + load_name="usascientific_12_reservoir_22ml", + location="C1") + trash = protocol.load_trash_bin("A3") + pipette = protocol.load_instrument( + instrument_name="flex_1channel_1000", + mount="right", tip_racks=[tiprack_1, tiprack_2]) # Volume amounts are for demonstration purposes only @@ -539,7 +547,7 @@ This protocol dispenses different volumes of liquids to a well plate and automat 89, 90, 91, 92, 93, 94, 95, 96 ] - pipette_1.distribute(water_volumes, reservoir['A12'], plate.wells()) + pipette.distribute(water_volumes, reservoir["A12"], plate.wells()) .. tab:: OT-2 @@ -547,24 +555,24 @@ This protocol dispenses different volumes of liquids to a well plate and automat :substitutions: from opentrons import protocol_api - metadata = {'apiLevel': '2.14'} + metadata = {"apiLevel": "|apiLevel|"} def run(protocol: protocol_api.ProtocolContext): plate = protocol.load_labware( - load_name='corning_96_wellplate_360ul_flat', + load_name="corning_96_wellplate_360ul_flat", location=1) tiprack_1 = protocol.load_labware( - load_name='opentrons_96_tiprack_300ul', + load_name="opentrons_96_tiprack_300ul", location=2) tiprack_2 = protocol.load_labware( - load_name='opentrons_96_tiprack_300ul', + load_name="opentrons_96_tiprack_300ul", location=3) reservoir = protocol.load_labware( - load_name='usascientific_12_reservoir_22ml', + load_name="usascientific_12_reservoir_22ml", location=4) p300 = protocol.load_instrument( - instrument_name='p300_single', - mount='right', + instrument_name="p300_single", + mount="right", tip_racks=[tiprack_1, tiprack_2]) # Volume amounts are for demonstration purposes only @@ -583,4 +591,4 @@ This protocol dispenses different volumes of liquids to a well plate and automat 89, 90, 91, 92, 93, 94, 95, 96 ] - p300.distribute(water_volumes, reservoir['A12'], plate.wells()) + p300.distribute(water_volumes, reservoir["A12"], plate.wells()) diff --git a/api/docs/v2/new_labware.rst b/api/docs/v2/new_labware.rst index 465622d6e8f..af948685049 100644 --- a/api/docs/v2/new_labware.rst +++ b/api/docs/v2/new_labware.rst @@ -10,7 +10,7 @@ Labware are the durable or consumable items that you work with, reuse, or discar .. note:: - Code snippets use coordinate deck slot locations (e.g. ``'D1'``, ``'D2'``), like those found on Flex. If you have an OT-2 and are using API version 2.14 or earlier, replace the coordinate with its numeric OT-2 equivalent. For example, slot D1 on Flex corresponds to slot 1 on an OT-2. See :ref:`deck-slots` for more information. + Code snippets use coordinate deck slot locations (e.g. ``"D1"``, ``"D2"``), like those found on Flex. If you have an OT-2 and are using API version 2.14 or earlier, replace the coordinate with its numeric OT-2 equivalent. For example, slot D1 on Flex corresponds to slot 1 on an OT-2. See :ref:`deck-slots` for more information. ************* Labware Types @@ -21,6 +21,8 @@ Default Labware Default labware is everything listed in the `Opentrons Labware Library `_. When used in a protocol, your Flex or OT-2 knows how to work with default labware. However, you must first inform the API about the labware you will place on the robot’s deck. Search the library when you’re looking for the API load names of the labware you want to use. You can copy the load names from the library and pass them to the :py:meth:`~.ProtocolContext.load_labware` method in your protocol. +.. _v2-custom-labware: + Custom Labware ============== @@ -58,14 +60,14 @@ Similar to the code sample in :ref:`overview-section-v2`, here's how you use the .. code-block:: python #Flex - tiprack = protocol.load_labware('opentrons_flex_96_tiprack_200ul', 'D1') - plate = protocol.load_labware('corning_96_wellplate_360ul_flat', 'D2') + tiprack = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "D1") + plate = protocol.load_labware("corning_96_wellplate_360ul_flat", "D2") .. code-block:: python #OT-2 - tiprack = protocol.load_labware('opentrons_96_tiprack_300ul', '1') - plate = protocol.load_labware('corning_96_wellplate_360ul_flat', '2') + tiprack = protocol.load_labware("opentrons_96_tiprack_300ul", "1") + plate = protocol.load_labware("corning_96_wellplate_360ul_flat", "2") .. versionadded:: 2.0 @@ -78,9 +80,9 @@ When the ``load_labware`` method loads labware into your protocol, it returns a The ``load_labware`` method includes an optional ``label`` argument. You can use it to identify labware with a descriptive name. If used, the label value is displayed in the Opentrons App. For example:: tiprack = protocol.load_labware( - load_name='corning_96_wellplate_360ul_flat', - location='D1', - label='any-name-you-want') + load_name="corning_96_wellplate_360ul_flat", + location="D1", + label="any-name-you-want") .. _labware-on-adapters: @@ -96,9 +98,9 @@ Loading Separately The ``load_adapter()`` method is available on ``ProtocolContext`` and module contexts. It behaves similarly to ``load_labware()``, requiring the load name and location for the desired adapter. Load a module, adapter, and labware with separate calls to specify each layer of the physical stack of components individually:: - hs_mod = protocol.load_module('heaterShakerModuleV1', 'D1') - hs_adapter = hs_mod.load_adapter('opentrons_96_flat_bottom_adapter') - hs_plate = hs_mod.load_labware('nest_96_wellplate_200ul_flat') + hs_mod = protocol.load_module("heaterShakerModuleV1", "D1") + hs_adapter = hs_mod.load_adapter("opentrons_96_flat_bottom_adapter") + hs_plate = hs_adapter.load_labware("nest_96_wellplate_200ul_flat") .. versionadded:: 2.15 The ``load_adapter()`` method. @@ -109,9 +111,9 @@ Loading Together Use the ``adapter`` argument of ``load_labware()`` to load an adapter at the same time as labware. For example, to load the same 96-well plate and adapter from the previous section at once:: hs_plate = hs_mod.load_labware( - load_name='nest_96_wellplate_200ul_flat', - location='D1', - adapter='opentrons_96_flat_bottom_adapter') + name="nest_96_wellplate_200ul_flat", + adapter="opentrons_96_flat_bottom_adapter" + ) .. versionadded:: 2.15 The ``adapter`` parameter. @@ -119,7 +121,7 @@ Use the ``adapter`` argument of ``load_labware()`` to load an adapter at the sam The API also has some "combination" labware definitions, which treat the adapter and labware as a unit:: hs_combo = hs_mod.load_labware( - 'opentrons_96_flat_bottom_adapter_nest_wellplate_200ul_flat' + "opentrons_96_flat_bottom_adapter_nest_wellplate_200ul_flat" ) Loading labware this way prevents you from :ref:`moving the labware ` onto or off of the adapter, so it's less flexible than loading the two separately. Avoid using combination definitions unless your protocol specifies an ``apiLevel`` of 2.14 or lower. @@ -135,9 +137,9 @@ Well Ordering You need to select which wells to transfer liquids to and from over the course of a protocol. -Rows of wells on a labware have labels that are capital letters starting with A. For instance, an 96-well plate has 8 rows, labeled ``'A'`` through ``'H'``. +Rows of wells on a labware have labels that are capital letters starting with A. For instance, an 96-well plate has 8 rows, labeled ``"A"`` through ``"H"``. -Columns of wells on a labware have labels that are numbers starting with 1. For instance, a 96-well plate has columns ``'1'`` through ``'12'``. +Columns of wells on a labware have labels that are numbers starting with 1. For instance, a 96-well plate has columns ``"1"`` through ``"12"``. All well-accessing functions start with the well at the top left corner of the labware. The ending well is in the bottom right. The order of travel from top left to bottom right depends on which function you use. @@ -147,7 +149,7 @@ The code in this section assumes that ``plate`` is a 24-well plate. For example: .. code-block:: python - plate = protocol.load_labware('corning_24_wellplate_3.4ml_flat', location='D1') + plate = protocol.load_labware("corning_24_wellplate_3.4ml_flat", location="D1") .. _well-accessor-methods: @@ -174,28 +176,30 @@ The API provides many different ways to access wells inside labware. Different m - ``[[labware:A1, labware:B1...], [labware:A2, labware:B2...]]`` * - :py:meth:`.Labware.wells_by_name` - Dictionary with well names as keys. - - ``{'A1': labware:A1, 'B1': labware:B1}`` + - ``{"A1": labware:A1, "B1": labware:B1}`` * - :py:meth:`.Labware.rows_by_name` - Dictionary with row names as keys. - - ``{'A': [labware:A1, labware:A2...], 'B': [labware:B1, labware:B2...]}`` + - ``{"A": [labware:A1, labware:A2...], "B": [labware:B1, labware:B2...]}`` * - :py:meth:`.Labware.columns_by_name` - Dictionary with column names as keys. - - ``{'1': [labware:A1, labware:B1...], '2': [labware:A2, labware:B2...]}`` + - ``{"1": [labware:A1, labware:B1...], "2": [labware:A2, labware:B2...]}`` Accessing Individual Wells ========================== +.. _well-dictionary-access: + Dictionary Access ----------------- -The simplest way to refer to a single well is by its name, like A1 or D6. :py:meth:`.Labware.wells_by_name` accomplishes this. This is such a common task that the API also has an equivalent shortcut: dictionary indexing. +The simplest way to refer to a single well is by its :py:obj:`.well_name`, like A1 or D6. Referencing a particular key in the result of :py:meth:`.Labware.wells_by_name` accomplishes this. This is such a common task that the API also has an equivalent shortcut: dictionary indexing. .. code-block:: python - a1 = plate.wells_by_name()['A1'] - d6 = plate['D6'] # dictionary indexing + a1 = plate.wells_by_name()["A1"] + d6 = plate["D6"] # dictionary indexing -If a well does not exist in the labware, such as ``plate['H12']`` on a 24-well plate, the API will raise a ``KeyError``. In contrast, it would be a valid reference on a standard 96-well plate. +If a well does not exist in the labware, such as ``plate["H12"]`` on a 24-well plate, the API will raise a ``KeyError``. In contrast, it would be a valid reference on a standard 96-well plate. .. versionadded:: 2.0 @@ -225,9 +229,9 @@ Use :py:meth:`.Labware.rows_by_name` to access a specific row of wells or :py:m .. code-block:: python - row_dict = plate.rows_by_name()['A'] + row_dict = plate.rows_by_name()["A"] row_list = plate.rows()[0] # equivalent to the line above - column_dict = plate.columns_by_name()['1'] + column_dict = plate.columns_by_name()["1"] column_list = plate.columns()[0] # equivalent to the line above print('Column "1" has', len(column_dict), 'wells') # Column "1" has 4 wells @@ -235,18 +239,21 @@ Use :py:meth:`.Labware.rows_by_name` to access a specific row of wells or :py:m Since these methods return either lists or dictionaries, you can iterate through them as you would regular Python data structures. -For example, to transfer 50 µL of liquid from the first well of a reservoir to each of the wells of row ``'A'`` on a plate:: +For example, to transfer 50 µL of liquid from the first well of a reservoir to each of the wells of row ``"A"`` on a plate:: for well in plate.rows()[0]: - pipette.transfer(reservoir['A1'], well, 50) + pipette.transfer(reservoir["A1"], well, 50) Equivalently, using ``rows_by_name``:: - for well in plate.rows_by_name()['A'].values(): - pipette.transfer(reservoir['A1'], well, 50) + for well in plate.rows_by_name()["A"].values(): + pipette.transfer(reservoir["A1"], well, 50) .. versionadded:: 2.0 + +.. _labeling-liquids: + ************************* Labeling Liquids in Wells ************************* @@ -316,7 +323,7 @@ The ``load_liquid`` arguments include a volume amount (``volume=n`` in µL). Thi Well Dimensions *************** -The functions in the :ref:`new-well-access` section above return a single :py:class:`.Well` object or a larger object representing many wells. :py:class:`.Well` objects have attributes that provide information about their physical shape, such as the depth or diameter, as specified in their corresponding labware definition. These properties can be used for different applications, such as calculating the volume of a well or a :ref:`position-relative-labware`. +The functions in the :ref:`new-well-access` section above return a single :py:class:`.Well` object or a larger object representing many wells. :py:class:`.Well` objects have attributes that provide information about their physical shape, such as the depth or diameter, as specified in their corresponding labware definition. These properties can be used for different applications, such as calculating the volume of a well or a :ref:`position relative to the well `. Depth ===== @@ -326,8 +333,8 @@ Use :py:attr:`.Well.depth` to get the distance in mm between the very top of the .. code-block:: python :substitutions: - plate = protocol.load_labware('corning_96_wellplate_360ul_flat', 'D1') - depth = plate['A1'].depth # 10.67 + plate = protocol.load_labware("corning_96_wellplate_360ul_flat", "D1") + depth = plate["A1"].depth # 10.67 Diameter ======== @@ -337,8 +344,8 @@ Use :py:attr:`.Well.diameter` to get the diameter of a given well in mm. Since d .. code-block:: python :substitutions: - plate = protocol.load_labware('corning_96_wellplate_360ul_flat', 'D1') - diameter = plate['A1'].diameter # 6.86 + plate = protocol.load_labware("corning_96_wellplate_360ul_flat", "D1") + diameter = plate["A1"].diameter # 6.86 Length ====== @@ -348,8 +355,8 @@ Use :py:attr:`.Well.length` to get the length of a given well in mm. Length is d .. code-block:: python :substitutions: - plate = protocol.load_labware('nest_12_reservoir_15ml', 'D1') - length = plate['A1'].length # 8.2 + plate = protocol.load_labware("nest_12_reservoir_15ml", "D1") + length = plate["A1"].length # 8.2 Width @@ -361,8 +368,8 @@ Use :py:attr:`.Well.width` to get the width of a given well in mm. Width is defi .. code-block:: python :substitutions: - plate = protocol.load_labware('nest_12_reservoir_15ml', 'D1') - width = plate['A1'].width # 71.2 + plate = protocol.load_labware("nest_12_reservoir_15ml", "D1") + width = plate["A1"].width # 71.2 .. versionadded:: 2.9 diff --git a/api/docs/v2/new_modules.rst b/api/docs/v2/new_modules.rst index 5bd9912213f..956a2bc7989 100644 --- a/api/docs/v2/new_modules.rst +++ b/api/docs/v2/new_modules.rst @@ -33,5 +33,5 @@ Pages in this section of the documentation cover: .. note:: - Throughout these pages, most code examples use coordinate deck slot locations (e.g. ``'D1'``, ``'D2'``), like those found on Flex. If you have an OT-2 and are using API version 2.14 or earlier, replace the coordinate with its numeric OT-2 equivalent. For example, slot D1 on Flex corresponds to slot 1 on an OT-2. See :ref:`deck-slots` for more information. + Throughout these pages, most code examples use coordinate deck slot locations (e.g. ``"D1"``, ``"D2"``), like those found on Flex. If you have an OT-2 and are using API version 2.14 or earlier, replace the coordinate with its numeric OT-2 equivalent. For example, slot D1 on Flex corresponds to slot 1 on an OT-2. See :ref:`deck-slots` for more information. diff --git a/api/docs/v2/new_pipette.rst b/api/docs/v2/new_pipette.rst index e6a151ee4e3..dfeee1ed169 100644 --- a/api/docs/v2/new_pipette.rst +++ b/api/docs/v2/new_pipette.rst @@ -2,443 +2,27 @@ .. _new-pipette: -######## +******** Pipettes -######## +******** -When writing a protocol, you must inform the Protocol API about the pipettes you will be using on your robot. The :py:meth:`.ProtocolContext.load_instrument` function provides this information and returns an :py:class:`.InstrumentContext` object. - -For information about liquid handling, see :ref:`v2-atomic-commands` and :ref:`v2-complex-commands`. - -.. _new-create-pipette: - -Loading Pipettes -================ - -As noted above, you call the :py:meth:`~.ProtocolContext.load_instrument` method to load a pipette. This method also requires the :ref:`pipette's API load name `, its left or right mount position, and (optionally) a list of associated tip racks. Even if you don't use the pipette anywhere else in your protocol, the Opentrons App and the robot won't let you start the protocol run until all pipettes loaded by ``load_instrument()`` are attached properly. - -Loading Flex 1- and 8-Channel Pipettes --------------------------------------- - -This code sample loads a Flex 1-Channel Pipette in the left mount and a Flex 8-Channel Pipette in the right mount. Both pipettes are 1000 µL. Each pipette uses its own 1000 µL tip rack. - -.. code-block:: Python - :substitutions: - - from opentrons import protocol_api - - requirements = {'robotType': 'Flex', 'apiLevel':'|apiLevel|'} - - def run(protocol: protocol_api.ProtocolContext): - tiprack1 = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_1000ul', location='D1') - tiprack2 = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_1000ul', location='C1') - left = protocol.load_instrument( - instrument_name='flex_1channel_1000', - mount='left', - tip_racks=[tiprack1]) - right = protocol.load_instrument( - instrument_name='flex_8channel_1000', - mount='right', - tip_racks=[tiprack2]) - -If you're writing a protocol that uses the Flex Gripper, you might think that this would be the place in your protocol to declare that. However, the gripper doesn't require ``load_instrument``! Whether your gripper requires a protocol is determined by the presence of :py:meth:`.ProtocolContext.move_labware` commands. See :ref:`moving-labware` for more details. - -Loading a Flex 96-Channel Pipette ---------------------------------- - -This code sample loads the Flex 96-Channel Pipette. Because of its size, the Flex 96-Channel Pipette requires the left *and* right pipette mounts. You cannot use this pipette with 1- or 8-Channel Pipette in the same protocol or when these instruments are attached to the robot. To load the 96-Channel Pipette, specify its position as ``mount='left'`` as shown here: - -.. code-block:: python - - def run(protocol: protocol_api.ProtocolContext): - left = protocol.load_instrument( - instrument_name='flex_96channel_1000', mount='left') - -.. versionadded:: 2.15 - -Loading OT-2 Pipettes ---------------------- - -This code sample loads a P1000 Single-Channel GEN2 pipette in the left mount and a P300 Single-Channel GEN2 pipette in the right mount. Each pipette uses its own 1000 µL tip rack. - -.. code-block:: python - :substitutions: - - from opentrons import protocol_api - - metadata = {'apiLevel': '2.14'} - - def run(protocol: protocol_api.ProtocolContext): - tiprack1 = protocol.load_labware( - load_name='opentrons_96_tiprack_1000ul', location=1) - tiprack2 = protocol.load_labware( - load_name='opentrons_96_tiprack_1000ul', location=2) - left = protocol.load_instrument( - instrument_name='p1000_single_gen2', - mount='left', - tip_racks=[tiprack1]) - right = protocol.load_instrument( - instrument_name='p300_multi_gen2', - mount='right', - tip_racks=[tiprack1]) - -.. versionadded:: 2.0 - -.. _new-multichannel-pipettes: - -Multi-Channel Pipettes -====================== - -All building block and advanced commands work with single- and multi-channel pipettes. - -To keep the interface to the Opentrons API consistent between single- and multi-channel pipettes, commands treat the *backmost channel* (furthest from the door) of a multi-channel pipette as the location of the pipette. Location arguments to building block and advanced commands are specified for the backmost channel. - -Also, this means that offset changes (such as :py:meth:`.Well.top` or :py:meth:`.Well.bottom`) can be applied to the single specified well, and each pipette channel will be at the same position relative to the well that it is over. - -Finally, because there is only one motor in a multi-channel pipette, these pipettes always aspirate and dispense on all channels simultaneously. - -8-Channel, 96-Well Plate Example --------------------------------- - -To demonstrate these concepts, let's write a protocol that uses a Flex 8-Channel Pipette and a 96-well plate. We'll then aspirate and dispense a liquid to different locations on the same well plate. To start, let's load a pipette in the right mount and add our labware. - -.. code-block:: python - :substitutions: - - from opentrons import protocol_api - - requirements = {'robotType': 'Flex', 'apiLevel':'|apiLevel|'} - - def run(protocol: protocol_api.ProtocolContext): - # Load a tiprack for 1000 µL tips - tiprack1 = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_1000ul', location='D1') - # Load a 96-well plate - plate = protocol.load_labware( - load_name='corning_96_wellplate_360ul_flat', location='C1') - # Load an 8-channel pipette on the right mount - right = protocol.load_instrument( - instrument_name='flex_8channel_1000', - mount='right', - tip_racks=[tiprack1]) - -After loading our instruments and labware, let's tell the robot to pick up a pipette tip from location ``A1`` in ``tiprack1``:: - - right.pick_up_tip() - -With the backmost pipette channel above location A1 on the tip rack, all eight channels are above the eight tip rack wells in column 1. - -After picking up a tip, let's tell the robot to aspirate 300 µL from the well plate at location ``A2``:: - - right.aspirate(volume=300, location=plate['A2']) - -With the backmost pipette tip above location A2 on the well plate, all eight channels are above the eight wells in column 2. - -Finally, let's tell the robot to dispense 300 µL into the well plate at location ``A3``:: - - right.dispense(volume=300, location=plate['A3'].top()) - -With the backmost pipette tip above location A3, all eight channels are above the eight wells in column 3. The pipette will dispense liquid into all the wells simultaneously. - -8-Channel, 384-Well Plate Example ---------------------------------- - -In general, you should specify wells in the first row of a well plate when using multi-channel pipettes. An exception to this rule is when using 384-well plates. The greater well density means the nozzles of a multi-channel pipette can only access every other well in a column. Specifying well A1 accesses every other well starting with the first (rows A, C, E, G, I, K, M, and O). Similarly, specifying well B1 also accesses every other well, but starts with the second (rows B, D, F, H, J, L, N, and P). - -To demonstrate these concepts, let's write a protocol that uses a Flex 8-Channel Pipette and a 384-well plate. We'll then aspirate and dispense a liquid to different locations on the same well plate. To start, let's load a pipette in the right mount and add our labware. - -.. code-block:: python - - def run(protocol: protocol_api.ProtocolContext): - # Load a tiprack for 200 µL tips - tiprack1 = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_200ul', location="D1") - # Load a well plate - plate = protocol.load_labware( - load_name='corning_384_wellplate_112ul_flat', location="D2") - # Load an 8-channel pipette on the right mount - right = protocol.load_instrument( - instrument_name='flex_8channel_1000', - mount='right', - tip_racks=[tiprack1]) - - -After loading our instruments and labware, let's tell the robot to pick up a pipette tip from location ``A1`` in ``tiprack1``:: - - right.pick_up_tip() - -With the backmost pipette channel above location A1 on the tip rack, all eight channels are above the eight tip rack wells in column 1. - -After picking up a tip, let's tell the robot to aspirate 100 µL from the well plate at location ``A1``:: - - right.aspirate(volume=100, location=plate['A1']) - -The eight pipette channels will only aspirate from every other well in the column: A1, C1, E1, G1, I1, K1, M1, and O1. - -Finally, let's tell the robot to dispense 100 µL into the well plate at location ``B1``:: - - right.dispense(volume=100, location=plate['B1']) - -The eight pipette channels will only dispense into every other well in the column: B1, D1, F1, H1, J1, L1, N1, and P1. - -.. _pipette-tip-racks: - -Adding Tip Racks -================ - -The ``load_instrument()`` method includes the optional argument ``tip_racks``. This parameter accepts a list of tip rack labware objects, which lets you to specify as many tip racks as you want. The advantage of using ``tip_racks`` is twofold. First, associating tip racks with your pipette allows for automatic tip tracking throughout your protocol. Second, it removes the need to specify tip locations in the :py:meth:`.InstrumentContext.pick_up_tip` method. For example, let's start by loading loading some labware and instruments like this:: - - def run(protocol: protocol_api.ProtocolContext): - tiprack_left = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_200ul', location='D1') - tiprack_right = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_200ul', location='D2') - left_pipette = protocol.load_instrument( - instrument_name='flex_8channel_1000', mount='left') - right_pipette = protocol.load_instrument( - instrument_name='flex_8channel_1000', - mount='right', - tip_racks=[tiprack_right]) - -Let's pick up a tip with the left pipette. We need to specify the location as an argument of ``pick_up_tip()``, since we loaded the left pipette without a ``tip_racks`` argument. - -.. code-block:: python - - left_pipette.pick_up_tip(tiprack_left['A1']) - left_pipette.drop_tip() - -But now you have to specify ``tiprack_left`` every time you call ``pick_up_tip``, which means you're doing all your own tip tracking:: - - left_pipette.pick_up_tip(tiprack_left['A2']) - left_pipette.drop_tip() - left_pipette.pick_up_tip(tiprack_left['A3']) - left_pipette.drop_tip() - -However, because you specified a tip rack location for the right pipette, the robot will automatically pick up from location ``A1`` of its associated tiprack:: +.. toctree:: + pipettes/loading + pipettes/characteristics + pipettes/partial_tip_pickup + pipettes/volume_modes - right_pipette.pick_up_tip() - right_pipette.drop_tip() - -Additional calls to ``pick_up_tip`` will automatically progress through the tips in the right rack:: - - right_pipette.pick_up_tip() # picks up from A2 - right_pipette.drop_tip() - right_pipette.pick_up_tip() # picks up from A3 - right_pipette.drop_tip() - -See also, :ref:`v2-atomic-commands` and :ref:`v2-complex-commands`. - -.. versionadded:: 2.0 - -.. _new-pipette-models: - -API Load Names -============== - -The pipette's API load name (``instrument_name``) is the first parameter of the ``load_instrument()`` method. It tells your robot which attached pipette you're going to use in a protocol. The tables below list the API load names for the currently available Flex and OT-2 pipettes. - -.. tabs:: - - .. tab:: Flex Pipettes - - +-------------------------+---------------+-------------------------+ - | Pipette Model | Volume (µL) | API Load Name | - +=========================+===============+===+=====================+ - | Flex 1-Channel Pipette | 1–50 | ``flex_1channel_50`` | - + +---------------+-------------------------+ - | | 5–1000 | ``flex_1channel_1000`` | - +-------------------------+---------------+-------------------------+ - | Flex 8-Channel Pipette | 1–50 | ``flex_8channel_50`` | - + +---------------+-------------------------+ - | | 5–1000 | ``flex_8channel_1000`` | - +-------------------------+---------------+-------------------------+ - | Flex 96-Channel Pipette | 5–1000 | ``flex_96channel_1000`` | - +-------------------------+---------------+-------------------------+ - - .. tab:: OT-2 Pipettes - - +-----------------------------+--------------------+-----------------------+ - | Pipette Model | Volume (µL) | API Load Name | - +=============================+====================+=======================+ - | P20 Single-Channel GEN2 | 1-20 | ``p20_single_gen2`` | - +-----------------------------+ +-----------------------+ - | P20 Multi-Channel GEN2 | | ``p20_multi_gen2`` | - +-----------------------------+--------------------+-----------------------+ - | P300 Single-Channel GEN2 | 20-300 | ``p300_single_gen2`` | - +-----------------------------+ +-----------------------+ - | P300 Multi-Channel GEN2 | | ``p300_multi_gen2`` | - +-----------------------------+--------------------+-----------------------+ - | P1000 Single-Channel GEN2 | 100-1000 | ``p1000_single_gen2`` | - +-----------------------------+--------------------+-----------------------+ - - See the OT-2 Pipette Generations section below if you're using GEN1 pipettes on an OT-2. The GEN1 family includes the P10, P50, and P300 single- and multi-channel pipettes, along with the P1000 single-chanel model. - - -OT-2 Pipette Generations -======================== - -The OT-2 works with the GEN1 and GEN2 pipette models. The newer GEN2 pipettes have different volume ranges than the older GEN1 pipettes. With some exceptions, the volume ranges for GEN2 pipettes overlap those used by the GEN1 models. If your protocol specifies a GEN1 pipette, but you have a GEN2 pipette with a compatible volume range, you can still run your protocol. The OT-2 will consider the GEN2 pipette to have the same minimum volume as the GEN1 pipette. The following table lists the volume compatibility between the GEN2 and GEN1 pipettes. - -.. list-table:: - :header-rows: 1 - - * - GEN2 Pipette - - GEN1 Pipette - - GEN1 Volume - * - P20 Single-Channel GEN2 - - P10 Single-Channel GEN1 - - 1-10 µL - * - P20 Multi-Channel GEN2 - - P10 Multi-Channel GEN1 - - 1-10 µL - * - P300 Single-Channel GEN2 - - P300 Single-Channel GEN1 - - 30-300 µL - * - P300 Multi-Channel GEN2 - - P300 Multi-Channel GEN1 - - 20-200 µL - * - P1000 Single-Channel GEN2 - - P1000 Single-Channel GEN1 - - 100-1000 µL - -The single- and multi-channel P50 GEN1 pipettes are the exceptions here. If your protocol uses a P50 GEN1 pipette, there is no backward compatibility with a related GEN2 pipette. To replace a P50 GEN1 with a corresponding GEN2 pipette, edit your protocol to load a P20 Single-Channel GEN2 (for volumes below 20 µL) or a P300 Single-Channel GEN2 (for volumes between 20 and 50 µL). - -.. _pipette-volume-modes: +Opentrons pipettes are configurable devices used to move liquids throughout the working area during the execution of protocols. Flex and OT-2 each have their own pipettes, which are available for use in the Python API. -Volume Modes -============ +Pages in this section of the documentation cover: -The Flex 1-Channel 50 µL and Flex 8-Channel 50 µL pipettes must operate in a low-volume mode to accurately dispense 1 µL of liquid. Set low-volume mode by calling :py:meth:`.InstrumentContext.configure_for_volume` with the amount of liquid you plan to aspirate, in µL:: + - :ref:`Loading pipettes ` into your protocol. + - :ref:`Pipette characteristics `, such as how fast they can move liquid and how they move around the deck. + - The :ref:`partial tip pickup ` configuration for the Flex 96-Channel Pipette, which uses only 8 channels for pipetting. Full and partial tip pickup can be combined in a single protocol. + - The :ref:`volume modes ` of Flex 50 µL pipettes, which must operate in low-volume mode to accurately dispense very small volumes of liquid. - pipette50.configure_for_volume(1) - pipette50.pick_up_tip() - pipette50.aspirate(1, plate["A1"]) - -.. versionadded:: 2.15 - -.. note:: - The pipette must not contain liquid when you call ``configure_for_volume()``, or the API will raise an error. - - Also, if the pipette is in a well location that may contain liquid, it will move upward to ensure it is not immersed in liquid before changing its mode. - -In a protocol that handles many different volumes, it's a good practice to call this function immediately before each :py:meth:`.transfer` or :py:meth:`.aspirate`, specifying the volume that you are about to handle. When operating with a list of volumes, nest ``configure_for_volume()`` inside a ``for`` loop to ensure that the pipette is properly configured for each volume: - -.. code-block:: python - - volumes = [1, 2, 3, 4, 1, 5, 2, 8] - sources = plate.columns()[0] - destinations = plate.columns()[1] - for i in range(8): - pipette50.pick_up_tip() - pipette50.configure_for_volume(volumes[i]) - pipette50.aspirate(volume=volumes[i], location=sources[i]) - pipette50.dispense(location=destinations[i]) - pipette50.drop_tip() - -If you know that all your liquid handling will take place in a specific mode, then you can call ``configure_for_volume()`` just once with a nominal volume. Or if all the volumes correspond to the pipette's default mode, you don't have to call ``configure_for_volume()`` at all. - - -.. _new-plunger-flow-rates: - -Pipette Flow Rates -================== - -Measured in µL/s, the flow rate determines how much liquid a pipette can aspirate, dispense, and blow-out. Opentrons pipettes have their own default flow rates. The API lets you change the flow rate on a loaded :py:class:`.InstrumentContext` by altering the :py:obj:`.InstrumentContext.flow_rate` properties listed below. - -* Aspirate: ``InstrumentContext.flow_rate.aspirate`` -* Dispense: ``InstrumentContext.flow_rate.dispense`` -* Blow-out: ``InstrumentContext.flow_rate.blow_out`` - -These flow rate properties operate independently. This means you can specify different flow rates for each property within the same protocol. For example, let's load a simple protocol and set different flow rates for the attached pipette. - -.. code-block:: python - - def run(protocol: protocol_api.ProtocolContext): - tiprack1 = protocol.load_labware( - load_name='opentrons_flex_96_tiprack_1000ul', location='D1') - pipette = protocol.load_instrument( - instrument_name='flex_1channel_1000', - mount='left', - tip_racks=[tiprack1]) - plate = protocol.load_labware( - load_name='corning_96_wellplate_360ul_flat', location='D3') - pipette.pick_up_tip() - -Let's tell the robot to aspirate, dispense, and blow out the liquid using default flow rates. Notice how you don't need to specify a ``flow_rate`` attribute to use the defaults:: - - pipette.aspirate(200, plate['A1']) # 160 µL/s - pipette.dispense(200, plate['A2']) # 160 µL/s - pipette.blow_out() # 80 µL/s - -Now let's change the flow rates for each action:: - - pipette.flow_rate.aspirate = 50 - pipette.flow_rate.dispense = 100 - pipette.flow_rate.blow_out = 75 - pipette.aspirate(200, plate['A1']) # 50 µL/s - pipette.dispense(200, plate['A2']) # 100 µL/s - pipette.blow_out() # 75 µL/s - -These flow rates will remain in effect until you change the ``flow_rate`` attribute again *or* call ``configure_for_volume()``. Calling ``configure_for_volume()`` always resets all pipette flow rates to the defaults for the mode that it sets. - -.. TODO add mode ranges and flow defaults to sections below - -.. note:: - In API version 2.13 and earlier, :py:obj:`.InstrumentContext.speed` offered similar functionality to ``.flow_rate``. It attempted to set the plunger speed in mm/s. Due to technical limitations, that speed could only be approximate. You must use ``.flow_rate`` in version 2.14 and later, and you should consider replacing older code that sets ``.speed``. - -.. versionadded:: 2.0 - - -Flex Pipette Flow Rates ------------------------ - -The following table provides data on the default aspirate, dispense, and blow-out flow rates (in µL/s) for Flex pipettes. - -+-------------------------------+-----------------+-----------------+-----------------+ -| Pipette Models | Aspirate (µL/s) | Dispense (µL/s) | Blow-out (µL/s) | -+===============================+=================+=================+=================+ -| | **Flex 50 µL pipettes** | 8 | 8 | 4 | -| | 1- and 8-channel | | | | -+-------------------------------+-----------------+-----------------+-----------------+ -| | **Flex 1000 µL pipettes** | 160 | 160 | 80 | -| | 1-, 8-, and 96-channel | | | | -+-------------------------------+-----------------+-----------------+-----------------+ - -Additionally, all Flex pipettes have a well bottom clearance of 1 mm for aspirate and dispense actions. +For information about liquid handling, see :ref:`v2-atomic-commands` and :ref:`v2-complex-commands`. -OT-2 Pipette Flow Rates ------------------------ -The following table provides data on the default aspirate, dispense, and blow-out flow rates (in µL/s) for OT-2 GEN2 pipettes. Because the flow rates are the same across all three actions, we've consolidated the data into the "Flow Rates" column. -.. list-table:: - :header-rows: 1 - * - Pipette Model - - Volume (µL) - - Flow Rates (µL/s) - * - P20 Single-Channel GEN2 - - 1-20 - - - * API v2.6 or higher: 7.56 - * API v2.5 or lower: 3.78 - * - P300 Single-Channel GEN2 - - 20-300 - - - * API v2.6 or higher: 92.86 - * API v2.5 or lower: 46.43 - * - P1000 Single-Channel GEN2 - - 100-1000 - - - * API v2.6 or higher: 274.7 - * API v2.5 or lower: 137.35 - * - P20 Multi-Channel GEN2 - - 1-20 - - 7.6 - * - P300 Multi-Channel GEN2 - - 20-300 - - 94 - -Additionally, all OT-2 GEN2 pipettes have a default head speed of 400 mm/s and a well bottom clearance of 1 mm for aspirate and dispense actions. diff --git a/api/docs/v2/new_protocol_api.rst b/api/docs/v2/new_protocol_api.rst index f6e35f6653b..acba9e8c2ce 100644 --- a/api/docs/v2/new_protocol_api.rst +++ b/api/docs/v2/new_protocol_api.rst @@ -2,41 +2,55 @@ .. _protocol-api-reference: +*********************** API Version 2 Reference -======================= +*********************** .. _protocol_api-protocols-and-instruments: -Protocols and Instruments -------------------------- +Protocols +========= .. module:: opentrons.protocol_api .. autoclass:: opentrons.protocol_api.ProtocolContext :members: :exclude-members: location_cache, cleanup, clear_commands +Instruments +=========== .. autoclass:: opentrons.protocol_api.InstrumentContext :members: :exclude-members: delay -.. autoclass:: opentrons.protocol_api.Liquid - .. _protocol-api-labware: -Labware and Wells ------------------ +Labware +======= .. autoclass:: opentrons.protocol_api.Labware :members: :exclude-members: next_tip, use_tips, previous_tip, return_tips +.. + The trailing ()s at the end of TrashBin and WasteChute here hide the __init__() + signatures, since users should never construct these directly. + +.. autoclass:: opentrons.protocol_api.TrashBin() + +.. autoclass:: opentrons.protocol_api.WasteChute() + + +Wells and Liquids +================= .. autoclass:: opentrons.protocol_api.Well :members: :exclude-members: geometry +.. autoclass:: opentrons.protocol_api.Liquid + .. _protocol-api-modules: Modules -------- +======= .. autoclass:: opentrons.protocol_api.HeaterShakerContext :members: @@ -66,8 +80,8 @@ Modules .. _protocol-api-types: -Useful Types and Definitions ----------------------------- +Useful Types +============ .. The opentrons.types module contains a mixture of public Protocol API things and private internal things. @@ -80,7 +94,7 @@ Useful Types and Definitions :no-value: Executing and Simulating Protocols ----------------------------------- +================================== .. automodule:: opentrons.execute :members: diff --git a/api/docs/v2/pipettes/characteristics.rst b/api/docs/v2/pipettes/characteristics.rst new file mode 100644 index 00000000000..a91f58d55e2 --- /dev/null +++ b/api/docs/v2/pipettes/characteristics.rst @@ -0,0 +1,278 @@ +:og:description: Details on Opentrons pipette movement and flow rates. + +.. _pipette-characteristics: + +*********************** +Pipette Characteristics +*********************** + +Each Opentrons pipette has different capabilities, which you'll want to take advantage of in your protocols. This page covers some fundamental pipette characteristics. + +:ref:`new-multichannel-pipettes` gives examples of how multi-channel pipettes move around the deck by using just one of their channels as a reference point. Taking this into account is important for commanding your pipettes to perform actions in the correct locations. + +:ref:`new-plunger-flow-rates` discusses how quickly each type of pipette can handle liquids. The defaults are designed to operate quickly, based on the pipette's hardware and assuming that you're handling aqueous liquids. You can speed up or slow down a pipette's flow rate to suit your protocol's needs. + +Finally, the volume ranges of pipettes affect what you can do with them. The volume ranges for current pipettes are listed on the :ref:`Loading Pipettes ` page. The :ref:`ot2-pipette-generations` section of this page describes how the API behaves when running protocols that specify older OT-2 pipettes. + +.. _new-multichannel-pipettes: + +Multi-Channel Movement +====================== + +All :ref:`building block ` and :ref:`complex commands ` work with single- and multi-channel pipettes. + +To keep the protocol API consistent when using single- and multi-channel pipettes, commands treat the back left channel of a multi-channel pipette as its *primary channel*. Location arguments of pipetting commands use the primary channel. The :py:meth:`.InstrumentContext.configure_nozzle_layout` method can change the pipette's primary channel, using its ``start`` parameter. See :ref:`partial-tip-pickup` for more information. + +With a pipette's default settings, you can generally access the wells indicated in the table below. Moving to any other well may cause the pipette to crash. + +.. list-table:: + :header-rows: 1 + + * - Channels + - 96-well plate + - 384-well plate + * - 1 + - Any well, A1–H12 + - Any well, A1–P24 + * - 8 + - A1–A12 + - A1–B24 + * - 96 + - A1 only + - A1–B2 + +Also, you should apply any location offset, such as :py:meth:`.Well.top` or :py:meth:`.Well.bottom`, to the well accessed by the primary channel. Since all of the pipette's channels move together, each channel will have the same offset relative to the well that it is over. + +Finally, because each multi-channel pipette has only one motor, they always aspirate and dispense on all channels simultaneously. + +8-Channel, 96-Well Plate Example +-------------------------------- + +To demonstrate these concepts, let's write a protocol that uses a Flex 8-Channel Pipette and a 96-well plate. We'll then aspirate and dispense a liquid to different locations on the same well plate. To start, let's load a pipette in the right mount and add our labware. + +.. code-block:: python + :substitutions: + + from opentrons import protocol_api + + requirements = {"robotType": "Flex", "apiLevel":"|apiLevel|"} + + def run(protocol: protocol_api.ProtocolContext): + # Load a tiprack for 1000 µL tips + tiprack1 = protocol.load_labware( + load_name="opentrons_flex_96_tiprack_1000ul", location="D1") + # Load a 96-well plate + plate = protocol.load_labware( + load_name="corning_96_wellplate_360ul_flat", location="C1") + # Load an 8-channel pipette on the right mount + right = protocol.load_instrument( + instrument_name="flex_8channel_1000", + mount="right", + tip_racks=[tiprack1]) + +After loading our instruments and labware, let's tell the robot to pick up a pipette tip from location ``A1`` in ``tiprack1``:: + + right.pick_up_tip() + +With the backmost pipette channel above location A1 on the tip rack, all eight channels are above the eight tip rack wells in column 1. + +After picking up a tip, let's tell the robot to aspirate 300 µL from the well plate at location ``A2``:: + + right.aspirate(volume=300, location=plate["A2"]) + +With the backmost pipette tip above location A2 on the well plate, all eight channels are above the eight wells in column 2. + +Finally, let's tell the robot to dispense 300 µL into the well plate at location ``A3``:: + + right.dispense(volume=300, location=plate["A3"].top()) + +With the backmost pipette tip above location A3, all eight channels are above the eight wells in column 3. The pipette will dispense liquid into all the wells simultaneously. + +8-Channel, 384-Well Plate Example +--------------------------------- + +In general, you should specify wells in the first row of a well plate when using multi-channel pipettes. An exception to this rule is when using 384-well plates. The greater well density means the nozzles of a multi-channel pipette can only access every other well in a column. Specifying well A1 accesses every other well starting with the first (rows A, C, E, G, I, K, M, and O). Similarly, specifying well B1 also accesses every other well, but starts with the second (rows B, D, F, H, J, L, N, and P). + +To demonstrate these concepts, let's write a protocol that uses a Flex 8-Channel Pipette and a 384-well plate. We'll then aspirate and dispense a liquid to different locations on the same well plate. To start, let's load a pipette in the right mount and add our labware. + +.. code-block:: python + + def run(protocol: protocol_api.ProtocolContext): + # Load a tiprack for 200 µL tips + tiprack1 = protocol.load_labware( + load_name="opentrons_flex_96_tiprack_200ul", location="D1") + # Load a well plate + plate = protocol.load_labware( + load_name="corning_384_wellplate_112ul_flat", location="D2") + # Load an 8-channel pipette on the right mount + right = protocol.load_instrument( + instrument_name="flex_8channel_1000", + mount="right", + tip_racks=[tiprack1]) + + +After loading our instruments and labware, let's tell the robot to pick up a pipette tip from location ``A1`` in ``tiprack1``:: + + right.pick_up_tip() + +With the backmost pipette channel above location A1 on the tip rack, all eight channels are above the eight tip rack wells in column 1. + +After picking up a tip, let's tell the robot to aspirate 100 µL from the well plate at location ``A1``:: + + right.aspirate(volume=100, location=plate["A1"]) + +The eight pipette channels will only aspirate from every other well in the column: A1, C1, E1, G1, I1, K1, M1, and O1. + +Finally, let's tell the robot to dispense 100 µL into the well plate at location ``B1``:: + + right.dispense(volume=100, location=plate["B1"]) + +The eight pipette channels will only dispense into every other well in the column: B1, D1, F1, H1, J1, L1, N1, and P1. + + +.. _new-plunger-flow-rates: + +Pipette Flow Rates +================== + +Measured in µL/s, the flow rate determines how much liquid a pipette can aspirate, dispense, and blow out. Opentrons pipettes have their own default flow rates. The API lets you change the flow rate on a loaded :py:class:`.InstrumentContext` by altering the :py:obj:`.InstrumentContext.flow_rate` properties listed below. + +* Aspirate: ``InstrumentContext.flow_rate.aspirate`` +* Dispense: ``InstrumentContext.flow_rate.dispense`` +* Blow out: ``InstrumentContext.flow_rate.blow_out`` + +These flow rate properties operate independently. This means you can specify different flow rates for each property within the same protocol. For example, let's load a simple protocol and set different flow rates for the attached pipette. + +.. code-block:: python + + def run(protocol: protocol_api.ProtocolContext): + tiprack1 = protocol.load_labware( + load_name="opentrons_flex_96_tiprack_1000ul", location="D1") + pipette = protocol.load_instrument( + instrument_name="flex_1channel_1000", + mount="left", + tip_racks=[tiprack1]) + plate = protocol.load_labware( + load_name="corning_96_wellplate_360ul_flat", location="D3") + pipette.pick_up_tip() + +Let's tell the robot to aspirate, dispense, and blow out the liquid using default flow rates. Notice how you don't need to specify a ``flow_rate`` attribute to use the defaults:: + + pipette.aspirate(200, plate["A1"]) # 160 µL/s + pipette.dispense(200, plate["A2"]) # 160 µL/s + pipette.blow_out() # 80 µL/s + +Now let's change the flow rates for each action:: + + pipette.flow_rate.aspirate = 50 + pipette.flow_rate.dispense = 100 + pipette.flow_rate.blow_out = 75 + pipette.aspirate(200, plate["A1"]) # 50 µL/s + pipette.dispense(200, plate["A2"]) # 100 µL/s + pipette.blow_out() # 75 µL/s + +These flow rates will remain in effect until you change the ``flow_rate`` attribute again *or* call ``configure_for_volume()``. Calling ``configure_for_volume()`` always resets all pipette flow rates to the defaults for the mode that it sets. + +.. TODO add mode ranges and flow defaults to sections below + +.. note:: + In API version 2.13 and earlier, :py:obj:`.InstrumentContext.speed` offered similar functionality to ``.flow_rate``. It attempted to set the plunger speed in mm/s. Due to technical limitations, that speed could only be approximate. You must use ``.flow_rate`` in version 2.14 and later, and you should consider replacing older code that sets ``.speed``. + +.. versionadded:: 2.0 + + +Flex Pipette Flow Rates +----------------------- + +The default flow rates for Flex pipettes depend on the maximum volume of the pipette and the capacity of the currently attached tip. For each pipette–tip configuration, the default flow rate is the same for aspirate, dispense, and blowout actions. + +.. list-table:: + :header-rows: 1 + + * - Pipette Model + - Tip Capacity (µL) + - Flow Rate (µL/s) + * - 50 µL (1- and 8-channel) + - All capacities + - 57 + * - 1000 µL (1-, 8-, and 96-channel) + - 50 + - 478 + * - 1000 µL (1-, 8-, and 96-channel) + - 200 + - 716 + * - 1000 µL (1-, 8-, and 96-channel) + - 1000 + - 716 + + +Additionally, all Flex pipettes have a well bottom clearance of 1 mm for aspirate and dispense actions. + +.. _ot2-flow-rates: + +OT-2 Pipette Flow Rates +----------------------- + +The following table provides data on the default aspirate, dispense, and blowout flow rates (in µL/s) for OT-2 GEN2 pipettes. Default flow rates are the same across all three actions. + +.. list-table:: + :header-rows: 1 + + * - Pipette Model + - Volume (µL) + - Flow Rates (µL/s) + * - P20 Single-Channel GEN2 + - 1–20 + - + * API v2.6 or higher: 7.56 + * API v2.5 or lower: 3.78 + * - P300 Single-Channel GEN2 + - 20–300 + - + * API v2.6 or higher: 92.86 + * API v2.5 or lower: 46.43 + * - P1000 Single-Channel GEN2 + - 100–1000 + - + * API v2.6 or higher: 274.7 + * API v2.5 or lower: 137.35 + * - P20 Multi-Channel GEN2 + - 1–20 + - 7.6 + * - P300 Multi-Channel GEN2 + - 20–300 + - 94 + +Additionally, all OT-2 GEN2 pipettes have a default head speed of 400 mm/s and a well bottom clearance of 1 mm for aspirate and dispense actions. + +.. _ot2-pipette-generations: + +OT-2 Pipette Generations +======================== + +The OT-2 works with the GEN1 and GEN2 pipette models. The newer GEN2 pipettes have different volume ranges than the older GEN1 pipettes. With some exceptions, the volume ranges for GEN2 pipettes overlap those used by the GEN1 models. If your protocol specifies a GEN1 pipette, but you have a GEN2 pipette with a compatible volume range, you can still run your protocol. The OT-2 will consider the GEN2 pipette to have the same minimum volume as the GEN1 pipette. The following table lists the volume compatibility between the GEN2 and GEN1 pipettes. + +.. list-table:: + :header-rows: 1 + + * - GEN2 Pipette + - GEN1 Pipette + - GEN1 Volume + * - P20 Single-Channel GEN2 + - P10 Single-Channel GEN1 + - 1-10 µL + * - P20 Multi-Channel GEN2 + - P10 Multi-Channel GEN1 + - 1-10 µL + * - P300 Single-Channel GEN2 + - P300 Single-Channel GEN1 + - 30-300 µL + * - P300 Multi-Channel GEN2 + - P300 Multi-Channel GEN1 + - 20-200 µL + * - P1000 Single-Channel GEN2 + - P1000 Single-Channel GEN1 + - 100-1000 µL + +The single- and multi-channel P50 GEN1 pipettes are the exceptions here. If your protocol uses a P50 GEN1 pipette, there is no backward compatibility with a related GEN2 pipette. To replace a P50 GEN1 with a corresponding GEN2 pipette, edit your protocol to load a P20 Single-Channel GEN2 (for volumes below 20 µL) or a P300 Single-Channel GEN2 (for volumes between 20 and 50 µL). + diff --git a/api/docs/v2/pipettes/loading.rst b/api/docs/v2/pipettes/loading.rst new file mode 100644 index 00000000000..72a13ce3409 --- /dev/null +++ b/api/docs/v2/pipettes/loading.rst @@ -0,0 +1,217 @@ +:og:description: How to load Opentrons pipettes and add tip racks to them in a Python protocol. + +.. _new-create-pipette: +.. _loading-pipettes: + +**************** +Loading Pipettes +**************** + +When writing a protocol, you must inform the Protocol API about the pipettes you will be using on your robot. The :py:meth:`.ProtocolContext.load_instrument` function provides this information and returns an :py:class:`.InstrumentContext` object. + +As noted above, you call the :py:meth:`~.ProtocolContext.load_instrument` method to load a pipette. This method also requires the :ref:`pipette's API load name `, its left or right mount position, and (optionally) a list of associated tip racks. Even if you don't use the pipette anywhere else in your protocol, the Opentrons App and the robot won't let you start the protocol run until all pipettes loaded by ``load_instrument()`` are attached properly. + +.. _new-pipette-models: + +API Load Names +============== + +The pipette's API load name (``instrument_name``) is the first parameter of the ``load_instrument()`` method. It tells your robot which attached pipette you're going to use in a protocol. The tables below list the API load names for the currently available Flex and OT-2 pipettes. + +.. tabs:: + + .. tab:: Flex Pipettes + + +-------------------------+---------------+-------------------------+ + | Pipette Model | Volume (µL) | API Load Name | + +=========================+===============+===+=====================+ + | Flex 1-Channel Pipette | 1–50 | ``flex_1channel_50`` | + + +---------------+-------------------------+ + | | 5–1000 | ``flex_1channel_1000`` | + +-------------------------+---------------+-------------------------+ + | Flex 8-Channel Pipette | 1–50 | ``flex_8channel_50`` | + + +---------------+-------------------------+ + | | 5–1000 | ``flex_8channel_1000`` | + +-------------------------+---------------+-------------------------+ + | Flex 96-Channel Pipette | 5–1000 | ``flex_96channel_1000`` | + +-------------------------+---------------+-------------------------+ + + .. tab:: OT-2 Pipettes + + +-----------------------------+--------------------+-----------------------+ + | Pipette Model | Volume (µL) | API Load Name | + +=============================+====================+=======================+ + | P20 Single-Channel GEN2 | 1-20 | ``p20_single_gen2`` | + +-----------------------------+ +-----------------------+ + | P20 Multi-Channel GEN2 | | ``p20_multi_gen2`` | + +-----------------------------+--------------------+-----------------------+ + | P300 Single-Channel GEN2 | 20-300 | ``p300_single_gen2`` | + +-----------------------------+ +-----------------------+ + | P300 Multi-Channel GEN2 | | ``p300_multi_gen2`` | + +-----------------------------+--------------------+-----------------------+ + | P1000 Single-Channel GEN2 | 100-1000 | ``p1000_single_gen2`` | + +-----------------------------+--------------------+-----------------------+ + + See the :ref:`OT-2 Pipette Generations ` section if you're using GEN1 pipettes on an OT-2. The GEN1 family includes the P10, P50, and P300 single- and multi-channel pipettes, along with the P1000 single-channel model. + +Loading Flex 1- and 8-Channel Pipettes +====================================== + +This code sample loads a Flex 1-Channel Pipette in the left mount and a Flex 8-Channel Pipette in the right mount. Both pipettes are 1000 µL. Each pipette uses its own 1000 µL tip rack. + +.. code-block:: Python + :substitutions: + + from opentrons import protocol_api + + requirements = {"robotType": "Flex", "apiLevel":"|apiLevel|"} + + def run(protocol: protocol_api.ProtocolContext): + tiprack1 = protocol.load_labware( + load_name="opentrons_flex_96_tiprack_1000ul", location="D1") + tiprack2 = protocol.load_labware( + load_name="opentrons_flex_96_tiprack_1000ul", location="C1") + left = protocol.load_instrument( + instrument_name="flex_1channel_1000", + mount="left", + tip_racks=[tiprack1]) + right = protocol.load_instrument( + instrument_name="flex_8channel_1000", + mount="right", + tip_racks=[tiprack2]) + +If you're writing a protocol that uses the Flex Gripper, you might think that this would be the place in your protocol to declare that. However, the gripper doesn't require ``load_instrument``! Whether your gripper requires a protocol is determined by the presence of :py:meth:`.ProtocolContext.move_labware` commands. See :ref:`moving-labware` for more details. + +Loading a Flex 96-Channel Pipette +================================= + +This code sample loads the Flex 96-Channel Pipette. Because of its size, the Flex 96-Channel Pipette requires the left *and* right pipette mounts. You cannot use this pipette with 1- or 8-Channel Pipette in the same protocol or when these instruments are attached to the robot. Load the 96-channel pipette as follows: + +.. code-block:: python + + def run(protocol: protocol_api.ProtocolContext): + pipette = protocol.load_instrument( + instrument_name="flex_96channel_1000" + ) + +In protocols specifying API version 2.15, also include ``mount="left"`` as a parameter of ``load_instrument()``. + +.. versionadded:: 2.15 +.. versionchanged:: 2.16 + The ``mount`` parameter is optional. + +Loading OT-2 Pipettes +===================== + +This code sample loads a P1000 Single-Channel GEN2 pipette in the left mount and a P300 Single-Channel GEN2 pipette in the right mount. Each pipette uses its own 1000 µL tip rack. + +.. code-block:: python + :substitutions: + + from opentrons import protocol_api + + metadata = {"apiLevel": "|apiLevel|"} + + def run(protocol: protocol_api.ProtocolContext): + tiprack1 = protocol.load_labware( + load_name="opentrons_96_tiprack_1000ul", location=1) + tiprack2 = protocol.load_labware( + load_name="opentrons_96_tiprack_1000ul", location=2) + left = protocol.load_instrument( + instrument_name="p1000_single_gen2", + mount="left", + tip_racks=[tiprack1]) + right = protocol.load_instrument( + instrument_name="p300_multi_gen2", + mount="right", + tip_racks=[tiprack1]) + +.. versionadded:: 2.0 + +.. _pipette-tip-racks: + +Adding Tip Racks +================ + +The ``load_instrument()`` method includes the optional argument ``tip_racks``. This parameter accepts a list of tip rack labware objects, which lets you to specify as many tip racks as you want. You can also edit a pipette's tip racks after loading it by setting its :py:obj:`.InstrumentContext.tip_racks` property. + +.. note:: + Some methods, like :py:meth:`.configure_nozzle_layout`, reset a pipette's tip racks. See :ref:`partial-tip-pickup` for more information. + +The advantage of using ``tip_racks`` is twofold. First, associating tip racks with your pipette allows for automatic tip tracking throughout your protocol. Second, it removes the need to specify tip locations in the :py:meth:`.InstrumentContext.pick_up_tip` method. For example, let's start by loading loading some labware and instruments like this:: + + def run(protocol: protocol_api.ProtocolContext): + tiprack_left = protocol.load_labware( + load_name="opentrons_flex_96_tiprack_200ul", location="D1") + tiprack_right = protocol.load_labware( + load_name="opentrons_flex_96_tiprack_200ul", location="D2") + left_pipette = protocol.load_instrument( + instrument_name="flex_8channel_1000", mount="left") + right_pipette = protocol.load_instrument( + instrument_name="flex_8channel_1000", + mount="right", + tip_racks=[tiprack_right]) + +Let's pick up a tip with the left pipette. We need to specify the location as an argument of ``pick_up_tip()``, since we loaded the left pipette without a ``tip_racks`` argument. + +.. code-block:: python + + left_pipette.pick_up_tip(tiprack_left["A1"]) + left_pipette.drop_tip() + +But now you have to specify ``tiprack_left`` every time you call ``pick_up_tip``, which means you're doing all your own tip tracking:: + + left_pipette.pick_up_tip(tiprack_left["A2"]) + left_pipette.drop_tip() + left_pipette.pick_up_tip(tiprack_left["A3"]) + left_pipette.drop_tip() + +However, because you specified a tip rack location for the right pipette, the robot will automatically pick up from location ``A1`` of its associated tiprack:: + + right_pipette.pick_up_tip() + right_pipette.drop_tip() + +Additional calls to ``pick_up_tip`` will automatically progress through the tips in the right rack:: + + right_pipette.pick_up_tip() # picks up from A2 + right_pipette.drop_tip() + right_pipette.pick_up_tip() # picks up from A3 + right_pipette.drop_tip() + +.. versionadded:: 2.0 + +See also :ref:`v2-atomic-commands` and :ref:`v2-complex-commands`. + +.. _pipette-trash-containers: + +Adding Trash Containers +======================= + +The API automatically assigns a :py:obj:`.trash_container` to pipettes, if one is available in your protocol. The ``trash_container`` is where the pipette will dispose tips when you call :py:meth:`.drop_tip` with no arguments. You can change the trash container, if you don't want to use the default. + +One example of when you might want to change the trash container is a Flex protocol that goes through a lot of tips. In a case where the protocol uses two pipettes, you could load two trash bins and assign one to each pipette:: + + left_pipette = protocol.load_instrument( + instrument_name="flex_8channel_1000", mount="left" + ) + right_pipette = protocol.load_instrument( + instrument_name="flex_8channel_50", mount="right" + ) + left_trash = load_trash_bin("A3") + right_trash = load_trash_bin("B3") + left_pipette.trash_container = left_trash + right_pipette.trash_container = right_trash + +Another example is a Flex protocol that uses a waste chute. Say you want to only dispose labware in the chute, and you want the pipette to drop tips in a trash bin. You can implicitly get the trash bin to be the pipette's ``trash_container`` based on load order, or you can ensure it by setting it after all the load commands:: + + pipette = protocol.load_instrument( + instrument_name="flex_1channel_1000", + mount="left" + ) + chute = protocol.load_waste_chute() # default because loaded first + trash = protocol.load_trash_bin("A3") + pipette.trash_container = trash # overrides default + +.. versionadded:: 2.0 +.. versionchanged:: 2.16 + Added support for ``TrashBin`` and ``WasteChute`` objects. diff --git a/api/docs/v2/pipettes/partial_tip_pickup.rst b/api/docs/v2/pipettes/partial_tip_pickup.rst new file mode 100644 index 00000000000..2018dd33ea7 --- /dev/null +++ b/api/docs/v2/pipettes/partial_tip_pickup.rst @@ -0,0 +1,189 @@ +:og:description: How to change the number of tips an Opentrons pipette uses. + +.. _partial-tip-pickup: + +****************** +Partial Tip Pickup +****************** + +The 96-channel pipette occupies both pipette mounts on Flex, so it's not possible to attach another pipette at the same time. Partial tip pickup lets you perform some of the same actions that you would be able to perform with a second pipette. As of version 2.16 of the API, you can configure the 96-channel pipette to pick up a single column of tips, similar to the behavior of an 8-channel pipette. + +Nozzle Layout +============= + +Use the :py:meth:`.configure_nozzle_layout` method to choose how many tips the 96-channel pipette will pick up. The method's ``style`` parameter accepts special layout constants. You must import these constants at the top of your protocol, or you won't be able to configure the pipette for partial tip pickup. + +At minimum, import the API from the ``opentrons`` package:: + + from opentrons import protocol_api + +Then when you call ``configure_nozzle_layout`` later in your protocol, you can set ``style=protocol_api.COLUMN``. + +For greater convenience, also import the individual layout constants that you plan to use in your protocol:: + + from opentrons.protocol_api import COLUMN, ALL + +Then when you call ``configure_nozzle_layout`` later in your protocol, you can set ``style=COLUMN``. + +Here is the start of a protocol that performs both imports, loads a 96-channel pipette, and sets it to pick up a single column of tips. + +.. code-block:: python + :substitutions: + + from opentrons import protocol_api + from opentrons.protocol_api import COLUMN, ALL + + requirements = {"robotType": "Flex", "apiLevel": "|apiLevel|"} + + def run(protocol: protocol_api.ProtocolContext): + column_rack = protocol.load_labware( + load_name="opentrons_flex_96_tiprack_1000ul", + location="D3" + ) + trash = protocol.load_trash_bin("A3") + pipette = protocol.load_instrument("flex_96channel_1000") + pipette.configure_nozzle_layout( + style=COLUMN, + start="A12", + tip_racks=[column_rack] + ) + +.. versionadded:: 2.16 + +Let's unpack some of the details of this code. + +First, we've given a special name to the tip rack, ``column_rack``. You can name your tip racks whatever you like, but if you're performing full pickup and partial pickup in the same protocol, you'll need to keep them separate. See :ref:`partial-tip-rack-adapters` below. + +Next, we load the 96-channel pipette. Note that :py:meth:`.load_instrument` only has a single argument. The 96-channel pipette occupies both mounts, so ``mount`` is omissible. The ``tip_racks`` argument is always optional. But it would have no effect to declare it here, because every call to ``configure_nozzle_layout()`` resets the pipette's :py:obj:`.InstrumentContext.tip_racks` property. + +Finally, we configure the nozzle layout, with three arguments. + + - The ``style`` parameter directly accepts the ``COLUMN`` constant, since we imported it at the top of the protocol. + - The ``start`` parameter accepts a nozzle name, representing the back-left nozzle in the layout, as a string. ``"A12"`` tells the pipette to use its rightmost column of nozzles for pipetting. + - The ``tip_racks`` parameter tells the pipette which racks to use for tip tracking, just like :ref:`adding tip racks ` when loading a pipette. + +In this configuration, pipetting actions will use a single column:: + + # configured in COLUMN mode + pipette.pick_up_tip() # picks up A1-H1 from tip rack + pipette.drop_tip() + pipette.pick_up_tip() # picks up A2-H2 from tip rack + +.. warning:: + + :py:meth:`.InstrumentContext.pick_up_tip` always accepts a ``location`` argument, regardless of nozzle configuration. Do not pass a value that would lead the pipette to line up over more unused tips than specified by the current layout. For example, setting ``COLUMN`` layout and then calling ``pipette.pick_up_tip(tip_rack["A2"])`` on a full tip rack will lead to unexpected pipetting behavior and potential crashes. + +.. _partial-tip-rack-adapters: + +Tip Rack Adapters +================= + +You can use both partial and full tip pickup in the same protocol. This requires having some tip racks directly on the deck, and some tip racks in the tip rack adapter. + +Do not use a tip rack adapter when performing partial tip pickup. Instead, place the tip rack on the deck. During partial tip pickup, the 96-channel pipette lowers onto the tip rack in a horizontally offset position. If the tip rack were in its adapter, the pipette would collide with the adapter's posts, which protrude above the top of the tip rack. If you configure the pipette for partial pickup and then call ``pick_up_tip()`` on a tip rack that's loaded onto an adapter, the API will raise an error. + +On the other hand, you must use the tip rack adapter for full tip pickup. If the 96-channel pipette is in a full layout, either by default or by configuring ``style=ALL``, and you then call ``pick_up_tip()`` on a tip rack that's not in an adapter, the API will raise an error. + +When switching between full and partial pickup, you may want to organize your tip racks into lists, depending on whether they're loaded on adapters or not. + +.. code-block:: python + + tips_1 = protocol.load_labware( + "opentrons_flex_96_tiprack_1000ul", "C1" + ) + tips_2 = protocol.load_labware( + "opentrons_flex_96_tiprack_1000ul", "D1" + ) + tips_3 = protocol.load_labware( + "opentrons_flex_96_tiprack_1000ul", "C3", + adapter="opentrons_flex_96_tiprack_adapter" + ) + tips_4 = protocol.load_labware( + "opentrons_flex_96_tiprack_1000ul", "D3", + adapter="opentrons_flex_96_tiprack_adapter" + ) + + partial_tip_racks = [tips_1, tips_2] + full_tip_racks = [tips_3, tips_4] + +Now, when you configure the nozzle layout, you can reference the appropriate list as the value of ``tip_racks``:: + + pipette.configure_nozzle_layout( + style=COLUMN, + start="A12", + tip_racks=partial_tip_racks + ) + # partial pipetting commands go here + + pipette.configure_nozzle_layout( + style=ALL, + tip_racks=full_tip_racks + ) + pipette.pick_up_tip() # picks up full rack in C1 + +This keeps tip tracking consistent across each type of pickup. And it reduces the risk of errors due to the incorrect presence or absence of a tip rack adapter. + + +Tip Pickup and Conflicts +======================== + +During partial tip pickup, 96-channel pipette moves into spaces above adjacent slots. To avoid crashes, the API prevents you from performing partial tip pickup when there is tall labware in these spaces. The current nozzle layout determines which labware can safely occupy adjacent slots. + +The API will raise errors for potential labware crashes when using a column nozzle configuration. Nevertheless, it's a good idea to do the following when working with partial tip pickup: + + - Plan your deck layout carefully. Make a diagram and visualize everywhere the pipette will travel. + - Simulate your protocol and compare the run preview to your expectations of where the pipette will travel. + - Perform a dry run with only tip racks on the deck. Have the Emergency Stop Pendant handy in case you see an impending crash. + +For column pickup, Opentrons recommends using the nozzles in column 12 of the pipette. + +Using Column 12 +--------------- + +The examples in this section use a 96-channel pipette configured to pick up tips with column 12:: + + pipette.configure_nozzle_layout( + style=COLUMN, + start="A12", + ) + +When using column 12, the pipette overhangs space to the left of wherever it is picking up tips or pipetting. For this reason, it's a good idea to organize tip racks front to back on the deck. If you place them side by side, the rack to the right will be inaccessible. For example, let's load three tip racks in the front left corner of the deck:: + + tips_C1 = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "C1") + tips_D1 = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "D1") + tips_D2 = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "D2") + +Now the pipette will be able to access the racks in column 1 only. ``pick_up_tip(tips_D2["A1"])`` will raise an error due to the tip rack immediately to its left, in slot D1. There a couple of ways to avoid this error: + + - Load the tip rack in a different slot, with no tall labware to its left. + - Use all the tips in slot D1 first, and then use :py:meth:`.move_labware` to make space for the pipette before picking up tips from D2. + +You would get a similar error trying to aspirate from or dispense into a well plate in slot D3, since there is a tip rack to the left. + +.. tip:: + + When using column 12 for partial tip pickup and pipetting, generally organize your deck with the shortest labware on the left side of the deck, and the tallest labware on the right side. + +Using Column 1 +-------------- + +If your application can't accommodate a deck layout that works well with column 12, you can configure the 96-channel pipette to pick up tips with column 1:: + + pipette.configure_nozzle_layout( + style=COLUMN, + start="A1", + ) + +The major drawback of this configuration, compared to using column 12, is that tip tracking is not available with column 1. You must always specify a ``location`` parameter for :py:meth:`.pick_up_tip`. This *requires careful tip tracking* so you don't place the pipette over more than a single column of unused tips at once. You can write some additional code to manage valid tip pickup locations, like this:: + + tip_rack = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "C1") + pipette.configure_nozzle_layout(style=COLUMN, start="A1") + row_a = tip_rack.rows()[0] + pipette.pick_up_tip(row_a.pop()) # pick up A12-H12 + pipette.drop_tip() + pipette.pick_up_tip(row_a.pop()) # pick up A11-H11 + pipette.drop_tip() + +This code first constructs a list of all the wells in row A of the tip rack. Then, when picking up a tip, instead of referencing one of those wells directly, the ``location`` is set to ``row_a.pop()``. This uses the `built-in pop method `_ to get the last item from the list and remove it from the list. If you keep using this approach to pick up tips, you'll get an error once the tip rack is empty — not from the API, but from Python itself, since you're trying to ``pop`` an item from an empty list. + +Additionally, you can't access the rightmost columns in labware in column 3, since they are beyond the movement limit of the pipette. The exact number of inaccessible columns varies by labware type. Any well that is within 29 mm of the right edge of the slot may be inaccessible in a column 12 configuration. Call ``configure_nozzle_layout()`` again to switch to a column 1 layout if you need to pipette in that area. diff --git a/api/docs/v2/pipettes/volume_modes.rst b/api/docs/v2/pipettes/volume_modes.rst new file mode 100644 index 00000000000..af1bc71fa51 --- /dev/null +++ b/api/docs/v2/pipettes/volume_modes.rst @@ -0,0 +1,51 @@ +:og:description: How to work with very small volumes of liquid on Opentrons Flex. + +.. _pipette-volume-modes: + +Volume Modes +============ + +The Flex 1-Channel 50 µL and Flex 8-Channel 50 µL pipettes must operate in a low-volume mode to accurately dispense very small volumes of liquid. Set the volume mode by calling :py:meth:`.InstrumentContext.configure_for_volume` with the amount of liquid you plan to aspirate, in µL:: + + pipette50.configure_for_volume(1) + pipette50.pick_up_tip() + pipette50.aspirate(1, plate["A1"]) + +.. versionadded:: 2.15 + +Passing different values to ``configure_for_volume()`` changes the minimum and maximum volume of Flex 50 µL pipettes as follows: + +.. list-table:: + :header-rows: 1 + :widths: 2 3 3 + + * - Value + - Minimum Volume (µL) + - Maximum Volume (µL) + * - 1–4.9 + - 1 + - 30 + * - 5–50 + - 5 + - 50 + +.. note:: + The pipette must not contain liquid when you call ``configure_for_volume()``, or the API will raise an error. + + Also, if the pipette is in a well location that may contain liquid, it will move upward to ensure it is not immersed in liquid before changing its mode. Calling ``configure_for_volume()`` *before* ``pick_up_tip()`` helps to avoid this situation. + +In a protocol that handles many different volumes, it's a good practice to call ``configure_for_volume()`` once for each :py:meth:`.transfer` or :py:meth:`.aspirate`, specifying the volume that you are about to handle. When operating with a list of volumes, nest ``configure_for_volume()`` inside a ``for`` loop to ensure that the pipette is properly configured for each volume: + +.. code-block:: python + + volumes = [1, 2, 3, 4, 1, 5, 2, 8] + sources = plate.columns()[0] + destinations = plate.columns()[1] + for i in range(8): + pipette50.configure_for_volume(volumes[i]) + pipette50.pick_up_tip() + pipette50.aspirate(volume=volumes[i], location=sources[i]) + pipette50.dispense(location=destinations[i]) + pipette50.drop_tip() + +If you know that all your liquid handling will take place in a specific mode, then you can call ``configure_for_volume()`` just once with a representative volume. Or if all the volumes correspond to the pipette's default mode, you don't have to call ``configure_for_volume()`` at all. diff --git a/api/docs/v2/robot_position.rst b/api/docs/v2/robot_position.rst index 4d6dc7f30d2..a7b014b187f 100644 --- a/api/docs/v2/robot_position.rst +++ b/api/docs/v2/robot_position.rst @@ -28,14 +28,14 @@ Let's look at the :py:meth:`.Well.top` method. It returns a position level with .. code-block:: python - plate['A1'].top() # the top center of the well + plate["A1"].top() # the top center of the well This is a good position to use for a :ref:`blow out operation ` or an activity where you don't want the tip to contact the liquid. In addition, you can adjust the height of this position with the optional argument ``z``, which is measured in mm. Positive ``z`` numbers move the position up, negative ``z`` numbers move it down. .. code-block:: python - plate['A1'].top(z=1) # 1 mm above the top center of the well - plate['A1'].top(z=-1) # 1 mm below the top center of the well + plate["A1"].top(z=1) # 1 mm above the top center of the well + plate["A1"].top(z=-1) # 1 mm below the top center of the well .. versionadded:: 2.0 @@ -46,19 +46,23 @@ Let's look at the :py:meth:`.Well.bottom` method. It returns a position level wi .. code-block:: python - plate['A1'].bottom() # the bottom center of the well + plate["A1"].bottom() # the bottom center of the well This is a good position for :ref:`aspirating liquid ` or an activity where you want the tip to contact the liquid. Similar to the ``Well.top()`` method, you can adjust the height of this position with the optional argument ``z``, which is measured in mm. Positive ``z`` numbers move the position up, negative ``z`` numbers move it down. .. code-block:: python - plate['A1'].bottom(z=1) # 1 mm above the bottom center of the well - plate['A1'].bottom(z=-1) # 1 mm below the bottom center of the well + plate["A1"].bottom(z=1) # 1 mm above the bottom center of the well + plate["A1"].bottom(z=-1) # 1 mm below the bottom center of the well # this may be dangerous! .. warning:: - Negative ``z`` arguments to ``Well.bottom()`` can cause a pipette tip to collide with the bottom of the well. While Flex can detect collisions, the OT-2 has no sensors to detect an impact with a well bottom. For both robot types, a collision with a well bottom may bend the pipette's tip (affecting liquid handling) and the pipette may be higher on the z-axis than expected until it picks up another tip. + Negative ``z`` arguments to ``Well.bottom()`` will cause the pipette tip to collide with the bottom of the well. Collisions may bend the tip (affecting liquid handling) and the pipette may be higher than expected on the z-axis until it picks up another tip. + + Flex can detect collisions, and even gentle contact may trigger an overpressure error and cause the protocol to fail. Avoid ``z`` values less than 1, if possible. + + The OT-2 has no sensors to detect contact with a well bottom. The protocol will continue even after a collision. .. versionadded:: 2.0 @@ -69,7 +73,7 @@ Let's look at the :py:meth:`.Well.center` method. It returns a position centered .. code-block:: python - plate['A1'].center() # the vertical and horizontal center of the well + plate["A1"].center() # the vertical and horizontal center of the well .. versionadded:: 2.0 @@ -86,22 +90,22 @@ If you need to change the aspiration or dispensing height for multiple operation Modifying these attributes will affect all subsequent aspirate and dispense actions performed by the attached pipette, even those executed as part of a :py:meth:`.transfer` operation. This snippet from a sample protocol demonstrates how to work with and change the default clearance:: # aspirate 1 mm above the bottom of the well (default) - pipette.aspirate(50, plate['A1']) + pipette.aspirate(50, plate["A1"]) # dispense 1 mm above the bottom of the well (default) - pipette.dispense(50, plate['A1']) + pipette.dispense(50, plate["A1"]) # change clearance for aspiration to 2 mm pipette.well_bottom_clearance.aspirate = 2 # aspirate 2 mm above the bottom of the well - pipette.aspirate(50, plate['A1']) + pipette.aspirate(50, plate["A1"]) # still dispensing 1 mm above the bottom - pipette.dispense(50, plate['A1']) + pipette.dispense(50, plate["A1"]) - pipette.aspirate(50, plate['A1']) + pipette.aspirate(50, plate["A1"]) # change clearance for dispensing to 10 mm pipette.well_bottom_clearance.dispense = 10 # dispense high above the well - pipette.dispense(50, plate['A1']) + pipette.dispense(50, plate["A1"]) .. versionadded:: 2.0 @@ -112,6 +116,8 @@ All positions relative to labware are adjusted automatically based on labware of You should only adjust labware offsets in your Python code if you plan to run your protocol in Jupyter Notebook or from the command line. See :ref:`using_lpc` in the Advanced Control article for information. +.. _protocol-api-deck-coords: + Position Relative to the Deck ============================= @@ -129,6 +135,7 @@ Independent Movement For convenience, many methods have location arguments and incorporate movement automatically. This section will focus on moving the pipette independently, without performing other actions like ``aspirate()`` or ``dispense()``. +.. _move-to: Move To ------- @@ -139,17 +146,17 @@ The :py:meth:`~.InstrumentContext.move_to` method requires the :py:class:`.Locat .. code-block:: python - pipette.move_to(plate['A1']) # error; can't move to a well itself - pipette.move_to(plate['A1'].bottom()) # move to the bottom of well A1 - pipette.move_to(plate['A1'].top()) # move to the top of well A1 - pipette.move_to(plate['A1'].bottom(z=2)) # move to 2 mm above the bottom of well A1 - pipette.move_to(plate['A1'].top(z=-2)) # move to 2 mm below the top of well A1 + pipette.move_to(plate["A1"]) # error; can't move to a well itself + pipette.move_to(plate["A1"].bottom()) # move to the bottom of well A1 + pipette.move_to(plate["A1"].top()) # move to the top of well A1 + pipette.move_to(plate["A1"].bottom(z=2)) # move to 2 mm above the bottom of well A1 + pipette.move_to(plate["A1"].top(z=-2)) # move to 2 mm below the top of well A1 When using ``move_to()``, by default the pipette will move in an arc: first upwards, then laterally to a position above the target location, and finally downwards to the target location. If you have a reason for doing so, you can force the pipette to move in a straight line to the target location: .. code-block:: python - pipette.move_to(plate['A1'].top(), force_direct=True) + pipette.move_to(plate["A1"].top(), force_direct=True) .. warning:: @@ -157,14 +164,16 @@ When using ``move_to()``, by default the pipette will move in an arc: first upwa Small, direct movements can be useful for working inside of a well, without having the tip exit and re-enter the well. This code sample demonstrates how to move the pipette to a well, make direct movements inside that well, and then move on to a different well:: - pipette.move_to(plate['A1'].top()) - pipette.move_to(plate['A1'].bottom(1), force_direct=True) - pipette.move_to(plate['A1'].top(-2), force_direct=True) - pipette.move_to(plate['A2'].top()) + pipette.move_to(plate["A1"].top()) + pipette.move_to(plate["A1"].bottom(1), force_direct=True) + pipette.move_to(plate["A1"].top(-2), force_direct=True) + pipette.move_to(plate["A2"].top()) .. versionadded:: 2.0 +.. _points-locations: + Points and Locations -------------------- @@ -178,7 +187,7 @@ When instructing the robot to move, it's important to consider the difference be This distinction is important for the :py:meth:`.Location.move` method, which operates on a location, takes a point as an argument, and outputs an updated location. To use this method, include ``from opentrons import types`` at the start of your protocol. The ``move()`` method does not mutate the location it is called on, so to perform an action at the updated location, use it as an argument of another method or save it to a variable. For example:: # get the location at the center of well A1 - center_location = plate['A1'].center() + center_location = plate["A1"].center() # get a location 1 mm right, 1 mm back, and 1 mm up from the center of well A1 adjusted_location = center_location.move(types.Point(x=1, y=1, z=1)) @@ -196,11 +205,11 @@ This distinction is important for the :py:meth:`.Location.move` method, which op .. code-block:: python # the following are equivalent - pipette.move_to(plate['A1'].bottom(z=2)) - pipette.move_to(plate['A1'].bottom().move(types.Point(z=2))) + pipette.move_to(plate["A1"].bottom(z=2)) + pipette.move_to(plate["A1"].bottom().move(types.Point(z=2))) # adjust along the y-axis - pipette.move_to(plate['A1'].bottom().move(types.Point(y=2))) + pipette.move_to(plate["A1"].bottom().move(types.Point(y=2))) .. versionadded:: 2.0 @@ -218,9 +227,9 @@ Gantry Speed The robot's gantry usually moves as fast as it can given its construction. The default speed for Flex varies between 300 and 350 mm/s. The OT-2 default is 400 mm/s. However, some experiments or liquids may require slower movements. In this case, you can reduce the gantry speed for a specific pipette by setting :py:obj:`.InstrumentContext.default_speed` like this:: - pipette.move_to(plate['A1'].top()) # move to the first well at default speed + pipette.move_to(plate["A1"].top()) # move to the first well at default speed pipette.default_speed = 100 # reduce pipette speed - pipette.move_to(plate['D6'].top()) # move to the last well at the slower speed + pipette.move_to(plate["D6"].top()) # move to the last well at the slower speed .. warning:: @@ -240,10 +249,10 @@ In addition to controlling the overall gantry speed, you can set speed limits fo .. code-block:: python :substitutions: - protocol.max_speeds['x'] = 50 # limit x-axis to 50 mm/s - del protocol.max_speeds['x'] # reset x-axis limit - protocol.max_speeds['a'] = 10 # limit a-axis to 10 mm/s - protocol.max_speeds['a'] = None # reset a-axis limit + protocol.max_speeds["x"] = 50 # limit x-axis to 50 mm/s + del protocol.max_speeds["x"] # reset x-axis limit + protocol.max_speeds["a"] = 10 # limit a-axis to 10 mm/s + protocol.max_speeds["a"] = None # reset a-axis limit Note that ``max_speeds`` can't set limits for the pipette plunger axes (``b`` and ``c``); instead, set the flow rates or plunger speeds as described in :ref:`new-plunger-flow-rates`. diff --git a/api/docs/v2/tutorial.rst b/api/docs/v2/tutorial.rst index 474e96d3bd6..473ad6e40c0 100644 --- a/api/docs/v2/tutorial.rst +++ b/api/docs/v2/tutorial.rst @@ -2,30 +2,29 @@ .. _tutorial: -######## +******** Tutorial -######## +******** -************ Introduction -************ +============ -This tutorial will guide you through creating a Python protocol file from scratch. At the end of this process you’ll have a complete protocol that can run on a Flex or an OT-2 robot. If you don’t have a Flex or an OT-2 (or if you’re away from your lab, or if your robot is in use), you can use the same file to simulate the protocol on your computer instead. +This tutorial will guide you through creating a Python protocol file from scratch. At the end of this process you'll have a complete protocol that can run on a Flex or an OT-2 robot. If you don’t have a Flex or an OT-2 (or if you’re away from your lab, or if your robot is in use), you can use the same file to simulate the protocol on your computer instead. -What You’ll Automate -^^^^^^^^^^^^^^^^^^^^ +What You'll Automate +-------------------- -The lab task that you’ll automate in this tutorial is `serial dilution`: taking a solution and progressively diluting it by transferring it stepwise across a plate from column 1 to column 12. With just a dozen or so lines of code, you can instruct your robot to perform the hundreds of individual pipetting actions necessary to fill an entire 96-well plate. And all of those liquid transfers will be done automatically, so you’ll have more time to do other work in your lab. +The lab task that you'll automate in this tutorial is `serial dilution`: taking a solution and progressively diluting it by transferring it stepwise across a plate from column 1 to column 12. With just a dozen or so lines of code, you can instruct your robot to perform the hundreds of individual pipetting actions necessary to fill an entire 96-well plate. And all of those liquid transfers will be done automatically, so you’ll have more time to do other work in your lab. Before You Begin -^^^^^^^^^^^^^^^^ +---------------- You're going to write some Python code, but you don't need to be a Python expert to get started writing Opentrons protocols. You should know some basic Python syntax, like how it uses `indentation `_ to group blocks of code, dot notation for `calling methods `_, and the format of `lists `_ and `dictionaries `_. You’ll also be using `common control structures `_ like ``if`` statements and ``for`` loops. To run your code, make sure that you've installed `Python 3 `_ and the `pip package installer `_. You should write your code in your favorite plaintext editor or development environment and save it in a file with a ``.py`` extension, like ``dilution-tutorial.py``. Hardware and Labware -^^^^^^^^^^^^^^^^^^^^ +-------------------- Before running a protocol, you’ll want to have the right kind of hardware and labware ready for your Flex or OT-2. @@ -57,9 +56,8 @@ The Flex and OT-2 use similar labware for serial dilution. The tutorial code wil For the liquids, you can use plain water as the diluent and water dyed with food coloring as the solution. -********************** Create a Protocol File -********************** +====================== Let’s start from scratch to create your serial dilution protocol. Open up a new file in your editor and start with the line: @@ -73,29 +71,30 @@ Everything else in the protocol file is required. Next, you’ll specify the ver For this tutorial, you’ll write very little Python outside of the ``run()`` function. But for more complex applications it’s worth remembering that your protocol file *is* a Python script, so any Python code that can run on your robot can be a part of a protocol. +.. _tutorial-metadata: + Metadata -^^^^^^^^ +-------- -Every protocol needs to have a metadata dictionary with information about the protocol. At minimum, you need to specify what :ref:`version ` of the API the protocol requires. The `scripts `_ for this tutorial were validated against API version 2.15, so specify: +Every protocol needs to have a metadata dictionary with information about the protocol. At minimum, you need to specify what :ref:`version of the API ` the protocol requires. The `scripts `_ for this tutorial were validated against API version 2.16, so specify: .. code-block:: python - metadata = {'apiLevel': '2.15'} + metadata = {"apiLevel": "2.16"} You can include any other information you like in the metadata dictionary. The fields ``protocolName``, ``description``, and ``author`` are all displayed in the Opentrons App, so it’s a good idea to expand the dictionary to include them: .. code-block:: python - :substitutions: metadata = { - 'apiLevel': '2.15', - 'protocolName': 'Serial Dilution Tutorial', - 'description': '''This protocol is the outcome of following the + "apiLevel": "2.16", + "protocolName": "Serial Dilution Tutorial", + "description": """This protocol is the outcome of following the Python Protocol API Tutorial located at https://docs.opentrons.com/v2/tutorial.html. It takes a solution and progressively dilutes it by transferring it - stepwise across a plate.''', - 'author': 'New API User' + stepwise across a plate.""", + "author": "New API User" } Note, if you have a Flex, or are using an OT-2 with API v2.15 (or higher), we recommend adding a ``requirements`` section to your code. See the Requirements section below. @@ -103,7 +102,7 @@ Note, if you have a Flex, or are using an OT-2 with API v2.15 (or higher), we re .. _tutorial-requirements: Requirements -^^^^^^^^^^^^ +------------ The ``requirements`` code block can appear before *or* after the ``metadata`` code block in a Python protocol. It uses the following syntax and accepts two arguments: ``robotType`` and ``apiLevel``. @@ -112,16 +111,18 @@ Whether you need a ``requirements`` block depends on your robot model and API ve - **Flex:** The ``requirements`` block is always required. And, the API version does not go in the ``metadata`` section. The API version belongs in the ``requirements``. For example:: - requirements = {"robotType": "Flex", "apiLevel": "2.15"} + requirements = {"robotType": "Flex", "apiLevel": "2.16"} - **OT-2:** The ``requirements`` block is optional, but including it is a recommended best practice, particularly if you’re using API version 2.15 or greater. If you do use it, remember to remove the API version from the ``metadata``. For example:: - requirements = {"robotType": "OT-2", "apiLevel": "2.15"} + requirements = {"robotType": "OT-2", "apiLevel": "2.16"} With the metadata and requirements defined, you can move on to creating the ``run()`` function for your protocol. +.. _run-function: + The ``run()`` function -^^^^^^^^^^^^^^^^^^^^^^ +---------------------- Now it’s time to actually instruct the Flex or OT-2 how to perform serial dilution. All of this information is contained in a single Python function, which has to be named ``run``. This function takes one argument, which is the *protocol context*. Many examples in these docs use the argument name ``protocol``, and sometimes they specify the argument’s type: @@ -132,7 +133,7 @@ Now it’s time to actually instruct the Flex or OT-2 how to perform serial dilu With the protocol context argument named and typed, you can start calling methods on ``protocol`` to add labware and hardware. Labware -------- +^^^^^^^ For serial dilution, you need to load a tip rack, reservoir, and 96-well plate on the deck of your Flex or OT-2. Loading labware is done with the :py:meth:`~.ProtocolContext.load_labware` method of the protocol context, which takes two arguments: the standard labware name as defined in the `Opentrons Labware Library `_, and the position where you'll place the labware on the robot's deck. @@ -143,12 +144,11 @@ For serial dilution, you need to load a tip rack, reservoir, and 96-well plate o Here’s how to load the labware on a Flex in slots D1, D2, and D3 (repeating the ``def`` statement from above to show proper indenting): .. code-block:: python - :substitutions: def run(protocol: protocol_api.ProtocolContext): - tips = protocol.load_labware('opentrons_flex_96_tiprack_200ul', 'D1') - reservoir = protocol.load_labware('nest_12_reservoir_15ml', 'D2') - plate = protocol.load_labware('nest_96_wellplate_200ul_flat', 'D3') + tips = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "D1") + reservoir = protocol.load_labware("nest_12_reservoir_15ml", "D2") + plate = protocol.load_labware("nest_96_wellplate_200ul_flat", "D3") If you’re using a different model of labware, find its name in the Labware Library and replace it in your code. @@ -165,12 +165,11 @@ For serial dilution, you need to load a tip rack, reservoir, and 96-well plate o Here’s how to load the labware on an OT-2 in slots 1, 2, and 3 (repeating the ``def`` statement from above to show proper indenting): .. code-block:: python - :substitutions: def run(protocol: protocol_api.ProtocolContext): - tips = protocol.load_labware('opentrons_96_tiprack_300ul', 1) - reservoir = protocol.load_labware('nest_12_reservoir_15ml', 2) - plate = protocol.load_labware('nest_96_wellplate_200ul_flat', 3) + tips = protocol.load_labware("opentrons_96_tiprack_300ul", 1) + reservoir = protocol.load_labware("nest_12_reservoir_15ml", 2) + plate = protocol.load_labware("nest_96_wellplate_200ul_flat", 3) If you’re using a different model of labware, find its name in the Labware Library and replace it in your code. @@ -184,20 +183,32 @@ For serial dilution, you need to load a tip rack, reservoir, and 96-well plate o You may notice that these deck maps don't show where the liquids will be at the start of the protocol. Liquid definitions aren’t required in Python protocols, unlike protocols made in `Protocol Designer `_. If you want to identify liquids, see `Labeling Liquids in Wells `_. (Sneak peek: you’ll put the diluent in column 1 of the reservoir and the solution in column 2 of the reservoir.) +Trash Bin +^^^^^^^^^ + +Flex and OT-2 both come with a trash bin for disposing used tips. + +The OT-2 trash bin is fixed in slot 12. Since it can't go anywhere else on the deck, you don't need to write any code to tell the API where it is. Skip ahead to the Pipettes section below. + +Flex lets you put a :ref:`trash bin ` in multiple locations on the deck. You can even have more than one trash bin, or none at all (if you use the :ref:`waste chute ` instead, or if your protocol never trashes any tips). For serial dilution, you'll need to dispose used tips, so you also need to tell the API where the trash container is located on your robot. Loading a trash bin on Flex is done with the :py:meth:`.load_trash_bin` method, which takes one argument: its location. Here's how to load the trash in slot A3:: + + trash = protocol.load_trash_bin("A3") + + Pipettes --------- +^^^^^^^^ Next you’ll specify what pipette to use in the protocol. Loading a pipette is done with the :py:meth:`.load_instrument` method, which takes three arguments: the name of the pipette, the mount it’s installed in, and the tip racks it should use when performing transfers. Load whatever pipette you have installed in your robot by using its :ref:`standard pipette name `. Here’s how to load the pipette in the left mount and instantiate it as a variable named ``left_pipette``: .. code-block:: python # Flex - left_pipette = protocol.load_instrument('flex_1channel_1000', 'left', tip_racks=[tips]) + left_pipette = protocol.load_instrument("flex_1channel_1000", "left", tip_racks=[tips]) .. code-block:: python # OT-2 - left_pipette = protocol.load_instrument('p300_single_gen2', 'left', tip_racks=[tips]) + left_pipette = protocol.load_instrument("p300_single_gen2", "left", tip_racks=[tips]) Since the pipette is so fundamental to the protocol, it might seem like you should have specified it first. But there’s a good reason why pipettes are loaded after labware: you need to have already loaded ``tips`` in order to tell the pipette to use it. And now you won’t have to reference ``tips`` again in your code — it’s assigned to the ``left_pipette`` and the robot will know to use it when commanded to pick up tips. @@ -208,7 +219,7 @@ Since the pipette is so fundamental to the protocol, it might seem like you shou .. _tutorial-commands: Commands --------- +^^^^^^^^ Finally, all of your labware and hardware is in place, so it’s time to give the robot pipetting commands. The required steps of the serial dilution process break down into three main phases: @@ -222,7 +233,7 @@ Let’s start with the diluent. This phase takes a larger quantity of liquid and .. code-block:: python - left_pipette.transfer(100, reservoir['A1'], plate.wells()) + left_pipette.transfer(100, reservoir["A1"], plate.wells()) Breaking down these single lines of code shows the power of :ref:`complex commands `. The first argument is the amount to transfer to each destination, 100 µL. The second argument is the source, column 1 of the reservoir (which is still specified with grid-style coordinates as ``A1`` — a reservoir only has an A row). The third argument is the destination. Here, calling the :py:meth:`.wells` method of ``plate`` returns a list of *every well*, and the command will apply to all of them. @@ -251,7 +262,7 @@ In each row, you first need to add solution. This will be similar to what you di .. code-block:: python - left_pipette.transfer(100, reservoir['A2'], row[0], mix_after(3, 50)) + left_pipette.transfer(100, reservoir["A2"], row[0], mix_after(3, 50)) As before, the first argument specifies to transfer 100 µL. The second argument is the source, column 2 of the reservoir. The third argument is the destination, the element at index 0 of the current ``row``. Since Python lists are zero-indexed, but columns on labware start numbering at 1, this will be well A1 on the first time through the loop, B1 the second time, and so on. The fourth argument specifies to mix 3 times with 50 µL of fluid each time. @@ -283,7 +294,7 @@ All that remains is for the loop to repeat these steps, filling each row down th That’s it! If you’re using a single-channel pipette, you’re ready to try out your protocol. 8-Channel Pipette ------------------ +^^^^^^^^^^^^^^^^^ If you’re using an 8-channel pipette, you’ll need to make a couple tweaks to the single-channel code from above. Most importantly, whenever you target a well in row A of a plate with an 8-channel pipette, it will move its topmost tip to row A, lining itself up over the entire column. @@ -291,21 +302,20 @@ Thus, when adding the diluent, instead of targeting every well on the plate, you .. code-block:: python - left_pipette.transfer(100, reservoir['A1'], plate.rows()[0]) + left_pipette.transfer(100, reservoir["A1"], plate.rows()[0]) And by accessing an entire column at once, the 8-channel pipette effectively implements the ``for`` loop in hardware, so you’ll need to remove it: .. code-block:: python row = plate.rows()[0] - left_pipette.transfer(100, reservoir['A2'], row[0], mix_after=(3, 50)) + left_pipette.transfer(100, reservoir["A2"], row[0], mix_after=(3, 50)) left_pipette.transfer(100, row[:11], row[1:], mix_after=(3, 50)) Instead of tracking the current row in the ``row`` variable, this code sets it to always be row A (index 0). -***************** Try Your Protocol -***************** +================= There are two ways to try out your protocol: simulation on your computer, or a live run on a Flex or OT-2. Even if you plan to run your protocol on a robot, it’s a good idea to check the simulation output first. @@ -319,10 +329,9 @@ If you get any errors in simulation, or you don't get the outcome you expected w .. _tutorial-simulate: In Simulation -^^^^^^^^^^^^^ -.. suggest linking to pip install rather than just using text in ``code`` format. Help reader find resource +------------- -Simulation doesn’t require having a robot connected to your computer. You just need to install the `Opentrons Python module `_ from Pip (``pip install opentrons``). This will give you access to the ``opentrons_simulate`` command-line utility (``opentrons_simulate.exe`` on Windows). +Simulation doesn’t require having a robot connected to your computer. You just need to install the `Opentrons Python module `_ using pip (``pip install opentrons``). This will give you access to the ``opentrons_simulate`` command-line utility (``opentrons_simulate.exe`` on Windows). To see a text preview of the steps your Flex or OT-2 will take, use the change directory (``cd``) command to navigate to the location of your saved protocol file and run: @@ -341,7 +350,7 @@ The ``-e`` flag estimates duration, and ``-o nothing`` suppresses printing the r If that’s too long, you can always cancel your run partway through or modify ``for i in range(8)`` to loop through fewer rows. On a Robot -^^^^^^^^^^ +---------- The simplest way to run your protocol on a Flex or OT-2 is to use the `Opentrons App `_. When you first launch the Opentrons App, you will see the Protocols screen. (Click **Protocols** in the left sidebar to access it at any other time.) Click **Import** in the top right corner to reveal the Import a Protocol pane. Then click **Choose File** and find your protocol in the system file picker, or drag and drop your protocol file into the well. @@ -358,8 +367,7 @@ When it’s all done, check the results of your serial dilution procedure — yo :align: center :alt: An overhead view of a well plate on the metal OT-2 deck, with dark blue liquid in the leftmost column smoothly transitioning to very light blue in the rightmost column. -********** Next Steps -********** +========== -This tutorial has relied heavily on the ``transfer()`` method, but there's much more that the Python Protocol API can do. Many advanced applications use :ref:`building block commands ` for finer control over the robot. These commands let you aspirate and dispense separately, add air gaps, blow out excess liquid, move the pipette to any location, and more. For protocols that use Opentrons :ref:`new_modules`, there are methods to control their behavior. And all of the API's classes and methods are catalogued in the :ref:`protocol-api-reference`. +This tutorial has relied heavily on the ``transfer()`` method, but there's much more that the Python Protocol API can do. Many advanced applications use :ref:`building block commands ` for finer control over the robot. These commands let you aspirate and dispense separately, add air gaps, blow out excess liquid, move the pipette to any location, and more. For protocols that use :ref:`Opentrons hardware modules `, there are methods to control their behavior. And all of the API's classes and methods are catalogued in the :ref:`API Reference `. diff --git a/api/docs/v2/versioning.rst b/api/docs/v2/versioning.rst index 8b1a6cdd09b..5d8e4cd3b82 100644 --- a/api/docs/v2/versioning.rst +++ b/api/docs/v2/versioning.rst @@ -30,11 +30,11 @@ You must specify the API version you are targeting in your Python protocol. In a from opentrons import protocol_api metadata = { - 'apiLevel': '|apiLevel|', - 'author': 'A. Biologist'} + "apiLevel": "|apiLevel|", + "author": "A. Biologist"} def run(protocol: protocol_api.ProtocolContext): - protocol.comment('Hello, world!') + protocol.comment("Hello, world!") From version 2.15 onward, you can specify ``apiLevel`` in the ``requirements`` dictionary instead: @@ -43,11 +43,11 @@ From version 2.15 onward, you can specify ``apiLevel`` in the ``requirements`` d from opentrons import protocol_api - metadata = {'author': 'A. Biologist'} - requirements = {'apiLevel': '2.15', 'robotType': 'Flex'} + metadata = {"author": "A. Biologist"} + requirements = {"apiLevel": "|apiLevel|", "robotType": "Flex"} def run(protocol: protocol_api.ProtocolContext): - protocol.comment('Hello, Flex!') + protocol.comment("Hello, Flex!") Choose only one of these places to specify ``apiLevel``. If you put it in neither or both places, you will not be able to simulate or run your protocol. @@ -59,10 +59,7 @@ When choosing an API level, consider what features you need and how widely you p On the one hand, using the highest available version will give your protocol access to all the latest :ref:`features and fixes `. On the other hand, using the lowest possible version lets the protocol work on a wider range of robot software versions. For example, a protocol that uses the Heater-Shaker and specifies version 2.13 of the API should work equally well on a robot running version 6.1.0 or 6.2.0 of the robot software. Specifying version 2.14 would limit the protocol to robots running 6.2.0 or higher. -.. note:: - - Python protocols with an ``apiLevel`` of 2.14 or higher can't currently be simulated with the ``opentrons_simulate`` command-line tool, the :py:func:`opentrons.simulate.simulate` function, or the :py:func:`opentrons.simulate.get_protocol_api` function. If your protocol doesn't rely on new functionality added after version 2.13, use a lower ``apiLevel``. For protocols that require 2.14 or higher, analyze your protocol with the Opentrons App instead. - +.. _max-version: Maximum Supported Versions ========================== @@ -71,9 +68,9 @@ The maximum supported API version for your robot is listed in the Opentrons App If you upload a protocol that specifies a higher API level than the maximum supported, your robot won't be able to analyze or run your protocol. You can increase the maximum supported version by updating your robot software and Opentrons App. -Opentrons robots running the latest software (7.0.0) support the following version ranges: +Opentrons robots running the latest software (7.1.0) support the following version ranges: - * **Flex:** version 2.15. + * **Flex:** version 2.15–|apiLevel|. * **OT-2:** versions 2.0–|apiLevel|. @@ -87,6 +84,8 @@ This table lists the correspondence between Protocol API versions and robot soft +-------------+------------------------------+ | API Version | Introduced in Robot Software | +=============+==============================+ +| 2.16 | 7.1.0 | ++-------------+------------------------------+ | 2.15 | 7.0.0 | +-------------+------------------------------+ | 2.14 | 6.3.0 | @@ -127,6 +126,37 @@ This table lists the correspondence between Protocol API versions and robot soft Changes in API Versions ======================= +Version 2.17 +------------ + +- :py:meth:`.dispense` will now raise an error if you try to dispense more than is available. + +Version 2.16 +------------ + +This version introduces new features for Flex and adds and improves methods for aspirating and dispensing. Note that when updating Flex protocols to version 2.16, you *must* load a trash container before dropping tips. + +- New features + + - Use :py:meth:`.configure_nozzle_layout` to pick up a single column of tips with the 96-channel pipette. See :ref:`Partial Tip Pickup `. + - Specify the trash containers attached to your Flex with :py:meth:`.load_waste_chute` and :py:meth:`.load_trash_bin`. + - Dispense, blow out, drop tips, and dispose labware in the waste chute. Disposing labware requires the gripper and calling :py:meth:`.move_labware` with ``use_gripper=True``. + - Perform actions in staging area slots by referencing slots A4 through D4. See :ref:`deck-slots`. + - Explicitly command a pipette to :py:meth:`.prepare_to_aspirate`. The API usually prepares pipettes to aspirate automatically, but this is useful for certain applications, like pre-wetting routines. + +- Improved features + + - :py:meth:`.aspirate`, :py:meth:`.dispense`, and :py:meth:`.mix` will not move any liquid when called with ``volume=0``. + +- Other changes + + - :py:obj:`.ProtocolContext.fixed_trash` and :py:obj:`.InstrumentContext.trash_container` now return :py:class:`.TrashBin` objects instead of :py:class:`.Labware` objects. + - Flex will no longer automatically drop tips in the trash at the end of a protocol. You can add a :py:meth:`.drop_tip()` command to your protocol or use the Opentrons App to drop the tips. + +- Known issues + + - It's possible to load a Thermocycler and then load another item in slot A1. Don't do this, as it could lead to unexpected pipetting behavior and crashes. + Version 2.15 ------------ @@ -140,25 +170,29 @@ This version introduces support for the Opentrons Flex robot, instruments, modul - The new :py:meth:`.move_labware` method can move labware automatically using the Flex Gripper. You can also move labware manually on Flex. - - :py:meth:`.load_module` supports loading the :ref:`magnetic-block`. + - :py:meth:`.load_module` supports loading the :ref:`Magnetic Block `. - The API does not enforce placement restrictions for the Heater-Shaker module on Flex, because it is installed below-deck in a module caddy. Pipetting restrictions are still in place when the Heater-Shaker is shaking or its labware latch is open. + - The new :py:meth:`.configure_for_volume` method can place Flex 50 µL pipettes in a low-volume mode for dispensing very small volumes of liquid. See :ref:`pipette-volume-modes`. + - Flex and OT-2 features - Optionally specify ``apiLevel`` in the new ``requirements`` dictionary (otherwise, specify it in ``metadata``). - Optionally specify ``"robotType": "OT-2"`` in ``requirements``. - - Use coordinates or numbers to specify :ref:`deck-slots`. These formats match physical labels on Flex and OT-2, but you can use either system, regardless of ``robotType``. + - Use coordinates or numbers to specify :ref:`deck slots `. These formats match physical labels on Flex and OT-2, but you can use either system, regardless of ``robotType``. - - The new :py:meth:`.load_adapter` method lets you load adapters and labware separately on modules, and lets you load adapters directly in deck slots. See :ref:`labware-on-adapters`. + - The new module context ``load_adapter()`` methods let you load adapters and labware separately on modules, and :py:meth:`.ProtocolContext.load_adapter` lets you load adapters directly in deck slots. See :ref:`labware-on-adapters`. - Move labware manually using :py:meth:`.move_labware`, without having to stop your protocol. - Manual labware moves support moving to or from the new :py:obj:`~.protocol_api.OFF_DECK` location (outside of the robot). - - :py:meth:`.load_labware` also accepts :py:obj:`~.protocol_api.OFF_DECK` as a location. This lets you prepare labware to be moved onto the deck later in a protocol. + - :py:meth:`.ProtocolContext.load_labware` also accepts :py:obj:`~.protocol_api.OFF_DECK` as a location. This lets you prepare labware to be moved onto the deck later in a protocol. + + - The new ``push_out`` parameter of the :py:meth:`.dispense` method helps ensure that the pipette dispenses all of its liquid when working with very small volumes. - By default, repeated calls to :py:meth:`.drop_tip` cycle through multiple locations above the trash bin to prevent tips from stacking up. @@ -212,10 +246,10 @@ If you specify an API version of ``2.13`` or lower, your protocols will continue because the plunger's speed is a stepwise function of the volume. Use :py:attr:`.InstrumentContext.flow_rate` to set the flow rate in µL/s, instead. - - ``ModuleContext.load_labware_object`` was removed as an unnecessary internal method. + - ``load_labware_object()`` was removed from module contexts as an unnecessary internal method. - - ``ModuleContext.geometry`` was removed in favor of - :py:attr:`.ModuleContext.model` and :py:attr:`.ModuleContext.type` + - ``geometry`` was removed from module contexts in favor of + ``model`` and ``type`` attributes. - ``Well.geometry`` was removed as unnecessary. @@ -292,7 +326,7 @@ Version 2.8 - You can now pass in a list of volumes to distribute and consolidate. See :ref:`distribute-consolidate-volume-list` for more information. - - Passing in a zero volume to any :ref:`v2-complex-commands` will result in no actions taken for aspirate or dispense + - Passing in a zero volume to any :ref:`complex command ` will result in no actions taken for aspirate or dispense - :py:meth:`.Well.from_center_cartesian` can be used to find a point within a well using normalized distance from the center in each axis. @@ -305,7 +339,7 @@ Version 2.8 Version 2.7 ----------- -- Added :py:meth:`.InstrumentContext.pair_with`, an experimental feature for moving both pipettes simultaneously. +- Added ``InstrumentContext.pair_with()``, an experimental feature for moving both pipettes simultaneously. .. note:: @@ -323,13 +357,13 @@ Version 2.6 - Protocols that manually configure pipette flow rates will be unaffected - - For a comparison between API Versions, see :ref:`defaults` + - For a comparison between API Versions, see :ref:`ot2-flow-rates` Version 2.5 ----------- -- New :ref:`new-utility-commands` were added: +- New :ref:`utility commands ` were added: - :py:meth:`.ProtocolContext.set_rail_lights`: turns robot rail lights on or off - :py:obj:`.ProtocolContext.rail_lights_on`: describes whether or not the rail lights are on @@ -353,7 +387,7 @@ Version 2.3 module gen2"`` and ``"temperature module gen2"``, respectively. - All pipettes will return tips to tip racks from a higher position to avoid possible collisions. -- During a :ref:`mix`, the pipette will no longer move up to clear the liquid in +- During a :py:meth:`.mix`, the pipette will no longer move up to clear the liquid in between every dispense and following aspirate. - You can now access the Temperature Module's status via :py:obj:`.TemperatureModuleContext.status`. diff --git a/api/mypy.ini b/api/mypy.ini index 56b8435855c..6cbbea90d34 100644 --- a/api/mypy.ini +++ b/api/mypy.ini @@ -4,7 +4,7 @@ show_error_codes = True warn_unused_configs = True strict = True # TODO(mc, 2021-09-12): work through and remove these exclusions -exclude = tests/opentrons/(hardware_control/test_.*py|hardware_control/integration/|hardware_control/emulation/|hardware_control/modules/|protocols/advanced_control/|protocols/api_support/|protocols/duration/|protocols/execution/|protocols/fixtures/|protocols/geometry/) +exclude = tests/opentrons/(hardware_control/test_(?!(ot3|module_control)).*py|hardware_control/integration/|hardware_control/emulation/|hardware_control/modules/|protocols/advanced_control/|protocols/api_support/|protocols/duration/|protocols/execution/|protocols/fixtures/|protocols/geometry/) [pydantic-mypy] init_forbid_extra = True diff --git a/api/release-notes-internal.md b/api/release-notes-internal.md index 07c68ac4749..f05cd2e2f1e 100644 --- a/api/release-notes-internal.md +++ b/api/release-notes-internal.md @@ -4,52 +4,31 @@ For more details about this release, please see the full [technical change log][ --- -# Internal Release 0.14.0 +# Internal Release 1.1.0 ## New Stuff In This Release -- Return tip heights and some other pipette behaviors are now properly executed based on the kind of tip being used -- Release Flex robot software builds are now cryptographically signed. If you run a release build, you can only install other properly signed release builds. Note that if the robot was previously on a non-release build this won't latch; remove the update server config file at ``/var/lib/otupdate/config.json`` to go back to signed builds only. -- Error handling has been overhauled; all errors now display with an error code for easier reporting. Many of those error codes are the 4000 catchall still but this will improve over time. -- If there's an error during the post-run cleanup steps, where the robot homes and drops tips, the run should no longer get stuck in a permanent "finishing" state. It should get marked as failed. -- Further updates to Flex motion control parameters from hardware testing for both gantry and plunger speeds and acceleration -- Pipette overpressure detection is now integrated. -- All instrument flows should now show errors if they occur instead of skipping a step -- Fixes to several incorrect status displays in ODD (i.e. protocols skipping the full-color outcome splash) -- Robot can now handle json protocol v7 -- Support for PVT (v1.1) grippers -- Update progress should get displayed after restart for firmware updates -- Removed `use_pick_up_location_lpc_offset` and `use_drop_location_lpc_offset` from `protocol_context.move_labware` arguments. So they should be removed from any protocols that used them. This change also requires resetting the protocol run database on the robot. -- Added 'contextual' gripper offsets to deck, labware and module definitions. So, any labware movement offsets that were previously being specified in the protocol should now be removed or adjusted or they will get added twice. - - -## Big Things That Don't Work Yet So Don't Report Bugs About Them - -### Robot Control -- Pipette pressure sensing for liquid-level sensing purposes -- Labware pick up failure with gripper -- E-stop integrated handling especially with modules - -## Big Things That Do Work Please Do Report Bugs About Them -### Robot Control -- Protocol behavior -- Labware movement between slots/modules, both manual and with gripper, from python protocols -- Labware drop/gripper crash errors, but they're very insensitive -- Pipette and gripper automated offset calibration -- Network connectivity and discoverability -- Firmware update for all devices -- Cancelling a protocol run. We're even more sure we fixed this so definitely tell us if it's not. -- USB connectivity -- Stall detection firing basically ever unless you clearly ran into something - -### ODD -- Protocol execution including end-of-protocol screen -- Protocol run monitoring -- Attach and calibrate -- Network connection management, including viewing IP addresses and connecting to wifi networks -- Automatic updates of robot software when new internal releases are created -- Chrome remote devtools - if you enable them and then use Chrome to go to robotip:9223 you'll get devtools -- After a while, the ODD should go into idle; if you touch it, it will come back online +This is a tracking internal release coming off of the edge branch to contain rapid dev on new features for 7.1.0. Features will change drastically between successive alphas even over the course of the day. For this reason, these release notes will not be in their usual depth. +The biggest new features, however, are +- There is a new protocol API version, 2.16, which changes how the default trash is loaded and gates features like partial tip pickup and waste chute usage: + - Protocols do not load a trash by default. To load the normal trash, load ``opentrons_1_trash_3200ml_fixed`` in slot ``A3``. + - But also you can load it in any other edge slot if you want (columns 1 and 3). + - Protocols can load trash chutes; the details of exactly how this works are still in flux. + - Protocols can configure their 96 and 8 channel pipettes to pick up only a subset of tips using ``configure_nozzle_layout``. +- Support for json protocol V8 and command V8, which adds JSON protocol support for the above features. +- ODD support for rendering the above features in protocols +- ODD support for configuring the loaded deck fixtures like trash chutes +- Labware position check now uses the calibration probe (the same one used for pipette and module calibration) instead of a tip; this should increase the accuracy of LPC. +- Support for P1000S v3.6 +- Updated liquid handling functions for all 96 channel pipettes +## Known Issues +- The ``MoveToAddressableArea`` command will noop. This means that all commands that use the movable trash bin will not "move to the trash bin". The command will analyze successfully. +- The deck configuration on the robot is not persistent, this means that between boots of a robot, you must PUT a deck configuration on the robot via HTTP. + +## Other changes + +- Protocol engine now does not allow loading any items in locations (whether deck slot/ module/ adapter) that are already occupied. +Previously there were gaps in our checks for this in the API. Also, one could write HTTP/ JSON protocols (not PD generated) that loaded multiple items in a given location. Protocols were most likely exploiting this loophole to perform labware movement prior to DSM support. They should now use the correct labware movement API instead. diff --git a/api/release-notes.md b/api/release-notes.md index 8251770fad6..e1f872563de 100644 --- a/api/release-notes.md +++ b/api/release-notes.md @@ -6,6 +6,81 @@ log][]. For a list of currently known issues, please see the [Opentrons issue tr --- +## Opentrons Robot Software Changes in [!!EDIT ME WITH THE ACTUAL NUMBER OF THE NEXT RELEASE!!] + +### HTTP API + +- In the `/runs/commands`, `/maintenance_runs/commands`, and `/protocols` endpoints, the `dispense` command will now return an error if you try to dispense more than you've aspirated, instead of silently clamping. +- The `/notifications/subscribe` WebSocket endpoint has been removed. See https://github.com/Opentrons/opentrons/pull/14280 for details. +- The `/runs/commands` endpoints are significantly faster when you request a small number of commands from a stored run. + +### Other Changes + +- The `notify_server` Python package has been removed. See https://github.com/Opentrons/opentrons/pull/14280 for details. + +### Upgrade Notes + +This update may take longer than usual if your robot has a lot of long protocols and runs stored on it. Allow **approximately 25 minutes** for your robot to restart. This delay will only happen once. + +If you don't care about preserving your labware offsets and run history, you can avoid the delay. Clear your runs and protocols before starting this update. Go to **Robot Settings** > **Device Reset** and select **Clear protocol run history**. + +--- + +## Opentrons Robot Software Changes in 7.1.1 + +Welcome to the v7.1.1 release of the Opentrons robot software! + +### Bug Fixes + +- Fixed an issue with the pipette definition for Flex 1-Channel 1000 µL pipettes. + +--- + +## Opentrons Robot Software Changes in 7.1.0 + +Welcome to the v7.1.0 release of the Opentrons robot software! This release includes support for deck configuration on Opentrons Flex, partial tip pickup with the Flex 96-Channel Pipette, and other improvements. + +### New Features + +- Pick up either a column of 8 tips or all 96 tips with the Flex 96-Channel Pipette. +- Specify the deck configuration of Flex, including the movable trash bin, waste chute, and staging area slots. +- Use the Flex Gripper to drop labware into the waste chute, or use Flex pipettes to dispense liquid or drop tips into the waste chute. +- Manually prepare a pipette for aspiration, when required for your application. + +### Improved Features + +- The Ethernet port on Flex now supports direct connection to a computer. +- Improves aspirate, dispense, and mix behavior with volumes set to zero. +- The `opentrons_simulate` command-line tool now works with all Python API versions. + +### Known Issues + +JSON protocols created or modified with Protocol Designer v6.0.0 or higher can't be simulated with `opentrons_simulate`. + +--- + +## Opentrons Robot Software Changes in 7.0.2 + +The 7.0.2 hotfix release does not contain any changes to the robot software. + +### Known Issues + +JSON protocols created or modified with Protocol Designer v6.0.0 or higher can't be simulated with the `opentrons_simulate` command-line tool. + +--- + +## Opentrons Robot Software Changes in 7.0.1 + +Welcome to the v7.0.1 release of the Opentrons robot software! This release builds on the major release that added support for Opentrons Flex. + +This update may take longer than usual if you are updating from v6.x. Allow **approximately 15 minutes** for your robot to restart. This delay will only happen once. + +### Known Issues + +JSON protocols created or modified with Protocol Designer v6.0.0 or higher can't be simulated with the `opentrons_simulate` command-line tool. + +--- + ## Opentrons Robot Software Changes in 7.0.0 Welcome to the v7.0.0 release of the Opentrons robot software! This release adds support for the Opentrons Flex robot, instruments, modules, and labware. @@ -21,7 +96,7 @@ Flex touchscreen - Manage instruments: View information about connected pipettes and the gripper. Attach, detach, or recalibrate instruments. - Robot settings: Customize the behavior of your Flex, including the LED and touchscreen displays. -Flex features +Flex features - Analyze and run protocols that use the Flex robot, Flex pipettes, and Flex tip racks. - Move labware around the deck automatically with the Flex Gripper. @@ -32,6 +107,7 @@ Python API features - Manually move labware around, off of, or onto the deck without ending your protocol. - Load adapters separately from labware (to allow moving labware onto or off of the adapter). - Use coordinate or numeric deck slot names interchangeably. +- Set 50 µL pipettes to a low-volume mode for handling very small quantities of liquid. ### Improved Features @@ -40,6 +116,7 @@ Python API features ### Bug Fixes +- Fixed a problem with empty files being stored in the robot's database if the robot is power cycled at the wrong time. - The API no longer raises an error when dropping tips into labware other than the fixed trash. - All API versions now properly track tips, including starting at a well other than A1. diff --git a/api/setup.py b/api/setup.py index ec02586992e..ae53321ca22 100755 --- a/api/setup.py +++ b/api/setup.py @@ -46,7 +46,6 @@ def get_version(): "Intended Audience :: Science/Research", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", @@ -61,16 +60,21 @@ def get_version(): INSTALL_REQUIRES = [ f"opentrons-shared-data=={VERSION}", "aionotify==0.2.0", - "anyio==3.3.0", - "jsonschema==3.0.2", - "numpy>=1.15.1,<2", - "pydantic==1.8.2", - "pyserial==3.5", + "anyio>=3.6.1,<4.0.0", + "jsonschema>=3.0.1,<4.18.0", + "numpy>=1.20.0,<2", + "pydantic>=1.10.9,<2.0.0", + "pyserial>=3.5", "typing-extensions>=4.0.0,<5", "click>=8.0.0,<9", 'importlib-metadata >= 1.0 ; python_version < "3.8"', ] +EXTRAS = { + "ot2-hardware": [f"opentrons-hardware=={VERSION}"], + "flex-hardware": [f"opentrons-hardware[FLEX]=={VERSION}"], +} + def read(*parts): """ @@ -83,7 +87,7 @@ def read(*parts): if __name__ == "__main__": setup( - python_requires=">=3.7", + python_requires=">=3.8", name=DISTNAME, description=DESCRIPTION, license=LICENSE, @@ -98,6 +102,7 @@ def read(*parts): zip_safe=False, classifiers=CLASSIFIERS, install_requires=INSTALL_REQUIRES, + extras_require=EXTRAS, include_package_data=True, package_dir={"": "src"}, package_data={"opentrons": ["py.typed"]}, diff --git a/api/src/opentrons/__init__.py b/api/src/opentrons/__init__.py index 7240dcfbb76..ac4e0c54262 100755 --- a/api/src/opentrons/__init__.py +++ b/api/src/opentrons/__init__.py @@ -10,6 +10,7 @@ API as HardwareAPI, ThreadManager, ThreadManagedHardware, + types as hw_types, ) from opentrons.config import ( @@ -118,6 +119,7 @@ async def _create_thread_manager() -> ThreadManagedHardware: use_usb_bus=ff.rear_panel_integration(), threadmanager_nonblocking=True, status_bar_enabled=ff.status_bar_enabled(), + feature_flags=hw_types.HardwareFeatureFlags.build_from_ff(), ) else: thread_manager = ThreadManager( @@ -125,6 +127,7 @@ async def _create_thread_manager() -> ThreadManagedHardware: threadmanager_nonblocking=True, port=_get_motor_control_serial_port(), firmware=_find_smoothie_file(), + feature_flags=hw_types.HardwareFeatureFlags.build_from_ff(), ) try: diff --git a/api/src/opentrons/_version.py b/api/src/opentrons/_version.py index 385f024a111..6b26eac4ce5 100644 --- a/api/src/opentrons/_version.py +++ b/api/src/opentrons/_version.py @@ -9,7 +9,7 @@ import importlib_metadata as metadata # type: ignore[no-redef] try: - version: str = metadata.version("opentrons") # type: ignore[attr-defined] + version: str = metadata.version("opentrons") except Exception as e: logging.warning( "Could not determine version for opentrons, may be dev install, using 0.0.0-dev" diff --git a/api/src/opentrons/calibration_storage/__init__.py b/api/src/opentrons/calibration_storage/__init__.py index 5daf55b660a..1ddbfdd1582 100644 --- a/api/src/opentrons/calibration_storage/__init__.py +++ b/api/src/opentrons/calibration_storage/__init__.py @@ -1,8 +1,11 @@ -from opentrons import config - -from .ot3 import ot3_gripper_offset +from .ot3 import gripper_offset from .ot2 import mark_bad_calibration +from .deck_configuration import ( + serialize_deck_configuration, + deserialize_deck_configuration, +) + # TODO these functions are only used in robot server. We should think about moving them and/or # abstracting it away from a robot specific function. We should also check if the tip rack # definition information is still needed. @@ -23,47 +26,10 @@ delete_robot_deck_attitude, ) -if config.feature_flags.enable_ot3_hardware_controller(): - from .ot3.pipette_offset import ( - save_pipette_calibration, - clear_pipette_offset_calibrations, - get_pipette_offset, - delete_pipette_offset_file, - ) - from .ot3.tip_length import ( - clear_tip_length_calibration, - create_tip_length_data, - save_tip_length_calibration, - tip_lengths_for_pipette, - load_tip_length_calibration, - delete_tip_length_calibration, - ) - from .ot3 import models - from .ot3.module_offset import ( - save_module_calibration, - clear_module_offset_calibrations, - get_module_offset, - delete_module_offset_file, - load_all_module_offsets, - ) -else: - from .ot2.pipette_offset import ( - save_pipette_calibration, - clear_pipette_offset_calibrations, - get_pipette_offset, - delete_pipette_offset_file, - ) - from .ot2.tip_length import ( - clear_tip_length_calibration, - create_tip_length_data, - save_tip_length_calibration, - tip_lengths_for_pipette, - load_tip_length_calibration, - delete_tip_length_calibration, - ) - from .ot2 import models # type: ignore[no-redef] +from . import ot2, ot3, helpers __all__ = [ + "helpers", # deck calibration functions "save_robot_deck_attitude", "get_robot_deck_attitude", @@ -71,31 +37,18 @@ "save_robot_belt_attitude", "get_robot_belt_attitude", "delete_robot_belt_attitude", - # pipette calibration functions - "save_pipette_calibration", - "get_pipette_offset", - "clear_pipette_offset_calibrations", - "delete_pipette_offset_file", - # tip length calibration functions - "clear_tip_length_calibration", - "create_tip_length_data", - "save_tip_length_calibration", - "tip_lengths_for_pipette", - "delete_tip_length_calibration", - "load_tip_length_calibration", - # module calibration functions - "save_module_calibration", - "clear_module_offset_calibrations", - "get_module_offset", - "delete_module_offset_file", - "load_all_module_offsets", + # deck configuration functions + "serialize_deck_configuration", + "deserialize_deck_configuration", # functions only used in robot server "_save_custom_tiprack_definition", "get_custom_tiprack_definition_for_tlc", "get_all_pipette_offset_calibrations", "get_all_tip_length_calibrations", # file exports - "models", - "ot3_gripper_offset", + "gripper_offset", "mark_bad_calibration", + # Platform specific submodules + "ot2", + "ot3", ] diff --git a/api/src/opentrons/calibration_storage/deck_configuration.py b/api/src/opentrons/calibration_storage/deck_configuration.py new file mode 100644 index 00000000000..31410403d35 --- /dev/null +++ b/api/src/opentrons/calibration_storage/deck_configuration.py @@ -0,0 +1,57 @@ +from datetime import datetime +from typing import List, Optional, Tuple + +import pydantic + +from .types import CutoutFixturePlacement +from . import file_operators as io + + +class _CutoutFixturePlacementModel(pydantic.BaseModel): + cutoutId: str + cutoutFixtureId: str + + +class _DeckConfigurationModel(pydantic.BaseModel): + """The on-filesystem representation of a deck configuration.""" + + cutoutFixtures: List[_CutoutFixturePlacementModel] + lastModified: datetime + + +def serialize_deck_configuration( + cutout_fixture_placements: List[CutoutFixturePlacement], last_modified: datetime +) -> bytes: + """Serialize a deck configuration for storing on the filesystem.""" + data = _DeckConfigurationModel.construct( + cutoutFixtures=[ + _CutoutFixturePlacementModel.construct( + cutoutId=e.cutout_id, cutoutFixtureId=e.cutout_fixture_id + ) + for e in cutout_fixture_placements + ], + lastModified=last_modified, + ) + return io.serialize_pydantic_model(data) + + +# TODO(mm, 2023-11-21): If the data is corrupt, we should propagate the underlying error. +# And there should be an enumerated "corrupt storage" error in shared-data. +def deserialize_deck_configuration( + serialized: bytes, +) -> Optional[Tuple[List[CutoutFixturePlacement], datetime]]: + """Deserialize bytes previously serialized by `serialize_deck_configuration()`. + + Returns a tuple `(deck_configuration, last_modified_time)`, or `None` if the data is corrupt. + """ + parsed = io.deserialize_pydantic_model(serialized, _DeckConfigurationModel) + if parsed is None: + return None + else: + cutout_fixture_placements = [ + CutoutFixturePlacement( + cutout_id=e.cutoutId, cutout_fixture_id=e.cutoutFixtureId + ) + for e in parsed.cutoutFixtures + ] + return cutout_fixture_placements, parsed.lastModified diff --git a/api/src/opentrons/calibration_storage/file_operators.py b/api/src/opentrons/calibration_storage/file_operators.py index 3ec91cb25b5..70c16297ecd 100644 --- a/api/src/opentrons/calibration_storage/file_operators.py +++ b/api/src/opentrons/calibration_storage/file_operators.py @@ -5,15 +5,20 @@ module, except in the special case of v2 labware support in the v1 API. """ -import json import datetime +import json +import logging import typing -from pydantic import BaseModel from pathlib import Path +import pydantic + from .encoder_decoder import DateTimeEncoder, DateTimeDecoder +_log = logging.getLogger(__name__) + + DecoderType = typing.Type[json.JSONDecoder] EncoderType = typing.Type[json.JSONEncoder] @@ -27,8 +32,9 @@ def delete_file(path: Path) -> None: pass +# TODO: This is private but used by other files. def _remove_json_files_in_directories(p: Path) -> None: - """Delete json file by the path""" + """Delete .json files in the given directory and its subdirectories.""" for item in p.iterdir(): if item.is_dir(): _remove_json_files_in_directories(item) @@ -47,12 +53,12 @@ def _assert_last_modified_value(calibration_dict: typing.Dict[str, typing.Any]) def read_cal_file( - filepath: Path, decoder: DecoderType = DateTimeDecoder + file_path: Path, decoder: DecoderType = DateTimeDecoder ) -> typing.Dict[str, typing.Any]: """ Function used to read data from a file - :param filepath: path to look for data at + :param file_path: path to look for data at :param decoder: if there is any specialized decoder needed. The default decoder is the date time decoder. :return: Data from the file @@ -63,7 +69,7 @@ def read_cal_file( # This can be done when the labware endpoints # are refactored to grab tip length calibration # from the correct locations. - with open(filepath, "r") as f: + with open(file_path, "r", encoding="utf-8") as f: calibration_data = typing.cast( typing.Dict[str, typing.Any], json.load(f, cls=decoder), @@ -76,22 +82,61 @@ def read_cal_file( def save_to_file( - directorypath: Path, + directory_path: Path, + # todo(mm, 2023-11-15): This file_name argument does not include the file + # extension, which is inconsistent with read_cal_file(). The two should match. file_name: str, - data: typing.Union[BaseModel, typing.Dict[str, typing.Any], typing.Any], + data: typing.Union[pydantic.BaseModel, typing.Dict[str, typing.Any], typing.Any], encoder: EncoderType = DateTimeEncoder, ) -> None: """ Function used to save data to a file - :param filepath: path to save data at - :param data: data to save + :param directory_path: path to the directory in which to save the data + :param file_name: name of the file within the directory, *without the extension*. + :param data: The data to save. Either a Pydantic model, or a JSON-like dict to pass to + `json.dumps()`. If you're storing a Pydantic model, prefer `save_pydantic_model_to_file()` + and `read_pydantic_model_from_file()` for new code. :param encoder: if there is any specialized encoder needed. The default encoder is the date time encoder. """ - directorypath.mkdir(parents=True, exist_ok=True) - filepath = directorypath / f"{file_name}.json" + directory_path.mkdir(parents=True, exist_ok=True) + file_path = directory_path / f"{file_name}.json" json_data = ( - data.json() if isinstance(data, BaseModel) else json.dumps(data, cls=encoder) + data.json() + if isinstance(data, pydantic.BaseModel) + else json.dumps(data, cls=encoder) ) - filepath.write_text(json_data, encoding="utf-8") + file_path.write_text(json_data, encoding="utf-8") + + +def serialize_pydantic_model(data: pydantic.BaseModel) -> bytes: + """Safely serialize data from a Pydantic model into a form suitable for storing on disk.""" + return data.json(by_alias=True).encode("utf-8") + + +_ModelT = typing.TypeVar("_ModelT", bound=pydantic.BaseModel) + + +# TODO(mm, 2023-11-20): We probably want to distinguish "missing file" from "corrupt file." +# The caller needs to deal with those cases separately because the appropriate action depends on +# context. For example, when running protocols through robot-server, if the file is corrupt, it's +# safe-ish to fall back to a default because the Opentrons App will let the user confirm everything +# before starting the run. But when running protocols through the non-interactive +# `opentrons_execute`, we don't want it to silently use default data if the file is corrupt. +def deserialize_pydantic_model( + serialized: bytes, + model: typing.Type[_ModelT], +) -> typing.Optional[_ModelT]: + """Safely read bytes from `serialize_pydantic_model()` back into a Pydantic model. + + Returns `None` if the file is missing or corrupt. + """ + try: + return model.parse_raw(serialized) + except json.JSONDecodeError: + _log.warning("Data is not valid JSON.", exc_info=True) + return None + except pydantic.ValidationError: + _log.warning(f"Data is malformed as a {model}.", exc_info=True) + return None diff --git a/api/src/opentrons/calibration_storage/helpers.py b/api/src/opentrons/calibration_storage/helpers.py index 011c3401bd3..b4cc6afe777 100644 --- a/api/src/opentrons/calibration_storage/helpers.py +++ b/api/src/opentrons/calibration_storage/helpers.py @@ -5,7 +5,7 @@ labware calibration to its designated file location. """ import json -from typing import Any, Union, List, Dict, TYPE_CHECKING, cast +from typing import Any, Union, List, Dict, TYPE_CHECKING, cast, Tuple from dataclasses import is_dataclass, asdict @@ -18,10 +18,7 @@ from opentrons_shared_data.pipette.dev_types import LabwareUri -DictionaryFactoryType = Union[List, Dict] - - -def dict_filter_none(data: DictionaryFactoryType) -> Dict[str, Any]: +def dict_filter_none(data: List[Tuple[str, Any]]) -> Dict[str, Any]: """ Helper function to filter out None keys from a dataclass before saving to file. diff --git a/api/src/opentrons/calibration_storage/ot2/__init__.py b/api/src/opentrons/calibration_storage/ot2/__init__.py index 504c84d0afd..821adc32bfa 100644 --- a/api/src/opentrons/calibration_storage/ot2/__init__.py +++ b/api/src/opentrons/calibration_storage/ot2/__init__.py @@ -1,10 +1,34 @@ from . import ( - models as ot2_models, + models, mark_bad_calibration, ) +from .pipette_offset import ( + save_pipette_calibration, + clear_pipette_offset_calibrations, + get_pipette_offset, + delete_pipette_offset_file, +) +from .tip_length import ( + clear_tip_length_calibration, + create_tip_length_data, + save_tip_length_calibration, + tip_lengths_for_pipette, + load_tip_length_calibration, + delete_tip_length_calibration, +) __all__ = [ - "ot2_models", + "models", "mark_bad_calibration", + "save_pipette_calibration", + "clear_pipette_offset_calibrations", + "get_pipette_offset", + "delete_pipette_offset_file", + "clear_tip_length_calibration", + "create_tip_length_data", + "save_tip_length_calibration", + "tip_lengths_for_pipette", + "load_tip_length_calibration", + "delete_tip_length_calibration", ] diff --git a/api/src/opentrons/calibration_storage/ot2/models/v1.py b/api/src/opentrons/calibration_storage/ot2/models/v1.py index d70f5731d41..98f7dadca1c 100644 --- a/api/src/opentrons/calibration_storage/ot2/models/v1.py +++ b/api/src/opentrons/calibration_storage/ot2/models/v1.py @@ -51,7 +51,7 @@ class DeckCalibrationModel(BaseModel): attitude: types.AttitudeMatrix = Field( ..., description="Attitude matrix for deck found from calibration." ) - last_modified: datetime = Field( + last_modified: typing.Optional[datetime] = Field( default=None, description="The last time this deck was calibrated." ) source: types.SourceType = Field( diff --git a/api/src/opentrons/calibration_storage/ot3/__init__.py b/api/src/opentrons/calibration_storage/ot3/__init__.py index 977ca8b9162..04806f5fe20 100644 --- a/api/src/opentrons/calibration_storage/ot3/__init__.py +++ b/api/src/opentrons/calibration_storage/ot3/__init__.py @@ -1,10 +1,31 @@ from . import ( - models as ot3_models, - gripper_offset as ot3_gripper_offset, + models, + gripper_offset as gripper_offset, +) +from .pipette_offset import ( + save_pipette_calibration, + clear_pipette_offset_calibrations, + get_pipette_offset, + delete_pipette_offset_file, +) +from .module_offset import ( + save_module_calibration, + clear_module_offset_calibrations, + get_module_offset, + delete_module_offset_file, + load_all_module_offsets, ) - __all__ = [ - "ot3_models", - "ot3_gripper_offset", + "models", + "gripper_offset", + "save_pipette_calibration", + "clear_pipette_offset_calibrations", + "get_pipette_offset", + "delete_pipette_offset_file", + "save_module_calibration", + "clear_module_offset_calibrations", + "get_module_offset", + "delete_module_offset_file", + "load_all_module_offsets", ] diff --git a/api/src/opentrons/calibration_storage/ot3/tip_length.py b/api/src/opentrons/calibration_storage/ot3/tip_length.py deleted file mode 100644 index 638560851aa..00000000000 --- a/api/src/opentrons/calibration_storage/ot3/tip_length.py +++ /dev/null @@ -1,181 +0,0 @@ -import json -import typing -import logging -from pydantic import ValidationError -from dataclasses import asdict - -from opentrons import config - -from .. import file_operators as io, helpers, types as local_types - -from opentrons.util.helpers import utc_now - - -from .models import v1 - -if typing.TYPE_CHECKING: - from opentrons_shared_data.labware.dev_types import LabwareDefinition - -log = logging.getLogger(__name__) -# Get Tip Length Calibration - - -def _conver_tip_length_model_to_dict( - to_dict: typing.Dict[str, v1.TipLengthModel] -) -> typing.Dict[str, typing.Any]: - # This is a workaround since pydantic doesn't have a nice way to - # add encoders when converting to a dict. - dict_of_tip_lengths = {} - for key, item in to_dict.items(): - dict_of_tip_lengths[key] = json.loads(item.json()) - return dict_of_tip_lengths - - -@typing.no_type_check -def tip_lengths_for_pipette( - pipette_id: str, -) -> typing.Dict[str, v1.TipLengthModel]: - tip_lengths = {} - try: - # While you technically could drop some data in for tip length calibration on the flex, - # it is not necessary and there is no UI frontend for it, so this code will mostly be - # taking the FileNotFoundError path. - tip_length_filepath = config.get_tip_length_cal_path() / f"{pipette_id}.json" - all_tip_lengths_for_pipette = io.read_cal_file(tip_length_filepath) - for tiprack, data in all_tip_lengths_for_pipette.items(): - try: - tip_lengths[tiprack] = v1.TipLengthModel(**data) - except (json.JSONDecodeError, ValidationError): - log.debug( - f"Tip length calibration is malformed for {tiprack} on {pipette_id}" - ) - pass - return tip_lengths - except FileNotFoundError: - # this is the overwhelmingly common case - return tip_lengths - - -@typing.no_type_check -def load_tip_length_calibration( - pip_id: str, definition: "LabwareDefinition" -) -> v1.TipLengthModel: - """ - Function used to grab the current tip length associated - with a particular tiprack. - - :param pip_id: pipette you are using - :param definition: full definition of the tiprack - """ - labware_hash = helpers.hash_labware_def(definition) - load_name = definition["parameters"]["loadName"] - try: - return tip_lengths_for_pipette(pip_id)[labware_hash] - except KeyError: - raise local_types.TipLengthCalNotFound( - f"Tip length of {load_name} has not been " - f"calibrated for this pipette: {pip_id} and cannot" - "be loaded" - ) - - -@typing.no_type_check -def create_tip_length_data( - definition: "LabwareDefinition", - length: float, - cal_status: typing.Optional[ - typing.Union[local_types.CalibrationStatus, v1.CalibrationStatus] - ] = None, -) -> typing.Dict[str, v1.TipLengthModel]: - """ - Function to correctly format tip length data. - - :param definition: full labware definition - :param length: the tip length to save - """ - labware_hash = helpers.hash_labware_def(definition) - labware_uri = helpers.uri_from_definition(definition) - - if isinstance(cal_status, local_types.CalibrationStatus): - cal_status_model = v1.CalibrationStatus(**asdict(cal_status)) - elif isinstance(cal_status, v1.CalibrationStatus): - cal_status_model = cal_status - else: - cal_status_model = v1.CalibrationStatus() - tip_length_data = v1.TipLengthModel( - tipLength=length, - lastModified=utc_now(), - source=local_types.SourceType.user, - status=cal_status_model, - uri=labware_uri, - ) - - data = {labware_hash: tip_length_data} - return data - - -# Delete Tip Length Calibration - - -@typing.no_type_check -def delete_tip_length_calibration(tiprack: str, pipette_id: str) -> None: - """ - Delete tip length calibration based on tiprack hash and - pipette serial number - - :param tiprack: tiprack hash - :param pipette: pipette serial number - """ - tip_lengths = tip_lengths_for_pipette(pipette_id) - if tiprack in tip_lengths: - # maybe make modify and delete same file? - del tip_lengths[tiprack] - tip_length_directory = config.get_tip_length_cal_path() - if tip_lengths: - dict_of_tip_lengths = _conver_tip_length_model_to_dict(tip_lengths) - io.save_to_file(tip_length_directory, pipette_id, dict_of_tip_lengths) - else: - io.delete_file(tip_length_directory / f"{pipette_id}.json") - else: - raise local_types.TipLengthCalNotFound( - f"Tip length for hash {tiprack} has not been " - f"calibrated for this pipette: {pipette_id} and cannot" - "be loaded" - ) - - -@typing.no_type_check -def clear_tip_length_calibration() -> None: - """ - Delete all tip length calibration files. - """ - offset_dir = config.get_tip_length_cal_path() - try: - io._remove_json_files_in_directories(offset_dir) - except FileNotFoundError: - pass - - -# Save Tip Length Calibration - - -@typing.no_type_check -def save_tip_length_calibration( - pip_id: str, - tip_length_cal: typing.Dict[str, v1.TipLengthModel], -) -> None: - """ - Function used to save tip length calibration to file. - - :param pip_id: pipette id to associate with this tip length - :param tip_length_cal: results of the data created using - :meth:`create_tip_length_data` - """ - tip_length_dir_path = config.get_tip_length_cal_path() - - all_tip_lengths = tip_lengths_for_pipette(pip_id) - - all_tip_lengths.update(tip_length_cal) - - dict_of_tip_lengths = _conver_tip_length_model_to_dict(all_tip_lengths) - io.save_to_file(tip_length_dir_path, pip_id, dict_of_tip_lengths) diff --git a/api/src/opentrons/calibration_storage/types.py b/api/src/opentrons/calibration_storage/types.py index 03aacab252a..fd1bfbd5e2e 100644 --- a/api/src/opentrons/calibration_storage/types.py +++ b/api/src/opentrons/calibration_storage/types.py @@ -34,3 +34,11 @@ class UriDetails: namespace: str load_name: str version: int + + +# TODO(mm, 2023-11-20): Deduplicate this with similar types in robot_server +# and opentrons.protocol_engine. +@dataclass +class CutoutFixturePlacement: + cutout_fixture_id: str + cutout_id: str diff --git a/api/src/opentrons/cli/analyze.py b/api/src/opentrons/cli/analyze.py index 9f5af67c584..4ee9f6507af 100644 --- a/api/src/opentrons/cli/analyze.py +++ b/api/src/opentrons/cli/analyze.py @@ -79,7 +79,7 @@ async def _analyze( runner = await create_simulating_runner( robot_type=protocol_source.robot_type, protocol_config=protocol_source.config ) - analysis = await runner.run(protocol_source) + analysis = await runner.run(deck_configuration=[], protocol_source=protocol_source) if json_output: results = AnalyzeResults.construct( @@ -145,10 +145,16 @@ class AnalyzeResults(BaseModel): See robot-server's analysis models for field documentation. """ + # We want to unify this local analysis model with the one that robot-server returns. + # Until that happens, we need to keep these fields in sync manually. + + # Fields that are currently unique to this local analysis module, missing from robot-server: createdAt: datetime files: List[ProtocolFile] config: Union[JsonConfig, PythonConfig] metadata: Dict[str, Any] + + # Fields that should match robot-server: robotType: RobotType commands: List[Command] labware: List[LoadedLabware] diff --git a/api/src/opentrons/commands/commands.py b/api/src/opentrons/commands/commands.py index ffbb9cba82b..b2c635d75d2 100755 --- a/api/src/opentrons/commands/commands.py +++ b/api/src/opentrons/commands/commands.py @@ -2,10 +2,12 @@ from typing import TYPE_CHECKING, List, Union, overload -from .helpers import stringify_location, listify +from .helpers import stringify_location, stringify_disposal_location, listify from . import types as command_types from opentrons.types import Location +from opentrons.protocol_api._trash_bin import TrashBin +from opentrons.protocol_api._waste_chute import WasteChute if TYPE_CHECKING: from opentrons.protocol_api import InstrumentContext @@ -63,6 +65,28 @@ def dispense( } +def dispense_in_disposal_location( + instrument: InstrumentContext, + volume: float, + location: Union[TrashBin, WasteChute], + flow_rate: float, + rate: float, +) -> command_types.DispenseInDisposalLocationCommand: + location_text = stringify_disposal_location(location) + text = f"Dispensing {float(volume)} uL into {location_text} at {flow_rate} uL/sec" + + return { + "name": command_types.DISPENSE_IN_DISPOSAL_LOCATION, + "payload": { + "instrument": instrument, + "volume": volume, + "location": location, + "rate": rate, + "text": text, + }, + } + + def consolidate( instrument: InstrumentContext, volume: Union[float, List[float]], @@ -190,6 +214,18 @@ def blow_out( } +def blow_out_in_disposal_location( + instrument: InstrumentContext, location: Union[TrashBin, WasteChute] +) -> command_types.BlowOutInDisposalLocationCommand: + location_text = stringify_disposal_location(location) + text = f"Blowing out into {location_text}" + + return { + "name": command_types.BLOW_OUT_IN_DISPOSAL_LOCATION, + "payload": {"instrument": instrument, "location": location, "text": text}, + } + + def touch_tip(instrument: InstrumentContext) -> command_types.TouchTipCommand: text = "Touching tip" @@ -231,6 +267,17 @@ def drop_tip( } +def drop_tip_in_disposal_location( + instrument: InstrumentContext, location: Union[TrashBin, WasteChute] +) -> command_types.DropTipInDisposalLocationCommand: + location_text = stringify_disposal_location(location) + text = f"Dropping tip into {location_text}" + return { + "name": command_types.DROP_TIP_IN_DISPOSAL_LOCATION, + "payload": {"instrument": instrument, "location": location, "text": text}, + } + + def move_to( instrument: InstrumentContext, location: Location, @@ -241,3 +288,15 @@ def move_to( "name": command_types.MOVE_TO, "payload": {"instrument": instrument, "location": location, "text": text}, } + + +def move_to_disposal_location( + instrument: InstrumentContext, + location: Union[TrashBin, WasteChute], +) -> command_types.MoveToDisposalLocationCommand: + location_text = stringify_disposal_location(location) + text = f"Moving to {location_text}" + return { + "name": command_types.MOVE_TO_DISPOSAL_LOCATION, + "payload": {"instrument": instrument, "location": location, "text": text}, + } diff --git a/api/src/opentrons/commands/helpers.py b/api/src/opentrons/commands/helpers.py index 96d41ed3f6a..b7ff02fa12b 100644 --- a/api/src/opentrons/commands/helpers.py +++ b/api/src/opentrons/commands/helpers.py @@ -1,7 +1,11 @@ from typing import List, Union -from opentrons.protocol_api.labware import Well -from opentrons.types import Location +from opentrons.protocol_api.labware import Well, Labware +from opentrons.protocol_api.module_contexts import ModuleContext +from opentrons.protocol_api._trash_bin import TrashBin +from opentrons.protocol_api._waste_chute import WasteChute +from opentrons.protocol_api._types import OffDeckType +from opentrons.types import Location, DeckLocation CommandLocation = Union[Location, Well] @@ -36,3 +40,36 @@ def _stringify_new_loc(loc: CommandLocation) -> str: def stringify_location(location: Union[CommandLocation, List[CommandLocation]]) -> str: loc_str_list = [_stringify_new_loc(loc) for loc in listify(location)] return ", ".join(loc_str_list) + + +def stringify_disposal_location(location: Union[TrashBin, WasteChute]) -> str: + if isinstance(location, TrashBin): + return f"Trash Bin on slot {location.location.id}" + elif isinstance(location, WasteChute): + return "Waste Chute" + + +def _stringify_labware_movement_location( + location: Union[DeckLocation, OffDeckType, Labware, ModuleContext, WasteChute] +) -> str: + if isinstance(location, (int, str)): + return f"slot {location}" + elif isinstance(location, OffDeckType): + return "off-deck" + elif isinstance(location, Labware): + return location.name + elif isinstance(location, ModuleContext): + return str(location) + elif isinstance(location, WasteChute): + return "Waste Chute" + + +def stringify_labware_movement_command( + source_labware: Labware, + destination: Union[DeckLocation, OffDeckType, Labware, ModuleContext, WasteChute], + use_gripper: bool, +) -> str: + source_labware_text = _stringify_labware_movement_location(source_labware) + destination_text = _stringify_labware_movement_location(destination) + gripper_text = " with gripper" if use_gripper else "" + return f"Moving {source_labware_text} to {destination_text}{gripper_text}" diff --git a/api/src/opentrons/commands/protocol_commands.py b/api/src/opentrons/commands/protocol_commands.py index e48dadc87b9..2b1b70bb0d9 100644 --- a/api/src/opentrons/commands/protocol_commands.py +++ b/api/src/opentrons/commands/protocol_commands.py @@ -45,3 +45,10 @@ def resume() -> command_types.ResumeCommand: "name": command_types.RESUME, "payload": {"text": "Resuming robot operation"}, } + + +def move_labware(text: str) -> command_types.MoveLabwareCommand: + return { + "name": command_types.MOVE_LABWARE, + "payload": {"text": text}, + } diff --git a/api/src/opentrons/commands/publisher.py b/api/src/opentrons/commands/publisher.py index 22b81f0b76f..e8ac35c429d 100644 --- a/api/src/opentrons/commands/publisher.py +++ b/api/src/opentrons/commands/publisher.py @@ -4,7 +4,7 @@ from typing import Any, Callable, Iterator, Optional, TypeVar, cast from uuid import uuid4 -from opentrons.broker import Broker +from opentrons.legacy_broker import LegacyBroker from .types import ( COMMAND as COMMAND_TOPIC, @@ -17,17 +17,17 @@ class CommandPublisher: """An object with a `Broker` dependency used to publish commands.""" - def __init__(self, broker: Optional[Broker]) -> None: + def __init__(self, broker: Optional[LegacyBroker]) -> None: """Initialize the publisher with a Broker.""" - self._broker = broker or Broker() + self._broker = broker or LegacyBroker() @property - def broker(self) -> Broker: + def broker(self) -> LegacyBroker: """Get the publisher's Broker.""" return self._broker @broker.setter - def broker(self, broker: Broker) -> None: + def broker(self, broker: LegacyBroker) -> None: """Set the publisher's Broker.""" self._broker = broker @@ -60,7 +60,7 @@ def _decorated(*args: Any, **kwargs: Any) -> Any: broker = getattr(args[0], "broker", None) assert isinstance( - broker, Broker + broker, LegacyBroker ), "Only methods of CommandPublisher classes should be decorated." func_sig = _inspect_signature(func) @@ -100,7 +100,7 @@ def _decorated(*args: Any, **kwargs: Any) -> Any: @contextmanager -def publish_context(broker: Broker, command: CommandPayload) -> Iterator[None]: +def publish_context(broker: LegacyBroker, command: CommandPayload) -> Iterator[None]: """Publish messages before and after the `with` block has run. If an `error` is raised in the `with` block, it will be published in the "after" @@ -131,7 +131,7 @@ def _inspect_signature(func: Callable[..., Any]) -> inspect.Signature: def _do_publish( - broker: Broker, + broker: LegacyBroker, message_id: str, command: CommandPayload, when: MessageSequenceId, diff --git a/api/src/opentrons/commands/types.py b/api/src/opentrons/commands/types.py index 912ad1cc29d..e4438401282 100755 --- a/api/src/opentrons/commands/types.py +++ b/api/src/opentrons/commands/types.py @@ -7,6 +7,8 @@ if TYPE_CHECKING: from opentrons.protocol_api import InstrumentContext from opentrons.protocol_api.labware import Well + from opentrons.protocol_api._trash_bin import TrashBin + from opentrons.protocol_api._waste_chute import WasteChute from opentrons.types import Location @@ -21,22 +23,27 @@ PAUSE: Final = "command.PAUSE" RESUME: Final = "command.RESUME" COMMENT: Final = "command.COMMENT" +MOVE_LABWARE: Final = "command.MOVE_LABWARE" # Pipette # ASPIRATE: Final = "command.ASPIRATE" DISPENSE: Final = "command.DISPENSE" +DISPENSE_IN_DISPOSAL_LOCATION: Final = "command.DISPENSE_IN_DISPOSAL_LOCATION" MIX: Final = "command.MIX" CONSOLIDATE: Final = "command.CONSOLIDATE" DISTRIBUTE: Final = "command.DISTRIBUTE" TRANSFER: Final = "command.TRANSFER" PICK_UP_TIP: Final = "command.PICK_UP_TIP" DROP_TIP: Final = "command.DROP_TIP" +DROP_TIP_IN_DISPOSAL_LOCATION: Final = "command.DROP_TIP_IN_DISPOSAL_LOCATION" BLOW_OUT: Final = "command.BLOW_OUT" +BLOW_OUT_IN_DISPOSAL_LOCATION: Final = "command.BLOW_OUT_IN_DISPOSAL_LOCATION" AIR_GAP: Final = "command.AIR_GAP" TOUCH_TIP: Final = "command.TOUCH_TIP" RETURN_TIP: Final = "command.RETURN_TIP" MOVE_TO: Final = "command.MOVE_TO" +MOVE_TO_DISPOSAL_LOCATION: Final = "command.MOVE_TO_DISPOSAL_LOCATION" # Modules # @@ -372,6 +379,19 @@ class DispenseCommand(TypedDict): payload: AspirateDispenseCommandPayload +class DispenseInDisposalLocationCommandPayload( + TextOnlyPayload, SingleInstrumentPayload +): + location: Union[TrashBin, WasteChute] + volume: float + rate: float + + +class DispenseInDisposalLocationCommand(TypedDict): + name: Literal["command.DISPENSE_IN_DISPOSAL_LOCATION"] + payload: DispenseInDisposalLocationCommandPayload + + class ConsolidateCommandPayload( TextOnlyPayload, MultiLocationPayload, SingleInstrumentPayload ): @@ -431,6 +451,15 @@ class BlowOutCommand(TypedDict): payload: BlowOutCommandPayload +class BlowOutInDisposalLocationCommandPayload(TextOnlyPayload, SingleInstrumentPayload): + location: Union[TrashBin, WasteChute] + + +class BlowOutInDisposalLocationCommand(TypedDict): + name: Literal["command.BLOW_OUT_IN_DISPOSAL_LOCATION"] + payload: BlowOutInDisposalLocationCommandPayload + + class TouchTipCommandPayload(TextOnlyPayload, SingleInstrumentPayload): pass @@ -476,27 +505,57 @@ class DropTipCommand(TypedDict): payload: DropTipCommandPayload +class DropTipInDisposalLocationCommandPayload(TextOnlyPayload, SingleInstrumentPayload): + location: Union[TrashBin, WasteChute] + + +class DropTipInDisposalLocationCommand(TypedDict): + name: Literal["command.DROP_TIP_IN_DISPOSAL_LOCATION"] + payload: DropTipInDisposalLocationCommandPayload + + +class MoveToCommandPayload(TextOnlyPayload, SingleInstrumentPayload): + location: Location + + class MoveToCommand(TypedDict): name: Literal["command.MOVE_TO"] payload: MoveToCommandPayload -class MoveToCommandPayload(TextOnlyPayload, SingleInstrumentPayload): - location: Location +class MoveToDisposalLocationCommandPayload(TextOnlyPayload, SingleInstrumentPayload): + location: Union[TrashBin, WasteChute] + + +class MoveToDisposalLocationCommand(TypedDict): + name: Literal["command.MOVE_TO_DISPOSAL_LOCATION"] + payload: MoveToDisposalLocationCommandPayload + + +class MoveLabwareCommandPayload(TextOnlyPayload): + pass + + +class MoveLabwareCommand(TypedDict): + name: Literal["command.MOVE_LABWARE"] + payload: MoveLabwareCommandPayload Command = Union[ DropTipCommand, + DropTipInDisposalLocationCommand, PickUpTipCommand, ReturnTipCommand, AirGapCommand, TouchTipCommand, BlowOutCommand, + BlowOutInDisposalLocationCommand, MixCommand, TransferCommand, DistributeCommand, ConsolidateCommand, DispenseCommand, + DispenseInDisposalLocationCommand, AspirateCommand, HomeCommand, HeaterShakerSetTargetTemperatureCommand, @@ -528,6 +587,8 @@ class MoveToCommandPayload(TextOnlyPayload, SingleInstrumentPayload): DelayCommand, CommentCommand, MoveToCommand, + MoveToDisposalLocationCommand, + MoveLabwareCommand, ] @@ -556,14 +617,17 @@ class MoveToCommandPayload(TextOnlyPayload, SingleInstrumentPayload): AirGapCommandPayload, ReturnTipCommandPayload, DropTipCommandPayload, + DropTipInDisposalLocationCommandPayload, PickUpTipCommandPayload, TouchTipCommandPayload, BlowOutCommandPayload, + BlowOutInDisposalLocationCommandPayload, MixCommandPayload, TransferCommandPayload, DistributeCommandPayload, ConsolidateCommandPayload, AspirateDispenseCommandPayload, + DispenseInDisposalLocationCommandPayload, HomeCommandPayload, ThermocyclerExecuteProfileCommandPayload, ThermocyclerSetBlockTempCommandPayload, @@ -572,6 +636,8 @@ class MoveToCommandPayload(TextOnlyPayload, SingleInstrumentPayload): PauseCommandPayload, DelayCommandPayload, MoveToCommandPayload, + MoveToDisposalLocationCommandPayload, + MoveLabwareCommandPayload, ] @@ -588,10 +654,22 @@ class MoveToMessage(CommandMessageFields, MoveToCommand): pass +class MoveToDisposalLocationMessage( + CommandMessageFields, MoveToDisposalLocationCommand +): + pass + + class DropTipMessage(CommandMessageFields, DropTipCommand): pass +class DropTipInDisposalLocationMessage( + CommandMessageFields, DropTipInDisposalLocationCommand +): + pass + + class PickUpTipMessage(CommandMessageFields, PickUpTipCommand): pass @@ -612,6 +690,12 @@ class BlowOutMessage(CommandMessageFields, BlowOutCommand): pass +class BlowOutInDisposalLocationMessage( + CommandMessageFields, BlowOutInDisposalLocationCommand +): + pass + + class MixMessage(CommandMessageFields, MixCommand): pass @@ -632,6 +716,12 @@ class DispenseMessage(CommandMessageFields, DispenseCommand): pass +class DispenseInDisposalLocationMessage( + CommandMessageFields, DispenseInDisposalLocationCommand +): + pass + + class AspirateMessage(CommandMessageFields, AspirateCommand): pass @@ -784,18 +874,25 @@ class CommentMessage(CommandMessageFields, CommentCommand): pass +class MoveLabwareMessage(CommandMessageFields, MoveLabwareCommand): + pass + + CommandMessage = Union[ DropTipMessage, + DropTipInDisposalLocationMessage, PickUpTipMessage, ReturnTipMessage, AirGapMessage, TouchTipMessage, BlowOutMessage, + BlowOutInDisposalLocationMessage, MixMessage, TransferMessage, DistributeMessage, ConsolidateMessage, DispenseMessage, + DispenseInDisposalLocationMessage, AspirateMessage, HomeMessage, HeaterShakerSetTargetTemperatureMessage, @@ -826,4 +923,6 @@ class CommentMessage(CommandMessageFields, CommentCommand): PauseMessage, ResumeMessage, MoveToMessage, + MoveToDisposalLocationMessage, + MoveLabwareMessage, ] diff --git a/api/src/opentrons/config/__init__.py b/api/src/opentrons/config/__init__.py index 6429ae154fb..ce867677777 100644 --- a/api/src/opentrons/config/__init__.py +++ b/api/src/opentrons/config/__init__.py @@ -184,7 +184,7 @@ class ConfigElement(NamedTuple): "Deck Calibration", Path("deck_calibration.json"), ConfigElementType.FILE, - "The file storing the deck calibration", + "The file storing the deck calibration. Superseded in v4 by robot_calibration_dir.", ), ConfigElement( "log_dir", diff --git a/api/src/opentrons/config/advanced_settings.py b/api/src/opentrons/config/advanced_settings.py index 97629fcd2e9..feebbe1cb48 100644 --- a/api/src/opentrons/config/advanced_settings.py +++ b/api/src/opentrons/config/advanced_settings.py @@ -17,7 +17,6 @@ ) from opentrons.config import CONFIG, ARCHITECTURE, SystemArchitecture -from opentrons.system import log_control from opentrons_shared_data.robot.dev_types import RobotTypeEnum if TYPE_CHECKING: @@ -109,22 +108,6 @@ def __init__(self) -> None: robot_type=[RobotTypeEnum.OT2, RobotTypeEnum.FLEX], ) - async def on_change(self, value: Optional[bool]) -> None: - """Special side effect for this setting""" - if ARCHITECTURE == SystemArchitecture.BUILDROOT: - code, stdout, stderr = await log_control.set_syslog_level( - "emerg" if value else "info" - ) - if code != 0: - log.error( - f"Could not set log control: {code}: stdout={stdout}" - f" stderr={stderr}" - ) - raise SettingException( - f"Failed to set log upstreaming: {code}", "log-config-failure" - ) - await super().on_change(value) - class Setting(NamedTuple): value: Optional[bool] @@ -232,14 +215,8 @@ class Setting(NamedTuple): ), SettingDefinition( _id="disableOverpressureDetection", - title="Disable overpressure detection on pipettes.", - description="This setting disables overpressure detection on pipettes, do not turn this feature off unless recommended.", - robot_type=[RobotTypeEnum.FLEX], - ), - SettingDefinition( - _id="disableTipPresenceDetection", - title="Disable tip presence detection on pipettes.", - description="This setting disables tip presence detection on pipettes, do not turn this feature off unless recommended.", + title="Disable Flex pipette pressure sensing.", + description="When this setting is on, Flex will continue its activities regardless of pressure changes inside the pipette. Do not turn this setting on unless you are intentionally causing pressures over 8 kPa inside the pipette air channel.", robot_type=[RobotTypeEnum.FLEX], ), ] @@ -683,6 +660,14 @@ def _migrate28to29(previous: SettingsMap) -> SettingsMap: return newmap +def _migrate29to30(previous: SettingsMap) -> SettingsMap: + """Migrate to version 30 of the feature flags file. + + - Removes the disableTipPresenceDetection flag. + """ + return {k: v for k, v in previous.items() if "disableTipPresenceDetection" != k} + + _MIGRATIONS = [ _migrate0to1, _migrate1to2, @@ -713,6 +698,7 @@ def _migrate28to29(previous: SettingsMap) -> SettingsMap: _migrate26to27, _migrate27to28, _migrate28to29, + _migrate29to30, ] """ List of all migrations to apply, indexed by (version - 1). See _migrate below diff --git a/api/src/opentrons/config/containers/default-containers.json b/api/src/opentrons/config/containers/default-containers.json deleted file mode 100644 index 44824a024a4..00000000000 --- a/api/src/opentrons/config/containers/default-containers.json +++ /dev/null @@ -1,27097 +0,0 @@ -{ - "containers": { - "temperature-plate": { - "origin-offset": { - "x": 11.24, - "y": 14.34, - "z": 97 - }, - "locations":{} - }, - - "tube-rack-5ml-96": { - "locations": { - "A1": { - "y": 0, - "x": 0, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "B1": { - "y": 0, - "x": 18, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "C1": { - "y": 0, - "x": 36, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "D1": { - "y": 0, - "x": 54, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "E1": { - "y": 0, - "x": 72, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "F1": { - "y": 0, - "x": 90, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "G1": { - "y": 0, - "x": 108, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "H1": { - "y": 0, - "x": 126, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - - "A2": { - "y": 18, - "x": 0, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "B2": { - "y": 18, - "x": 18, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "C2": { - "y": 18, - "x": 36, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "D2": { - "y": 18, - "x": 54, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "E2": { - "y": 18, - "x": 72, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "F2": { - "y": 18, - "x": 90, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "G2": { - "y": 18, - "x": 108, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "H2": { - "y": 18, - "x": 126, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - - "A3": { - "y": 36, - "x": 0, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "B3": { - "y": 36, - "x": 18, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "C3": { - "y": 36, - "x": 36, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "D3": { - "y": 36, - "x": 54, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "E3": { - "y": 36, - "x": 72, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "F3": { - "y": 36, - "x": 90, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "G3": { - "y": 36, - "x": 108, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "H3": { - "y": 36, - "x": 126, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - - "A4": { - "y": 54, - "x": 0, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "B4": { - "y": 54, - "x": 18, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "C4": { - "y": 54, - "x": 36, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "D4": { - "y": 54, - "x": 54, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "E4": { - "y": 54, - "x": 72, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "F4": { - "y": 54, - "x": 90, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "G4": { - "y": 54, - "x": 108, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "H4": { - "y": 54, - "x": 126, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - - "A5": { - "y": 72, - "x": 0, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "B5": { - "y": 72, - "x": 18, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "C5": { - "y": 72, - "x": 36, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "D5": { - "y": 72, - "x": 54, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "E5": { - "y": 72, - "x": 72, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "F5": { - "y": 72, - "x": 90, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "G5": { - "y": 72, - "x": 108, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "H5": { - "y": 72, - "x": 126, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - - "A6": { - "y": 90, - "x": 0, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "B6": { - "y": 90, - "x": 18, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "C6": { - "y": 90, - "x": 36, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "D6": { - "y": 90, - "x": 54, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "E6": { - "y": 90, - "x": 72, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "F6": { - "y": 90, - "x": 90, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "G6": { - "y": 90, - "x": 108, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "H6": { - "y": 90, - "x": 126, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - - "A7": { - "y": 108, - "x": 0, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "B7": { - "y": 108, - "x": 18, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "C7": { - "y": 108, - "x": 36, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "D7": { - "y": 108, - "x": 54, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "E7": { - "y": 108, - "x": 72, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "F7": { - "y": 108, - "x": 90, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "G7": { - "y": 108, - "x": 108, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "H7": { - "y": 108, - "x": 126, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - - "A8": { - "y": 126, - "x": 0, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "B8": { - "y": 126, - "x": 18, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "C8": { - "y": 126, - "x": 36, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "D8": { - "y": 126, - "x": 54, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "E8": { - "y": 126, - "x": 72, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "F8": { - "y": 126, - "x": 90, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "G8": { - "y": 126, - "x": 108, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "H8": { - "y": 126, - "x": 126, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - - "A9": { - "y": 144, - "x": 0, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "B9": { - "y": 144, - "x": 18, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "C9": { - "y": 144, - "x": 36, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "D9": { - "y": 144, - "x": 54, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "E9": { - "y": 144, - "x": 72, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "F9": { - "y": 144, - "x": 90, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "G9": { - "y": 144, - "x": 108, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "H9": { - "y": 144, - "x": 126, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - - "A10": { - "y": 162, - "x": 0, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "B10": { - "y": 162, - "x": 18, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "C10": { - "y": 162, - "x": 36, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "D10": { - "y": 162, - "x": 54, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "E10": { - "y": 162, - "x": 72, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "F10": { - "y": 162, - "x": 90, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "G10": { - "y": 162, - "x": 108, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "H10": { - "y": 162, - "x": 126, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - - "A11": { - "y": 180, - "x": 0, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "B11": { - "y": 180, - "x": 18, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "C11": { - "y": 180, - "x": 36, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "D11": { - "y": 180, - "x": 54, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "E11": { - "y": 180, - "x": 72, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "F11": { - "y": 180, - "x": 90, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "G11": { - "y": 180, - "x": 108, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "H11": { - "y": 180, - "x": 126, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - - "A12": { - "y": 198, - "x": 0, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "B12": { - "y": 198, - "x": 18, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "C12": { - "y": 198, - "x": 36, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "D12": { - "y": 198, - "x": 54, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "E12": { - "y": 198, - "x": 72, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "F12": { - "y": 198, - "x": 90, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "G12": { - "y": 198, - "x": 108, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - }, - "H12": { - "y": 198, - "x": 126, - "z": 0, - "depth": 72, - "diameter": 15, - "total-liquid-volume": 5000 - } - - } - }, - - "tube-rack-2ml-9x9": { - "locations": { - "A1": { - "y": 0, - "x": 0, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "B1": { - "y": 0, - "x": 14.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "C1": { - "y": 0, - "x": 29.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "D1": { - "y": 0, - "x": 44.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "E1": { - "y": 0, - "x": 59, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "F1": { - "y": 0, - "x": 73.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "G1": { - "y": 0, - "x": 88.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "H1": { - "y": 0, - "x": 103.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "I1": { - "y": 0, - "x": 118, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - - "A2": { - "y": 14.75, - "x": 0, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "B2": { - "y": 14.75, - "x": 14.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "C2": { - "y": 14.75, - "x": 29.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "D2": { - "y": 14.75, - "x": 44.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "E2": { - "y": 14.75, - "x": 59, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "F2": { - "y": 14.75, - "x": 73.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "G2": { - "y": 14.75, - "x": 88.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "H2": { - "y": 14.75, - "x": 103.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "I2": { - "y": 14.75, - "x": 118, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - - "A3": { - "y": 29.5, - "x": 0, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "B3": { - "y": 29.5, - "x": 14.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "C3": { - "y": 29.5, - "x": 29.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "D3": { - "y": 29.5, - "x": 44.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "E3": { - "y": 29.5, - "x": 59, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "F3": { - "y": 29.5, - "x": 73.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "G3": { - "y": 29.5, - "x": 88.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "H3": { - "y": 29.5, - "x": 103.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "I3": { - "y": 29.5, - "x": 118, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - - "A4": { - "y": 44.25, - "x": 0, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "B4": { - "y": 44.25, - "x": 14.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "C4": { - "y": 44.25, - "x": 29.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "D4": { - "y": 44.25, - "x": 44.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "E4": { - "y": 44.25, - "x": 59, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "F4": { - "y": 44.25, - "x": 73.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "G4": { - "y": 44.25, - "x": 88.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "H4": { - "y": 44.25, - "x": 103.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "I4": { - "y": 44.25, - "x": 118, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - - "A5": { - "y": 59, - "x": 0, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "B5": { - "y": 59, - "x": 14.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "C5": { - "y": 59, - "x": 29.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "D5": { - "y": 59, - "x": 44.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "E5": { - "y": 59, - "x": 59, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "F5": { - "y": 59, - "x": 73.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "G5": { - "y": 59, - "x": 88.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "H5": { - "y": 59, - "x": 103.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "I5": { - "y": 59, - "x": 118, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - - "A6": { - "y": 73.75, - "x": 0, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "B6": { - "y": 73.75, - "x": 14.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "C6": { - "y": 73.75, - "x": 29.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "D6": { - "y": 73.75, - "x": 44.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "E6": { - "y": 73.75, - "x": 59, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "F6": { - "y": 73.75, - "x": 73.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "G6": { - "y": 73.75, - "x": 88.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "H6": { - "y": 73.75, - "x": 103.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "I6": { - "y": 73.75, - "x": 118, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - - "A7": { - "y": 88.5, - "x": 0, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "B7": { - "y": 88.5, - "x": 14.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "C7": { - "y": 88.5, - "x": 29.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "D7": { - "y": 88.5, - "x": 44.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "E7": { - "y": 88.5, - "x": 59, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "F7": { - "y": 88.5, - "x": 73.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "G7": { - "y": 88.5, - "x": 88.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "H7": { - "y": 88.5, - "x": 103.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "I7": { - "y": 88.5, - "x": 118, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - - "A8": { - "y": 103.25, - "x": 0, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "B8": { - "y": 103.25, - "x": 14.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "C8": { - "y": 103.25, - "x": 29.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "D8": { - "y": 103.25, - "x": 44.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "E8": { - "y": 103.25, - "x": 59, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "F8": { - "y": 103.25, - "x": 73.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "G8": { - "y": 103.25, - "x": 88.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "H8": { - "y": 103.25, - "x": 103.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "I8": { - "y": 103.25, - "x": 118, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - - "A9": { - "y": 118, - "x": 0, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "B9": { - "y": 118, - "x": 14.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "C9": { - "y": 118, - "x": 29.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "D9": { - "y": 118, - "x": 44.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "E9": { - "y": 118, - "x": 59, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "F9": { - "y": 118, - "x": 73.75, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "G9": { - "y": 118, - "x": 88.5, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "H9": { - "y": 118, - "x": 103.25, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - }, - "I9": { - "y": 118, - "x": 118, - "z": 0, - "depth": 45, - "diameter": 10, - "total-liquid-volume": 2000 - } - } - }, - "96-well-plate-20mm": { - "origin-offset": { - "x": 11.24, - "y": 14.34 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "B1": { - "x": 9, - "y": 0, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "C1": { - "x": 18, - "y": 0, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "D1": { - "x": 27, - "y": 0, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "E1": { - "x": 36, - "y": 0, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "F1": { - "x": 45, - "y": 0, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "G1": { - "x": 54, - "y": 0, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "H1": { - "x": 63, - "y": 0, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "A2": { - "x": 0, - "y": 9, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "B2": { - "x": 9, - "y": 9, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "C2": { - "x": 18, - "y": 9, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "D2": { - "x": 27, - "y": 9, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "E2": { - "x": 36, - "y": 9, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "F2": { - "x": 45, - "y": 9, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "G2": { - "x": 54, - "y": 9, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "H2": { - "x": 63, - "y": 9, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "A3": { - "x": 0, - "y": 18, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "B3": { - "x": 9, - "y": 18, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "C3": { - "x": 18, - "y": 18, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "D3": { - "x": 27, - "y": 18, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "E3": { - "x": 36, - "y": 18, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "F3": { - "x": 45, - "y": 18, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "G3": { - "x": 54, - "y": 18, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "H3": { - "x": 63, - "y": 18, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "A4": { - "x": 0, - "y": 27, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "B4": { - "x": 9, - "y": 27, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "C4": { - "x": 18, - "y": 27, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "D4": { - "x": 27, - "y": 27, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "E4": { - "x": 36, - "y": 27, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "F4": { - "x": 45, - "y": 27, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "G4": { - "x": 54, - "y": 27, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "H4": { - "x": 63, - "y": 27, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "A5": { - "x": 0, - "y": 36, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "B5": { - "x": 9, - "y": 36, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "C5": { - "x": 18, - "y": 36, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "D5": { - "x": 27, - "y": 36, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "E5": { - "x": 36, - "y": 36, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "F5": { - "x": 45, - "y": 36, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "G5": { - "x": 54, - "y": 36, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "H5": { - "x": 63, - "y": 36, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "A6": { - "x": 0, - "y": 45, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "B6": { - "x": 9, - "y": 45, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "C6": { - "x": 18, - "y": 45, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "D6": { - "x": 27, - "y": 45, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "E6": { - "x": 36, - "y": 45, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "F6": { - "x": 45, - "y": 45, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "G6": { - "x": 54, - "y": 45, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "H6": { - "x": 63, - "y": 45, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "A7": { - "x": 0, - "y": 54, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "B7": { - "x": 9, - "y": 54, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "C7": { - "x": 18, - "y": 54, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "D7": { - "x": 27, - "y": 54, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "E7": { - "x": 36, - "y": 54, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "F7": { - "x": 45, - "y": 54, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "G7": { - "x": 54, - "y": 54, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "H7": { - "x": 63, - "y": 54, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "A8": { - "x": 0, - "y": 63, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "B8": { - "x": 9, - "y": 63, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "C8": { - "x": 18, - "y": 63, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "D8": { - "x": 27, - "y": 63, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "E8": { - "x": 36, - "y": 63, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "F8": { - "x": 45, - "y": 63, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "G8": { - "x": 54, - "y": 63, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "H8": { - "x": 63, - "y": 63, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "A9": { - "x": 0, - "y": 72, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "B9": { - "x": 9, - "y": 72, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "C9": { - "x": 18, - "y": 72, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "D9": { - "x": 27, - "y": 72, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "E9": { - "x": 36, - "y": 72, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "F9": { - "x": 45, - "y": 72, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "G9": { - "x": 54, - "y": 72, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "H9": { - "x": 63, - "y": 72, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "A10": { - "x": 0, - "y": 81, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "B10": { - "x": 9, - "y": 81, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "C10": { - "x": 18, - "y": 81, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "D10": { - "x": 27, - "y": 81, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "E10": { - "x": 36, - "y": 81, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "F10": { - "x": 45, - "y": 81, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "G10": { - "x": 54, - "y": 81, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "H10": { - "x": 63, - "y": 81, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "A11": { - "x": 0, - "y": 90, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "B11": { - "x": 9, - "y": 90, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "C11": { - "x": 18, - "y": 90, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "D11": { - "x": 27, - "y": 90, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "E11": { - "x": 36, - "y": 90, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "F11": { - "x": 45, - "y": 90, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "G11": { - "x": 54, - "y": 90, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "H11": { - "x": 63, - "y": 90, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "A12": { - "x": 0, - "y": 99, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "B12": { - "x": 9, - "y": 99, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "C12": { - "x": 18, - "y": 99, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "D12": { - "x": 27, - "y": 99, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "E12": { - "x": 36, - "y": 99, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "F12": { - "x": 45, - "y": 99, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "G12": { - "x": 54, - "y": 99, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - }, - "H12": { - "x": 63, - "y": 99, - "z": 0, - "depth": 20.2, - "diameter": 5.46, - "total-liquid-volume": 300 - } - } - }, - "6-well-plate": { - "origin-offset": { - "x": 23.16, - "y": 24.76 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 17.4, - "diameter": 22.5, - "total-liquid-volume": 16800 - }, - "B1": { - "x": 39.12, - "y": 0, - "z": 0, - "depth": 17.4, - "diameter": 22.5, - "total-liquid-volume": 16800 - }, - "A2": { - "x": 0, - "y": 39.12, - "z": 0, - "depth": 17.4, - "diameter": 22.5, - "total-liquid-volume": 16800 - }, - "B2": { - "x": 39.12, - "y": 39.12, - "z": 0, - "depth": 17.4, - "diameter": 22.5, - "total-liquid-volume": 16800 - }, - "A3": { - "x": 0, - "y": 78.24, - "z": 0, - "depth": 17.4, - "diameter": 22.5, - "total-liquid-volume": 16800 - }, - "B3": { - "x": 39.12, - "y": 78.24, - "z": 0, - "depth": 17.4, - "diameter": 22.5, - "total-liquid-volume": 16800 - } - } - }, - "12-well-plate": { - "origin-offset": { - "x": 16.79, - "y": 24.94 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 17.53, - "diameter": 22.5, - "total-liquid-volume": 6900 - }, - "B1": { - "x": 26.01, - "y": 0, - "z": 0, - "depth": 17.53, - "diameter": 22.5, - "total-liquid-volume": 6900 - }, - "C1": { - "x": 52.02, - "y": 0, - "z": 0, - "depth": 17.53, - "diameter": 22.5, - "total-liquid-volume": 6900 - }, - "A2": { - "x": 0, - "y": 26.01, - "z": 0, - "depth": 17.53, - "diameter": 22.5, - "total-liquid-volume": 6900 - }, - "B2": { - "x": 26.01, - "y": 26.01, - "z": 0, - "depth": 17.53, - "diameter": 22.5, - "total-liquid-volume": 6900 - }, - "C2": { - "x": 52.02, - "y": 26.01, - "z": 0, - "depth": 17.53, - "diameter": 22.5, - "total-liquid-volume": 6900 - }, - "A3": { - "x": 0, - "y": 52.02, - "z": 0, - "depth": 17.53, - "diameter": 22.5, - "total-liquid-volume": 6900 - }, - "B3": { - "x": 26.01, - "y": 52.02, - "z": 0, - "depth": 17.53, - "diameter": 22.5, - "total-liquid-volume": 6900 - }, - "C3": { - "x": 52.02, - "y": 52.02, - "z": 0, - "depth": 17.53, - "diameter": 22.5, - "total-liquid-volume": 6900 - }, - "A4": { - "x": 0, - "y": 78.03, - "z": 0, - "depth": 17.53, - "diameter": 22.5, - "total-liquid-volume": 6900 - }, - "B4": { - "x": 26.01, - "y": 78.03, - "z": 0, - "depth": 17.53, - "diameter": 22.5, - "total-liquid-volume": 6900 - }, - "C4": { - "x": 52.02, - "y": 78.03, - "z": 0, - "depth": 17.53, - "diameter": 22.5, - "total-liquid-volume": 6900 - } - } - }, - "24-well-plate": { - "origin-offset": { - "x": 13.67, - "y": 15 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "B1": { - "x": 19.3, - "y": 0, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "C1": { - "x": 38.6, - "y": 0, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "D1": { - "x": 57.9, - "y": 0, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "A2": { - "x": 0, - "y": 19.3, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "B2": { - "x": 19.3, - "y": 19.3, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "C2": { - "x": 38.6, - "y": 19.3, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "D2": { - "x": 57.9, - "y": 19.3, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "A3": { - "x": 0, - "y": 38.6, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "B3": { - "x": 19.3, - "y": 38.6, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "C3": { - "x": 38.6, - "y": 38.6, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "D3": { - "x": 57.9, - "y": 38.6, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "A4": { - "x": 0, - "y": 57.9, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "B4": { - "x": 19.3, - "y": 57.9, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "C4": { - "x": 38.6, - "y": 57.9, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "D4": { - "x": 57.9, - "y": 57.9, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "A5": { - "x": 0, - "y": 77.2, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "B5": { - "x": 19.3, - "y": 77.2, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "C5": { - "x": 38.6, - "y": 77.2, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "D5": { - "x": 57.9, - "y": 77.2, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "A6": { - "x": 0, - "y": 96.5, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "B6": { - "x": 19.3, - "y": 96.5, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "C6": { - "x": 38.6, - "y": 96.5, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - }, - "D6": { - "x": 57.9, - "y": 96.5, - "z": 0, - "depth": 17.4, - "diameter": 16, - "total-liquid-volume": 1900 - } - } - }, - "48-well-plate": { - "origin-offset": { - "x": 10.08, - "y": 18.16 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "B1": { - "x": 13.08, - "y": 0, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "C1": { - "x": 26.16, - "y": 0, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "D1": { - "x": 39.24, - "y": 0, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "E1": { - "x": 52.32, - "y": 0, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "F1": { - "x": 65.4, - "y": 0, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "A2": { - "x": 0, - "y": 13.08, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "B2": { - "x": 13.08, - "y": 13.08, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "C2": { - "x": 26.16, - "y": 13.08, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "D2": { - "x": 39.24, - "y": 13.08, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "E2": { - "x": 52.32, - "y": 13.08, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "F2": { - "x": 65.4, - "y": 13.08, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "A3": { - "x": 0, - "y": 26.16, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "B3": { - "x": 13.08, - "y": 26.16, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "C3": { - "x": 26.16, - "y": 26.16, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "D3": { - "x": 39.24, - "y": 26.16, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "E3": { - "x": 52.32, - "y": 26.16, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "F3": { - "x": 65.4, - "y": 26.16, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "A4": { - "x": 0, - "y": 39.24, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "B4": { - "x": 13.08, - "y": 39.24, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "C4": { - "x": 26.16, - "y": 39.24, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "D4": { - "x": 39.24, - "y": 39.24, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "E4": { - "x": 52.32, - "y": 39.24, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "F4": { - "x": 65.4, - "y": 39.24, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "A5": { - "x": 0, - "y": 52.32, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "B5": { - "x": 13.08, - "y": 52.32, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "C5": { - "x": 26.16, - "y": 52.32, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "D5": { - "x": 39.24, - "y": 52.32, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "E5": { - "x": 52.32, - "y": 52.32, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "F5": { - "x": 65.4, - "y": 52.32, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "A6": { - "x": 0, - "y": 65.4, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "B6": { - "x": 13.08, - "y": 65.4, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "C6": { - "x": 26.16, - "y": 65.4, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "D6": { - "x": 39.24, - "y": 65.4, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "E6": { - "x": 52.32, - "y": 65.4, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "F6": { - "x": 65.4, - "y": 65.4, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "A7": { - "x": 0, - "y": 78.48, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "B7": { - "x": 13.08, - "y": 78.48, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "C7": { - "x": 26.16, - "y": 78.48, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "D7": { - "x": 39.24, - "y": 78.48, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "E7": { - "x": 52.32, - "y": 78.48, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "F7": { - "x": 65.4, - "y": 78.48, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "A8": { - "x": 0, - "y": 91.56, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "B8": { - "x": 13.08, - "y": 91.56, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "C8": { - "x": 26.16, - "y": 91.56, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "D8": { - "x": 39.24, - "y": 91.56, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "E8": { - "x": 52.32, - "y": 91.56, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - }, - "F8": { - "x": 65.4, - "y": 91.56, - "z": 0, - "depth": 17.4, - "diameter": 11.25, - "total-liquid-volume": 950 - } - } - }, - "trough-1row-25ml": { - "locations": { - "A1": { - "x": 42.75, - "y": 63.875, - "z": 0, - "depth": 26, - "diameter": 10, - "total-liquid-volume": 25000 - } - } - }, - "trough-1row-test": { - "locations": { - "A1": { - "x": 42.75, - "y": 63.875, - "z": 0, - "depth": 26, - "diameter": 10, - "total-liquid-volume": 25000 - } - } - }, - "hampton-1ml-deep-block": { - "origin-offset": { - "x": 11.24, - "y": 14.34 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "B1": { - "x": 9, - "y": 0, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "C1": { - "x": 18, - "y": 0, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "D1": { - "x": 27, - "y": 0, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "E1": { - "x": 36, - "y": 0, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "F1": { - "x": 45, - "y": 0, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "G1": { - "x": 54, - "y": 0, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "H1": { - "x": 63, - "y": 0, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "A2": { - "x": 0, - "y": 9, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "B2": { - "x": 9, - "y": 9, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "C2": { - "x": 18, - "y": 9, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "D2": { - "x": 27, - "y": 9, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "E2": { - "x": 36, - "y": 9, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "F2": { - "x": 45, - "y": 9, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "G2": { - "x": 54, - "y": 9, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "H2": { - "x": 63, - "y": 9, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "A3": { - "x": 0, - "y": 18, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "B3": { - "x": 9, - "y": 18, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "C3": { - "x": 18, - "y": 18, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "D3": { - "x": 27, - "y": 18, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "E3": { - "x": 36, - "y": 18, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "F3": { - "x": 45, - "y": 18, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "G3": { - "x": 54, - "y": 18, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "H3": { - "x": 63, - "y": 18, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "A4": { - "x": 0, - "y": 27, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "B4": { - "x": 9, - "y": 27, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "C4": { - "x": 18, - "y": 27, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "D4": { - "x": 27, - "y": 27, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "E4": { - "x": 36, - "y": 27, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "F4": { - "x": 45, - "y": 27, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "G4": { - "x": 54, - "y": 27, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "H4": { - "x": 63, - "y": 27, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "A5": { - "x": 0, - "y": 36, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "B5": { - "x": 9, - "y": 36, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "C5": { - "x": 18, - "y": 36, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "D5": { - "x": 27, - "y": 36, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "E5": { - "x": 36, - "y": 36, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "F5": { - "x": 45, - "y": 36, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "G5": { - "x": 54, - "y": 36, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "H5": { - "x": 63, - "y": 36, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "A6": { - "x": 0, - "y": 45, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "B6": { - "x": 9, - "y": 45, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "C6": { - "x": 18, - "y": 45, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "D6": { - "x": 27, - "y": 45, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "E6": { - "x": 36, - "y": 45, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "F6": { - "x": 45, - "y": 45, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "G6": { - "x": 54, - "y": 45, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "H6": { - "x": 63, - "y": 45, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "A7": { - "x": 0, - "y": 54, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "B7": { - "x": 9, - "y": 54, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "C7": { - "x": 18, - "y": 54, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "D7": { - "x": 27, - "y": 54, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "E7": { - "x": 36, - "y": 54, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "F7": { - "x": 45, - "y": 54, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "G7": { - "x": 54, - "y": 54, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "H7": { - "x": 63, - "y": 54, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "A8": { - "x": 0, - "y": 63, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "B8": { - "x": 9, - "y": 63, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "C8": { - "x": 18, - "y": 63, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "D8": { - "x": 27, - "y": 63, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "E8": { - "x": 36, - "y": 63, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "F8": { - "x": 45, - "y": 63, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "G8": { - "x": 54, - "y": 63, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "H8": { - "x": 63, - "y": 63, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "A9": { - "x": 0, - "y": 72, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "B9": { - "x": 9, - "y": 72, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "C9": { - "x": 18, - "y": 72, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "D9": { - "x": 27, - "y": 72, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "E9": { - "x": 36, - "y": 72, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "F9": { - "x": 45, - "y": 72, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "G9": { - "x": 54, - "y": 72, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "H9": { - "x": 63, - "y": 72, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "A10": { - "x": 0, - "y": 81, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "B10": { - "x": 9, - "y": 81, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "C10": { - "x": 18, - "y": 81, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "D10": { - "x": 27, - "y": 81, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "E10": { - "x": 36, - "y": 81, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "F10": { - "x": 45, - "y": 81, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "G10": { - "x": 54, - "y": 81, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "H10": { - "x": 63, - "y": 81, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "A11": { - "x": 0, - "y": 90, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "B11": { - "x": 9, - "y": 90, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "C11": { - "x": 18, - "y": 90, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "D11": { - "x": 27, - "y": 90, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "E11": { - "x": 36, - "y": 90, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "F11": { - "x": 45, - "y": 90, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "G11": { - "x": 54, - "y": 90, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "H11": { - "x": 63, - "y": 90, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "A12": { - "x": 0, - "y": 99, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "B12": { - "x": 9, - "y": 99, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "C12": { - "x": 18, - "y": 99, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "D12": { - "x": 27, - "y": 99, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "E12": { - "x": 36, - "y": 99, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "F12": { - "x": 45, - "y": 99, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "G12": { - "x": 54, - "y": 99, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - }, - "H12": { - "x": 63, - "y": 99, - "z": 0, - "depth": 38, - "diameter": 7.5, - "total-liquid-volume": 1000 - } - } - }, - - "rigaku-compact-crystallization-plate": { - "origin-offset": { - "x": 9, - "y": 11 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "B1": { - "x": 9, - "y": 0, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "C1": { - "x": 18, - "y": 0, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "D1": { - "x": 27, - "y": 0, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "E1": { - "x": 36, - "y": 0, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "F1": { - "x": 45, - "y": 0, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "G1": { - "x": 54, - "y": 0, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "H1": { - "x": 63, - "y": 0, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - - "A2": { - "x": 0, - "y": 9, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "B2": { - "x": 9, - "y": 9, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "C2": { - "x": 18, - "y": 9, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "D2": { - "x": 27, - "y": 9, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "E2": { - "x": 36, - "y": 9, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "F2": { - "x": 45, - "y": 9, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "G2": { - "x": 54, - "y": 9, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "H2": { - "x": 63, - "y": 9, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - - "A3": { - "x": 0, - "y": 18, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "B3": { - "x": 9, - "y": 18, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "C3": { - "x": 18, - "y": 18, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "D3": { - "x": 27, - "y": 18, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "E3": { - "x": 36, - "y": 18, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "F3": { - "x": 45, - "y": 18, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "G3": { - "x": 54, - "y": 18, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "H3": { - "x": 63, - "y": 18, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - - "A4": { - "x": 0, - "y": 27, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "B4": { - "x": 9, - "y": 27, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "C4": { - "x": 18, - "y": 27, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "D4": { - "x": 27, - "y": 27, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "E4": { - "x": 36, - "y": 27, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "F4": { - "x": 45, - "y": 27, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "G4": { - "x": 54, - "y": 27, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "H4": { - "x": 63, - "y": 27, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - - "A5": { - "x": 0, - "y": 36, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "B5": { - "x": 9, - "y": 36, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "C5": { - "x": 18, - "y": 36, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "D5": { - "x": 27, - "y": 36, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "E5": { - "x": 36, - "y": 36, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "F5": { - "x": 45, - "y": 36, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "G5": { - "x": 54, - "y": 36, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "H5": { - "x": 63, - "y": 36, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - - "A6": { - "x": 0, - "y": 45, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "B6": { - "x": 9, - "y": 45, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "C6": { - "x": 18, - "y": 45, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "D6": { - "x": 27, - "y": 45, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "E6": { - "x": 36, - "y": 45, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "F6": { - "x": 45, - "y": 45, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "G6": { - "x": 54, - "y": 45, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "H6": { - "x": 63, - "y": 45, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - - "A7": { - "x": 0, - "y": 54, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "B7": { - "x": 9, - "y": 54, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "C7": { - "x": 18, - "y": 54, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "D7": { - "x": 27, - "y": 54, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "E7": { - "x": 36, - "y": 54, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "F7": { - "x": 45, - "y": 54, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "G7": { - "x": 54, - "y": 54, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "H7": { - "x": 63, - "y": 54, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - - "A8": { - "x": 0, - "y": 63, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "B8": { - "x": 9, - "y": 63, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "C8": { - "x": 18, - "y": 63, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "D8": { - "x": 27, - "y": 63, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "E8": { - "x": 36, - "y": 63, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "F8": { - "x": 45, - "y": 63, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "G8": { - "x": 54, - "y": 63, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "H8": { - "x": 63, - "y": 63, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - - "A9": { - "x": 0, - "y": 72, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "B9": { - "x": 9, - "y": 72, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "C9": { - "x": 18, - "y": 72, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "D9": { - "x": 27, - "y": 72, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "E9": { - "x": 36, - "y": 72, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "F9": { - "x": 45, - "y": 72, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "G9": { - "x": 54, - "y": 72, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "H9": { - "x": 63, - "y": 72, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - - "A10": { - "x": 0, - "y": 81, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "B10": { - "x": 9, - "y": 81, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "C10": { - "x": 18, - "y": 81, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "D10": { - "x": 27, - "y": 81, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "E10": { - "x": 36, - "y": 81, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "F10": { - "x": 45, - "y": 81, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "G10": { - "x": 54, - "y": 81, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "H10": { - "x": 63, - "y": 81, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - - "A11": { - "x": 0, - "y": 90, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "B11": { - "x": 9, - "y": 90, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "C11": { - "x": 18, - "y": 90, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "D11": { - "x": 27, - "y": 90, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "E11": { - "x": 36, - "y": 90, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "F11": { - "x": 45, - "y": 90, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "G11": { - "x": 54, - "y": 90, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "H11": { - "x": 63, - "y": 90, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - - "A12": { - "x": 0, - "y": 99, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "B12": { - "x": 9, - "y": 99, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "C12": { - "x": 18, - "y": 99, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "D12": { - "x": 27, - "y": 99, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "E12": { - "x": 36, - "y": 99, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "F12": { - "x": 45, - "y": 99, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "G12": { - "x": 54, - "y": 99, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - "H12": { - "x": 63, - "y": 99, - "z": 0, - "depth": 2.5, - "diameter": 2, - "total-liquid-volume": 6 - }, - - "A13": { - "x": 3.5, - "y": 3.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "B13": { - "x": 12.5, - "y": 3.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "C13": { - "x": 21.5, - "y": 3.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "D13": { - "x": 30.5, - "y": 3.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "E13": { - "x": 39.5, - "y": 3.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "F13": { - "x": 48.5, - "y": 3.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "G13": { - "x": 57.5, - "y": 3.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "H13": { - "x": 66.5, - "y": 3.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - - "A14": { - "x": 3.5, - "y": 12.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "B14": { - "x": 12.5, - "y": 12.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "C14": { - "x": 21.5, - "y": 12.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "D14": { - "x": 30.5, - "y": 12.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "E14": { - "x": 39.5, - "y": 12.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "F14": { - "x": 48.5, - "y": 12.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "G14": { - "x": 57.5, - "y": 12.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "H14": { - "x": 66.5, - "y": 12.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - - "A15": { - "x": 3.5, - "y": 21.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "B15": { - "x": 12.5, - "y": 21.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "C15": { - "x": 21.5, - "y": 21.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "D15": { - "x": 30.5, - "y": 21.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "E15": { - "x": 39.5, - "y": 21.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "F15": { - "x": 48.5, - "y": 21.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "G15": { - "x": 57.5, - "y": 21.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "H15": { - "x": 66.5, - "y": 21.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - - "A16": { - "x": 3.5, - "y": 30.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "B16": { - "x": 12.5, - "y": 30.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "C16": { - "x": 21.5, - "y": 30.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "D16": { - "x": 30.5, - "y": 30.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "E16": { - "x": 39.5, - "y": 30.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "F16": { - "x": 48.5, - "y": 30.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "G16": { - "x": 57.5, - "y": 30.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "H16": { - "x": 66.5, - "y": 30.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - - "A17": { - "x": 3.5, - "y": 39.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "B17": { - "x": 12.5, - "y": 39.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "C17": { - "x": 21.5, - "y": 39.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "D17": { - "x": 30.5, - "y": 39.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "E17": { - "x": 39.5, - "y": 39.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "F17": { - "x": 48.5, - "y": 39.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "G17": { - "x": 57.5, - "y": 39.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "H17": { - "x": 66.5, - "y": 39.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - - "A18": { - "x": 3.5, - "y": 48.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "B18": { - "x": 12.5, - "y": 48.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "C18": { - "x": 21.5, - "y": 48.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "D18": { - "x": 30.5, - "y": 48.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "E18": { - "x": 39.5, - "y": 48.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "F18": { - "x": 48.5, - "y": 48.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "G18": { - "x": 57.5, - "y": 48.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "H18": { - "x": 66.5, - "y": 48.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - - "A19": { - "x": 3.5, - "y": 57.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "B19": { - "x": 12.5, - "y": 57.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "C19": { - "x": 21.5, - "y": 57.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "D19": { - "x": 30.5, - "y": 57.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "E19": { - "x": 39.5, - "y": 57.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "F19": { - "x": 48.5, - "y": 57.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "G19": { - "x": 57.5, - "y": 57.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "H19": { - "x": 66.5, - "y": 57.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - - "A20": { - "x": 3.5, - "y": 66.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "B20": { - "x": 12.5, - "y": 66.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "C20": { - "x": 21.5, - "y": 66.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "D20": { - "x": 30.5, - "y": 66.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "E20": { - "x": 39.5, - "y": 66.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "F20": { - "x": 48.5, - "y": 66.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "G20": { - "x": 57.5, - "y": 66.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "H20": { - "x": 66.5, - "y": 66.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - - "A21": { - "x": 3.5, - "y": 75.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "B21": { - "x": 12.5, - "y": 75.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "C21": { - "x": 21.5, - "y": 75.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "D21": { - "x": 30.5, - "y": 75.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "E21": { - "x": 39.5, - "y": 75.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "F21": { - "x": 48.5, - "y": 75.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "G21": { - "x": 57.5, - "y": 75.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "H21": { - "x": 66.5, - "y": 75.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - - "A22": { - "x": 3.5, - "y": 84.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "B22": { - "x": 12.5, - "y": 84.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "C22": { - "x": 21.5, - "y": 84.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "D22": { - "x": 30.5, - "y": 84.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "E22": { - "x": 39.5, - "y": 84.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "F22": { - "x": 48.5, - "y": 84.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "G22": { - "x": 57.5, - "y": 84.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "H22": { - "x": 66.5, - "y": 84.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - - "A23": { - "x": 3.5, - "y": 93.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "B23": { - "x": 12.5, - "y": 93.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "C23": { - "x": 21.5, - "y": 93.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "D23": { - "x": 30.5, - "y": 93.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "E23": { - "x": 39.5, - "y": 93.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "F23": { - "x": 48.5, - "y": 93.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "G23": { - "x": 57.5, - "y": 93.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "H23": { - "x": 66.5, - "y": 93.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - - "A24": { - "x": 3.5, - "y": 102.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "B24": { - "x": 12.5, - "y": 102.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "C24": { - "x": 21.5, - "y": 102.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "D24": { - "x": 30.5, - "y": 102.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "E24": { - "x": 39.5, - "y": 102.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "F24": { - "x": 48.5, - "y": 102.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "G24": { - "x": 57.5, - "y": 102.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - }, - "H24": { - "x": 66.5, - "y": 102.5, - "z": -6, - "depth": 6.5, - "diameter": 2.5, - "total-liquid-volume": 300 - } - } - }, - "alum-block-pcr-strips": { - - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "B1": { - "x": 9, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "C1": { - "x": 18, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "D1": { - "x": 27, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "E1": { - "x": 36, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "F1": { - "x": 45, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "G1": { - "x": 54, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "H1": { - "x": 63, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "A2": { - "x": 0, - "y": 117, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "B2": { - "x": 9, - "y": 117, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "C2": { - "x": 18, - "y": 117, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "D2": { - "x": 27, - "y": 117, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "E2": { - "x": 36, - "y": 117, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "F2": { - "x": 45, - "y": 117, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "G2": { - "x": 54, - "y": 117, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "H2": { - "x": 63, - "y": 117, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - } - } - }, - "T75-flask": { - "origin-offset": { - "x": 42.75, - "y": 63.875 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 163, - "diameter": 25, - "total-liquid-volume": 75000 - } - } - }, - "T25-flask": { - "origin-offset": { - "x": 42.75, - "y": 63.875 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 99, - "diameter": 18, - "total-liquid-volume": 25000 - } - } - }, - "magdeck": { - "origin-offset": { - "x": 0, - "y": 0 - }, - "locations": { - "A1": { - "x": 63.9, - "y": 42.8, - "z": 0, - "depth": 82.25 - } - } - }, - "tempdeck": { - "origin-offset": { - "x": 0, - "y": 0 - }, - "locations": { - "A1": { - "x": 63.9, - "y": 42.8, - "z": 0, - "depth": 80.09 - } - } - }, - "trash-box": { - "origin-offset": { - "x": 42.75, - "y": 63.875 - }, - "locations": { - "A1": { - "x": 60, - "y": 45, - "z": 0, - "depth": 40 - } - } - }, - "fixed-trash": { - "origin-offset": { - "x": 0, - "y": 0 - }, - "locations": { - "A1": { - "x": 80, - "y": 80, - "z": 5, - "depth": 58 - } - } - }, - "tall-fixed-trash": { - "origin-offset": { - "x": 0, - "y": 0 - }, - "locations": { - "A1": { - "x": 80, - "y": 80, - "z": 5, - "depth": 80 - } - } - }, - "wheaton_vial_rack": { - "origin-offset": { - "x": 9, - "y": 9 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "B1": { - "x": 35, - "y": 0, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "C1": { - "x": 70, - "y": 0, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "D1": { - "x": 105, - "y": 0, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "E1": { - "x": 140, - "y": 0, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "F1": { - "x": 175, - "y": 0, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "G1": { - "x": 210, - "y": 0, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "H1": { - "x": 245, - "y": 0, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "I1": { - "x": 280, - "y": 0, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "J1": { - "x": 315, - "y": 0, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - - "A2": { - "x": 0, - "y": 35, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "B2": { - "x": 35, - "y": 35, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "C2": { - "x": 70, - "y": 35, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "D2": { - "x": 105, - "y": 35, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "E2": { - "x": 140, - "y": 35, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "F2": { - "x": 175, - "y": 35, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "G2": { - "x": 210, - "y": 35, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "H2": { - "x": 245, - "y": 35, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "I2": { - "x": 280, - "y": 35, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "J2": { - "x": 315, - "y": 35, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - - "A3": { - "x": 0, - "y": 70, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "B3": { - "x": 35, - "y": 70, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "C3": { - "x": 70, - "y": 70, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "D3": { - "x": 105, - "y": 70, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "E3": { - "x": 140, - "y": 70, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "F3": { - "x": 175, - "y": 70, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "G3": { - "x": 210, - "y": 70, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "H3": { - "x": 245, - "y": 70, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "I3": { - "x": 280, - "y": 70, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "J3": { - "x": 315, - "y": 70, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - - "A4": { - "x": 0, - "y": 105, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "B4": { - "x": 35, - "y": 105, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "C4": { - "x": 70, - "y": 105, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "D4": { - "x": 105, - "y": 105, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "E4": { - "x": 140, - "y": 105, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "F4": { - "x": 175, - "y": 105, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "G4": { - "x": 210, - "y": 105, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "H4": { - "x": 245, - "y": 105, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "I4": { - "x": 280, - "y": 105, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "J4": { - "x": 315, - "y": 105, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - - "A5": { - "x": 0, - "y": 140, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "B5": { - "x": 35, - "y": 140, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "C5": { - "x": 70, - "y": 140, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "D5": { - "x": 105, - "y": 140, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "E5": { - "x": 140, - "y": 140, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "F5": { - "x": 175, - "y": 140, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "G5": { - "x": 210, - "y": 140, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "H5": { - "x": 245, - "y": 140, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "I5": { - "x": 280, - "y": 140, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - }, - "J5": { - "x": 315, - "y": 140, - "z": 0, - "depth": 95, - "diameter": 18, - "total-liquid-volume": 2000 - } - } - }, - "tube-rack-80well": { - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B1": { - "x": 13.2, - "y": 0, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C1": { - "x": 26.5, - "y": 0, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D1": { - "x": 39.7, - "y": 0, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E1": { - "x": 52.9, - "y": 0, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A2": { - "x": 0, - "y": 13.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B2": { - "x": 13.2, - "y": 13.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C2": { - "x": 26.5, - "y": 13.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D2": { - "x": 39.7, - "y": 13.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E2": { - "x": 52.9, - "y": 13.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A3": { - "x": 0, - "y": 26.5, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B3": { - "x": 13.2, - "y": 26.5, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C3": { - "x": 26.5, - "y": 26.5, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D3": { - "x": 39.7, - "y": 26.5, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E3": { - "x": 52.9, - "y": 26.5, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A4": { - "x": 0, - "y": 39.7, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B4": { - "x": 13.2, - "y": 39.7, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C4": { - "x": 26.5, - "y": 39.7, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D4": { - "x": 39.7, - "y": 39.7, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E4": { - "x": 52.9, - "y": 39.7, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A5": { - "x": 0, - "y": 52.9, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B5": { - "x": 13.2, - "y": 52.9, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C5": { - "x": 26.5, - "y": 52.9, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D5": { - "x": 39.7, - "y": 52.9, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E5": { - "x": 52.9, - "y": 52.9, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A6": { - "x": 0, - "y": 66.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B6": { - "x": 13.2, - "y": 66.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C6": { - "x": 26.5, - "y": 66.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D6": { - "x": 39.7, - "y": 66.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E6": { - "x": 52.9, - "y": 66.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A7": { - "x": 0, - "y": 79.4, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B7": { - "x": 13.2, - "y": 79.4, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C7": { - "x": 26.5, - "y": 79.4, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D7": { - "x": 39.7, - "y": 79.4, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E7": { - "x": 52.9, - "y": 79.4, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A8": { - "x": 0, - "y": 92.6, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B8": { - "x": 13.2, - "y": 92.6, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C8": { - "x": 26.5, - "y": 92.6, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D8": { - "x": 39.7, - "y": 92.6, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E8": { - "x": 52.9, - "y": 92.6, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A9": { - "x": 0, - "y": 105.8, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B9": { - "x": 13.2, - "y": 105.8, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C9": { - "x": 26.5, - "y": 105.8, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D9": { - "x": 39.7, - "y": 105.8, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E9": { - "x": 52.9, - "y": 105.8, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A10": { - "x": 0, - "y": 119.1, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B10": { - "x": 13.2, - "y": 119.1, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C10": { - "x": 26.5, - "y": 119.1, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D10": { - "x": 39.7, - "y": 119.1, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E10": { - "x": 52.9, - "y": 119.1, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A11": { - "x": 0, - "y": 132.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B11": { - "x": 13.2, - "y": 132.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C11": { - "x": 26.5, - "y": 132.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D11": { - "x": 39.7, - "y": 132.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E11": { - "x": 52.9, - "y": 132.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A12": { - "x": 0, - "y": 145.5, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B12": { - "x": 13.2, - "y": 145.5, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C12": { - "x": 26.5, - "y": 145.5, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D12": { - "x": 39.7, - "y": 145.5, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E12": { - "x": 52.9, - "y": 145.5, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A13": { - "x": 0, - "y": 158.8, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B13": { - "x": 13.2, - "y": 158.8, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C13": { - "x": 26.5, - "y": 158.8, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D13": { - "x": 39.7, - "y": 158.8, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E13": { - "x": 52.9, - "y": 158.8, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A14": { - "x": 0, - "y": 172, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B14": { - "x": 13.2, - "y": 172, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C14": { - "x": 26.5, - "y": 172, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D14": { - "x": 39.7, - "y": 172, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E14": { - "x": 52.9, - "y": 172, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A15": { - "x": 0, - "y": 185.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B15": { - "x": 13.2, - "y": 185.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C15": { - "x": 26.5, - "y": 185.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D15": { - "x": 39.7, - "y": 185.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E15": { - "x": 52.9, - "y": 185.2, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A16": { - "x": 0, - "y": 198.4, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B16": { - "x": 13.2, - "y": 198.4, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C16": { - "x": 26.5, - "y": 198.4, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D16": { - "x": 39.7, - "y": 198.4, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "E16": { - "x": 52.9, - "y": 198.4, - "z": 0, - "depth": 35, - "diameter": 6, - "total-liquid-volume": 2000 - } - } - }, - "point": { - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 0, - "total-liquid-volume": 1 - } - } - }, - "tiprack-10ul": { - "origin-offset": { - "x": 14.24, - "y": 14.54 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "B1": { - "x": 9, - "y": 0, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "C1": { - "x": 18, - "y": 0, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "D1": { - "x": 27, - "y": 0, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "E1": { - "x": 36, - "y": 0, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "F1": { - "x": 45, - "y": 0, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "G1": { - "x": 54, - "y": 0, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "H1": { - "x": 63, - "y": 0, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "A2": { - "x": 0, - "y": 9, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "B2": { - "x": 9, - "y": 9, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "C2": { - "x": 18, - "y": 9, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "D2": { - "x": 27, - "y": 9, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "E2": { - "x": 36, - "y": 9, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "F2": { - "x": 45, - "y": 9, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "G2": { - "x": 54, - "y": 9, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "H2": { - "x": 63, - "y": 9, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "A3": { - "x": 0, - "y": 18, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "B3": { - "x": 9, - "y": 18, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "C3": { - "x": 18, - "y": 18, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "D3": { - "x": 27, - "y": 18, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "E3": { - "x": 36, - "y": 18, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "F3": { - "x": 45, - "y": 18, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "G3": { - "x": 54, - "y": 18, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "H3": { - "x": 63, - "y": 18, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "A4": { - "x": 0, - "y": 27, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "B4": { - "x": 9, - "y": 27, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "C4": { - "x": 18, - "y": 27, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "D4": { - "x": 27, - "y": 27, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "E4": { - "x": 36, - "y": 27, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "F4": { - "x": 45, - "y": 27, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "G4": { - "x": 54, - "y": 27, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "H4": { - "x": 63, - "y": 27, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "A5": { - "x": 0, - "y": 36, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "B5": { - "x": 9, - "y": 36, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "C5": { - "x": 18, - "y": 36, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "D5": { - "x": 27, - "y": 36, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "E5": { - "x": 36, - "y": 36, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "F5": { - "x": 45, - "y": 36, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "G5": { - "x": 54, - "y": 36, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "H5": { - "x": 63, - "y": 36, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "A6": { - "x": 0, - "y": 45, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "B6": { - "x": 9, - "y": 45, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "C6": { - "x": 18, - "y": 45, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "D6": { - "x": 27, - "y": 45, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "E6": { - "x": 36, - "y": 45, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "F6": { - "x": 45, - "y": 45, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "G6": { - "x": 54, - "y": 45, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "H6": { - "x": 63, - "y": 45, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "A7": { - "x": 0, - "y": 54, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "B7": { - "x": 9, - "y": 54, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "C7": { - "x": 18, - "y": 54, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "D7": { - "x": 27, - "y": 54, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "E7": { - "x": 36, - "y": 54, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "F7": { - "x": 45, - "y": 54, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "G7": { - "x": 54, - "y": 54, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "H7": { - "x": 63, - "y": 54, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "A8": { - "x": 0, - "y": 63, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "B8": { - "x": 9, - "y": 63, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "C8": { - "x": 18, - "y": 63, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "D8": { - "x": 27, - "y": 63, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "E8": { - "x": 36, - "y": 63, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "F8": { - "x": 45, - "y": 63, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "G8": { - "x": 54, - "y": 63, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "H8": { - "x": 63, - "y": 63, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "A9": { - "x": 0, - "y": 72, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "B9": { - "x": 9, - "y": 72, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "C9": { - "x": 18, - "y": 72, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "D9": { - "x": 27, - "y": 72, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "E9": { - "x": 36, - "y": 72, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "F9": { - "x": 45, - "y": 72, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "G9": { - "x": 54, - "y": 72, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "H9": { - "x": 63, - "y": 72, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "A10": { - "x": 0, - "y": 81, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "B10": { - "x": 9, - "y": 81, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "C10": { - "x": 18, - "y": 81, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "D10": { - "x": 27, - "y": 81, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "E10": { - "x": 36, - "y": 81, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "F10": { - "x": 45, - "y": 81, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "G10": { - "x": 54, - "y": 81, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "H10": { - "x": 63, - "y": 81, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "A11": { - "x": 0, - "y": 90, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "B11": { - "x": 9, - "y": 90, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "C11": { - "x": 18, - "y": 90, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "D11": { - "x": 27, - "y": 90, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "E11": { - "x": 36, - "y": 90, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "F11": { - "x": 45, - "y": 90, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "G11": { - "x": 54, - "y": 90, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "H11": { - "x": 63, - "y": 90, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "A12": { - "x": 0, - "y": 99, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "B12": { - "x": 9, - "y": 99, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "C12": { - "x": 18, - "y": 99, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "D12": { - "x": 27, - "y": 99, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "E12": { - "x": 36, - "y": 99, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "F12": { - "x": 45, - "y": 99, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "G12": { - "x": 54, - "y": 99, - "z": 0, - "depth": 56, - "diameter": 3.5 - }, - "H12": { - "x": 63, - "y": 99, - "z": 0, - "depth": 56, - "diameter": 3.5 - } - } - }, - - "tiprack-10ul-H": { - "origin-offset": { - "x": 11.24, - "y": 14.34 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "B1": { - "x": 9, - "y": 0, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "C1": { - "x": 18, - "y": 0, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "D1": { - "x": 27, - "y": 0, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "A2": { - "x": 0, - "y": 9, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "B2": { - "x": 9, - "y": 9, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "C2": { - "x": 18, - "y": 9, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "D2": { - "x": 27, - "y": 9, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "A3": { - "x": 0, - "y": 18, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "B3": { - "x": 9, - "y": 18, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "C3": { - "x": 18, - "y": 18, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "D3": { - "x": 27, - "y": 18, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "A4": { - "x": 0, - "y": 27, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "B4": { - "x": 9, - "y": 27, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "C4": { - "x": 18, - "y": 27, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "D4": { - "x": 27, - "y": 27, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "A5": { - "x": 0, - "y": 36, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "B5": { - "x": 9, - "y": 36, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "C5": { - "x": 18, - "y": 36, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "D5": { - "x": 27, - "y": 36, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "A6": { - "x": 0, - "y": 45, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "B6": { - "x": 9, - "y": 45, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "C6": { - "x": 18, - "y": 45, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "D6": { - "x": 27, - "y": 45, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "A7": { - "x": 0, - "y": 54, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "B7": { - "x": 9, - "y": 54, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "C7": { - "x": 18, - "y": 54, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "D7": { - "x": 27, - "y": 54, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "A8": { - "x": 0, - "y": 63, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "B8": { - "x": 9, - "y": 63, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "C8": { - "x": 18, - "y": 63, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "D8": { - "x": 27, - "y": 63, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "A9": { - "x": 0, - "y": 72, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "B9": { - "x": 9, - "y": 72, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "C9": { - "x": 18, - "y": 72, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "D9": { - "x": 27, - "y": 72, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "A10": { - "x": 0, - "y": 81, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "B10": { - "x": 9, - "y": 81, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "C10": { - "x": 18, - "y": 81, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "D10": { - "x": 27, - "y": 81, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "A11": { - "x": 0, - "y": 90, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "B11": { - "x": 9, - "y": 90, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "C11": { - "x": 18, - "y": 90, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "D11": { - "x": 27, - "y": 90, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "A12": { - "x": 0, - "y": 99, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "B12": { - "x": 9, - "y": 99, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "C12": { - "x": 18, - "y": 99, - "z": 0, - "depth": 60, - "diameter": 6.4 - }, - "D12": { - "x": 27, - "y": 99, - "z": 0, - "depth": 60, - "diameter": 6.4 - } - } - }, - - "tiprack-200ul": { - "origin-offset": { - "x": 11.24, - "y": 14.34 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "B1": { - "x": 9, - "y": 0, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "C1": { - "x": 18, - "y": 0, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "D1": { - "x": 27, - "y": 0, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "E1": { - "x": 36, - "y": 0, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "F1": { - "x": 45, - "y": 0, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "G1": { - "x": 54, - "y": 0, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "H1": { - "x": 63, - "y": 0, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "A2": { - "x": 0, - "y": 9, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "B2": { - "x": 9, - "y": 9, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "C2": { - "x": 18, - "y": 9, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "D2": { - "x": 27, - "y": 9, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "E2": { - "x": 36, - "y": 9, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "F2": { - "x": 45, - "y": 9, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "G2": { - "x": 54, - "y": 9, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "H2": { - "x": 63, - "y": 9, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "A3": { - "x": 0, - "y": 18, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "B3": { - "x": 9, - "y": 18, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "C3": { - "x": 18, - "y": 18, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "D3": { - "x": 27, - "y": 18, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "E3": { - "x": 36, - "y": 18, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "F3": { - "x": 45, - "y": 18, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "G3": { - "x": 54, - "y": 18, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "H3": { - "x": 63, - "y": 18, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "A4": { - "x": 0, - "y": 27, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "B4": { - "x": 9, - "y": 27, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "C4": { - "x": 18, - "y": 27, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "D4": { - "x": 27, - "y": 27, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "E4": { - "x": 36, - "y": 27, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "F4": { - "x": 45, - "y": 27, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "G4": { - "x": 54, - "y": 27, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "H4": { - "x": 63, - "y": 27, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "A5": { - "x": 0, - "y": 36, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "B5": { - "x": 9, - "y": 36, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "C5": { - "x": 18, - "y": 36, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "D5": { - "x": 27, - "y": 36, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "E5": { - "x": 36, - "y": 36, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "F5": { - "x": 45, - "y": 36, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "G5": { - "x": 54, - "y": 36, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "H5": { - "x": 63, - "y": 36, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "A6": { - "x": 0, - "y": 45, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "B6": { - "x": 9, - "y": 45, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "C6": { - "x": 18, - "y": 45, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "D6": { - "x": 27, - "y": 45, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "E6": { - "x": 36, - "y": 45, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "F6": { - "x": 45, - "y": 45, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "G6": { - "x": 54, - "y": 45, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "H6": { - "x": 63, - "y": 45, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "A7": { - "x": 0, - "y": 54, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "B7": { - "x": 9, - "y": 54, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "C7": { - "x": 18, - "y": 54, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "D7": { - "x": 27, - "y": 54, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "E7": { - "x": 36, - "y": 54, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "F7": { - "x": 45, - "y": 54, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "G7": { - "x": 54, - "y": 54, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "H7": { - "x": 63, - "y": 54, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "A8": { - "x": 0, - "y": 63, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "B8": { - "x": 9, - "y": 63, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "C8": { - "x": 18, - "y": 63, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "D8": { - "x": 27, - "y": 63, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "E8": { - "x": 36, - "y": 63, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "F8": { - "x": 45, - "y": 63, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "G8": { - "x": 54, - "y": 63, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "H8": { - "x": 63, - "y": 63, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "A9": { - "x": 0, - "y": 72, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "B9": { - "x": 9, - "y": 72, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "C9": { - "x": 18, - "y": 72, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "D9": { - "x": 27, - "y": 72, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "E9": { - "x": 36, - "y": 72, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "F9": { - "x": 45, - "y": 72, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "G9": { - "x": 54, - "y": 72, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "H9": { - "x": 63, - "y": 72, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "A10": { - "x": 0, - "y": 81, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "B10": { - "x": 9, - "y": 81, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "C10": { - "x": 18, - "y": 81, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "D10": { - "x": 27, - "y": 81, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "E10": { - "x": 36, - "y": 81, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "F10": { - "x": 45, - "y": 81, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "G10": { - "x": 54, - "y": 81, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "H10": { - "x": 63, - "y": 81, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "A11": { - "x": 0, - "y": 90, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "B11": { - "x": 9, - "y": 90, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "C11": { - "x": 18, - "y": 90, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "D11": { - "x": 27, - "y": 90, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "E11": { - "x": 36, - "y": 90, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "F11": { - "x": 45, - "y": 90, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "G11": { - "x": 54, - "y": 90, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "H11": { - "x": 63, - "y": 90, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "A12": { - "x": 0, - "y": 99, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "B12": { - "x": 9, - "y": 99, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "C12": { - "x": 18, - "y": 99, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "D12": { - "x": 27, - "y": 99, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "E12": { - "x": 36, - "y": 99, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "F12": { - "x": 45, - "y": 99, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "G12": { - "x": 54, - "y": 99, - "z": 0, - "diameter": 3.5, - "depth": 60 - }, - "H12": { - "x": 63, - "y": 99, - "z": 0, - "diameter": 3.5, - "depth": 60 - } - } - }, - "opentrons-tiprack-10ul": { - "origin-offset": { - "x": 10.77, - "y": 11.47 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "B1": { - "x": 9, - "y": 0, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "C1": { - "x": 18, - "y": 0, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "D1": { - "x": 27, - "y": 0, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "E1": { - "x": 36, - "y": 0, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "F1": { - "x": 45, - "y": 0, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "G1": { - "x": 54, - "y": 0, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "H1": { - "x": 63, - "y": 0, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "A2": { - "x": 0, - "y": 9, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "B2": { - "x": 9, - "y": 9, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "C2": { - "x": 18, - "y": 9, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "D2": { - "x": 27, - "y": 9, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "E2": { - "x": 36, - "y": 9, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "F2": { - "x": 45, - "y": 9, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "G2": { - "x": 54, - "y": 9, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "H2": { - "x": 63, - "y": 9, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "A3": { - "x": 0, - "y": 18, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "B3": { - "x": 9, - "y": 18, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "C3": { - "x": 18, - "y": 18, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "D3": { - "x": 27, - "y": 18, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "E3": { - "x": 36, - "y": 18, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "F3": { - "x": 45, - "y": 18, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "G3": { - "x": 54, - "y": 18, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "H3": { - "x": 63, - "y": 18, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "A4": { - "x": 0, - "y": 27, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "B4": { - "x": 9, - "y": 27, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "C4": { - "x": 18, - "y": 27, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "D4": { - "x": 27, - "y": 27, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "E4": { - "x": 36, - "y": 27, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "F4": { - "x": 45, - "y": 27, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "G4": { - "x": 54, - "y": 27, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "H4": { - "x": 63, - "y": 27, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "A5": { - "x": 0, - "y": 36, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "B5": { - "x": 9, - "y": 36, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "C5": { - "x": 18, - "y": 36, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "D5": { - "x": 27, - "y": 36, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "E5": { - "x": 36, - "y": 36, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "F5": { - "x": 45, - "y": 36, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "G5": { - "x": 54, - "y": 36, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "H5": { - "x": 63, - "y": 36, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "A6": { - "x": 0, - "y": 45, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "B6": { - "x": 9, - "y": 45, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "C6": { - "x": 18, - "y": 45, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "D6": { - "x": 27, - "y": 45, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "E6": { - "x": 36, - "y": 45, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "F6": { - "x": 45, - "y": 45, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "G6": { - "x": 54, - "y": 45, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "H6": { - "x": 63, - "y": 45, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "A7": { - "x": 0, - "y": 54, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "B7": { - "x": 9, - "y": 54, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "C7": { - "x": 18, - "y": 54, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "D7": { - "x": 27, - "y": 54, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "E7": { - "x": 36, - "y": 54, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "F7": { - "x": 45, - "y": 54, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "G7": { - "x": 54, - "y": 54, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "H7": { - "x": 63, - "y": 54, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "A8": { - "x": 0, - "y": 63, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "B8": { - "x": 9, - "y": 63, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "C8": { - "x": 18, - "y": 63, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "D8": { - "x": 27, - "y": 63, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "E8": { - "x": 36, - "y": 63, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "F8": { - "x": 45, - "y": 63, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "G8": { - "x": 54, - "y": 63, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "H8": { - "x": 63, - "y": 63, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "A9": { - "x": 0, - "y": 72, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "B9": { - "x": 9, - "y": 72, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "C9": { - "x": 18, - "y": 72, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "D9": { - "x": 27, - "y": 72, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "E9": { - "x": 36, - "y": 72, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "F9": { - "x": 45, - "y": 72, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "G9": { - "x": 54, - "y": 72, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "H9": { - "x": 63, - "y": 72, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "A10": { - "x": 0, - "y": 81, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "B10": { - "x": 9, - "y": 81, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "C10": { - "x": 18, - "y": 81, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "D10": { - "x": 27, - "y": 81, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "E10": { - "x": 36, - "y": 81, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "F10": { - "x": 45, - "y": 81, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "G10": { - "x": 54, - "y": 81, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "H10": { - "x": 63, - "y": 81, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "A11": { - "x": 0, - "y": 90, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "B11": { - "x": 9, - "y": 90, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "C11": { - "x": 18, - "y": 90, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "D11": { - "x": 27, - "y": 90, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "E11": { - "x": 36, - "y": 90, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "F11": { - "x": 45, - "y": 90, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "G11": { - "x": 54, - "y": 90, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "H11": { - "x": 63, - "y": 90, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "A12": { - "x": 0, - "y": 99, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "B12": { - "x": 9, - "y": 99, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "C12": { - "x": 18, - "y": 99, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "D12": { - "x": 27, - "y": 99, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "E12": { - "x": 36, - "y": 99, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "F12": { - "x": 45, - "y": 99, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "G12": { - "x": 54, - "y": 99, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - }, - "H12": { - "x": 63, - "y": 99, - "z": 25.46, - "diameter": 3.5, - "depth": 39.2 - } - } - }, - "opentrons-tiprack-300ul": { - "origin-offset": { - "x": 12.59, - "y": 14.85 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "B1": { - "x": 9, - "y": 0, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "C1": { - "x": 18, - "y": 0, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "D1": { - "x": 27, - "y": 0, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "E1": { - "x": 36, - "y": 0, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "F1": { - "x": 45, - "y": 0, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "G1": { - "x": 54, - "y": 0, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "H1": { - "x": 63, - "y": 0, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "A2": { - "x": 0, - "y": 9, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "B2": { - "x": 9, - "y": 9, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "C2": { - "x": 18, - "y": 9, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "D2": { - "x": 27, - "y": 9, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "E2": { - "x": 36, - "y": 9, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "F2": { - "x": 45, - "y": 9, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "G2": { - "x": 54, - "y": 9, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "H2": { - "x": 63, - "y": 9, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "A3": { - "x": 0, - "y": 18, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "B3": { - "x": 9, - "y": 18, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "C3": { - "x": 18, - "y": 18, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "D3": { - "x": 27, - "y": 18, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "E3": { - "x": 36, - "y": 18, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "F3": { - "x": 45, - "y": 18, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "G3": { - "x": 54, - "y": 18, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "H3": { - "x": 63, - "y": 18, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "A4": { - "x": 0, - "y": 27, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "B4": { - "x": 9, - "y": 27, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "C4": { - "x": 18, - "y": 27, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "D4": { - "x": 27, - "y": 27, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "E4": { - "x": 36, - "y": 27, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "F4": { - "x": 45, - "y": 27, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "G4": { - "x": 54, - "y": 27, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "H4": { - "x": 63, - "y": 27, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "A5": { - "x": 0, - "y": 36, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "B5": { - "x": 9, - "y": 36, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "C5": { - "x": 18, - "y": 36, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "D5": { - "x": 27, - "y": 36, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "E5": { - "x": 36, - "y": 36, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "F5": { - "x": 45, - "y": 36, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "G5": { - "x": 54, - "y": 36, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "H5": { - "x": 63, - "y": 36, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "A6": { - "x": 0, - "y": 45, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "B6": { - "x": 9, - "y": 45, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "C6": { - "x": 18, - "y": 45, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "D6": { - "x": 27, - "y": 45, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "E6": { - "x": 36, - "y": 45, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "F6": { - "x": 45, - "y": 45, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "G6": { - "x": 54, - "y": 45, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "H6": { - "x": 63, - "y": 45, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "A7": { - "x": 0, - "y": 54, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "B7": { - "x": 9, - "y": 54, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "C7": { - "x": 18, - "y": 54, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "D7": { - "x": 27, - "y": 54, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "E7": { - "x": 36, - "y": 54, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "F7": { - "x": 45, - "y": 54, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "G7": { - "x": 54, - "y": 54, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "H7": { - "x": 63, - "y": 54, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "A8": { - "x": 0, - "y": 63, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "B8": { - "x": 9, - "y": 63, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "C8": { - "x": 18, - "y": 63, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "D8": { - "x": 27, - "y": 63, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "E8": { - "x": 36, - "y": 63, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "F8": { - "x": 45, - "y": 63, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "G8": { - "x": 54, - "y": 63, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "H8": { - "x": 63, - "y": 63, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "A9": { - "x": 0, - "y": 72, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "B9": { - "x": 9, - "y": 72, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "C9": { - "x": 18, - "y": 72, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "D9": { - "x": 27, - "y": 72, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "E9": { - "x": 36, - "y": 72, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "F9": { - "x": 45, - "y": 72, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "G9": { - "x": 54, - "y": 72, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "H9": { - "x": 63, - "y": 72, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "A10": { - "x": 0, - "y": 81, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "B10": { - "x": 9, - "y": 81, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "C10": { - "x": 18, - "y": 81, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "D10": { - "x": 27, - "y": 81, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "E10": { - "x": 36, - "y": 81, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "F10": { - "x": 45, - "y": 81, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "G10": { - "x": 54, - "y": 81, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "H10": { - "x": 63, - "y": 81, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "A11": { - "x": 0, - "y": 90, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "B11": { - "x": 9, - "y": 90, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "C11": { - "x": 18, - "y": 90, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "D11": { - "x": 27, - "y": 90, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "E11": { - "x": 36, - "y": 90, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "F11": { - "x": 45, - "y": 90, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "G11": { - "x": 54, - "y": 90, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "H11": { - "x": 63, - "y": 90, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "A12": { - "x": 0, - "y": 99, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "B12": { - "x": 9, - "y": 99, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "C12": { - "x": 18, - "y": 99, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "D12": { - "x": 27, - "y": 99, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "E12": { - "x": 36, - "y": 99, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "F12": { - "x": 45, - "y": 99, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "G12": { - "x": 54, - "y": 99, - "z": 6, - "diameter": 3.5, - "depth": 60 - }, - "H12": { - "x": 63, - "y": 99, - "z": 6, - "diameter": 3.5, - "depth": 60 - } - } - }, - - "tiprack-1000ul": { - "origin-offset": { - "x": 11.24, - "y": 14.34 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "B1": { - "x": 9, - "y": 0, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "C1": { - "x": 18, - "y": 0, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "D1": { - "x": 27, - "y": 0, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "E1": { - "x": 36, - "y": 0, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "F1": { - "x": 45, - "y": 0, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "G1": { - "x": 54, - "y": 0, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "H1": { - "x": 63, - "y": 0, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "A2": { - "x": 0, - "y": 9, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "B2": { - "x": 9, - "y": 9, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "C2": { - "x": 18, - "y": 9, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "D2": { - "x": 27, - "y": 9, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "E2": { - "x": 36, - "y": 9, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "F2": { - "x": 45, - "y": 9, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "G2": { - "x": 54, - "y": 9, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "H2": { - "x": 63, - "y": 9, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "A3": { - "x": 0, - "y": 18, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "B3": { - "x": 9, - "y": 18, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "C3": { - "x": 18, - "y": 18, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "D3": { - "x": 27, - "y": 18, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "E3": { - "x": 36, - "y": 18, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "F3": { - "x": 45, - "y": 18, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "G3": { - "x": 54, - "y": 18, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "H3": { - "x": 63, - "y": 18, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "A4": { - "x": 0, - "y": 27, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "B4": { - "x": 9, - "y": 27, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "C4": { - "x": 18, - "y": 27, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "D4": { - "x": 27, - "y": 27, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "E4": { - "x": 36, - "y": 27, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "F4": { - "x": 45, - "y": 27, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "G4": { - "x": 54, - "y": 27, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "H4": { - "x": 63, - "y": 27, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "A5": { - "x": 0, - "y": 36, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "B5": { - "x": 9, - "y": 36, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "C5": { - "x": 18, - "y": 36, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "D5": { - "x": 27, - "y": 36, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "E5": { - "x": 36, - "y": 36, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "F5": { - "x": 45, - "y": 36, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "G5": { - "x": 54, - "y": 36, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "H5": { - "x": 63, - "y": 36, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "A6": { - "x": 0, - "y": 45, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "B6": { - "x": 9, - "y": 45, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "C6": { - "x": 18, - "y": 45, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "D6": { - "x": 27, - "y": 45, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "E6": { - "x": 36, - "y": 45, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "F6": { - "x": 45, - "y": 45, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "G6": { - "x": 54, - "y": 45, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "H6": { - "x": 63, - "y": 45, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "A7": { - "x": 0, - "y": 54, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "B7": { - "x": 9, - "y": 54, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "C7": { - "x": 18, - "y": 54, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "D7": { - "x": 27, - "y": 54, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "E7": { - "x": 36, - "y": 54, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "F7": { - "x": 45, - "y": 54, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "G7": { - "x": 54, - "y": 54, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "H7": { - "x": 63, - "y": 54, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "A8": { - "x": 0, - "y": 63, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "B8": { - "x": 9, - "y": 63, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "C8": { - "x": 18, - "y": 63, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "D8": { - "x": 27, - "y": 63, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "E8": { - "x": 36, - "y": 63, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "F8": { - "x": 45, - "y": 63, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "G8": { - "x": 54, - "y": 63, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "H8": { - "x": 63, - "y": 63, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "A9": { - "x": 0, - "y": 72, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "B9": { - "x": 9, - "y": 72, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "C9": { - "x": 18, - "y": 72, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "D9": { - "x": 27, - "y": 72, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "E9": { - "x": 36, - "y": 72, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "F9": { - "x": 45, - "y": 72, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "G9": { - "x": 54, - "y": 72, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "H9": { - "x": 63, - "y": 72, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "A10": { - "x": 0, - "y": 81, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "B10": { - "x": 9, - "y": 81, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "C10": { - "x": 18, - "y": 81, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "D10": { - "x": 27, - "y": 81, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "E10": { - "x": 36, - "y": 81, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "F10": { - "x": 45, - "y": 81, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "G10": { - "x": 54, - "y": 81, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "H10": { - "x": 63, - "y": 81, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "A11": { - "x": 0, - "y": 90, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "B11": { - "x": 9, - "y": 90, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "C11": { - "x": 18, - "y": 90, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "D11": { - "x": 27, - "y": 90, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "E11": { - "x": 36, - "y": 90, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "F11": { - "x": 45, - "y": 90, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "G11": { - "x": 54, - "y": 90, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "H11": { - "x": 63, - "y": 90, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "A12": { - "x": 0, - "y": 99, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "B12": { - "x": 9, - "y": 99, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "C12": { - "x": 18, - "y": 99, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "D12": { - "x": 27, - "y": 99, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "E12": { - "x": 36, - "y": 99, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "F12": { - "x": 45, - "y": 99, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "G12": { - "x": 54, - "y": 99, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - }, - "H12": { - "x": 63, - "y": 99, - "z": 0, - "diameter": 6.4, - "depth": 101.0 - } - } - }, - "opentrons-tiprack-1000ul": { - "origin-offset": { - "x": 8.5, - "y": 11.18 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "B1": { - "x": 9, - "y": 0, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "C1": { - "x": 18, - "y": 0, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "D1": { - "x": 27, - "y": 0, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "E1": { - "x": 36, - "y": 0, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "F1": { - "x": 45, - "y": 0, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "G1": { - "x": 54, - "y": 0, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "H1": { - "x": 63, - "y": 0, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "A2": { - "x": 0, - "y": 9, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "B2": { - "x": 9, - "y": 9, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "C2": { - "x": 18, - "y": 9, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "D2": { - "x": 27, - "y": 9, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "E2": { - "x": 36, - "y": 9, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "F2": { - "x": 45, - "y": 9, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "G2": { - "x": 54, - "y": 9, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "H2": { - "x": 63, - "y": 9, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "A3": { - "x": 0, - "y": 18, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "B3": { - "x": 9, - "y": 18, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "C3": { - "x": 18, - "y": 18, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "D3": { - "x": 27, - "y": 18, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "E3": { - "x": 36, - "y": 18, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "F3": { - "x": 45, - "y": 18, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "G3": { - "x": 54, - "y": 18, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "H3": { - "x": 63, - "y": 18, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "A4": { - "x": 0, - "y": 27, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "B4": { - "x": 9, - "y": 27, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "C4": { - "x": 18, - "y": 27, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "D4": { - "x": 27, - "y": 27, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "E4": { - "x": 36, - "y": 27, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "F4": { - "x": 45, - "y": 27, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "G4": { - "x": 54, - "y": 27, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "H4": { - "x": 63, - "y": 27, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "A5": { - "x": 0, - "y": 36, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "B5": { - "x": 9, - "y": 36, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "C5": { - "x": 18, - "y": 36, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "D5": { - "x": 27, - "y": 36, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "E5": { - "x": 36, - "y": 36, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "F5": { - "x": 45, - "y": 36, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "G5": { - "x": 54, - "y": 36, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "H5": { - "x": 63, - "y": 36, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "A6": { - "x": 0, - "y": 45, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "B6": { - "x": 9, - "y": 45, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "C6": { - "x": 18, - "y": 45, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "D6": { - "x": 27, - "y": 45, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "E6": { - "x": 36, - "y": 45, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "F6": { - "x": 45, - "y": 45, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "G6": { - "x": 54, - "y": 45, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "H6": { - "x": 63, - "y": 45, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "A7": { - "x": 0, - "y": 54, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "B7": { - "x": 9, - "y": 54, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "C7": { - "x": 18, - "y": 54, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "D7": { - "x": 27, - "y": 54, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "E7": { - "x": 36, - "y": 54, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "F7": { - "x": 45, - "y": 54, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "G7": { - "x": 54, - "y": 54, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "H7": { - "x": 63, - "y": 54, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "A8": { - "x": 0, - "y": 63, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "B8": { - "x": 9, - "y": 63, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "C8": { - "x": 18, - "y": 63, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "D8": { - "x": 27, - "y": 63, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "E8": { - "x": 36, - "y": 63, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "F8": { - "x": 45, - "y": 63, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "G8": { - "x": 54, - "y": 63, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "H8": { - "x": 63, - "y": 63, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "A9": { - "x": 0, - "y": 72, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "B9": { - "x": 9, - "y": 72, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "C9": { - "x": 18, - "y": 72, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "D9": { - "x": 27, - "y": 72, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "E9": { - "x": 36, - "y": 72, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "F9": { - "x": 45, - "y": 72, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "G9": { - "x": 54, - "y": 72, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "H9": { - "x": 63, - "y": 72, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "A10": { - "x": 0, - "y": 81, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "B10": { - "x": 9, - "y": 81, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "C10": { - "x": 18, - "y": 81, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "D10": { - "x": 27, - "y": 81, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "E10": { - "x": 36, - "y": 81, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "F10": { - "x": 45, - "y": 81, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "G10": { - "x": 54, - "y": 81, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "H10": { - "x": 63, - "y": 81, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "A11": { - "x": 0, - "y": 90, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "B11": { - "x": 9, - "y": 90, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "C11": { - "x": 18, - "y": 90, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "D11": { - "x": 27, - "y": 90, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "E11": { - "x": 36, - "y": 90, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "F11": { - "x": 45, - "y": 90, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "G11": { - "x": 54, - "y": 90, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "H11": { - "x": 63, - "y": 90, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "A12": { - "x": 0, - "y": 99, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "B12": { - "x": 9, - "y": 99, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "C12": { - "x": 18, - "y": 99, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "D12": { - "x": 27, - "y": 99, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "E12": { - "x": 36, - "y": 99, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "F12": { - "x": 45, - "y": 99, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "G12": { - "x": 54, - "y": 99, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - }, - "H12": { - "x": 63, - "y": 99, - "z": 0, - "diameter": 7.62, - "depth": 98.07 - } - } - }, - "tube-rack-.75ml": { - "origin-offset": { - "x": 13.5, - "y": 15, - "z": 55 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "B1": { - "x": 19.5, - "y": 0, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "C1": { - "x": 39, - "y": 0, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "D1": { - "x": 58.5, - "y": 0, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "A2": { - "x": 0, - "y": 19.5, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "B2": { - "x": 19.5, - "y": 19.5, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "C2": { - "x": 39, - "y": 19.5, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "D2": { - "x": 58.5, - "y": 19.5, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "A3": { - "x": 0, - "y": 39, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "B3": { - "x": 19.5, - "y": 39, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "C3": { - "x": 39, - "y": 39, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "D3": { - "x": 58.5, - "y": 39, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "A4": { - "x": 0, - "y": 58.5, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "B4": { - "x": 19.5, - "y": 58.5, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "C4": { - "x": 39, - "y": 58.5, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "D4": { - "x": 58.5, - "y": 58.5, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "A5": { - "x": 0, - "y": 78, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "B5": { - "x": 19.5, - "y": 78, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "C5": { - "x": 39, - "y": 78, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "D5": { - "x": 58.5, - "y": 78, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "A6": { - "x": 0, - "y": 97.5, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "B6": { - "x": 19.5, - "y": 97.5, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "C6": { - "x": 39, - "y": 97.5, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - }, - "D6": { - "x": 58.5, - "y": 97.5, - "z": 0, - "depth": 20, - "diameter": 6, - "total-liquid-volume": 750 - } - } - }, - - "tube-rack-2ml": { - "origin-offset": { - "x": 13, - "y": 16, - "z": 52 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B1": { - "x": 19.5, - "y": 0, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C1": { - "x": 39, - "y": 0, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D1": { - "x": 58.5, - "y": 0, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A2": { - "x": 0, - "y": 19.5, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B2": { - "x": 19.5, - "y": 19.5, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C2": { - "x": 39, - "y": 19.5, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D2": { - "x": 58.5, - "y": 19.5, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A3": { - "x": 0, - "y": 39, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B3": { - "x": 19.5, - "y": 39, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C3": { - "x": 39, - "y": 39, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D3": { - "x": 58.5, - "y": 39, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A4": { - "x": 0, - "y": 58.5, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B4": { - "x": 19.5, - "y": 58.5, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C4": { - "x": 39, - "y": 58.5, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D4": { - "x": 58.5, - "y": 58.5, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A5": { - "x": 0, - "y": 78, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B5": { - "x": 19.5, - "y": 78, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C5": { - "x": 39, - "y": 78, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D5": { - "x": 58.5, - "y": 78, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "A6": { - "x": 0, - "y": 97.5, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "B6": { - "x": 19.5, - "y": 97.5, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "C6": { - "x": 39, - "y": 97.5, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - }, - "D6": { - "x": 58.5, - "y": 97.5, - "z": 0, - "depth": 40, - "diameter": 6, - "total-liquid-volume": 2000 - } - } - }, - - "tube-rack-15_50ml": { - "origin-offset": { - "x": 11, - "y": 19 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 5, - "depth": 115, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "B1": { - "x": 31.5, - "y": 0, - "z": 5, - "depth": 115, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "C1": { - "x": 63, - "y": 0, - "z": 5, - "depth": 115, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "A2": { - "x": 0, - "y": 22.7, - "z": 5, - "depth": 115, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "B2": { - "x": 31.5, - "y": 22.7, - "z": 5, - "depth": 115, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "C2": { - "x": 63, - "y": 22.7, - "z": 0, - "depth": 115, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "A3": { - "x": 5.9, - "y": 51.26, - "z": 5, - "depth": 115, - "diameter": 30, - "total-liquid-volume": 50000 - }, - "B3": { - "x": 51.26, - "y": 51.26, - "z": 5, - "depth": 115, - "diameter": 30, - "total-liquid-volume": 50000 - }, - "A4": { - "x": 5.9, - "y": 87.1, - "z": 5, - "depth": 115, - "diameter": 30, - "total-liquid-volume": 50000 - }, - "B4": { - "x": 51.26, - "y": 87.1, - "z": 5, - "depth": 115, - "diameter": 30, - "total-liquid-volume": 50000 - } - } - }, - - "trough-12row": { - "origin-offset": { - "x": 7.75, - "y": 14.34 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 8, - "depth": 38, - "total-liquid-volume": 22000 - }, - "A2": { - "x": 0, - "y": 9, - "z": 8, - "depth": 38, - "total-liquid-volume": 22000 - }, - "A3": { - "x": 0, - "y": 18, - "z": 8, - "depth": 38, - "total-liquid-volume": 22000 - }, - "A4": { - "x": 0, - "y": 27, - "z": 8, - "depth": 38, - "total-liquid-volume": 22000 - }, - "A5": { - "x": 0, - "y": 36, - "z": 8, - "depth": 38, - "total-liquid-volume": 22000 - }, - "A6": { - "x": 0, - "y": 45, - "z": 8, - "depth": 38, - "total-liquid-volume": 22000 - }, - "A7": { - "x": 0, - "y": 54, - "z": 8, - "depth": 38, - "total-liquid-volume": 22000 - }, - "A8": { - "x": 0, - "y": 63, - "z": 8, - "depth": 38, - "total-liquid-volume": 22000 - }, - "A9": { - "x": 0, - "y": 72, - "z": 8, - "depth": 38, - "total-liquid-volume": 22000 - }, - "A10": { - "x": 0, - "y": 81, - "z": 8, - "depth": 38, - "total-liquid-volume": 22000 - }, - "A11": { - "x": 0, - "y": 90, - "z": 8, - "depth": 38, - "total-liquid-volume": 22000 - }, - "A12": { - "x": 0, - "y": 99, - "z": 8, - "depth": 38, - "total-liquid-volume": 22000 - } - } - }, - - "trough-12row-short": { - "origin-offset": { - "x": 7.75, - "y": 14.34 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 20, - "total-liquid-volume": 22000 - }, - "A2": { - "x": 0, - "y": 9, - "z": 0, - "depth": 20, - "total-liquid-volume": 22000 - }, - "A3": { - "x": 0, - "y": 18, - "z": 0, - "depth": 20, - "total-liquid-volume": 22000 - }, - "A4": { - "x": 0, - "y": 27, - "z": 0, - "depth": 20, - "total-liquid-volume": 22000 - }, - "A5": { - "x": 0, - "y": 36, - "z": 0, - "depth": 20, - "total-liquid-volume": 22000 - }, - "A6": { - "x": 0, - "y": 45, - "z": 0, - "depth": 20, - "total-liquid-volume": 22000 - }, - "A7": { - "x": 0, - "y": 54, - "z": 0, - "depth": 20, - "total-liquid-volume": 22000 - }, - "A8": { - "x": 0, - "y": 63, - "z": 0, - "depth": 20, - "total-liquid-volume": 22000 - }, - "A9": { - "x": 0, - "y": 72, - "z": 0, - "depth": 20, - "total-liquid-volume": 22000 - }, - "A10": { - "x": 0, - "y": 81, - "z": 0, - "depth": 20, - "total-liquid-volume": 22000 - }, - "A11": { - "x": 0, - "y": 90, - "z": 0, - "depth": 20, - "total-liquid-volume": 22000 - }, - "A12": { - "x": 0, - "y": 99, - "z": 0, - "depth": 20, - "total-liquid-volume": 22000 - } - } - }, - - "24-vial-rack": { - "origin-offset": { - "x": 13.67, - "y": 16 - }, - "locations": { - "A1": { - "x": 0.0, - "total-liquid-volume": 3400, - "y": 0.0, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "A2": { - "x": 0.0, - "total-liquid-volume": 3400, - "y": 19.3, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "A3": { - "x": 0.0, - "total-liquid-volume": 3400, - "y": 38.6, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "A4": { - "x": 0.0, - "total-liquid-volume": 3400, - "y": 57.9, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "A5": { - "x": 0.0, - "total-liquid-volume": 3400, - "y": 77.2, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "A6": { - "x": 0.0, - "total-liquid-volume": 3400, - "y": 96.5, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "B1": { - "x": 19.3, - "total-liquid-volume": 3400, - "y": 0.0, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "B2": { - "x": 19.3, - "total-liquid-volume": 3400, - "y": 19.3, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "B3": { - "x": 19.3, - "total-liquid-volume": 3400, - "y": 38.6, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "B4": { - "x": 19.3, - "total-liquid-volume": 3400, - "y": 57.9, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "B5": { - "x": 19.3, - "total-liquid-volume": 3400, - "y": 77.2, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "B6": { - "x": 19.3, - "total-liquid-volume": 3400, - "y": 96.5, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "C1": { - "x": 38.6, - "total-liquid-volume": 3400, - "y": 0.0, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "C2": { - "x": 38.6, - "total-liquid-volume": 3400, - "y": 19.3, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "C3": { - "x": 38.6, - "total-liquid-volume": 3400, - "y": 38.6, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "C4": { - "x": 38.6, - "total-liquid-volume": 3400, - "y": 57.9, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "C5": { - "x": 38.6, - "total-liquid-volume": 3400, - "y": 77.2, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "C6": { - "x": 38.6, - "total-liquid-volume": 3400, - "y": 96.5, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "D1": { - "x": 57.9, - "total-liquid-volume": 3400, - "y": 0.0, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "D2": { - "x": 57.9, - "total-liquid-volume": 3400, - "y": 19.3, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "D3": { - "x": 57.9, - "total-liquid-volume": 3400, - "y": 38.6, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "D4": { - "x": 57.9, - "total-liquid-volume": 3400, - "y": 57.9, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "D5": { - "x": 57.9, - "total-liquid-volume": 3400, - "y": 77.2, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - }, - "D6": { - "x": 57.9, - "total-liquid-volume": 3400, - "y": 96.5, - "depth": 16.2, - "z": 0, - "diameter": 15.62 - } - } - }, - - "96-deep-well": { - "origin-offset": { - "x": 11.24, - "y": 14.34 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "B1": { - "x": 9, - "y": 0, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "C1": { - "x": 18, - "y": 0, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "D1": { - "x": 27, - "y": 0, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "E1": { - "x": 36, - "y": 0, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "F1": { - "x": 45, - "y": 0, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "G1": { - "x": 54, - "y": 0, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "H1": { - "x": 63, - "y": 0, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "A2": { - "x": 0, - "y": 9, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "B2": { - "x": 9, - "y": 9, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "C2": { - "x": 18, - "y": 9, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "D2": { - "x": 27, - "y": 9, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "E2": { - "x": 36, - "y": 9, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "F2": { - "x": 45, - "y": 9, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "G2": { - "x": 54, - "y": 9, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "H2": { - "x": 63, - "y": 9, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "A3": { - "x": 0, - "y": 18, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "B3": { - "x": 9, - "y": 18, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "C3": { - "x": 18, - "y": 18, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "D3": { - "x": 27, - "y": 18, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "E3": { - "x": 36, - "y": 18, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "F3": { - "x": 45, - "y": 18, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "G3": { - "x": 54, - "y": 18, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "H3": { - "x": 63, - "y": 18, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "A4": { - "x": 0, - "y": 27, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "B4": { - "x": 9, - "y": 27, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "C4": { - "x": 18, - "y": 27, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "D4": { - "x": 27, - "y": 27, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "E4": { - "x": 36, - "y": 27, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "F4": { - "x": 45, - "y": 27, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "G4": { - "x": 54, - "y": 27, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "H4": { - "x": 63, - "y": 27, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "A5": { - "x": 0, - "y": 36, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "B5": { - "x": 9, - "y": 36, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "C5": { - "x": 18, - "y": 36, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "D5": { - "x": 27, - "y": 36, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "E5": { - "x": 36, - "y": 36, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "F5": { - "x": 45, - "y": 36, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "G5": { - "x": 54, - "y": 36, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "H5": { - "x": 63, - "y": 36, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "A6": { - "x": 0, - "y": 45, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "B6": { - "x": 9, - "y": 45, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "C6": { - "x": 18, - "y": 45, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "D6": { - "x": 27, - "y": 45, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "E6": { - "x": 36, - "y": 45, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "F6": { - "x": 45, - "y": 45, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "G6": { - "x": 54, - "y": 45, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "H6": { - "x": 63, - "y": 45, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "A7": { - "x": 0, - "y": 54, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "B7": { - "x": 9, - "y": 54, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "C7": { - "x": 18, - "y": 54, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "D7": { - "x": 27, - "y": 54, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "E7": { - "x": 36, - "y": 54, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "F7": { - "x": 45, - "y": 54, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "G7": { - "x": 54, - "y": 54, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "H7": { - "x": 63, - "y": 54, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "A8": { - "x": 0, - "y": 63, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "B8": { - "x": 9, - "y": 63, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "C8": { - "x": 18, - "y": 63, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "D8": { - "x": 27, - "y": 63, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "E8": { - "x": 36, - "y": 63, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "F8": { - "x": 45, - "y": 63, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "G8": { - "x": 54, - "y": 63, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "H8": { - "x": 63, - "y": 63, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "A9": { - "x": 0, - "y": 72, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "B9": { - "x": 9, - "y": 72, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "C9": { - "x": 18, - "y": 72, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "D9": { - "x": 27, - "y": 72, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "E9": { - "x": 36, - "y": 72, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "F9": { - "x": 45, - "y": 72, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "G9": { - "x": 54, - "y": 72, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "H9": { - "x": 63, - "y": 72, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "A10": { - "x": 0, - "y": 81, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "B10": { - "x": 9, - "y": 81, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "C10": { - "x": 18, - "y": 81, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "D10": { - "x": 27, - "y": 81, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "E10": { - "x": 36, - "y": 81, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "F10": { - "x": 45, - "y": 81, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "G10": { - "x": 54, - "y": 81, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "H10": { - "x": 63, - "y": 81, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "A11": { - "x": 0, - "y": 90, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "B11": { - "x": 9, - "y": 90, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "C11": { - "x": 18, - "y": 90, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "D11": { - "x": 27, - "y": 90, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "E11": { - "x": 36, - "y": 90, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "F11": { - "x": 45, - "y": 90, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "G11": { - "x": 54, - "y": 90, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "H11": { - "x": 63, - "y": 90, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "A12": { - "x": 0, - "y": 99, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "B12": { - "x": 9, - "y": 99, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "C12": { - "x": 18, - "y": 99, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "D12": { - "x": 27, - "y": 99, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "E12": { - "x": 36, - "y": 99, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "F12": { - "x": 45, - "y": 99, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "G12": { - "x": 54, - "y": 99, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - }, - "H12": { - "x": 63, - "y": 99, - "z": 0, - "depth": 33.5, - "diameter": 7.5, - "total-liquid-volume": 2000 - } - } - }, - - "96-PCR-tall": { - "origin-offset": { - "x": 11.24, - "y": 14.34 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B1": { - "x": 9, - "y": 0, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C1": { - "x": 18, - "y": 0, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D1": { - "x": 27, - "y": 0, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E1": { - "x": 36, - "y": 0, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F1": { - "x": 45, - "y": 0, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G1": { - "x": 54, - "y": 0, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H1": { - "x": 63, - "y": 0, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A2": { - "x": 0, - "y": 9, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B2": { - "x": 9, - "y": 9, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C2": { - "x": 18, - "y": 9, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D2": { - "x": 27, - "y": 9, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E2": { - "x": 36, - "y": 9, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F2": { - "x": 45, - "y": 9, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G2": { - "x": 54, - "y": 9, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H2": { - "x": 63, - "y": 9, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A3": { - "x": 0, - "y": 18, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B3": { - "x": 9, - "y": 18, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C3": { - "x": 18, - "y": 18, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D3": { - "x": 27, - "y": 18, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E3": { - "x": 36, - "y": 18, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F3": { - "x": 45, - "y": 18, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G3": { - "x": 54, - "y": 18, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H3": { - "x": 63, - "y": 18, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A4": { - "x": 0, - "y": 27, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B4": { - "x": 9, - "y": 27, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C4": { - "x": 18, - "y": 27, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D4": { - "x": 27, - "y": 27, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E4": { - "x": 36, - "y": 27, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F4": { - "x": 45, - "y": 27, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G4": { - "x": 54, - "y": 27, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H4": { - "x": 63, - "y": 27, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A5": { - "x": 0, - "y": 36, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B5": { - "x": 9, - "y": 36, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C5": { - "x": 18, - "y": 36, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D5": { - "x": 27, - "y": 36, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E5": { - "x": 36, - "y": 36, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F5": { - "x": 45, - "y": 36, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G5": { - "x": 54, - "y": 36, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H5": { - "x": 63, - "y": 36, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A6": { - "x": 0, - "y": 45, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B6": { - "x": 9, - "y": 45, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C6": { - "x": 18, - "y": 45, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D6": { - "x": 27, - "y": 45, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E6": { - "x": 36, - "y": 45, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F6": { - "x": 45, - "y": 45, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G6": { - "x": 54, - "y": 45, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H6": { - "x": 63, - "y": 45, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A7": { - "x": 0, - "y": 54, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B7": { - "x": 9, - "y": 54, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C7": { - "x": 18, - "y": 54, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D7": { - "x": 27, - "y": 54, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E7": { - "x": 36, - "y": 54, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F7": { - "x": 45, - "y": 54, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G7": { - "x": 54, - "y": 54, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H7": { - "x": 63, - "y": 54, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A8": { - "x": 0, - "y": 63, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B8": { - "x": 9, - "y": 63, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C8": { - "x": 18, - "y": 63, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D8": { - "x": 27, - "y": 63, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E8": { - "x": 36, - "y": 63, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F8": { - "x": 45, - "y": 63, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G8": { - "x": 54, - "y": 63, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H8": { - "x": 63, - "y": 63, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A9": { - "x": 0, - "y": 72, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B9": { - "x": 9, - "y": 72, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C9": { - "x": 18, - "y": 72, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D9": { - "x": 27, - "y": 72, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E9": { - "x": 36, - "y": 72, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F9": { - "x": 45, - "y": 72, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G9": { - "x": 54, - "y": 72, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H9": { - "x": 63, - "y": 72, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A10": { - "x": 0, - "y": 81, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B10": { - "x": 9, - "y": 81, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C10": { - "x": 18, - "y": 81, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D10": { - "x": 27, - "y": 81, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E10": { - "x": 36, - "y": 81, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F10": { - "x": 45, - "y": 81, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G10": { - "x": 54, - "y": 81, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H10": { - "x": 63, - "y": 81, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A11": { - "x": 0, - "y": 90, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B11": { - "x": 9, - "y": 90, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C11": { - "x": 18, - "y": 90, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D11": { - "x": 27, - "y": 90, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E11": { - "x": 36, - "y": 90, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F11": { - "x": 45, - "y": 90, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G11": { - "x": 54, - "y": 90, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H11": { - "x": 63, - "y": 90, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A12": { - "x": 0, - "y": 99, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B12": { - "x": 9, - "y": 99, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C12": { - "x": 18, - "y": 99, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D12": { - "x": 27, - "y": 99, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E12": { - "x": 36, - "y": 99, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F12": { - "x": 45, - "y": 99, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G12": { - "x": 54, - "y": 99, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H12": { - "x": 63, - "y": 99, - "z": 0, - "depth": 15.4, - "diameter": 6.4, - "total-liquid-volume": 300 - } - } - }, - - "96-PCR-flat": { - "origin-offset": { - "x": 11.24, - "y": 14.34 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B1": { - "x": 9, - "y": 0, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C1": { - "x": 18, - "y": 0, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D1": { - "x": 27, - "y": 0, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E1": { - "x": 36, - "y": 0, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F1": { - "x": 45, - "y": 0, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G1": { - "x": 54, - "y": 0, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H1": { - "x": 63, - "y": 0, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A2": { - "x": 0, - "y": 9, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B2": { - "x": 9, - "y": 9, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C2": { - "x": 18, - "y": 9, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D2": { - "x": 27, - "y": 9, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E2": { - "x": 36, - "y": 9, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F2": { - "x": 45, - "y": 9, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G2": { - "x": 54, - "y": 9, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H2": { - "x": 63, - "y": 9, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A3": { - "x": 0, - "y": 18, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B3": { - "x": 9, - "y": 18, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C3": { - "x": 18, - "y": 18, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D3": { - "x": 27, - "y": 18, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E3": { - "x": 36, - "y": 18, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F3": { - "x": 45, - "y": 18, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G3": { - "x": 54, - "y": 18, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H3": { - "x": 63, - "y": 18, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A4": { - "x": 0, - "y": 27, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B4": { - "x": 9, - "y": 27, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C4": { - "x": 18, - "y": 27, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D4": { - "x": 27, - "y": 27, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E4": { - "x": 36, - "y": 27, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F4": { - "x": 45, - "y": 27, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G4": { - "x": 54, - "y": 27, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H4": { - "x": 63, - "y": 27, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A5": { - "x": 0, - "y": 36, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B5": { - "x": 9, - "y": 36, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C5": { - "x": 18, - "y": 36, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D5": { - "x": 27, - "y": 36, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E5": { - "x": 36, - "y": 36, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F5": { - "x": 45, - "y": 36, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G5": { - "x": 54, - "y": 36, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H5": { - "x": 63, - "y": 36, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A6": { - "x": 0, - "y": 45, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B6": { - "x": 9, - "y": 45, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C6": { - "x": 18, - "y": 45, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D6": { - "x": 27, - "y": 45, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E6": { - "x": 36, - "y": 45, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F6": { - "x": 45, - "y": 45, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G6": { - "x": 54, - "y": 45, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H6": { - "x": 63, - "y": 45, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A7": { - "x": 0, - "y": 54, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B7": { - "x": 9, - "y": 54, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C7": { - "x": 18, - "y": 54, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D7": { - "x": 27, - "y": 54, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E7": { - "x": 36, - "y": 54, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F7": { - "x": 45, - "y": 54, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G7": { - "x": 54, - "y": 54, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H7": { - "x": 63, - "y": 54, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A8": { - "x": 0, - "y": 63, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B8": { - "x": 9, - "y": 63, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C8": { - "x": 18, - "y": 63, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D8": { - "x": 27, - "y": 63, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E8": { - "x": 36, - "y": 63, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F8": { - "x": 45, - "y": 63, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G8": { - "x": 54, - "y": 63, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H8": { - "x": 63, - "y": 63, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A9": { - "x": 0, - "y": 72, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B9": { - "x": 9, - "y": 72, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C9": { - "x": 18, - "y": 72, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D9": { - "x": 27, - "y": 72, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E9": { - "x": 36, - "y": 72, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F9": { - "x": 45, - "y": 72, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G9": { - "x": 54, - "y": 72, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H9": { - "x": 63, - "y": 72, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A10": { - "x": 0, - "y": 81, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B10": { - "x": 9, - "y": 81, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C10": { - "x": 18, - "y": 81, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D10": { - "x": 27, - "y": 81, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E10": { - "x": 36, - "y": 81, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F10": { - "x": 45, - "y": 81, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G10": { - "x": 54, - "y": 81, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H10": { - "x": 63, - "y": 81, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A11": { - "x": 0, - "y": 90, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B11": { - "x": 9, - "y": 90, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C11": { - "x": 18, - "y": 90, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D11": { - "x": 27, - "y": 90, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E11": { - "x": 36, - "y": 90, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F11": { - "x": 45, - "y": 90, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G11": { - "x": 54, - "y": 90, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H11": { - "x": 63, - "y": 90, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "A12": { - "x": 0, - "y": 99, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "B12": { - "x": 9, - "y": 99, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "C12": { - "x": 18, - "y": 99, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "D12": { - "x": 27, - "y": 99, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "E12": { - "x": 36, - "y": 99, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "F12": { - "x": 45, - "y": 99, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "G12": { - "x": 54, - "y": 99, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - }, - "H12": { - "x": 63, - "y": 99, - "z": 0, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 300 - } - } - }, - - "biorad-hardshell-96-PCR": { - "origin-offset": { - "x": 18.24, - "y": 13.63 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B1": { - "x": 9, - "y": 0, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C1": { - "x": 18, - "y": 0, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D1": { - "x": 27, - "y": 0, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E1": { - "x": 36, - "y": 0, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F1": { - "x": 45, - "y": 0, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G1": { - "x": 54, - "y": 0, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H1": { - "x": 63, - "y": 0, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A2": { - "x": 0, - "y": 9, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B2": { - "x": 9, - "y": 9, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C2": { - "x": 18, - "y": 9, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D2": { - "x": 27, - "y": 9, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E2": { - "x": 36, - "y": 9, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F2": { - "x": 45, - "y": 9, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G2": { - "x": 54, - "y": 9, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H2": { - "x": 63, - "y": 9, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A3": { - "x": 0, - "y": 18, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B3": { - "x": 9, - "y": 18, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C3": { - "x": 18, - "y": 18, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D3": { - "x": 27, - "y": 18, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E3": { - "x": 36, - "y": 18, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F3": { - "x": 45, - "y": 18, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G3": { - "x": 54, - "y": 18, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H3": { - "x": 63, - "y": 18, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A4": { - "x": 0, - "y": 27, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B4": { - "x": 9, - "y": 27, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C4": { - "x": 18, - "y": 27, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D4": { - "x": 27, - "y": 27, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E4": { - "x": 36, - "y": 27, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F4": { - "x": 45, - "y": 27, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G4": { - "x": 54, - "y": 27, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H4": { - "x": 63, - "y": 27, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A5": { - "x": 0, - "y": 36, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B5": { - "x": 9, - "y": 36, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C5": { - "x": 18, - "y": 36, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D5": { - "x": 27, - "y": 36, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E5": { - "x": 36, - "y": 36, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F5": { - "x": 45, - "y": 36, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G5": { - "x": 54, - "y": 36, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H5": { - "x": 63, - "y": 36, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A6": { - "x": 0, - "y": 45, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B6": { - "x": 9, - "y": 45, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C6": { - "x": 18, - "y": 45, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D6": { - "x": 27, - "y": 45, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E6": { - "x": 36, - "y": 45, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F6": { - "x": 45, - "y": 45, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G6": { - "x": 54, - "y": 45, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H6": { - "x": 63, - "y": 45, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A7": { - "x": 0, - "y": 54, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B7": { - "x": 9, - "y": 54, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C7": { - "x": 18, - "y": 54, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D7": { - "x": 27, - "y": 54, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E7": { - "x": 36, - "y": 54, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F7": { - "x": 45, - "y": 54, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G7": { - "x": 54, - "y": 54, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H7": { - "x": 63, - "y": 54, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A8": { - "x": 0, - "y": 63, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B8": { - "x": 9, - "y": 63, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C8": { - "x": 18, - "y": 63, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D8": { - "x": 27, - "y": 63, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E8": { - "x": 36, - "y": 63, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F8": { - "x": 45, - "y": 63, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G8": { - "x": 54, - "y": 63, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H8": { - "x": 63, - "y": 63, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A9": { - "x": 0, - "y": 72, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B9": { - "x": 9, - "y": 72, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C9": { - "x": 18, - "y": 72, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D9": { - "x": 27, - "y": 72, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E9": { - "x": 36, - "y": 72, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F9": { - "x": 45, - "y": 72, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G9": { - "x": 54, - "y": 72, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H9": { - "x": 63, - "y": 72, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A10": { - "x": 0, - "y": 81, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B10": { - "x": 9, - "y": 81, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C10": { - "x": 18, - "y": 81, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D10": { - "x": 27, - "y": 81, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E10": { - "x": 36, - "y": 81, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F10": { - "x": 45, - "y": 81, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G10": { - "x": 54, - "y": 81, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H10": { - "x": 63, - "y": 81, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A11": { - "x": 0, - "y": 90, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B11": { - "x": 9, - "y": 90, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C11": { - "x": 18, - "y": 90, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D11": { - "x": 27, - "y": 90, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E11": { - "x": 36, - "y": 90, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F11": { - "x": 45, - "y": 90, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G11": { - "x": 54, - "y": 90, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H11": { - "x": 63, - "y": 90, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A12": { - "x": 0, - "y": 99, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B12": { - "x": 9, - "y": 99, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C12": { - "x": 18, - "y": 99, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D12": { - "x": 27, - "y": 99, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E12": { - "x": 36, - "y": 99, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F12": { - "x": 45, - "y": 99, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G12": { - "x": 54, - "y": 99, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H12": { - "x": 63, - "y": 99, - "z": 4.25, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 300 - } - } - }, - - "96-flat": { - "origin-offset": { - "x": 17.64, - "y": 14.34 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "B1": { - "x": 9, - "y": 0, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "C1": { - "x": 18, - "y": 0, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "D1": { - "x": 27, - "y": 0, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "E1": { - "x": 36, - "y": 0, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "F1": { - "x": 45, - "y": 0, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "G1": { - "x": 54, - "y": 0, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "H1": { - "x": 63, - "y": 0, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "A2": { - "x": 0, - "y": 9, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "B2": { - "x": 9, - "y": 9, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "C2": { - "x": 18, - "y": 9, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "D2": { - "x": 27, - "y": 9, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "E2": { - "x": 36, - "y": 9, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "F2": { - "x": 45, - "y": 9, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "G2": { - "x": 54, - "y": 9, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "H2": { - "x": 63, - "y": 9, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "A3": { - "x": 0, - "y": 18, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "B3": { - "x": 9, - "y": 18, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "C3": { - "x": 18, - "y": 18, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "D3": { - "x": 27, - "y": 18, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "E3": { - "x": 36, - "y": 18, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "F3": { - "x": 45, - "y": 18, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "G3": { - "x": 54, - "y": 18, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "H3": { - "x": 63, - "y": 18, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "A4": { - "x": 0, - "y": 27, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "B4": { - "x": 9, - "y": 27, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "C4": { - "x": 18, - "y": 27, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "D4": { - "x": 27, - "y": 27, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "E4": { - "x": 36, - "y": 27, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "F4": { - "x": 45, - "y": 27, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "G4": { - "x": 54, - "y": 27, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "H4": { - "x": 63, - "y": 27, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "A5": { - "x": 0, - "y": 36, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "B5": { - "x": 9, - "y": 36, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "C5": { - "x": 18, - "y": 36, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "D5": { - "x": 27, - "y": 36, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "E5": { - "x": 36, - "y": 36, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "F5": { - "x": 45, - "y": 36, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "G5": { - "x": 54, - "y": 36, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "H5": { - "x": 63, - "y": 36, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "A6": { - "x": 0, - "y": 45, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "B6": { - "x": 9, - "y": 45, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "C6": { - "x": 18, - "y": 45, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "D6": { - "x": 27, - "y": 45, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "E6": { - "x": 36, - "y": 45, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "F6": { - "x": 45, - "y": 45, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "G6": { - "x": 54, - "y": 45, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "H6": { - "x": 63, - "y": 45, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "A7": { - "x": 0, - "y": 54, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "B7": { - "x": 9, - "y": 54, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "C7": { - "x": 18, - "y": 54, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "D7": { - "x": 27, - "y": 54, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "E7": { - "x": 36, - "y": 54, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "F7": { - "x": 45, - "y": 54, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "G7": { - "x": 54, - "y": 54, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "H7": { - "x": 63, - "y": 54, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "A8": { - "x": 0, - "y": 63, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "B8": { - "x": 9, - "y": 63, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "C8": { - "x": 18, - "y": 63, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "D8": { - "x": 27, - "y": 63, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "E8": { - "x": 36, - "y": 63, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "F8": { - "x": 45, - "y": 63, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "G8": { - "x": 54, - "y": 63, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "H8": { - "x": 63, - "y": 63, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "A9": { - "x": 0, - "y": 72, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "B9": { - "x": 9, - "y": 72, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "C9": { - "x": 18, - "y": 72, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "D9": { - "x": 27, - "y": 72, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "E9": { - "x": 36, - "y": 72, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "F9": { - "x": 45, - "y": 72, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "G9": { - "x": 54, - "y": 72, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "H9": { - "x": 63, - "y": 72, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "A10": { - "x": 0, - "y": 81, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "B10": { - "x": 9, - "y": 81, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "C10": { - "x": 18, - "y": 81, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "D10": { - "x": 27, - "y": 81, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "E10": { - "x": 36, - "y": 81, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "F10": { - "x": 45, - "y": 81, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "G10": { - "x": 54, - "y": 81, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "H10": { - "x": 63, - "y": 81, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "A11": { - "x": 0, - "y": 90, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "B11": { - "x": 9, - "y": 90, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "C11": { - "x": 18, - "y": 90, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "D11": { - "x": 27, - "y": 90, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "E11": { - "x": 36, - "y": 90, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "F11": { - "x": 45, - "y": 90, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "G11": { - "x": 54, - "y": 90, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "H11": { - "x": 63, - "y": 90, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "A12": { - "x": 0, - "y": 99, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "B12": { - "x": 9, - "y": 99, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "C12": { - "x": 18, - "y": 99, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "D12": { - "x": 27, - "y": 99, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "E12": { - "x": 36, - "y": 99, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "F12": { - "x": 45, - "y": 99, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "G12": { - "x": 54, - "y": 99, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - }, - "H12": { - "x": 63, - "y": 99, - "z": 3.85, - "depth": 10.5, - "diameter": 6.4, - "total-liquid-volume": 400 - } - } - }, - - "PCR-strip-tall": { - "origin-offset": { - "x": 11.24, - "y": 14.34 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "B1": { - "x": 9, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "C1": { - "x": 18, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "D1": { - "x": 27, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "E1": { - "x": 36, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "F1": { - "x": 45, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "G1": { - "x": 54, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "H1": { - "x": 63, - "y": 0, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "A2": { - "x": 0, - "y": 9, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "B2": { - "x": 9, - "y": 9, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "C2": { - "x": 18, - "y": 9, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "D2": { - "x": 27, - "y": 9, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "E2": { - "x": 36, - "y": 9, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "F2": { - "x": 45, - "y": 9, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "G2": { - "x": 54, - "y": 9, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "H2": { - "x": 63, - "y": 9, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "A3": { - "x": 0, - "y": 18, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "B3": { - "x": 9, - "y": 18, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "C3": { - "x": 18, - "y": 18, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "D3": { - "x": 27, - "y": 18, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "E3": { - "x": 36, - "y": 18, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "F3": { - "x": 45, - "y": 18, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "G3": { - "x": 54, - "y": 18, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "H3": { - "x": 63, - "y": 18, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "A4": { - "x": 0, - "y": 27, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "B4": { - "x": 9, - "y": 27, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "C4": { - "x": 18, - "y": 27, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "D4": { - "x": 27, - "y": 27, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "E4": { - "x": 36, - "y": 27, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "F4": { - "x": 45, - "y": 27, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "G4": { - "x": 54, - "y": 27, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "H4": { - "x": 63, - "y": 27, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "A5": { - "x": 0, - "y": 36, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "B5": { - "x": 9, - "y": 36, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "C5": { - "x": 18, - "y": 36, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "D5": { - "x": 27, - "y": 36, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "E5": { - "x": 36, - "y": 36, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "F5": { - "x": 45, - "y": 36, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "G5": { - "x": 54, - "y": 36, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "H5": { - "x": 63, - "y": 36, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "A6": { - "x": 0, - "y": 45, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "B6": { - "x": 9, - "y": 45, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "C6": { - "x": 18, - "y": 45, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "D6": { - "x": 27, - "y": 45, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "E6": { - "x": 36, - "y": 45, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "F6": { - "x": 45, - "y": 45, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "G6": { - "x": 54, - "y": 45, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "H6": { - "x": 63, - "y": 45, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "A7": { - "x": 0, - "y": 54, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "B7": { - "x": 9, - "y": 54, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "C7": { - "x": 18, - "y": 54, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "D7": { - "x": 27, - "y": 54, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "E7": { - "x": 36, - "y": 54, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "F7": { - "x": 45, - "y": 54, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "G7": { - "x": 54, - "y": 54, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "H7": { - "x": 63, - "y": 54, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "A8": { - "x": 0, - "y": 63, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "B8": { - "x": 9, - "y": 63, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "C8": { - "x": 18, - "y": 63, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "D8": { - "x": 27, - "y": 63, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "E8": { - "x": 36, - "y": 63, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "F8": { - "x": 45, - "y": 63, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "G8": { - "x": 54, - "y": 63, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "H8": { - "x": 63, - "y": 63, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "A9": { - "x": 0, - "y": 72, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "B9": { - "x": 9, - "y": 72, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "C9": { - "x": 18, - "y": 72, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "D9": { - "x": 27, - "y": 72, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "E9": { - "x": 36, - "y": 72, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "F9": { - "x": 45, - "y": 72, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "G9": { - "x": 54, - "y": 72, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "H9": { - "x": 63, - "y": 72, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "A10": { - "x": 0, - "y": 81, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "B10": { - "x": 9, - "y": 81, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "C10": { - "x": 18, - "y": 81, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "D10": { - "x": 27, - "y": 81, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "E10": { - "x": 36, - "y": 81, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "F10": { - "x": 45, - "y": 81, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "G10": { - "x": 54, - "y": 81, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "H10": { - "x": 63, - "y": 81, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "A11": { - "x": 0, - "y": 90, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "B11": { - "x": 9, - "y": 90, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "C11": { - "x": 18, - "y": 90, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "D11": { - "x": 27, - "y": 90, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "E11": { - "x": 36, - "y": 90, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "F11": { - "x": 45, - "y": 90, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "G11": { - "x": 54, - "y": 90, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "H11": { - "x": 63, - "y": 90, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "A12": { - "x": 0, - "y": 99, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "B12": { - "x": 9, - "y": 99, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "C12": { - "x": 18, - "y": 99, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "D12": { - "x": 27, - "y": 99, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "E12": { - "x": 36, - "y": 99, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "F12": { - "x": 45, - "y": 99, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "G12": { - "x": 54, - "y": 99, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - }, - "H12": { - "x": 63, - "y": 99, - "z": 0, - "depth": 19.5, - "diameter": 6.4, - "total-liquid-volume": 280 - } - } - }, - - "384-plate": { - "origin-offset": { - "x": 9, - "y": 12.13 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B1": { - "x": 4.5, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C1": { - "x": 9, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D1": { - "x": 13.5, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E1": { - "x": 18, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F1": { - "x": 22.5, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G1": { - "x": 27, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H1": { - "x": 31.5, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I1": { - "x": 36, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J1": { - "x": 40.5, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K1": { - "x": 45, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L1": { - "x": 49.5, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M1": { - "x": 54, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N1": { - "x": 58.5, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O1": { - "x": 63, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P1": { - "x": 67.5, - "y": 0, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A2": { - "x": 0, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B2": { - "x": 4.5, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C2": { - "x": 9, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D2": { - "x": 13.5, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E2": { - "x": 18, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F2": { - "x": 22.5, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G2": { - "x": 27, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H2": { - "x": 31.5, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I2": { - "x": 36, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J2": { - "x": 40.5, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K2": { - "x": 45, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L2": { - "x": 49.5, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M2": { - "x": 54, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N2": { - "x": 58.5, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O2": { - "x": 63, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P2": { - "x": 67.5, - "y": 4.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A3": { - "x": 0, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B3": { - "x": 4.5, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C3": { - "x": 9, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D3": { - "x": 13.5, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E3": { - "x": 18, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F3": { - "x": 22.5, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G3": { - "x": 27, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H3": { - "x": 31.5, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I3": { - "x": 36, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J3": { - "x": 40.5, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K3": { - "x": 45, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L3": { - "x": 49.5, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M3": { - "x": 54, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N3": { - "x": 58.5, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O3": { - "x": 63, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P3": { - "x": 67.5, - "y": 9, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A4": { - "x": 0, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B4": { - "x": 4.5, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C4": { - "x": 9, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D4": { - "x": 13.5, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E4": { - "x": 18, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F4": { - "x": 22.5, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G4": { - "x": 27, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H4": { - "x": 31.5, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I4": { - "x": 36, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J4": { - "x": 40.5, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K4": { - "x": 45, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L4": { - "x": 49.5, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M4": { - "x": 54, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N4": { - "x": 58.5, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O4": { - "x": 63, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P4": { - "x": 67.5, - "y": 13.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A5": { - "x": 0, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B5": { - "x": 4.5, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C5": { - "x": 9, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D5": { - "x": 13.5, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E5": { - "x": 18, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F5": { - "x": 22.5, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G5": { - "x": 27, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H5": { - "x": 31.5, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I5": { - "x": 36, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J5": { - "x": 40.5, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K5": { - "x": 45, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L5": { - "x": 49.5, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M5": { - "x": 54, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N5": { - "x": 58.5, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O5": { - "x": 63, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P5": { - "x": 67.5, - "y": 18, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A6": { - "x": 0, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B6": { - "x": 4.5, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C6": { - "x": 9, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D6": { - "x": 13.5, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E6": { - "x": 18, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F6": { - "x": 22.5, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G6": { - "x": 27, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H6": { - "x": 31.5, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I6": { - "x": 36, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J6": { - "x": 40.5, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K6": { - "x": 45, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L6": { - "x": 49.5, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M6": { - "x": 54, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N6": { - "x": 58.5, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O6": { - "x": 63, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P6": { - "x": 67.5, - "y": 22.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A7": { - "x": 0, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B7": { - "x": 4.5, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C7": { - "x": 9, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D7": { - "x": 13.5, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E7": { - "x": 18, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F7": { - "x": 22.5, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G7": { - "x": 27, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H7": { - "x": 31.5, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I7": { - "x": 36, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J7": { - "x": 40.5, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K7": { - "x": 45, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L7": { - "x": 49.5, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M7": { - "x": 54, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N7": { - "x": 58.5, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O7": { - "x": 63, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P7": { - "x": 67.5, - "y": 27, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A8": { - "x": 0, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B8": { - "x": 4.5, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C8": { - "x": 9, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D8": { - "x": 13.5, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E8": { - "x": 18, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F8": { - "x": 22.5, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G8": { - "x": 27, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H8": { - "x": 31.5, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I8": { - "x": 36, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J8": { - "x": 40.5, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K8": { - "x": 45, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L8": { - "x": 49.5, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M8": { - "x": 54, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N8": { - "x": 58.5, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O8": { - "x": 63, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P8": { - "x": 67.5, - "y": 31.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A9": { - "x": 0, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B9": { - "x": 4.5, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C9": { - "x": 9, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D9": { - "x": 13.5, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E9": { - "x": 18, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F9": { - "x": 22.5, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G9": { - "x": 27, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H9": { - "x": 31.5, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I9": { - "x": 36, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J9": { - "x": 40.5, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K9": { - "x": 45, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L9": { - "x": 49.5, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M9": { - "x": 54, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N9": { - "x": 58.5, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O9": { - "x": 63, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P9": { - "x": 67.5, - "y": 36, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A10": { - "x": 0, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B10": { - "x": 4.5, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C10": { - "x": 9, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D10": { - "x": 13.5, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E10": { - "x": 18, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F10": { - "x": 22.5, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G10": { - "x": 27, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H10": { - "x": 31.5, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I10": { - "x": 36, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J10": { - "x": 40.5, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K10": { - "x": 45, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L10": { - "x": 49.5, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M10": { - "x": 54, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N10": { - "x": 58.5, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O10": { - "x": 63, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P10": { - "x": 67.5, - "y": 40.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A11": { - "x": 0, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B11": { - "x": 4.5, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C11": { - "x": 9, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D11": { - "x": 13.5, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E11": { - "x": 18, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F11": { - "x": 22.5, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G11": { - "x": 27, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H11": { - "x": 31.5, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I11": { - "x": 36, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J11": { - "x": 40.5, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K11": { - "x": 45, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L11": { - "x": 49.5, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M11": { - "x": 54, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N11": { - "x": 58.5, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O11": { - "x": 63, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P11": { - "x": 67.5, - "y": 45, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A12": { - "x": 0, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B12": { - "x": 4.5, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C12": { - "x": 9, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D12": { - "x": 13.5, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E12": { - "x": 18, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F12": { - "x": 22.5, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G12": { - "x": 27, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H12": { - "x": 31.5, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I12": { - "x": 36, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J12": { - "x": 40.5, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K12": { - "x": 45, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L12": { - "x": 49.5, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M12": { - "x": 54, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N12": { - "x": 58.5, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O12": { - "x": 63, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P12": { - "x": 67.5, - "y": 49.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A13": { - "x": 0, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B13": { - "x": 4.5, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C13": { - "x": 9, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D13": { - "x": 13.5, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E13": { - "x": 18, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F13": { - "x": 22.5, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G13": { - "x": 27, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H13": { - "x": 31.5, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I13": { - "x": 36, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J13": { - "x": 40.5, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K13": { - "x": 45, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L13": { - "x": 49.5, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M13": { - "x": 54, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N13": { - "x": 58.5, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O13": { - "x": 63, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P13": { - "x": 67.5, - "y": 54, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A14": { - "x": 0, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B14": { - "x": 4.5, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C14": { - "x": 9, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D14": { - "x": 13.5, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E14": { - "x": 18, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F14": { - "x": 22.5, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G14": { - "x": 27, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H14": { - "x": 31.5, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I14": { - "x": 36, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J14": { - "x": 40.5, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K14": { - "x": 45, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L14": { - "x": 49.5, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M14": { - "x": 54, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N14": { - "x": 58.5, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O14": { - "x": 63, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P14": { - "x": 67.5, - "y": 58.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A15": { - "x": 0, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B15": { - "x": 4.5, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C15": { - "x": 9, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D15": { - "x": 13.5, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E15": { - "x": 18, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F15": { - "x": 22.5, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G15": { - "x": 27, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H15": { - "x": 31.5, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I15": { - "x": 36, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J15": { - "x": 40.5, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K15": { - "x": 45, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L15": { - "x": 49.5, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M15": { - "x": 54, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N15": { - "x": 58.5, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O15": { - "x": 63, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P15": { - "x": 67.5, - "y": 63, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A16": { - "x": 0, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B16": { - "x": 4.5, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C16": { - "x": 9, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D16": { - "x": 13.5, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E16": { - "x": 18, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F16": { - "x": 22.5, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G16": { - "x": 27, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H16": { - "x": 31.5, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I16": { - "x": 36, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J16": { - "x": 40.5, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K16": { - "x": 45, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L16": { - "x": 49.5, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M16": { - "x": 54, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N16": { - "x": 58.5, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O16": { - "x": 63, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P16": { - "x": 67.5, - "y": 67.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A17": { - "x": 0, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B17": { - "x": 4.5, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C17": { - "x": 9, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D17": { - "x": 13.5, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E17": { - "x": 18, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F17": { - "x": 22.5, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G17": { - "x": 27, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H17": { - "x": 31.5, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I17": { - "x": 36, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J17": { - "x": 40.5, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K17": { - "x": 45, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L17": { - "x": 49.5, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M17": { - "x": 54, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N17": { - "x": 58.5, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O17": { - "x": 63, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P17": { - "x": 67.5, - "y": 72, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A18": { - "x": 0, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B18": { - "x": 4.5, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C18": { - "x": 9, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D18": { - "x": 13.5, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E18": { - "x": 18, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F18": { - "x": 22.5, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G18": { - "x": 27, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H18": { - "x": 31.5, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I18": { - "x": 36, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J18": { - "x": 40.5, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K18": { - "x": 45, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L18": { - "x": 49.5, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M18": { - "x": 54, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N18": { - "x": 58.5, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O18": { - "x": 63, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P18": { - "x": 67.5, - "y": 76.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A19": { - "x": 0, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B19": { - "x": 4.5, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C19": { - "x": 9, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D19": { - "x": 13.5, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E19": { - "x": 18, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F19": { - "x": 22.5, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G19": { - "x": 27, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H19": { - "x": 31.5, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I19": { - "x": 36, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J19": { - "x": 40.5, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K19": { - "x": 45, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L19": { - "x": 49.5, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M19": { - "x": 54, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N19": { - "x": 58.5, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O19": { - "x": 63, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P19": { - "x": 67.5, - "y": 81, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A20": { - "x": 0, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B20": { - "x": 4.5, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C20": { - "x": 9, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D20": { - "x": 13.5, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E20": { - "x": 18, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F20": { - "x": 22.5, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G20": { - "x": 27, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H20": { - "x": 31.5, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I20": { - "x": 36, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J20": { - "x": 40.5, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K20": { - "x": 45, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L20": { - "x": 49.5, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M20": { - "x": 54, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N20": { - "x": 58.5, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O20": { - "x": 63, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P20": { - "x": 67.5, - "y": 85.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A21": { - "x": 0, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B21": { - "x": 4.5, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C21": { - "x": 9, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D21": { - "x": 13.5, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E21": { - "x": 18, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F21": { - "x": 22.5, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G21": { - "x": 27, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H21": { - "x": 31.5, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I21": { - "x": 36, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J21": { - "x": 40.5, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K21": { - "x": 45, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L21": { - "x": 49.5, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M21": { - "x": 54, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N21": { - "x": 58.5, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O21": { - "x": 63, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P21": { - "x": 67.5, - "y": 90, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A22": { - "x": 0, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B22": { - "x": 4.5, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C22": { - "x": 9, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D22": { - "x": 13.5, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E22": { - "x": 18, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F22": { - "x": 22.5, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G22": { - "x": 27, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H22": { - "x": 31.5, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I22": { - "x": 36, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J22": { - "x": 40.5, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K22": { - "x": 45, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L22": { - "x": 49.5, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M22": { - "x": 54, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N22": { - "x": 58.5, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O22": { - "x": 63, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P22": { - "x": 67.5, - "y": 94.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A23": { - "x": 0, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B23": { - "x": 4.5, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C23": { - "x": 9, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D23": { - "x": 13.5, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E23": { - "x": 18, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F23": { - "x": 22.5, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G23": { - "x": 27, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H23": { - "x": 31.5, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I23": { - "x": 36, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J23": { - "x": 40.5, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K23": { - "x": 45, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L23": { - "x": 49.5, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M23": { - "x": 54, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N23": { - "x": 58.5, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O23": { - "x": 63, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P23": { - "x": 67.5, - "y": 99, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A24": { - "x": 0, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B24": { - "x": 4.5, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C24": { - "x": 9, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D24": { - "x": 13.5, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E24": { - "x": 18, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F24": { - "x": 22.5, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G24": { - "x": 27, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H24": { - "x": 31.5, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I24": { - "x": 36, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J24": { - "x": 40.5, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K24": { - "x": 45, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L24": { - "x": 49.5, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M24": { - "x": 54, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N24": { - "x": 58.5, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O24": { - "x": 63, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P24": { - "x": 67.5, - "y": 103.5, - "z": 0, - "depth": 9.5, - "diameter": 3.1, - "total-liquid-volume": 55 - } - } - }, - - "MALDI-plate": { - "origin-offset": { - "x": 9, - "y": 12 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B1": { - "x": 4.5, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C1": { - "x": 9, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D1": { - "x": 13.5, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E1": { - "x": 18, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F1": { - "x": 22.5, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G1": { - "x": 27, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H1": { - "x": 31.5, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I1": { - "x": 36, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J1": { - "x": 40.5, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K1": { - "x": 45, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L1": { - "x": 49.5, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M1": { - "x": 54, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N1": { - "x": 58.5, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O1": { - "x": 63, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P1": { - "x": 67.5, - "y": 0, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A2": { - "x": 0, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B2": { - "x": 4.5, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C2": { - "x": 9, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D2": { - "x": 13.5, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E2": { - "x": 18, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F2": { - "x": 22.5, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G2": { - "x": 27, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H2": { - "x": 31.5, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I2": { - "x": 36, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J2": { - "x": 40.5, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K2": { - "x": 45, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L2": { - "x": 49.5, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M2": { - "x": 54, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N2": { - "x": 58.5, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O2": { - "x": 63, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P2": { - "x": 67.5, - "y": 4.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A3": { - "x": 0, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B3": { - "x": 4.5, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C3": { - "x": 9, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D3": { - "x": 13.5, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E3": { - "x": 18, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F3": { - "x": 22.5, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G3": { - "x": 27, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H3": { - "x": 31.5, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I3": { - "x": 36, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J3": { - "x": 40.5, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K3": { - "x": 45, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L3": { - "x": 49.5, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M3": { - "x": 54, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N3": { - "x": 58.5, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O3": { - "x": 63, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P3": { - "x": 67.5, - "y": 9, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A4": { - "x": 0, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B4": { - "x": 4.5, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C4": { - "x": 9, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D4": { - "x": 13.5, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E4": { - "x": 18, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F4": { - "x": 22.5, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G4": { - "x": 27, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H4": { - "x": 31.5, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I4": { - "x": 36, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J4": { - "x": 40.5, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K4": { - "x": 45, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L4": { - "x": 49.5, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M4": { - "x": 54, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N4": { - "x": 58.5, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O4": { - "x": 63, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P4": { - "x": 67.5, - "y": 13.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A5": { - "x": 0, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B5": { - "x": 4.5, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C5": { - "x": 9, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D5": { - "x": 13.5, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E5": { - "x": 18, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F5": { - "x": 22.5, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G5": { - "x": 27, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H5": { - "x": 31.5, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I5": { - "x": 36, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J5": { - "x": 40.5, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K5": { - "x": 45, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L5": { - "x": 49.5, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M5": { - "x": 54, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N5": { - "x": 58.5, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O5": { - "x": 63, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P5": { - "x": 67.5, - "y": 18, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A6": { - "x": 0, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B6": { - "x": 4.5, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C6": { - "x": 9, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D6": { - "x": 13.5, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E6": { - "x": 18, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F6": { - "x": 22.5, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G6": { - "x": 27, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H6": { - "x": 31.5, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I6": { - "x": 36, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J6": { - "x": 40.5, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K6": { - "x": 45, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L6": { - "x": 49.5, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M6": { - "x": 54, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N6": { - "x": 58.5, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O6": { - "x": 63, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P6": { - "x": 67.5, - "y": 22.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A7": { - "x": 0, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B7": { - "x": 4.5, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C7": { - "x": 9, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D7": { - "x": 13.5, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E7": { - "x": 18, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F7": { - "x": 22.5, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G7": { - "x": 27, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H7": { - "x": 31.5, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I7": { - "x": 36, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J7": { - "x": 40.5, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K7": { - "x": 45, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L7": { - "x": 49.5, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M7": { - "x": 54, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N7": { - "x": 58.5, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O7": { - "x": 63, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P7": { - "x": 67.5, - "y": 27, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A8": { - "x": 0, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B8": { - "x": 4.5, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C8": { - "x": 9, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D8": { - "x": 13.5, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E8": { - "x": 18, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F8": { - "x": 22.5, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G8": { - "x": 27, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H8": { - "x": 31.5, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I8": { - "x": 36, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J8": { - "x": 40.5, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K8": { - "x": 45, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L8": { - "x": 49.5, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M8": { - "x": 54, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N8": { - "x": 58.5, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O8": { - "x": 63, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P8": { - "x": 67.5, - "y": 31.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A9": { - "x": 0, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B9": { - "x": 4.5, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C9": { - "x": 9, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D9": { - "x": 13.5, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E9": { - "x": 18, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F9": { - "x": 22.5, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G9": { - "x": 27, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H9": { - "x": 31.5, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I9": { - "x": 36, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J9": { - "x": 40.5, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K9": { - "x": 45, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L9": { - "x": 49.5, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M9": { - "x": 54, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N9": { - "x": 58.5, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O9": { - "x": 63, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P9": { - "x": 67.5, - "y": 36, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A10": { - "x": 0, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B10": { - "x": 4.5, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C10": { - "x": 9, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D10": { - "x": 13.5, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E10": { - "x": 18, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F10": { - "x": 22.5, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G10": { - "x": 27, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H10": { - "x": 31.5, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I10": { - "x": 36, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J10": { - "x": 40.5, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K10": { - "x": 45, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L10": { - "x": 49.5, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M10": { - "x": 54, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N10": { - "x": 58.5, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O10": { - "x": 63, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P10": { - "x": 67.5, - "y": 40.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A11": { - "x": 0, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B11": { - "x": 4.5, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C11": { - "x": 9, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D11": { - "x": 13.5, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E11": { - "x": 18, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F11": { - "x": 22.5, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G11": { - "x": 27, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H11": { - "x": 31.5, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I11": { - "x": 36, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J11": { - "x": 40.5, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K11": { - "x": 45, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L11": { - "x": 49.5, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M11": { - "x": 54, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N11": { - "x": 58.5, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O11": { - "x": 63, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P11": { - "x": 67.5, - "y": 45, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A12": { - "x": 0, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B12": { - "x": 4.5, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C12": { - "x": 9, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D12": { - "x": 13.5, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E12": { - "x": 18, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F12": { - "x": 22.5, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G12": { - "x": 27, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H12": { - "x": 31.5, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I12": { - "x": 36, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J12": { - "x": 40.5, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K12": { - "x": 45, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L12": { - "x": 49.5, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M12": { - "x": 54, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N12": { - "x": 58.5, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O12": { - "x": 63, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P12": { - "x": 67.5, - "y": 49.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A13": { - "x": 0, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B13": { - "x": 4.5, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C13": { - "x": 9, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D13": { - "x": 13.5, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E13": { - "x": 18, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F13": { - "x": 22.5, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G13": { - "x": 27, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H13": { - "x": 31.5, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I13": { - "x": 36, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J13": { - "x": 40.5, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K13": { - "x": 45, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L13": { - "x": 49.5, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M13": { - "x": 54, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N13": { - "x": 58.5, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O13": { - "x": 63, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P13": { - "x": 67.5, - "y": 54, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A14": { - "x": 0, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B14": { - "x": 4.5, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C14": { - "x": 9, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D14": { - "x": 13.5, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E14": { - "x": 18, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F14": { - "x": 22.5, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G14": { - "x": 27, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H14": { - "x": 31.5, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I14": { - "x": 36, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J14": { - "x": 40.5, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K14": { - "x": 45, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L14": { - "x": 49.5, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M14": { - "x": 54, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N14": { - "x": 58.5, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O14": { - "x": 63, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P14": { - "x": 67.5, - "y": 58.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A15": { - "x": 0, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B15": { - "x": 4.5, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C15": { - "x": 9, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D15": { - "x": 13.5, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E15": { - "x": 18, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F15": { - "x": 22.5, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G15": { - "x": 27, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H15": { - "x": 31.5, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I15": { - "x": 36, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J15": { - "x": 40.5, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K15": { - "x": 45, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L15": { - "x": 49.5, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M15": { - "x": 54, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N15": { - "x": 58.5, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O15": { - "x": 63, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P15": { - "x": 67.5, - "y": 63, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A16": { - "x": 0, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B16": { - "x": 4.5, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C16": { - "x": 9, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D16": { - "x": 13.5, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E16": { - "x": 18, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F16": { - "x": 22.5, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G16": { - "x": 27, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H16": { - "x": 31.5, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I16": { - "x": 36, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J16": { - "x": 40.5, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K16": { - "x": 45, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L16": { - "x": 49.5, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M16": { - "x": 54, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N16": { - "x": 58.5, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O16": { - "x": 63, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P16": { - "x": 67.5, - "y": 67.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A17": { - "x": 0, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B17": { - "x": 4.5, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C17": { - "x": 9, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D17": { - "x": 13.5, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E17": { - "x": 18, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F17": { - "x": 22.5, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G17": { - "x": 27, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H17": { - "x": 31.5, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I17": { - "x": 36, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J17": { - "x": 40.5, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K17": { - "x": 45, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L17": { - "x": 49.5, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M17": { - "x": 54, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N17": { - "x": 58.5, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O17": { - "x": 63, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P17": { - "x": 67.5, - "y": 72, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A18": { - "x": 0, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B18": { - "x": 4.5, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C18": { - "x": 9, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D18": { - "x": 13.5, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E18": { - "x": 18, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F18": { - "x": 22.5, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G18": { - "x": 27, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H18": { - "x": 31.5, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I18": { - "x": 36, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J18": { - "x": 40.5, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K18": { - "x": 45, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L18": { - "x": 49.5, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M18": { - "x": 54, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N18": { - "x": 58.5, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O18": { - "x": 63, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P18": { - "x": 67.5, - "y": 76.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A19": { - "x": 0, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B19": { - "x": 4.5, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C19": { - "x": 9, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D19": { - "x": 13.5, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E19": { - "x": 18, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F19": { - "x": 22.5, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G19": { - "x": 27, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H19": { - "x": 31.5, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I19": { - "x": 36, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J19": { - "x": 40.5, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K19": { - "x": 45, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L19": { - "x": 49.5, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M19": { - "x": 54, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N19": { - "x": 58.5, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O19": { - "x": 63, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P19": { - "x": 67.5, - "y": 81, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A20": { - "x": 0, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B20": { - "x": 4.5, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C20": { - "x": 9, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D20": { - "x": 13.5, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E20": { - "x": 18, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F20": { - "x": 22.5, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G20": { - "x": 27, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H20": { - "x": 31.5, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I20": { - "x": 36, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J20": { - "x": 40.5, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K20": { - "x": 45, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L20": { - "x": 49.5, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M20": { - "x": 54, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N20": { - "x": 58.5, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O20": { - "x": 63, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P20": { - "x": 67.5, - "y": 85.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A21": { - "x": 0, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B21": { - "x": 4.5, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C21": { - "x": 9, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D21": { - "x": 13.5, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E21": { - "x": 18, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F21": { - "x": 22.5, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G21": { - "x": 27, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H21": { - "x": 31.5, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I21": { - "x": 36, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J21": { - "x": 40.5, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K21": { - "x": 45, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L21": { - "x": 49.5, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M21": { - "x": 54, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N21": { - "x": 58.5, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O21": { - "x": 63, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P21": { - "x": 67.5, - "y": 90, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A22": { - "x": 0, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B22": { - "x": 4.5, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C22": { - "x": 9, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D22": { - "x": 13.5, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E22": { - "x": 18, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F22": { - "x": 22.5, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G22": { - "x": 27, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H22": { - "x": 31.5, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I22": { - "x": 36, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J22": { - "x": 40.5, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K22": { - "x": 45, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L22": { - "x": 49.5, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M22": { - "x": 54, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N22": { - "x": 58.5, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O22": { - "x": 63, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P22": { - "x": 67.5, - "y": 94.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A23": { - "x": 0, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B23": { - "x": 4.5, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C23": { - "x": 9, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D23": { - "x": 13.5, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E23": { - "x": 18, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F23": { - "x": 22.5, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G23": { - "x": 27, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H23": { - "x": 31.5, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I23": { - "x": 36, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J23": { - "x": 40.5, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K23": { - "x": 45, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L23": { - "x": 49.5, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M23": { - "x": 54, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N23": { - "x": 58.5, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O23": { - "x": 63, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P23": { - "x": 67.5, - "y": 99, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "A24": { - "x": 0, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "B24": { - "x": 4.5, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "C24": { - "x": 9, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "D24": { - "x": 13.5, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "E24": { - "x": 18, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "F24": { - "x": 22.5, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "G24": { - "x": 27, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "H24": { - "x": 31.5, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "I24": { - "x": 36, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "J24": { - "x": 40.5, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "K24": { - "x": 45, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "L24": { - "x": 49.5, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "M24": { - "x": 54, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "N24": { - "x": 58.5, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "O24": { - "x": 63, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - }, - "P24": { - "x": 67.5, - "y": 103.5, - "z": 0, - "depth": 0, - "diameter": 3.1, - "total-liquid-volume": 55 - } - } - }, - - "48-vial-plate": { - "origin-offset": { - "x": 10.5, - "y": 18 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "B1": { - "x": 13, - "y": 0, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "C1": { - "x": 26, - "y": 0, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "D1": { - "x": 39, - "y": 0, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "E1": { - "x": 52, - "y": 0, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "F1": { - "x": 65, - "y": 0, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - - "A2": { - "x": 0, - "y": 13, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "B2": { - "x": 13, - "y": 13, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "C2": { - "x": 26, - "y": 13, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "D2": { - "x": 39, - "y": 13, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "E2": { - "x": 52, - "y": 13, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "F2": { - "x": 65, - "y": 13, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - - "A3": { - "x": 0, - "y": 26, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "B3": { - "x": 13, - "y": 26, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "C3": { - "x": 26, - "y": 26, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "D3": { - "x": 39, - "y": 26, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "E3": { - "x": 52, - "y": 26, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "F3": { - "x": 65, - "y": 26, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - - "A4": { - "x": 0, - "y": 39, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "B4": { - "x": 13, - "y": 39, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "C4": { - "x": 26, - "y": 39, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "D4": { - "x": 39, - "y": 39, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "E4": { - "x": 52, - "y": 39, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "F4": { - "x": 65, - "y": 39, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - - "A5": { - "x": 0, - "y": 52, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "B5": { - "x": 13, - "y": 52, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "C5": { - "x": 26, - "y": 52, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "D5": { - "x": 39, - "y": 52, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "E5": { - "x": 52, - "y": 52, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "F5": { - "x": 65, - "y": 52, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - - "A6": { - "x": 0, - "y": 65, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "B6": { - "x": 13, - "y": 65, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "C6": { - "x": 26, - "y": 65, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "D6": { - "x": 39, - "y": 65, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "E6": { - "x": 52, - "y": 65, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "F6": { - "x": 65, - "y": 65, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - - "A7": { - "x": 0, - "y": 78, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "B7": { - "x": 13, - "y": 78, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "C7": { - "x": 26, - "y": 78, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "D7": { - "x": 39, - "y": 78, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "E7": { - "x": 52, - "y": 78, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "F7": { - "x": 65, - "y": 78, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - - "A8": { - "x": 0, - "y": 91, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "B8": { - "x": 13, - "y": 91, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "C8": { - "x": 26, - "y": 91, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "D8": { - "x": 39, - "y": 91, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "E8": { - "x": 52, - "y": 91, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - }, - "F8": { - "x": 65, - "y": 91, - "z": 0, - "depth": 30, - "diameter": 11.5, - "total-liquid-volume": 2000 - } - } - }, - - "e-gelgol": { - "origin-offset": { - "x": 11.24, - "y": 14.34 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "B1": { - "x": 9, - "y": 0, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "C1": { - "x": 18, - "y": 0, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "D1": { - "x": 27, - "y": 0, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "E1": { - "x": 36, - "y": 0, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "F1": { - "x": 45, - "y": 0, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "G1": { - "x": 54, - "y": 0, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "H1": { - "x": 63, - "y": 0, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "A2": { - "x": 0, - "y": 9, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "B2": { - "x": 9, - "y": 9, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "C2": { - "x": 18, - "y": 9, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "D2": { - "x": 27, - "y": 9, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "E2": { - "x": 36, - "y": 9, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "F2": { - "x": 45, - "y": 9, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "G2": { - "x": 54, - "y": 9, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "H2": { - "x": 63, - "y": 9, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "A3": { - "x": 0, - "y": 18, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "B3": { - "x": 9, - "y": 18, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "C3": { - "x": 18, - "y": 18, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "D3": { - "x": 27, - "y": 18, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "E3": { - "x": 36, - "y": 18, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "F3": { - "x": 45, - "y": 18, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "G3": { - "x": 54, - "y": 18, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "H3": { - "x": 63, - "y": 18, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "A4": { - "x": 0, - "y": 27, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "B4": { - "x": 9, - "y": 27, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "C4": { - "x": 18, - "y": 27, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "D4": { - "x": 27, - "y": 27, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "E4": { - "x": 36, - "y": 27, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "F4": { - "x": 45, - "y": 27, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "G4": { - "x": 54, - "y": 27, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "H4": { - "x": 63, - "y": 27, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "A5": { - "x": 0, - "y": 36, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "B5": { - "x": 9, - "y": 36, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "C5": { - "x": 18, - "y": 36, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "D5": { - "x": 27, - "y": 36, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "E5": { - "x": 36, - "y": 36, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "F5": { - "x": 45, - "y": 36, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "G5": { - "x": 54, - "y": 36, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "H5": { - "x": 63, - "y": 36, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "A6": { - "x": 0, - "y": 45, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "B6": { - "x": 9, - "y": 45, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "C6": { - "x": 18, - "y": 45, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "D6": { - "x": 27, - "y": 45, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "E6": { - "x": 36, - "y": 45, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "F6": { - "x": 45, - "y": 45, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "G6": { - "x": 54, - "y": 45, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "H6": { - "x": 63, - "y": 45, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "A7": { - "x": 0, - "y": 54, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "B7": { - "x": 9, - "y": 54, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "C7": { - "x": 18, - "y": 54, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "D7": { - "x": 27, - "y": 54, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "E7": { - "x": 36, - "y": 54, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "F7": { - "x": 45, - "y": 54, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "G7": { - "x": 54, - "y": 54, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "H7": { - "x": 63, - "y": 54, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "A8": { - "x": 0, - "y": 63, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "B8": { - "x": 9, - "y": 63, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "C8": { - "x": 18, - "y": 63, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "D8": { - "x": 27, - "y": 63, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "E8": { - "x": 36, - "y": 63, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "F8": { - "x": 45, - "y": 63, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "G8": { - "x": 54, - "y": 63, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "H8": { - "x": 63, - "y": 63, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "A9": { - "x": 0, - "y": 72, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "B9": { - "x": 9, - "y": 72, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "C9": { - "x": 18, - "y": 72, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "D9": { - "x": 27, - "y": 72, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "E9": { - "x": 36, - "y": 72, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "F9": { - "x": 45, - "y": 72, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "G9": { - "x": 54, - "y": 72, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "H9": { - "x": 63, - "y": 72, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "A10": { - "x": 0, - "y": 81, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "B10": { - "x": 9, - "y": 81, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "C10": { - "x": 18, - "y": 81, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "D10": { - "x": 27, - "y": 81, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "E10": { - "x": 36, - "y": 81, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "F10": { - "x": 45, - "y": 81, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "G10": { - "x": 54, - "y": 81, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "H10": { - "x": 63, - "y": 81, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "A11": { - "x": 0, - "y": 90, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "B11": { - "x": 9, - "y": 90, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "C11": { - "x": 18, - "y": 90, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "D11": { - "x": 27, - "y": 90, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "E11": { - "x": 36, - "y": 90, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "F11": { - "x": 45, - "y": 90, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "G11": { - "x": 54, - "y": 90, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "H11": { - "x": 63, - "y": 90, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "A12": { - "x": 0, - "y": 99, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "B12": { - "x": 9, - "y": 99, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "C12": { - "x": 18, - "y": 99, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "D12": { - "x": 27, - "y": 99, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "E12": { - "x": 36, - "y": 99, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "F12": { - "x": 45, - "y": 99, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "G12": { - "x": 54, - "y": 99, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - }, - "H12": { - "x": 63, - "y": 99, - "z": 0, - "depth": 2, - "diameter": 1, - "total-liquid-volume": 2 - } - } - }, - - "5ml-3x4": { - "origin-offset": { - "x": 18, - "y": 19 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 55, - "diameter": 14, - "total-liquid-volume": 50000 - }, - "B1": { - "x": 25, - "y": 0, - "z": 0, - "depth": 55, - "diameter": 14, - "total-liquid-volume": 50000 - }, - "C1": { - "x": 50, - "y": 0, - "z": 0, - "depth": 55, - "diameter": 14, - "total-liquid-volume": 50000 - }, - "A2": { - "x": 0, - "y": 30, - "z": 0, - "depth": 55, - "diameter": 14, - "total-liquid-volume": 50000 - }, - "B2": { - "x": 25, - "y": 30, - "z": 0, - "depth": 55, - "diameter": 14, - "total-liquid-volume": 50000 - }, - "C2": { - "x": 50, - "y": 30, - "z": 0, - "depth": 55, - "diameter": 14, - "total-liquid-volume": 50000 - }, - "A3": { - "x": 0, - "y": 60, - "z": 0, - "depth": 55, - "diameter": 14, - "total-liquid-volume": 50000 - }, - "B3": { - "x": 25, - "y": 60, - "z": 0, - "depth": 55, - "diameter": 14, - "total-liquid-volume": 50000 - }, - "C3": { - "x": 50, - "y": 60, - "z": 0, - "depth": 55, - "diameter": 14, - "total-liquid-volume": 50000 - }, - "A4": { - "x": 0, - "y": 90, - "z": 0, - "depth": 55, - "diameter": 14, - "total-liquid-volume": 50000 - }, - "B4": { - "x": 25, - "y": 90, - "z": 0, - "depth": 55, - "diameter": 14, - "total-liquid-volume": 50000 - }, - "C4": { - "x": 50, - "y": 90, - "z": 0, - "depth": 55, - "diameter": 14, - "total-liquid-volume": 50000 - } - } - }, - - "small_vial_rack_16x45": { - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "B1": { - "x": 40, - "y": 0, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "C1": { - "x": 80, - "y": 0, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "D1": { - "x": 120, - "y": 0, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "A2": { - "x": 0, - "y": 20, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "B2": { - "x": 40, - "y": 20, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "C2": { - "x": 80, - "y": 20, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "D2": { - "x": 120, - "y": 20, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "A3": { - "x": 0, - "y": 40, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "B3": { - "x": 40, - "y": 40, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "C3": { - "x": 80, - "y": 40, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "D3": { - "x": 120, - "y": 40, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "A4": { - "x": 0, - "y": 60, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "B4": { - "x": 40, - "y": 60, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "C4": { - "x": 80, - "y": 60, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "D4": { - "x": 120, - "y": 60, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "A5": { - "x": 0, - "y": 80, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "B5": { - "x": 40, - "y": 80, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "C5": { - "x": 80, - "y": 80, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "D5": { - "x": 120, - "y": 80, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "A6": { - "x": 0, - "y": 100, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "B6": { - "x": 40, - "y": 100, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "C6": { - "x": 80, - "y": 100, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - }, - "D6": { - "x": 120, - "y": 100, - "z": 0, - "depth": 45, - "diameter": 16, - "total-liquid-volume": 10000 - } - } - }, - - "opentrons-tuberack-15ml": { - "origin-offset": { - "x": 34.375, - "y": 13.5 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 6.78, - "depth": 117.98, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "B1": { - "x": 25, - "y": 0, - "z": 6.78, - "depth": 117.98, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "C1": { - "x": 50, - "y": 0, - "z": 6.78, - "depth": 117.98, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "A2": { - "x": 0, - "y": 25, - "z": 6.78, - "depth": 117.98, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "B2": { - "x": 25, - "y": 25, - "z": 6.78, - "depth": 117.98, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "C2": { - "x": 50, - "y": 25, - "z": 6.78, - "depth": 117.98, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "A3": { - "x": 0, - "y": 50, - "z": 6.78, - "depth": 117.98, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "B3": { - "x": 25, - "y": 50, - "z": 6.78, - "depth": 117.98, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "C3": { - "x": 50, - "y": 50, - "z": 6.78, - "depth": 117.98, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "A4": { - "x": 0, - "y": 75, - "z": 6.78, - "depth": 117.98, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "B4": { - "x": 25, - "y": 75, - "z": 6.78, - "depth": 117.98, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "C4": { - "x": 50, - "y": 75, - "z": 6.78, - "depth": 117.98, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "A5": { - "x": 0, - "y": 100, - "z": 6.78, - "depth": 117.98, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "B5": { - "x": 25, - "y": 100, - "z": 6.78, - "depth": 117.98, - "diameter": 17, - "total-liquid-volume": 15000 - }, - "C5": { - "x": 50, - "y": 100, - "z": 6.78, - "depth": 117.98, - "diameter": 17, - "total-liquid-volume": 15000 - } - } - }, - - "opentrons-tuberack-50ml": { - "origin-offset": { - "x": 39.875, - "y": 37 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 6.95, - "depth": 112.85, - "diameter": 17, - "total-liquid-volume": 50000 - }, - "B1": { - "x": 35, - "y": 0, - "z": 6.95, - "depth": 112.85, - "diameter": 17, - "total-liquid-volume": 50000 - }, - "A2": { - "x": 0, - "y": 35, - "z": 6.95, - "depth": 112.85, - "diameter": 17, - "total-liquid-volume": 50000 - }, - "B2": { - "x": 35, - "y": 35, - "z": 6.95, - "depth": 112.85, - "diameter": 17, - "total-liquid-volume": 50000 - }, - "A3": { - "x": 0, - "y": 70, - "z": 6.95, - "depth": 112.85, - "diameter": 17, - "total-liquid-volume": 50000 - }, - "B3": { - "x": 35, - "y": 70, - "z": 6.95, - "depth": 112.85, - "diameter": 17, - "total-liquid-volume": 50000 - } - } - }, - - "opentrons-tuberack-15_50ml": { - "origin-offset": { - "x": 32.75, - "y": 14.875 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 6.78, - "depth": 117.98, - "diameter": 14.5, - "total-liquid-volume": 15000 - }, - "B1": { - "x": 25, - "y": 0, - "z": 6.78, - "depth": 117.98, - "diameter": 14.5, - "total-liquid-volume": 15000 - }, - "C1": { - "x": 50, - "y": 0, - "z": 6.78, - "depth": 117.98, - "diameter": 14.5, - "total-liquid-volume": 15000 - }, - "A2": { - "x": 0, - "y": 25, - "z": 6.78, - "depth": 117.98, - "diameter": 14.5, - "total-liquid-volume": 15000 - }, - "B2": { - "x": 25, - "y": 25, - "z": 6.78, - "depth": 117.98, - "diameter": 14.5, - "total-liquid-volume": 15000 - }, - "C2": { - "x": 50, - "y": 25, - "z": 6.78, - "depth": 117.98, - "diameter": 14.5, - "total-liquid-volume": 15000 - }, - "A3": { - "x": 18.25, - "y": 57.5, - "z": 6.95, - "depth": 112.85, - "diameter": 26.45, - "total-liquid-volume": 50000 - }, - "B3": { - "x": 53.25, - "y": 57.5, - "z": 6.95, - "depth": 112.85, - "diameter": 26.45, - "total-liquid-volume": 50000 - }, - "A4": { - "x": 18.25, - "y": 92.5, - "z": 6.95, - "depth": 112.85, - "diameter": 26.45, - "total-liquid-volume": 50000 - }, - "B4": { - "x": 53.25, - "y": 92.5, - "z": 6.95, - "depth": 112.85, - "diameter": 26.45, - "total-liquid-volume": 50000 - } - } - }, - - "opentrons-tuberack-2ml-eppendorf": { - "origin-offset": { - "x": 21.07, - "y": 18.21 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B1": { - "x": 19.28, - "y": 0, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C1": { - "x": 38.56, - "y": 0, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D1": { - "x": 57.84, - "y": 0, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "A2": { - "x": 0, - "y": 19.89, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B2": { - "x": 19.28, - "y": 19.89, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C2": { - "x": 38.56, - "y": 19.89, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D2": { - "x": 57.84, - "y": 19.89, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "A3": { - "x": 0, - "y": 39.78, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B3": { - "x": 19.28, - "y": 39.78, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C3": { - "x": 38.56, - "y": 39.78, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D3": { - "x": 57.84, - "y": 39.78, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "A4": { - "x": 0, - "y": 59.67, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B4": { - "x": 19.28, - "y": 59.67, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C4": { - "x": 38.56, - "y": 59.67, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D4": { - "x": 57.84, - "y": 59.67, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "A5": { - "x": 0, - "y": 79.56, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B5": { - "x": 19.28, - "y": 79.56, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C5": { - "x": 38.56, - "y": 79.56, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D5": { - "x": 57.84, - "y": 79.56, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "A6": { - "x": 0, - "y": 99.45, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B6": { - "x": 19.28, - "y": 99.45, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C6": { - "x": 38.56, - "y": 99.45, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D6": { - "x": 57.84, - "y": 99.45, - "z": 43.3, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - } - } - }, - - "opentrons-tuberack-2ml-screwcap": { - "origin-offset": { - "x": 21.07, - "y": 18.21 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "B1": { - "x": 19.28, - "y": 0, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "C1": { - "x": 38.56, - "y": 0, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "D1": { - "x": 57.84, - "y": 0, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "A2": { - "x": 0, - "y": 19.89, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "B2": { - "x": 19.28, - "y": 19.89, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "C2": { - "x": 38.56, - "y": 19.89, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "D2": { - "x": 57.84, - "y": 19.89, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "A3": { - "x": 0, - "y": 39.78, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "B3": { - "x": 19.28, - "y": 39.78, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "C3": { - "x": 38.56, - "y": 39.78, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "D3": { - "x": 57.84, - "y": 39.78, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "A4": { - "x": 0, - "y": 59.67, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "B4": { - "x": 19.28, - "y": 59.67, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "C4": { - "x": 38.56, - "y": 59.67, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "D4": { - "x": 57.84, - "y": 59.67, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "A5": { - "x": 0, - "y": 79.56, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "B5": { - "x": 19.28, - "y": 79.56, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "C5": { - "x": 38.56, - "y": 79.56, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "D5": { - "x": 57.84, - "y": 79.56, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "A6": { - "x": 0, - "y": 99.45, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "B6": { - "x": 19.28, - "y": 99.45, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "C6": { - "x": 38.56, - "y": 99.45, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - }, - "D6": { - "x": 57.84, - "y": 99.45, - "z": 45.2, - "depth": 42, - "diameter": 8.5, - "total-liquid-volume": 2000 - } - } - }, - - "opentrons-tuberack-1.5ml-eppendorf": { - "origin-offset": { - "x": 21.07, - "y": 18.21 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "B1": { - "x": 19.28, - "y": 0, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "C1": { - "x": 38.56, - "y": 0, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "D1": { - "x": 57.84, - "y": 0, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "A2": { - "x": 0, - "y": 19.89, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "B2": { - "x": 19.28, - "y": 19.89, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "C2": { - "x": 38.56, - "y": 19.89, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "D2": { - "x": 57.84, - "y": 19.89, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "A3": { - "x": 0, - "y": 39.78, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "B3": { - "x": 19.28, - "y": 39.78, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "C3": { - "x": 38.56, - "y": 39.78, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "D3": { - "x": 57.84, - "y": 39.78, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "A4": { - "x": 0, - "y": 59.67, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "B4": { - "x": 19.28, - "y": 59.67, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "C4": { - "x": 38.56, - "y": 59.67, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "D4": { - "x": 57.84, - "y": 59.67, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "A5": { - "x": 0, - "y": 79.56, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "B5": { - "x": 19.28, - "y": 79.56, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "C5": { - "x": 38.56, - "y": 79.56, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "D5": { - "x": 57.84, - "y": 79.56, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "A6": { - "x": 0, - "y": 99.45, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "B6": { - "x": 19.28, - "y": 99.45, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "C6": { - "x": 38.56, - "y": 99.45, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - }, - "D6": { - "x": 57.84, - "y": 99.45, - "z": 43.3, - "depth": 37.0, - "diameter": 9, - "total-liquid-volume": 1500 - } - } - }, - - "opentrons-aluminum-block-2ml-eppendorf": { - "origin-offset": { - "x": 25.88, - "y": 20.75 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B1": { - "x": 17.25, - "y": 0, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C1": { - "x": 34.5, - "y": 0, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D1": { - "x": 51.75, - "y": 0, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "A2": { - "x": 0, - "y": 17.25, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B2": { - "x": 17.25, - "y": 17.25, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C2": { - "x": 34.5, - "y": 17.25, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D2": { - "x": 51.75, - "y": 17.25, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "A3": { - "x": 0, - "y": 34.5, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B3": { - "x": 17.25, - "y": 34.5, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C3": { - "x": 34.5, - "y": 34.5, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D3": { - "x": 51.75, - "y": 34.5, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "A4": { - "x": 0, - "y": 51.75, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B4": { - "x": 17.25, - "y": 51.75, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C4": { - "x": 34.5, - "y": 51.75, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D4": { - "x": 51.75, - "y": 51.75, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "A5": { - "x": 0, - "y": 69, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B5": { - "x": 17.25, - "y": 69, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C5": { - "x": 34.5, - "y": 69, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D5": { - "x": 51.75, - "y": 69, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "A6": { - "x": 0, - "y": 86.25, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B6": { - "x": 17.25, - "y": 86.25, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C6": { - "x": 34.5, - "y": 86.25, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D6": { - "x": 51.75, - "y": 86.25, - "z": 5.5, - "depth": 38.5, - "diameter": 9, - "total-liquid-volume": 2000 - } - } - }, - "opentrons-aluminum-block-2ml-screwcap": { - "origin-offset": { - "x": 25.88, - "y": 20.75 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B1": { - "x": 17.25, - "y": 0, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C1": { - "x": 34.5, - "y": 0, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D1": { - "x": 51.75, - "y": 0, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "A2": { - "x": 0, - "y": 17.25, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B2": { - "x": 17.25, - "y": 17.25, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C2": { - "x": 34.5, - "y": 17.25, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D2": { - "x": 51.75, - "y": 17.25, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "A3": { - "x": 0, - "y": 34.5, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B3": { - "x": 17.25, - "y": 34.5, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C3": { - "x": 34.5, - "y": 34.5, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D3": { - "x": 51.75, - "y": 34.5, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "A4": { - "x": 0, - "y": 51.75, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B4": { - "x": 17.25, - "y": 51.75, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C4": { - "x": 34.5, - "y": 51.75, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D4": { - "x": 51.75, - "y": 51.75, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "A5": { - "x": 0, - "y": 69, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B5": { - "x": 17.25, - "y": 69, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C5": { - "x": 34.5, - "y": 69, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D5": { - "x": 51.75, - "y": 69, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "A6": { - "x": 0, - "y": 86.25, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "B6": { - "x": 17.25, - "y": 86.25, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "C6": { - "x": 34.5, - "y": 86.25, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - }, - "D6": { - "x": 51.75, - "y": 86.25, - "z": 6.5, - "depth": 42, - "diameter": 9, - "total-liquid-volume": 2000 - } - } - }, - "opentrons-aluminum-block-96-PCR-plate": { - "origin-offset": { - "x": 17.25, - "y": 13.38 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "B1": { - "x": 9, - "y": 0, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "C1": { - "x": 18, - "y": 0, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "D1": { - "x": 27, - "y": 0, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "E1": { - "x": 36, - "y": 0, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "F1": { - "x": 45, - "y": 0, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "G1": { - "x": 54, - "y": 0, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "H1": { - "x": 63, - "y": 0, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "A2": { - "x": 0, - "y": 9, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "B2": { - "x": 9, - "y": 9, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "C2": { - "x": 18, - "y": 9, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "D2": { - "x": 27, - "y": 9, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "E2": { - "x": 36, - "y": 9, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "F2": { - "x": 45, - "y": 9, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "G2": { - "x": 54, - "y": 9, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "H2": { - "x": 63, - "y": 9, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "A3": { - "x": 0, - "y": 18, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "B3": { - "x": 9, - "y": 18, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "C3": { - "x": 18, - "y": 18, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "D3": { - "x": 27, - "y": 18, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "E3": { - "x": 36, - "y": 18, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "F3": { - "x": 45, - "y": 18, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "G3": { - "x": 54, - "y": 18, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "H3": { - "x": 63, - "y": 18, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "A4": { - "x": 0, - "y": 27, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "B4": { - "x": 9, - "y": 27, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "C4": { - "x": 18, - "y": 27, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "D4": { - "x": 27, - "y": 27, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "E4": { - "x": 36, - "y": 27, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "F4": { - "x": 45, - "y": 27, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "G4": { - "x": 54, - "y": 27, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "H4": { - "x": 63, - "y": 27, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "A5": { - "x": 0, - "y": 36, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "B5": { - "x": 9, - "y": 36, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "C5": { - "x": 18, - "y": 36, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "D5": { - "x": 27, - "y": 36, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "E5": { - "x": 36, - "y": 36, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "F5": { - "x": 45, - "y": 36, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "G5": { - "x": 54, - "y": 36, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "H5": { - "x": 63, - "y": 36, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "A6": { - "x": 0, - "y": 45, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "B6": { - "x": 9, - "y": 45, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "C6": { - "x": 18, - "y": 45, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "D6": { - "x": 27, - "y": 45, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "E6": { - "x": 36, - "y": 45, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "F6": { - "x": 45, - "y": 45, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "G6": { - "x": 54, - "y": 45, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "H6": { - "x": 63, - "y": 45, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "A7": { - "x": 0, - "y": 54, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "B7": { - "x": 9, - "y": 54, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "C7": { - "x": 18, - "y": 54, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "D7": { - "x": 27, - "y": 54, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "E7": { - "x": 36, - "y": 54, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "F7": { - "x": 45, - "y": 54, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "G7": { - "x": 54, - "y": 54, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "H7": { - "x": 63, - "y": 54, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "A8": { - "x": 0, - "y": 63, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "B8": { - "x": 9, - "y": 63, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "C8": { - "x": 18, - "y": 63, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "D8": { - "x": 27, - "y": 63, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "E8": { - "x": 36, - "y": 63, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "F8": { - "x": 45, - "y": 63, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "G8": { - "x": 54, - "y": 63, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "H8": { - "x": 63, - "y": 63, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "A9": { - "x": 0, - "y": 72, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "B9": { - "x": 9, - "y": 72, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "C9": { - "x": 18, - "y": 72, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "D9": { - "x": 27, - "y": 72, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "E9": { - "x": 36, - "y": 72, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "F9": { - "x": 45, - "y": 72, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "G9": { - "x": 54, - "y": 72, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "H9": { - "x": 63, - "y": 72, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "A10": { - "x": 0, - "y": 81, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "B10": { - "x": 9, - "y": 81, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "C10": { - "x": 18, - "y": 81, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "D10": { - "x": 27, - "y": 81, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "E10": { - "x": 36, - "y": 81, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "F10": { - "x": 45, - "y": 81, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "G10": { - "x": 54, - "y": 81, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "H10": { - "x": 63, - "y": 81, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "A11": { - "x": 0, - "y": 90, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "B11": { - "x": 9, - "y": 90, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "C11": { - "x": 18, - "y": 90, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "D11": { - "x": 27, - "y": 90, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "E11": { - "x": 36, - "y": 90, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "F11": { - "x": 45, - "y": 90, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "G11": { - "x": 54, - "y": 90, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "H11": { - "x": 63, - "y": 90, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "A12": { - "x": 0, - "y": 99, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "B12": { - "x": 9, - "y": 99, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "C12": { - "x": 18, - "y": 99, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "D12": { - "x": 27, - "y": 99, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "E12": { - "x": 36, - "y": 99, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "F12": { - "x": 45, - "y": 99, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "G12": { - "x": 54, - "y": 99, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - }, - "H12": { - "x": 63, - "y": 99, - "z": 7.44, - "depth": 14.81, - "diameter": 5.4, - "total-liquid-volume": 200 - } - } - }, - "opentrons-aluminum-block-PCR-strips-200ul": { - "origin-offset": { - "x": 17.25, - "y": 13.38 - }, - "locations": { - "A1": { - "x": 0, - "y": 0, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B1": { - "x": 9, - "y": 0, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C1": { - "x": 18, - "y": 0, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D1": { - "x": 27, - "y": 0, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E1": { - "x": 36, - "y": 0, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F1": { - "x": 45, - "y": 0, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G1": { - "x": 54, - "y": 0, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H1": { - "x": 63, - "y": 0, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A2": { - "x": 0, - "y": 9, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B2": { - "x": 9, - "y": 9, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C2": { - "x": 18, - "y": 9, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D2": { - "x": 27, - "y": 9, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E2": { - "x": 36, - "y": 9, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F2": { - "x": 45, - "y": 9, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G2": { - "x": 54, - "y": 9, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H2": { - "x": 63, - "y": 9, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A3": { - "x": 0, - "y": 18, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B3": { - "x": 9, - "y": 18, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C3": { - "x": 18, - "y": 18, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D3": { - "x": 27, - "y": 18, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E3": { - "x": 36, - "y": 18, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F3": { - "x": 45, - "y": 18, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G3": { - "x": 54, - "y": 18, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H3": { - "x": 63, - "y": 18, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A4": { - "x": 0, - "y": 27, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B4": { - "x": 9, - "y": 27, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C4": { - "x": 18, - "y": 27, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D4": { - "x": 27, - "y": 27, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E4": { - "x": 36, - "y": 27, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F4": { - "x": 45, - "y": 27, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G4": { - "x": 54, - "y": 27, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H4": { - "x": 63, - "y": 27, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A5": { - "x": 0, - "y": 36, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B5": { - "x": 9, - "y": 36, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C5": { - "x": 18, - "y": 36, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D5": { - "x": 27, - "y": 36, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E5": { - "x": 36, - "y": 36, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F5": { - "x": 45, - "y": 36, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G5": { - "x": 54, - "y": 36, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H5": { - "x": 63, - "y": 36, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A6": { - "x": 0, - "y": 45, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B6": { - "x": 9, - "y": 45, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C6": { - "x": 18, - "y": 45, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D6": { - "x": 27, - "y": 45, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E6": { - "x": 36, - "y": 45, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F6": { - "x": 45, - "y": 45, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G6": { - "x": 54, - "y": 45, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H6": { - "x": 63, - "y": 45, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A7": { - "x": 0, - "y": 54, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B7": { - "x": 9, - "y": 54, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C7": { - "x": 18, - "y": 54, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D7": { - "x": 27, - "y": 54, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E7": { - "x": 36, - "y": 54, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F7": { - "x": 45, - "y": 54, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G7": { - "x": 54, - "y": 54, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H7": { - "x": 63, - "y": 54, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A8": { - "x": 0, - "y": 63, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B8": { - "x": 9, - "y": 63, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C8": { - "x": 18, - "y": 63, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D8": { - "x": 27, - "y": 63, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E8": { - "x": 36, - "y": 63, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F8": { - "x": 45, - "y": 63, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G8": { - "x": 54, - "y": 63, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H8": { - "x": 63, - "y": 63, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A9": { - "x": 0, - "y": 72, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B9": { - "x": 9, - "y": 72, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C9": { - "x": 18, - "y": 72, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D9": { - "x": 27, - "y": 72, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E9": { - "x": 36, - "y": 72, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F9": { - "x": 45, - "y": 72, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G9": { - "x": 54, - "y": 72, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H9": { - "x": 63, - "y": 72, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A10": { - "x": 0, - "y": 81, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B10": { - "x": 9, - "y": 81, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C10": { - "x": 18, - "y": 81, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D10": { - "x": 27, - "y": 81, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E10": { - "x": 36, - "y": 81, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F10": { - "x": 45, - "y": 81, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G10": { - "x": 54, - "y": 81, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H10": { - "x": 63, - "y": 81, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A11": { - "x": 0, - "y": 90, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B11": { - "x": 9, - "y": 90, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C11": { - "x": 18, - "y": 90, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D11": { - "x": 27, - "y": 90, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E11": { - "x": 36, - "y": 90, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F11": { - "x": 45, - "y": 90, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G11": { - "x": 54, - "y": 90, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H11": { - "x": 63, - "y": 90, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "A12": { - "x": 0, - "y": 99, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "B12": { - "x": 9, - "y": 99, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "C12": { - "x": 18, - "y": 99, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "D12": { - "x": 27, - "y": 99, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "E12": { - "x": 36, - "y": 99, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "F12": { - "x": 45, - "y": 99, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "G12": { - "x": 54, - "y": 99, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - }, - "H12": { - "x": 63, - "y": 99, - "z": 4.19, - "depth": 20.30, - "diameter": 5.4, - "total-liquid-volume": 300 - } - } - } - } -} diff --git a/api/src/opentrons/config/defaults_ot3.py b/api/src/opentrons/config/defaults_ot3.py index 000d8b795cd..c27a0b6384f 100644 --- a/api/src/opentrons/config/defaults_ot3.py +++ b/api/src/opentrons/config/defaults_ot3.py @@ -75,7 +75,6 @@ DEFAULT_LEFT_MOUNT_OFFSET: Final[Offset] = (-13.5, -60.5, 255.675) DEFAULT_RIGHT_MOUNT_OFFSET: Final[Offset] = (40.5, -60.5, 255.675) DEFAULT_GRIPPER_MOUNT_OFFSET: Final[Offset] = (84.55, -12.75, 93.85) -DEFAULT_Z_RETRACT_DISTANCE: Final = 2 DEFAULT_SAFE_HOME_DISTANCE: Final = 5 DEFAULT_CALIBRATION_AXIS_MAX_SPEED: Final = 30 @@ -123,7 +122,7 @@ OT3AxisKind.Y: 10, OT3AxisKind.Z: 5, OT3AxisKind.P: 5, - OT3AxisKind.Z_G: 10, + OT3AxisKind.Z_G: 5, OT3AxisKind.Q: 5, }, low_throughput={ @@ -131,7 +130,7 @@ OT3AxisKind.Y: 10, OT3AxisKind.Z: 5, OT3AxisKind.P: 10, - OT3AxisKind.Z_G: 10, + OT3AxisKind.Z_G: 5, }, ) @@ -381,9 +380,6 @@ def build_with_defaults(robot_settings: Dict[str, Any]) -> OT3Config: DEFAULT_RUN_CURRENT, ), ), - z_retract_distance=robot_settings.get( - "z_retract_distance", DEFAULT_Z_RETRACT_DISTANCE - ), safe_home_distance=robot_settings.get( "safe_home_distance", DEFAULT_SAFE_HOME_DISTANCE ), diff --git a/api/src/opentrons/config/feature_flags.py b/api/src/opentrons/config/feature_flags.py index f46674fb56e..583dae0b141 100644 --- a/api/src/opentrons/config/feature_flags.py +++ b/api/src/opentrons/config/feature_flags.py @@ -20,10 +20,8 @@ def use_old_aspiration_functions() -> bool: ) -def enable_door_safety_switch() -> bool: - return advs.get_setting_with_env_overload( - "enableDoorSafetySwitch", RobotTypeEnum.FLEX - ) +def enable_door_safety_switch(robot_type: RobotTypeEnum) -> bool: + return advs.get_setting_with_env_overload("enableDoorSafetySwitch", robot_type) def disable_fast_protocol_upload() -> bool: @@ -67,13 +65,6 @@ def status_bar_enabled() -> bool: ) -def tip_presence_detection_enabled() -> bool: - """Whether tip presence is enabled on the Flex""" - return not advs.get_setting_with_env_overload( - "disableTipPresenceDetection", RobotTypeEnum.FLEX - ) - - def require_estop() -> bool: """Whether the OT3 should allow gantry movements with no Estop plugged in.""" return not advs.get_setting_with_env_overload( diff --git a/api/src/opentrons/config/reset.py b/api/src/opentrons/config/reset.py index ac5df2a7981..eac5cf26982 100644 --- a/api/src/opentrons/config/reset.py +++ b/api/src/opentrons/config/reset.py @@ -5,16 +5,18 @@ from pathlib import Path from typing import NamedTuple, Dict, Set +from opentrons_shared_data.robot.dev_types import RobotTypeEnum from opentrons.config import IS_ROBOT from opentrons.calibration_storage import ( delete_robot_deck_attitude, - clear_tip_length_calibration, - clear_pipette_offset_calibrations, - ot3_gripper_offset, + gripper_offset, + ot2, + ot3, ) DATA_BOOT_D = Path("/data/boot.d") +AUTHORIZED_KEYS = Path(os.path.expanduser("~/.ssh/authorized_keys")) log = logging.getLogger(__name__) @@ -33,12 +35,14 @@ class ResetOptionId(str, Enum): boot_scripts = "bootScripts" deck_calibration = "deckCalibration" + deck_configuration = "deckConfiguration" pipette_offset = "pipetteOffsetCalibrations" gripper_offset = "gripperOffsetCalibrations" tip_length_calibrations = "tipLengthCalibrations" runs_history = "runsHistory" on_device_display = "onDeviceDisplay" module_calibration = "moduleCalibration" + authorized_keys = "authorizedKeys" _OT_2_RESET_OPTIONS = [ @@ -47,6 +51,8 @@ class ResetOptionId(str, Enum): ResetOptionId.pipette_offset, ResetOptionId.tip_length_calibrations, ResetOptionId.runs_history, + ResetOptionId.deck_configuration, + ResetOptionId.authorized_keys, ] _FLEX_RESET_OPTIONS = [ ResetOptionId.boot_scripts, @@ -54,7 +60,9 @@ class ResetOptionId(str, Enum): ResetOptionId.gripper_offset, ResetOptionId.runs_history, ResetOptionId.on_device_display, + ResetOptionId.deck_configuration, ResetOptionId.module_calibration, + ResetOptionId.authorized_keys, ] _settings_reset_options = { @@ -77,8 +85,8 @@ class ResetOptionId(str, Enum): name="Tip Length Calibrations", description="Clear tip length calibrations (will also clear pipette offset)", ), - # TODO(mm, 2022-05-23): runs_history and on_device_display are robot-server things, - # and are not concepts known to this package (the `opentrons` library). + # TODO(mm, 2022-05-23): runs_history, on_device_display, and deck_configuration are + # robot-server things, and are not concepts known to this package (the `opentrons` library). # This option is defined here only as a convenience for robot-server. # Find a way to split things up and define this in robot-server instead. ResetOptionId.runs_history: CommonResetOption( @@ -89,15 +97,22 @@ class ResetOptionId(str, Enum): name="On-Device Display Configuration", description="Clear the configuration of the on-device display (touchscreen)", ), + ResetOptionId.deck_configuration: CommonResetOption( + name="Deck Configuration", + description="Clear deck configuration", + ), ResetOptionId.module_calibration: CommonResetOption( name="Module Calibrations", description="Clear module offset calibrations" ), + ResetOptionId.authorized_keys: CommonResetOption( + name="SSH Authorized Keys", description="Clear the ssh authorized keys" + ), } -def reset_options(robot_type: str) -> Dict[ResetOptionId, CommonResetOption]: +def reset_options(robot_type: RobotTypeEnum) -> Dict[ResetOptionId, CommonResetOption]: reset_options_for_robot_type = ( - _OT_2_RESET_OPTIONS if robot_type == "OT-2 Standard" else _FLEX_RESET_OPTIONS + _OT_2_RESET_OPTIONS if robot_type is RobotTypeEnum.OT2 else _FLEX_RESET_OPTIONS ) return { key: _settings_reset_options[key] @@ -106,7 +121,7 @@ def reset_options(robot_type: str) -> Dict[ResetOptionId, CommonResetOption]: } -def reset(options: Set[ResetOptionId]) -> None: +def reset(options: Set[ResetOptionId], robot_type: RobotTypeEnum) -> None: """ Execute a reset of the requested parts of the user configuration. @@ -118,13 +133,13 @@ def reset(options: Set[ResetOptionId]) -> None: reset_boot_scripts() if ResetOptionId.deck_calibration in options: - reset_deck_calibration() + reset_deck_calibration(robot_type) if ResetOptionId.pipette_offset in options: - reset_pipette_offset() + reset_pipette_offset(robot_type) if ResetOptionId.tip_length_calibrations in options: - reset_tip_length_calibrations() + reset_tip_length_calibrations(robot_type) if ResetOptionId.gripper_offset in options: reset_gripper_offset() @@ -132,6 +147,9 @@ def reset(options: Set[ResetOptionId]) -> None: if ResetOptionId.module_calibration in options: reset_module_calibration() + if ResetOptionId.authorized_keys in options: + reset_authorized_keys() + def reset_boot_scripts() -> None: if IS_ROBOT: @@ -141,24 +159,25 @@ def reset_boot_scripts() -> None: log.debug(f"Not on pi, not removing {DATA_BOOT_D}") -# (lc 09-15-2022) Choosing to import both ot2 and ot3 delete modules -# rather than type ignore an import_module command using importlib. -def reset_deck_calibration() -> None: +def reset_deck_calibration(robot_type: RobotTypeEnum) -> None: delete_robot_deck_attitude() - clear_pipette_offset_calibrations() + ot2.clear_pipette_offset_calibrations() if robot_type is RobotTypeEnum.OT2 else ot3.clear_pipette_offset_calibrations() -def reset_pipette_offset() -> None: - clear_pipette_offset_calibrations() +def reset_pipette_offset(robot_type: RobotTypeEnum) -> None: + ot2.clear_pipette_offset_calibrations() if robot_type is RobotTypeEnum.OT2 else ot3.clear_pipette_offset_calibrations() def reset_gripper_offset() -> None: - ot3_gripper_offset.clear_gripper_calibration_offsets() + gripper_offset.clear_gripper_calibration_offsets() -def reset_tip_length_calibrations() -> None: - clear_tip_length_calibration() - clear_pipette_offset_calibrations() +def reset_tip_length_calibrations(robot_type: RobotTypeEnum) -> None: + if robot_type is RobotTypeEnum.OT2: + ot2.clear_tip_length_calibration() + ot2.clear_pipette_offset_calibrations() + else: + raise UnrecognizedOption("Tip Length calibration not supported on Flex") def reset_module_calibration() -> None: @@ -170,3 +189,9 @@ def reset_module_calibration() -> None: clear_module_offset_calibrations() except ImportError: log.warning("Tried to clear module offset calibrations on an OT-2") + + +def reset_authorized_keys() -> None: + if IS_ROBOT and os.path.exists(AUTHORIZED_KEYS): + with open(AUTHORIZED_KEYS, "w") as fh: + fh.write("") diff --git a/api/src/opentrons/config/types.py b/api/src/opentrons/config/types.py index 9e4076e1ee0..e80fcd3de44 100644 --- a/api/src/opentrons/config/types.py +++ b/api/src/opentrons/config/types.py @@ -174,7 +174,6 @@ class OT3Config: log_level: str motion_settings: OT3MotionSettings current_settings: OT3CurrentSettings - z_retract_distance: float safe_home_distance: float deck_transform: OT3Transform carriage_offset: Offset diff --git a/api/src/opentrons/drivers/asyncio/communication/async_serial.py b/api/src/opentrons/drivers/asyncio/communication/async_serial.py index 9910b73215f..8d2db0ddda7 100644 --- a/api/src/opentrons/drivers/asyncio/communication/async_serial.py +++ b/api/src/opentrons/drivers/asyncio/communication/async_serial.py @@ -7,7 +7,7 @@ from typing import Optional, AsyncGenerator, Union from typing_extensions import Literal -from serial import Serial, serial_for_url # type: ignore[import] +from serial import Serial, serial_for_url # type: ignore[import-untyped] TimeoutProperties = Union[Literal["write_timeout"], Literal["timeout"]] diff --git a/api/src/opentrons/drivers/rpi_drivers/gpio.py b/api/src/opentrons/drivers/rpi_drivers/gpio.py index 69eb2d49b41..d692fa1f795 100755 --- a/api/src/opentrons/drivers/rpi_drivers/gpio.py +++ b/api/src/opentrons/drivers/rpi_drivers/gpio.py @@ -7,7 +7,7 @@ from . import RevisionPinsError from .types import gpio_group, PinDir, GPIOPin -import gpiod # type: ignore[import] +import gpiod # type: ignore[import-not-found] """ Raspberry Pi GPIO control module diff --git a/api/src/opentrons/drivers/serial_communication.py b/api/src/opentrons/drivers/serial_communication.py index 854921c35a6..9e2ee465504 100755 --- a/api/src/opentrons/drivers/serial_communication.py +++ b/api/src/opentrons/drivers/serial_communication.py @@ -1,12 +1,12 @@ from typing import List, Optional, Iterator -import serial # type: ignore[import] +import serial # type: ignore[import-untyped] from serial import Serial -from serial.tools import list_ports # type: ignore[import] +from serial.tools import list_ports # type: ignore[import-untyped] import contextlib import logging -from serial.tools.list_ports_common import ListPortInfo # type: ignore[import] +from serial.tools.list_ports_common import ListPortInfo # type: ignore[import-untyped] log = logging.getLogger(__name__) diff --git a/api/src/opentrons/drivers/smoothie_drivers/driver_3_0.py b/api/src/opentrons/drivers/smoothie_drivers/driver_3_0.py index 41bd554682c..c43f8d3f13d 100755 --- a/api/src/opentrons/drivers/smoothie_drivers/driver_3_0.py +++ b/api/src/opentrons/drivers/smoothie_drivers/driver_3_0.py @@ -18,7 +18,7 @@ from math import isclose from opentrons.drivers.serial_communication import get_ports_by_name -from serial.serialutil import SerialException # type: ignore[import] +from serial.serialutil import SerialException # type: ignore[import-untyped] from opentrons.drivers.smoothie_drivers.connection import SmoothieConnection from opentrons.drivers.smoothie_drivers.constants import ( @@ -1667,7 +1667,7 @@ async def unstick_axes( self.push_active_current() self.set_active_current( { - ax: self._config.high_current["default"][ax] # type: ignore[misc] + ax: self._config.high_current["default"][ax] # type: ignore[literal-required] for ax in axes } ) @@ -1848,7 +1848,7 @@ async def hard_halt(self) -> None: await asyncio.sleep(0.25) self.run_flag.set() - async def update_firmware( # noqa: C901 + async def update_firmware( self, filename: str, loop: Optional[asyncio.AbstractEventLoop] = None, @@ -1896,8 +1896,8 @@ async def update_firmware( # noqa: C901 "stdout": asyncio.subprocess.PIPE, "stderr": asyncio.subprocess.PIPE, } - if loop: - kwargs["loop"] = loop + # if loop: + # kwargs["loop"] = loop log.info(update_cmd) before = time() proc = await asyncio.create_subprocess_shell(update_cmd, **kwargs) diff --git a/api/src/opentrons/drivers/smoothie_drivers/simulator.py b/api/src/opentrons/drivers/smoothie_drivers/simulator.py index ad1197f4aa5..4db3c28adf7 100644 --- a/api/src/opentrons/drivers/smoothie_drivers/simulator.py +++ b/api/src/opentrons/drivers/smoothie_drivers/simulator.py @@ -57,11 +57,11 @@ async def update_pipette_config( - endstop debounce M365.2 (NOT for zprobe debounce) - retract from endstop distance M365.3 """ - pass + return {} @property def current(self) -> Dict[str, float]: - pass + return {} @property def speed(self) -> None: diff --git a/api/src/opentrons/equipment_broker.py b/api/src/opentrons/equipment_broker.py deleted file mode 100644 index e25f3bbf6ef..00000000000 --- a/api/src/opentrons/equipment_broker.py +++ /dev/null @@ -1,56 +0,0 @@ -"""A simple pub/sub message broker for monitoring equipment loads.""" - - -from typing import Callable, Generic, Set, TypeVar - - -_MessageT = TypeVar("_MessageT") - - -class EquipmentBroker(Generic[_MessageT]): - """A simple pub/sub message broker. - - This is currently meant for monitoring equipment loads - (pipette, labware, and module loads) - on an APIv2 `ProtocolContext`. - - This duplicates much of `opentrons.broker.Broker`, - which covers most other APIv2 events, like aspirates and moves, - but doesn't cover equipment loads. - To cover equipment loads, we felt more comfortable - duplicating `opentrons.broker.Broker`'s responsibilities here - than attempting to extend it without breaking anything. - """ - - def __init__(self) -> None: # noqa: D107 - self._callbacks: Set[Callable[[_MessageT], None]] = set() - - def subscribe(self, callback: Callable[[_MessageT], None]) -> Callable[[], None]: - """Register ``callback`` to be called by a subsequent `publish`. - - You must not subscribe the same callback again - unless you first unsubscribe it. - - Returns: - A function that you can call to unsubscribe ``callback``. - You must not call it more than once. - """ - - def unsubscribe() -> None: - self._callbacks.remove(callback) - - self._callbacks.add(callback) - return unsubscribe - - def publish(self, message: _MessageT) -> None: - """Call every subscribed callback, with ``message`` as the argument. - - The order in which the callbacks are called is undefined. - - If any callback raises an exception, it's propagated, - and any remaining callbacks will be left uncalled. - """ - # Callback order is undefined because - # Python sets don't preserve insertion order. - for callback in self._callbacks: - callback(message) diff --git a/api/src/opentrons/execute.py b/api/src/opentrons/execute.py index 38a8db44734..6ef5a56e92d 100644 --- a/api/src/opentrons/execute.py +++ b/api/src/opentrons/execute.py @@ -11,15 +11,12 @@ import contextlib import logging import os -from pathlib import Path import sys -import tempfile from typing import ( TYPE_CHECKING, BinaryIO, Callable, Dict, - Generator, List, Optional, TextIO, @@ -33,19 +30,18 @@ from opentrons.commands import types as command_types -from opentrons.config import IS_ROBOT, JUPYTER_NOTEBOOK_LABWARE_DIR - from opentrons.hardware_control import ( API as OT2API, - HardwareControlAPI, ThreadManagedHardware, ThreadManager, ) -from opentrons.protocol_engine.types import PostRunHardwareState +from opentrons.hardware_control.types import HardwareFeatureFlags from opentrons.protocols import parse from opentrons.protocols.api_support.deck_type import ( guess_from_global_config as guess_deck_type_from_global_config, + should_load_fixed_trash, + should_load_fixed_trash_for_python_protocol, ) from opentrons.protocols.api_support.types import APIVersion from opentrons.protocols.execution import execute as execute_apiv2 @@ -62,21 +58,16 @@ Config, DeckType, EngineStatus, - ErrorOccurrence as ProtocolEngineErrorOccurrence, create_protocol_engine, create_protocol_engine_in_thread, ) +from opentrons.protocol_engine.types import PostRunHardwareState -from opentrons.protocol_reader import ProtocolReader, ProtocolSource +from opentrons.protocol_reader import ProtocolSource from opentrons.protocol_runner import create_protocol_runner -from .util.entrypoint_util import ( - FoundLabware, - labware_from_paths, - datafiles_from_paths, - copy_file_like, -) +from .util import entrypoint_util if TYPE_CHECKING: from opentrons_shared_data.labware.dev_types import ( @@ -123,6 +114,9 @@ def get_protocol_api( bundled_labware: Optional[Dict[str, "LabwareDefinitionDict"]] = None, bundled_data: Optional[Dict[str, bytes]] = None, extra_labware: Optional[Dict[str, "LabwareDefinitionDict"]] = None, + # If you add any more arguments here, make sure they're kw-only to make mistakes harder in + # environments without type checking, like Jupyter Notebook. + # * ) -> protocol_api.ProtocolContext: """ Build and return a ``protocol_api.ProtocolContext`` @@ -169,7 +163,8 @@ def get_protocol_api( if extra_labware is None: extra_labware = { - uri: details.definition for uri, details in _get_jupyter_labware().items() + uri: details.definition + for uri, details in (entrypoint_util.find_jupyter_labware() or {}).items() } robot_type = _get_robot_type() @@ -188,6 +183,8 @@ def get_protocol_api( ) else: if bundled_labware is not None: + # Protocol Engine has a deep assumption that standard labware definitions are always + # implicitly loadable. raise NotImplementedError( f"The bundled_labware argument is not currently supported for Python protocols" f" with apiLevel {ENGINE_CORE_API_VERSION} or newer." @@ -195,7 +192,7 @@ def get_protocol_api( context = _create_live_context_pe( api_version=checked_version, robot_type=robot_type, - deck_type=guess_deck_type_from_global_config(), + deck_type=deck_type, hardware_api=_THREAD_MANAGED_HW, # type: ignore[arg-type] bundled_data=bundled_data, extra_labware=extra_labware, @@ -321,12 +318,33 @@ def execute( # noqa: C901 :param log_level: The level of logs to emit on the command line: ``"debug"``, ``"info"``, ``"warning"``, or ``"error"``. Defaults to ``"warning"``. - :param emit_runlog: A callback for printing the runlog. If specified, this - will be called whenever a command adds an entry to the - runlog, which can be used for display and progress - estimation. If specified, the callback should take a - single argument (the name doesn't matter) which will - be a dictionary (see below). Default: ``None`` + :param emit_runlog: A callback for printing the run log. If specified, this + will be called whenever a command adds an entry to the + run log, which can be used for display and progress + estimation. If specified, the callback should take a + single argument (the name doesn't matter) which will + be a dictionary: + + .. code-block:: python + + { + 'name': command_name, + 'payload': { + 'text': string_command_text, + # The rest of this struct is + # command-dependent; see + # opentrons.commands.commands. + } + } + + .. note:: + In older software versions, ``payload["text"]`` was a + `format string `_. + To get human-readable text, you had to do ``payload["text"].format(**payload)``. + Don't do that anymore. If ``payload["text"]`` happens to contain any + ``{`` or ``}`` characters, it can confuse ``.format()`` and cause it to raise a + ``KeyError``. + :param custom_labware_paths: A list of directories to search for custom labware. Loads valid labware from these paths and makes them available to the protocol context. If this is ``None`` (the default), and @@ -339,39 +357,26 @@ def execute( # noqa: C901 non-recursive contents of specified directories are presented by the protocol context in ``ProtocolContext.bundled_data``. - - The format of the runlog entries is as follows: - - .. code-block:: python - - { - 'name': command_name, - 'payload': { - 'text': string_command_text, - # The rest of this struct is command-dependent; see - # opentrons.commands.commands. Its keys match format - # keys in 'text', so that - # entry['payload']['text'].format(**entry['payload']) - # will produce a string with information filled in - } - } """ stack_logger = logging.getLogger("opentrons") stack_logger.propagate = propagate_logs stack_logger.setLevel(getattr(logging, log_level.upper(), logging.WARNING)) + # TODO(mm, 2023-11-20): We should restore the original log settings when we're done. - contents = protocol_file.read() - + # TODO(mm, 2023-10-02): Switch this truthy check to `is not None` + # to match documented behavior. + # See notes in https://github.com/Opentrons/opentrons/pull/13107 if custom_labware_paths: - extra_labware = labware_from_paths(custom_labware_paths) + extra_labware = entrypoint_util.labware_from_paths(custom_labware_paths) else: - extra_labware = _get_jupyter_labware() + extra_labware = entrypoint_util.find_jupyter_labware() or {} if custom_data_paths: - extra_data = datafiles_from_paths(custom_data_paths) + extra_data = entrypoint_util.datafiles_from_paths(custom_data_paths) else: extra_data = {} + contents = protocol_file.read() try: protocol = parse.parse( contents, @@ -393,6 +398,8 @@ def execute( # noqa: C901 # Guard against trying to run protocols for the wrong robot type. # This matches what robot-server does. + # FIXME: This exposes the internal strings "OT-2 Standard" and "OT-3 Standard". + # https://opentrons.atlassian.net/browse/RSS-370 if protocol.robot_type != _get_robot_type(): raise RuntimeError( f'This robot is of type "{_get_robot_type()}",' @@ -407,13 +414,6 @@ def execute( # noqa: C901 else: # TODO(mm, 2023-07-06): Once these NotImplementedErrors are resolved, consider removing # the enclosing if-else block and running everything through _run_file_pe() for simplicity. - if emit_runlog: - raise NotImplementedError( - f"Printing the run log is not currently supported for Python protocols" - f" with apiLevel {ENGINE_CORE_API_VERSION} or newer." - f" Pass --no-print-runlog to opentrons_execute" - f" or emit_runlog=None to opentrons.execute.execute()." - ) if custom_data_paths: raise NotImplementedError( f"The custom_data_paths argument is not currently supported for Python protocols" @@ -421,10 +421,9 @@ def execute( # noqa: C901 ) protocol_file.seek(0) _run_file_pe( - protocol_file=protocol_file, - protocol_name=protocol_name, - extra_labware=extra_labware, - hardware_api=_get_global_hardware_controller(_get_robot_type()).wrapped(), + protocol=protocol, + hardware_api=_get_global_hardware_controller(_get_robot_type()), + emit_runlog=emit_runlog, ) @@ -491,8 +490,8 @@ def main() -> int: emit_runlog=printer, ) return 0 - except _ProtocolEngineExecuteError as error: - # _ProtocolEngineExecuteError is a wrapper that's meaningless to the CLI user. + except entrypoint_util.ProtocolEngineExecuteError as error: + # This exception is a wrapper that's meaningless to the CLI user. # Take the actual protocol problem out of it and just print that. print(error.to_stderr_string(), file=sys.stderr) return 1 @@ -500,40 +499,6 @@ def main() -> int: # Just let Python show a traceback. -class _ProtocolEngineExecuteError(Exception): - def __init__(self, errors: List[ProtocolEngineErrorOccurrence]) -> None: - """Raised when there was any fatal error running a protocol through Protocol Engine. - - Protocol Engine reports errors as data, not as exceptions. - But the only way for `execute()` to signal problems to its caller is to raise something. - So we need this class to wrap them. - - Params: - errors: The errors that Protocol Engine reported. - """ - # Show the full error details if this is part of a traceback. Don't try to summarize. - super().__init__(errors) - self._error_occurrences = errors - - def to_stderr_string(self) -> str: - """Return a string suitable as the stderr output of the `opentrons_execute` CLI. - - This summarizes from the full error details. - """ - # It's unclear what exactly we should extract here. - # - # First, do we print the first element, or the last, or all of them? - # - # Second, do we print the .detail? .errorCode? .errorInfo? .wrappedErrors? - # By contract, .detail seems like it would be insufficient, but experimentally, - # it includes a lot, like: - # - # ProtocolEngineError [line 3]: Error 4000 GENERAL_ERROR (ProtocolEngineError): - # UnexpectedProtocolError: Labware "fixture_12_trough" not found with version 1 - # in namespace "fixture". - return self._error_occurrences[0].detail - - def _create_live_context_non_pe( api_version: APIVersion, hardware_api: ThreadManagedHardware, @@ -575,6 +540,7 @@ def _create_live_context_pe( config=_get_protocol_engine_config(), drop_tips_after_run=False, post_run_hardware_state=PostRunHardwareState.STAY_ENGAGED_IN_PLACE, + load_fixed_trash=should_load_fixed_trash_for_python_protocol(api_version), ) ) @@ -638,37 +604,44 @@ def _run_file_non_pe( def _run_file_pe( - protocol_file: Union[BinaryIO, TextIO], - protocol_name: str, - extra_labware: Dict[str, FoundLabware], - hardware_api: HardwareControlAPI, + protocol: Protocol, + hardware_api: ThreadManagedHardware, + emit_runlog: Optional[_EmitRunlogCallable], ) -> None: """Run a protocol file with Protocol Engine.""" async def run(protocol_source: ProtocolSource) -> None: protocol_engine = await create_protocol_engine( - hardware_api=hardware_api, + hardware_api=hardware_api.wrapped(), config=_get_protocol_engine_config(), + load_fixed_trash=should_load_fixed_trash(protocol_source.config), ) protocol_runner = create_protocol_runner( protocol_config=protocol_source.config, protocol_engine=protocol_engine, - hardware_api=hardware_api, + hardware_api=hardware_api.wrapped(), ) - # TODO(mm, 2023-06-30): This will home and drop tips at the end, which is not how - # things have historically behaved with PAPIv2.13 and older or JSONv5 and older. - result = await protocol_runner.run(protocol_source) + unsubscribe = protocol_runner.broker.subscribe( + "command", lambda event: emit_runlog(event) if emit_runlog else None + ) + try: + # TODO(mm, 2023-06-30): This will home and drop tips at the end, which is not how + # things have historically behaved with PAPIv2.13 and older or JSONv5 and older. + result = await protocol_runner.run( + deck_configuration=entrypoint_util.get_deck_configuration(), + protocol_source=protocol_source, + ) + finally: + unsubscribe() if result.state_summary.status != EngineStatus.SUCCEEDED: - raise _ProtocolEngineExecuteError(result.state_summary.errors) + raise entrypoint_util.ProtocolEngineExecuteError( + result.state_summary.errors + ) - with _adapt_protocol_source( - protocol_file=protocol_file, - protocol_name=protocol_name, - extra_labware=extra_labware, - ) as protocol_source: + with entrypoint_util.adapt_protocol_source(protocol) as protocol_source: asyncio.run(run(protocol_source)) @@ -685,53 +658,11 @@ def _get_protocol_engine_config() -> Config: # We deliberately omit ignore_pause=True because, in the current implementation of # opentrons.protocol_api.core.engine, that would incorrectly make # ProtocolContext.is_simulating() return True. + use_simulated_deck_config=True, + # TODO the above is not correct for this and it should use the robot's actual config ) -def _get_jupyter_labware() -> Dict[str, FoundLabware]: - """Return labware files in this robot's Jupyter Notebook directory.""" - if IS_ROBOT: - # JUPYTER_NOTEBOOK_LABWARE_DIR should never be None when IS_ROBOT == True. - assert JUPYTER_NOTEBOOK_LABWARE_DIR is not None - if JUPYTER_NOTEBOOK_LABWARE_DIR.is_dir(): - return labware_from_paths([JUPYTER_NOTEBOOK_LABWARE_DIR]) - - return {} - - -@contextlib.contextmanager -def _adapt_protocol_source( - protocol_file: Union[BinaryIO, TextIO], - protocol_name: str, - extra_labware: Dict[str, FoundLabware], -) -> Generator[ProtocolSource, None, None]: - """Create a `ProtocolSource` representing input protocol files.""" - with tempfile.TemporaryDirectory() as temporary_directory: - # It's not well-defined in our customer-facing interfaces whether the supplied protocol_name - # should be just the filename part, or a path with separators. In case it contains stuff - # like "../", sanitize it to just the filename part so we don't save files somewhere bad. - safe_protocol_name = Path(protocol_name).name - - temp_protocol_file = Path(temporary_directory) / safe_protocol_name - - # FIXME(mm, 2023-06-26): Copying this file is pure overhead, and it introduces encoding - # hazards. Remove this when we can parse JSONv6+ and PAPIv2.14+ protocols without going - # through the filesystem. https://opentrons.atlassian.net/browse/RSS-281 - copy_file_like(source=protocol_file, destination=temp_protocol_file) - - custom_labware_files = [labware.path for labware in extra_labware.values()] - - protocol_source = asyncio.run( - ProtocolReader().read_saved( - files=[temp_protocol_file] + custom_labware_files, - directory=None, - files_are_prevalidated=False, - ) - ) - - yield protocol_source - - def _get_global_hardware_controller(robot_type: RobotType) -> ThreadManagedHardware: # Build a hardware controller in a worker thread, which is necessary # because ipython runs its notebook in asyncio but the notebook @@ -744,9 +675,15 @@ def _get_global_hardware_controller(robot_type: RobotType) -> ThreadManagedHardw # Conditional import because this isn't installed on OT-2s. from opentrons.hardware_control.ot3api import OT3API - _THREAD_MANAGED_HW = ThreadManager(OT3API.build_hardware_controller) + _THREAD_MANAGED_HW = ThreadManager( + OT3API.build_hardware_controller, + feature_flags=HardwareFeatureFlags.build_from_ff(), + ) else: - _THREAD_MANAGED_HW = ThreadManager(OT2API.build_hardware_controller) + _THREAD_MANAGED_HW = ThreadManager( + OT2API.build_hardware_controller, + feature_flags=HardwareFeatureFlags.build_from_ff(), + ) return _THREAD_MANAGED_HW diff --git a/api/src/opentrons/hardware_control/__init__.py b/api/src/opentrons/hardware_control/__init__.py index b8e1c015bbb..b49f1462249 100644 --- a/api/src/opentrons/hardware_control/__init__.py +++ b/api/src/opentrons/hardware_control/__init__.py @@ -13,25 +13,29 @@ from .api import API from .pause_manager import PauseManager from .backends import Controller, Simulator -from .types import CriticalPoint, ExecutionState -from .errors import ExecutionCancelledError, NoTipAttachedError, TipAttachedError +from .types import CriticalPoint, ExecutionState, OT3Mount from .constants import DROP_TIP_RELEASE_DISTANCE from .thread_manager import ThreadManager from .execution_manager import ExecutionManager from .threaded_async_lock import ThreadedAsyncLock, ThreadedAsyncForbidden -from .protocols import HardwareControlInterface +from .protocols import HardwareControlInterface, FlexHardwareControlInterface from .instruments import AbstractInstrument, Gripper from typing import Union from .ot3_calibration import OT3Transforms from .robot_calibration import RobotCalibration +from opentrons.config.types import RobotConfig, OT3Config + +from opentrons.types import Mount # TODO (lc 12-05-2022) We should 1. figure out if we need # to globally export a class that is strictly used in the hardware controller # and 2. how to properly export an ot2 and ot3 pipette. from .instruments.ot2.pipette import Pipette -OT2HardwareControlAPI = HardwareControlInterface[RobotCalibration] -OT3HardwareControlAPI = HardwareControlInterface[OT3Transforms] +OT2HardwareControlAPI = HardwareControlInterface[RobotCalibration, Mount, RobotConfig] +OT3HardwareControlAPI = FlexHardwareControlInterface[ + OT3Transforms, Union[Mount, OT3Mount], OT3Config +] HardwareControlAPI = Union[OT2HardwareControlAPI, OT3HardwareControlAPI] ThreadManagedHardware = ThreadManager[HardwareControlAPI] @@ -48,15 +52,14 @@ "SynchronousAdapter", "HardwareControlAPI", "CriticalPoint", - "NoTipAttachedError", - "TipAttachedError", "DROP_TIP_RELEASE_DISTANCE", "ThreadManager", "ExecutionManager", "ExecutionState", - "ExecutionCancelledError", "ThreadedAsyncLock", "ThreadedAsyncForbidden", "ThreadManagedHardware", "SyncHardwareAPI", + "OT2HardwareControlAPI", + "OT3HardwareControlAPI", ] diff --git a/api/src/opentrons/hardware_control/__main__.py b/api/src/opentrons/hardware_control/__main__.py index 31f3462a05d..ff41b88312b 100644 --- a/api/src/opentrons/hardware_control/__main__.py +++ b/api/src/opentrons/hardware_control/__main__.py @@ -14,6 +14,7 @@ from typing import Optional, Dict, Any from . import API +from .types import HardwareFeatureFlags from opentrons.config import robot_configs as rc from opentrons.config.types import RobotConfig @@ -45,7 +46,9 @@ async def arun( :param port: Optional smoothie port override """ rconf = config or rc.load() - hc = await API.build_hardware_controller(rconf, port) # noqa: F841 + hc = await API.build_hardware_controller( # noqa: F841 + config=rconf, port=port, feature_flags=HardwareFeatureFlags.build_from_ff() + ) def run(config: Optional[RobotConfig] = None, port: Optional[str] = None) -> None: diff --git a/api/src/opentrons/hardware_control/adapters.py b/api/src/opentrons/hardware_control/adapters.py index 330734fc6f0..4497da88bf8 100644 --- a/api/src/opentrons/hardware_control/adapters.py +++ b/api/src/opentrons/hardware_control/adapters.py @@ -2,13 +2,12 @@ """ import asyncio import functools -from typing import Generic, TypeVar, Callable, Any, cast +from typing import Generic, TypeVar, Callable, Any, cast, Awaitable from .protocols import AsyncioConfigurable WrappedObj = TypeVar("WrappedObj", bound=AsyncioConfigurable, covariant=True) WrappedReturn = TypeVar("WrappedReturn") -WrappedFunc = TypeVar("WrappedFunc", bound=Callable[..., WrappedReturn]) # TODO: BC 2020-02-25 instead of overwriting __get_attribute__ in this class @@ -54,7 +53,7 @@ def __repr__(self) -> str: @staticmethod def call_coroutine_sync( loop: asyncio.AbstractEventLoop, - to_call: WrappedFunc, + to_call: Callable[..., Awaitable[WrappedReturn]], *args: Any, **kwargs: Any, ) -> WrappedReturn: diff --git a/api/src/opentrons/hardware_control/api.py b/api/src/opentrons/hardware_control/api.py index b0765e590c0..4b62eba7e3a 100644 --- a/api/src/opentrons/hardware_control/api.py +++ b/api/src/opentrons/hardware_control/api.py @@ -20,6 +20,10 @@ cast, ) +from opentrons_shared_data.errors.exceptions import ( + PositionUnknownError, + UnsupportedHardwareCommand, +) from opentrons_shared_data.pipette import ( pipette_load_name_conversions as pipette_load_name, ) @@ -53,10 +57,7 @@ EstopState, SubSystem, SubSystemState, -) -from .errors import ( - MustHomeError, - NotSupportedByHardware, + HardwareFeatureFlags, ) from . import modules from .robot_calibration import ( @@ -87,7 +88,7 @@ class API( # of methods that are present in the protocol will call the (empty, # do-nothing) methods in the protocol. This will happily make all the # tests fail. - HardwareControlInterface[RobotCalibration], + HardwareControlInterface[RobotCalibration, top_types.Mount, RobotConfig], ): """This API is the primary interface to the hardware controller. @@ -111,6 +112,7 @@ def __init__( backend: Union[Controller, Simulator], loop: asyncio.AbstractEventLoop, config: RobotConfig, + feature_flags: Optional[HardwareFeatureFlags] = None, ) -> None: """Initialize an API instance. @@ -122,6 +124,8 @@ def __init__( self._config = config self._backend = backend self._loop = loop + # If no feature flag set is defined, we will use the default values + self._feature_flags = feature_flags or HardwareFeatureFlags() self._callbacks: Set[HardwareEventHandler] = set() # {'X': 0.0, 'Y': 0.0, 'Z': 0.0, 'A': 0.0, 'B': 0.0, 'C': 0.0} @@ -163,13 +167,14 @@ def _update_door_state(self, door_state: DoorState) -> None: def _reset_last_mount(self) -> None: self._last_moved_mount = None - @classmethod # noqa: C901 - async def build_hardware_controller( + @classmethod + async def build_hardware_controller( # noqa: C901 cls, config: Union[RobotConfig, OT3Config, None] = None, port: Optional[str] = None, loop: Optional[asyncio.AbstractEventLoop] = None, firmware: Optional[Tuple[pathlib.Path, str]] = None, + feature_flags: Optional[HardwareFeatureFlags] = None, ) -> "API": """Build a hardware controller that will actually talk to hardware. @@ -221,7 +226,12 @@ async def blink() -> None: mod_log.error(msg) raise RuntimeError(msg) - api_instance = cls(backend, loop=checked_loop, config=checked_config) + api_instance = cls( + backend, + loop=checked_loop, + config=checked_config, + feature_flags=feature_flags, + ) await api_instance.cache_instruments() module_controls = await AttachedModulesControl.build( api_instance, board_revision=backend.board_revision @@ -249,6 +259,7 @@ async def build_hardware_simulator( config: Optional[Union[RobotConfig, OT3Config]] = None, loop: Optional[asyncio.AbstractEventLoop] = None, strict_attached_instruments: bool = True, + feature_flags: Optional[HardwareFeatureFlags] = None, ) -> "API": """Build a simulating hardware controller. @@ -274,7 +285,12 @@ async def build_hardware_simulator( checked_loop, strict_attached_instruments, ) - api_instance = cls(backend, loop=checked_loop, config=checked_config) + api_instance = cls( + backend, + loop=checked_loop, + config=checked_config, + feature_flags=feature_flags, + ) await api_instance.cache_instruments() module_controls = await AttachedModulesControl.build( api_instance, board_revision=backend.board_revision @@ -286,6 +302,9 @@ async def build_hardware_simulator( def __repr__(self) -> str: return "<{} using backend {}>".format(type(self), type(self._backend)) + async def get_serial_number(self) -> Optional[str]: + return await self._backend.get_serial_number() + @property def loop(self) -> asyncio.AbstractEventLoop: """The event loop used by this instance.""" @@ -328,6 +347,7 @@ def fw_version(self) -> str: def board_revision(self) -> str: return str(self._backend.board_revision) + @property def attached_subsystems(self) -> Dict[SubSystem, SubSystemState]: return {} @@ -407,6 +427,9 @@ async def update_firmware( firmware_file, checked_loop, explicit_modeset ) + def has_gripper(self) -> bool: + return False + async def cache_instruments( self, require: Optional[Dict[top_types.Mount, PipetteName]] = None ) -> None: @@ -432,6 +455,7 @@ async def cache_instruments( req_instr, pip_id, pip_offset_cal, + self._feature_flags.use_old_aspiration_functions, ) self._attached_instruments[mount] = p if req_instr and p: @@ -509,7 +533,7 @@ async def stop(self, home_after: bool = True) -> None: robot. After this call, no further recovery is necessary. """ await self._backend.halt() # calls smoothie_driver.kill() - await self._execution_manager.cancel() + await self.cancel_execution_and_running_tasks() self._log.info("Recovering from halt") await self.reset() await self.cache_instruments() @@ -517,6 +541,15 @@ async def stop(self, home_after: bool = True) -> None: if home_after: await self.home() + def is_movement_execution_taskified(self) -> bool: + return self.taskify_movement_execution + + def should_taskify_movement_execution(self, taskify: bool) -> None: + self.taskify_movement_execution = taskify + + async def cancel_execution_and_running_tasks(self) -> None: + await self._execution_manager.cancel() + async def reset(self) -> None: """Reset the stored state of the system.""" self._pause_manager.reset() @@ -586,6 +619,7 @@ async def _do_plunger_home( home_flagged_axes=False, ) + @ExecutionManagerProvider.wait_for_running async def home_plunger(self, mount: top_types.Mount) -> None: """ Home the plunger motor for a mount, and then return it to the 'bottom' @@ -601,10 +635,13 @@ async def home(self, axes: Optional[List[Axis]] = None) -> None: # No internal code passes OT3 axes as arguments on an OT2. But a user/ client # can still explicitly specify an OT3 axis even when working on an OT2. # Adding this check in order to prevent misuse of axes types. - if axes and any(axis not in Axis.ot2_axes() for axis in axes): - raise NotSupportedByHardware( - f"At least one axis in {axes} is not supported on the OT2." - ) + if axes: + unsupported = list(axis not in Axis.ot2_axes() for axis in axes) + if any(unsupported): + raise UnsupportedHardwareCommand( + message=f"At least one axis in {axes} is not supported on the OT2.", + detail={"unsupported_axes": str(unsupported)}, + ) self._reset_last_mount() # Initialize/update current_position checked_axes = axes or [ax for ax in Axis.ot2_axes()] @@ -641,16 +678,24 @@ async def current_position( plunger_ax = Axis.of_plunger(mount) position_axes = [Axis.X, Axis.Y, z_ax, plunger_ax] - if fail_on_not_homed and ( - not self._backend.is_homed([ot2_axis_to_string(a) for a in position_axes]) - or not self._current_position - ): - raise MustHomeError( - f"Current position of {str(mount)} pipette is unknown, please home." - ) - + if fail_on_not_homed: + if not self._current_position: + raise PositionUnknownError( + message=f"Current position of {str(mount)} pipette is unknown," + " please home.", + detail={"mount": str(mount), "missing_axes": str(position_axes)}, + ) + axes_str = [ot2_axis_to_string(a) for a in position_axes] + if not self._backend.is_homed(axes_str): + unhomed = self._backend._unhomed_axes(axes_str) + raise PositionUnknownError( + message=f"{str(mount)} pipette axes ({unhomed}) must be homed.", + detail={"mount": str(mount), "unhomed_axes": str(unhomed)}, + ) elif not self._current_position and not refresh: - raise MustHomeError("Current position is unknown; please home motors.") + raise PositionUnknownError( + message="Current position is unknown; please home motors." + ) async with self._motion_lock: if refresh: smoothie_pos = await self._backend.update_position() @@ -717,7 +762,7 @@ async def move_to( top_types.Point(0, 0, 0), ) - await self._cache_and_maybe_retract_mount(mount) + await self.prepare_for_mount_movement(mount) await self._move(target_position, speed=speed, max_speeds=max_speeds) async def move_axes( @@ -730,7 +775,10 @@ async def move_axes( The effector of the x,y axis is the center of the carriage. The effector of the pipette mount axis are the mount critical points but only in z. """ - raise NotSupportedByHardware("move_axes is not supported on the OT-2.") + raise UnsupportedHardwareCommand( + message="move_axes is not supported on the OT-2.", + detail={"axes_commanded": str(list(position.keys()))}, + ) async def move_rel( self, @@ -748,24 +796,33 @@ async def move_rel( # TODO: Remove the fail_on_not_homed and make this the behavior all the time. # Having the optional arg makes the bug stick around in existing code and we # really want to fix it when we're not gearing up for a release. - mhe = MustHomeError( - "Cannot make a relative move because absolute position is unknown" - ) if not self._current_position: if fail_on_not_homed: - raise mhe + raise PositionUnknownError( + message="Cannot make a relative move because absolute position" + " is unknown.", + detail={ + "mount": str(mount), + "fail_on_not_homed": str(fail_on_not_homed), + }, + ) else: await self.home() target_position = target_position_from_relative( mount, delta, self._current_position ) + axes_moving = [Axis.X, Axis.Y, Axis.by_mount(mount)] - if fail_on_not_homed and not self._backend.is_homed( - [ot2_axis_to_string(axis) for axis in axes_moving if axis is not None] - ): - raise mhe - await self._cache_and_maybe_retract_mount(mount) + axes_str = [ot2_axis_to_string(a) for a in axes_moving] + if fail_on_not_homed and not self._backend.is_homed(axes_str): + unhomed = self._backend._unhomed_axes(axes_str) + raise PositionUnknownError( + message=f"{str(mount)} pipette axes ({unhomed}) must be homed.", + detail={"mount": str(mount), "unhomed_axes": str(unhomed)}, + ) + + await self.prepare_for_mount_movement(mount) await self._move( target_position, speed=speed, @@ -785,6 +842,9 @@ async def _cache_and_maybe_retract_mount(self, mount: top_types.Mount) -> None: await self.retract(self._last_moved_mount, 10) self._last_moved_mount = mount + async def prepare_for_mount_movement(self, mount: top_types.Mount) -> None: + await self._cache_and_maybe_retract_mount(mount) + @ExecutionManagerProvider.wait_for_running async def _move( self, @@ -853,11 +913,11 @@ def engaged_axes(self) -> Dict[Axis, bool]: async def disengage_axes(self, which: List[Axis]) -> None: await self._backend.disengage_axes([ot2_axis_to_string(ax) for ax in which]) + @ExecutionManagerProvider.wait_for_running async def _fast_home(self, axes: Sequence[str], margin: float) -> Dict[str, float]: converted_axes = "".join(axes) return await self._backend.fast_home(converted_axes, margin) - @ExecutionManagerProvider.wait_for_running async def retract(self, mount: top_types.Mount, margin: float = 10) -> None: """Pull the specified mount up to its home position. @@ -865,7 +925,6 @@ async def retract(self, mount: top_types.Mount, margin: float = 10) -> None: """ await self.retract_axis(Axis.by_mount(mount), margin) - @ExecutionManagerProvider.wait_for_running async def retract_axis(self, axis: Axis, margin: float = 10) -> None: """Pull the specified axis up to its home position. @@ -926,6 +985,14 @@ async def update_config(self, **kwargs: Any) -> None: """ self._config = replace(self._config, **kwargs) + @property + def hardware_feature_flags(self) -> HardwareFeatureFlags: + return self._feature_flags + + @hardware_feature_flags.setter + def hardware_feature_flags(self, feature_flags: HardwareFeatureFlags) -> None: + self._feature_flags = feature_flags + async def update_deck_calibration(self, new_transform: RobotCalibration) -> None: pass @@ -937,7 +1004,7 @@ async def prepare_for_aspirate( Prepare the pipette for aspiration. """ instrument = self.get_pipette(mount) - self.ready_for_tip_action(instrument, HardwareAction.PREPARE_ASPIRATE) + self.ready_for_tip_action(instrument, HardwareAction.PREPARE_ASPIRATE, mount) if instrument.current_volume == 0: speed = self.plunger_speed( @@ -1049,6 +1116,38 @@ async def blow_out( blowout_spec.instr.set_current_volume(0) blowout_spec.instr.ready_to_aspirate = False + async def update_nozzle_configuration_for_mount( + self, + mount: top_types.Mount, + back_left_nozzle: Optional[str], + front_right_nozzle: Optional[str], + starting_nozzle: Optional[str] = None, + ) -> None: + """ + Update a nozzle configuration for a given pipette. + + The expectation of this function is that the back_left_nozzle/front_right_nozzle are the two corners + of a rectangle of nozzles. A call to this function that does not follow that schema will result + in an error. + + :param mount: A robot mount that the instrument is on. + :param back_left_nozzle: A string representing a nozzle name of the form such as 'A1'. + :param front_right_nozzle: A string representing a nozzle name of the form such as 'A1'. + :param starting_nozzle: A string representing the starting nozzle which will be used as the critical point + of the pipette nozzle configuration. By default, the back left nozzle will be the starting nozzle if + none is provided. + :return: None. + + If none of the nozzle parameters are provided, the nozzle configuration will be reset to default. + """ + if not back_left_nozzle and not front_right_nozzle and not starting_nozzle: + await self.reset_nozzle_configuration(mount) + else: + assert back_left_nozzle and front_right_nozzle + await self.update_nozzle_configuration( + mount, back_left_nozzle, front_right_nozzle, starting_nozzle + ) + async def pick_up_tip( self, mount: top_types.Mount, @@ -1111,9 +1210,9 @@ async def drop_tip(self, mount: top_types.Mount, home_after: bool = True) -> Non home_flagged_axes=False, ) if move.home_after: - smoothie_pos = await self._backend.fast_home( - [ot2_axis_to_string(ax) for ax in move.home_axes], - move.home_after_safety_margin, + smoothie_pos = await self._fast_home( + axes=[ot2_axis_to_string(ax) for ax in move.home_axes], + margin=move.home_after_safety_margin, ) self._current_position = deck_from_machine( machine_pos=self._axis_map_from_string_map(smoothie_pos), diff --git a/api/src/opentrons/hardware_control/backends/controller.py b/api/src/opentrons/hardware_control/backends/controller.py index f3e73ecbea7..f35d6092134 100644 --- a/api/src/opentrons/hardware_control/backends/controller.py +++ b/api/src/opentrons/hardware_control/backends/controller.py @@ -16,9 +16,10 @@ cast, ) from typing_extensions import Final +from pathlib import Path try: - import aionotify # type: ignore[import] + import aionotify # type: ignore[import-untyped] except (OSError, ModuleNotFoundError): aionotify = None @@ -110,7 +111,12 @@ def _build_event_watcher() -> aionotify.Watcher: watcher.watch( alias="modules", path="/dev", - flags=(aionotify.Flags.CREATE | aionotify.Flags.DELETE), + flags=( + aionotify.Flags.CREATE + | aionotify.Flags.DELETE + | aionotify.Flags.MOVED_FROM + | aionotify.Flags.MOVED_TO + ), ) return watcher @@ -132,6 +138,12 @@ def module_controls(self) -> AttachedModulesControl: def module_controls(self, module_controls: AttachedModulesControl) -> None: self._module_controls = module_controls + async def get_serial_number(self) -> Optional[str]: + try: + return Path("/var/serial").read_text().strip() + except OSError: + return None + def start_gpio_door_watcher( self, loop: asyncio.AbstractEventLoop, @@ -145,11 +157,15 @@ async def update_position(self) -> Dict[str, float]: await self._smoothie_driver.update_position() return self._smoothie_driver.position + def _unhomed_axes(self, axes: Sequence[str]) -> List[str]: + return list( + axis + for axis in axes + if not self._smoothie_driver.homed_flags.get(axis, False) + ) + def is_homed(self, axes: Sequence[str]) -> bool: - for axis in axes: - if not self._smoothie_driver.homed_flags.get(axis, False): - return False - return True + return not any(self._unhomed_axes(axes)) async def move( self, diff --git a/api/src/opentrons/hardware_control/estop_state.py b/api/src/opentrons/hardware_control/backends/estop_state.py similarity index 96% rename from api/src/opentrons/hardware_control/estop_state.py rename to api/src/opentrons/hardware_control/backends/estop_state.py index 2c8884dcb26..d421af6a77a 100644 --- a/api/src/opentrons/hardware_control/estop_state.py +++ b/api/src/opentrons/hardware_control/backends/estop_state.py @@ -13,6 +13,7 @@ EstopAttachLocation, EstopStateNotification, HardwareEventHandler, + HardwareEventUnsubscriber, ) @@ -51,10 +52,12 @@ def __del__(self) -> None: if self._detector is not None: self._detector.remove_listener(self.detector_listener) - def add_listener(self, listener: HardwareEventHandler) -> None: + def add_listener(self, listener: HardwareEventHandler) -> HardwareEventUnsubscriber: """Add a hardware event listener for estop event changes.""" if listener not in self._listeners: self._listeners.append(listener) + return lambda: self.remove_listener(listener) + return lambda: None def remove_listener(self, listener: HardwareEventHandler) -> None: """Remove an existing hardware event listener for estop detector changes.""" diff --git a/api/src/opentrons/hardware_control/backends/flex_protocol.py b/api/src/opentrons/hardware_control/backends/flex_protocol.py new file mode 100644 index 00000000000..d5e06c5c433 --- /dev/null +++ b/api/src/opentrons/hardware_control/backends/flex_protocol.py @@ -0,0 +1,419 @@ +import asyncio +from contextlib import asynccontextmanager +from typing import ( + Protocol, + Dict, + Optional, + List, + Mapping, + AsyncIterator, + Sequence, + Tuple, + Set, + TypeVar, +) +from opentrons_shared_data.pipette.dev_types import ( + PipetteName, +) +from opentrons.config.types import GantryLoad +from opentrons.hardware_control.types import ( + BoardRevision, + Axis, + OT3Mount, + OT3AxisMap, + InstrumentProbeType, + MotorStatus, + UpdateStatus, + SubSystem, + SubSystemState, + TipStateType, + GripperJawState, + HardwareFeatureFlags, + EstopOverallStatus, + EstopState, + HardwareEventHandler, + HardwareEventUnsubscriber, +) +from opentrons.hardware_control.module_control import AttachedModulesControl +from ..dev_types import OT3AttachedInstruments +from ..types import StatusBarState +from .types import HWStopCondition + +Cls = TypeVar("Cls") + + +class FlexBackend(Protocol): + """Flex backend mypy protocol.""" + + async def get_serial_number(self) -> Optional[str]: + ... + + @asynccontextmanager + def restore_system_constraints(self) -> AsyncIterator[None]: + ... + + def update_constraints_for_gantry_load(self, gantry_load: GantryLoad) -> None: + ... + + def update_constraints_for_calibration_with_gantry_load( + self, + gantry_load: GantryLoad, + ) -> None: + ... + + def update_constraints_for_plunger_acceleration( + self, mount: OT3Mount, acceleration: float, gantry_load: GantryLoad + ) -> None: + ... + + @property + def initialized(self) -> bool: + """True when the hardware controller has initialized and is ready.""" + ... + + @initialized.setter + def initialized(self, value: bool) -> None: + ... + + @property + def gear_motor_position(self) -> Optional[float]: + ... + + @property + def board_revision(self) -> BoardRevision: + """Get the board revision""" + ... + + @property + def module_controls(self) -> AttachedModulesControl: + """Get the module controls.""" + ... + + @module_controls.setter + def module_controls(self, module_controls: AttachedModulesControl) -> None: + """Set the module controls""" + ... + + async def update_to_default_current_settings(self, gantry_load: GantryLoad) -> None: + ... + + def update_feature_flags(self, feature_flags: HardwareFeatureFlags) -> None: + """Update the hardware feature flags used by the hardware controller.""" + ... + + async def update_motor_status(self) -> None: + """Retreieve motor and encoder status and position from all present devices""" + ... + + async def update_motor_estimation(self, axes: Sequence[Axis]) -> None: + """Update motor position estimation for commanded axes, and update cache of data.""" + # Simulate conditions as if there are no stalls, aka do nothing + ... + + def _get_motor_status( + self, axes: Sequence[Axis] + ) -> Dict[Axis, Optional[MotorStatus]]: + ... + + def get_invalid_motor_axes(self, axes: Sequence[Axis]) -> List[Axis]: + """Get axes that currently do not have the motor-ok flag.""" + ... + + def get_invalid_encoder_axes(self, axes: Sequence[Axis]) -> List[Axis]: + """Get axes that currently do not have the encoder-ok flag.""" + ... + + def check_motor_status(self, axes: Sequence[Axis]) -> bool: + ... + + def check_encoder_status(self, axes: Sequence[Axis]) -> bool: + ... + + async def update_position(self) -> OT3AxisMap[float]: + """Get the current position.""" + ... + + async def update_encoder_position(self) -> OT3AxisMap[float]: + """Get the encoder current position.""" + ... + + async def liquid_probe( + self, + mount: OT3Mount, + max_z_distance: float, + mount_speed: float, + plunger_speed: float, + threshold_pascals: float, + log_pressure: bool = True, + auto_zero_sensor: bool = True, + num_baseline_reads: int = 10, + probe: InstrumentProbeType = InstrumentProbeType.PRIMARY, + ) -> float: + ... + + async def move( + self, + origin: Dict[Axis, float], + target: Dict[Axis, float], + speed: float, + stop_condition: HWStopCondition = HWStopCondition.none, + nodes_in_moves_only: bool = True, + ) -> None: + """Move to a position. + + Args: + target_position: Map of axis to position. + home_flagged_axes: Whether to home afterwords. + speed: Optional speed + axis_max_speeds: Optional map of axis to speed. + + Returns: + None + """ + ... + + async def home( + self, axes: Sequence[Axis], gantry_load: GantryLoad + ) -> OT3AxisMap[float]: + """Home axes. + + Args: + axes: Optional list of axes. + + Returns: + Homed position. + """ + ... + + async def gripper_grip_jaw( + self, + duty_cycle: float, + expected_displacement: float, + stop_condition: HWStopCondition = HWStopCondition.none, + stay_engaged: bool = True, + ) -> None: + """Move gripper inward.""" + ... + + async def gripper_home_jaw(self, duty_cycle: float) -> None: + """Move gripper outward.""" + ... + + async def gripper_hold_jaw( + self, + encoder_position_um: int, + ) -> None: + ... + + async def get_jaw_state(self) -> GripperJawState: + """Get the state of the gripper jaw.""" + ... + + async def tip_action( + self, origin: Dict[Axis, float], targets: List[Tuple[Dict[Axis, float], float]] + ) -> None: + ... + + async def home_tip_motors( + self, + distance: float, + velocity: float, + back_off: bool = True, + ) -> None: + ... + + async def get_attached_instruments( + self, expected: Mapping[OT3Mount, PipetteName] + ) -> Mapping[OT3Mount, OT3AttachedInstruments]: + """Get attached instruments. + + Args: + expected: Which mounts are expected. + + Returns: + A map of mount to pipette name. + """ + ... + + async def get_limit_switches(self) -> OT3AxisMap[bool]: + """Get the state of the gantry's limit switches on each axis.""" + ... + + async def set_active_current(self, axis_currents: OT3AxisMap[float]) -> None: + """Set the active current. + + Args: + axis_currents: Axes' currents + + Returns: + None + """ + ... + + @asynccontextmanager + def motor_current( + self, + run_currents: Optional[OT3AxisMap[float]] = None, + hold_currents: Optional[OT3AxisMap[float]] = None, + ) -> AsyncIterator[None]: + """Save the current.""" + ... + + @asynccontextmanager + def restore_z_r_run_current(self) -> AsyncIterator[None]: + """ + Temporarily restore the active current ONLY when homing or + retracting the Z_R axis while the 96-channel is attached. + """ + ... + + @asynccontextmanager + def increase_z_l_hold_current(self) -> AsyncIterator[None]: + """ + Temporarily increase the hold current when engaging the Z_L axis + while the 96-channel is attached + """ + ... + + async def watch(self, loop: asyncio.AbstractEventLoop) -> None: + ... + + @property + def axis_bounds(self) -> OT3AxisMap[Tuple[float, float]]: + """Get the axis bounds.""" + ... + + @property + def fw_version(self) -> Dict[SubSystem, int]: + """Get the firmware version.""" + ... + + def axis_is_present(self, axis: Axis) -> bool: + ... + + @property + def update_required(self) -> bool: + ... + + def update_firmware( + self, + subsystems: Set[SubSystem], + force: bool = False, + ) -> AsyncIterator[UpdateStatus]: + """Updates the firmware on the OT3.""" + ... + + def engaged_axes(self) -> OT3AxisMap[bool]: + """Get engaged axes.""" + ... + + async def disengage_axes(self, axes: List[Axis]) -> None: + """Disengage axes.""" + ... + + async def engage_axes(self, axes: List[Axis]) -> None: + """Engage axes.""" + ... + + async def set_lights(self, button: Optional[bool], rails: Optional[bool]) -> None: + """Set the light states.""" + ... + + async def get_lights(self) -> Dict[str, bool]: + """Get the light state.""" + ... + + def pause(self) -> None: + """Pause the controller activity.""" + ... + + def resume(self) -> None: + """Resume the controller activity.""" + ... + + async def halt(self) -> None: + """Halt the motors.""" + ... + + async def probe(self, axis: Axis, distance: float) -> OT3AxisMap[float]: + """Probe.""" + ... + + async def clean_up(self) -> None: + """Clean up.""" + ... + + @staticmethod + def home_position() -> OT3AxisMap[float]: + ... + + async def capacitive_probe( + self, + mount: OT3Mount, + moving: Axis, + distance_mm: float, + speed_mm_per_s: float, + sensor_threshold_pf: float, + probe: InstrumentProbeType, + ) -> bool: + ... + + async def capacitive_pass( + self, + mount: OT3Mount, + moving: Axis, + distance_mm: float, + speed_mm_per_s: float, + probe: InstrumentProbeType, + ) -> List[float]: + ... + + @property + def subsystems(self) -> Dict[SubSystem, SubSystemState]: + ... + + async def get_tip_status(self, mount: OT3Mount) -> TipStateType: + ... + + def current_tip_state(self, mount: OT3Mount) -> Optional[bool]: + ... + + async def update_tip_detector(self, mount: OT3Mount, sensor_count: int) -> None: + ... + + async def teardown_tip_detector(self, mount: OT3Mount) -> None: + ... + + async def set_status_bar_state(self, state: StatusBarState) -> None: + ... + + async def set_status_bar_enabled(self, enabled: bool) -> None: + ... + + def get_status_bar_state(self) -> StatusBarState: + ... + + @property + def estop_status(self) -> EstopOverallStatus: + ... + + def estop_acknowledge_and_clear(self) -> EstopOverallStatus: + ... + + def get_estop_state(self) -> EstopState: + ... + + def add_estop_callback(self, cb: HardwareEventHandler) -> HardwareEventUnsubscriber: + ... + + def check_gripper_position_within_bounds( + self, + expected_grip_width: float, + grip_width_uncertainty_wider: float, + grip_width_uncertainty_narrower: float, + jaw_width: float, + max_allowed_grip_error: float, + hard_limit_lower: float, + hard_limit_upper: float, + ) -> None: + ... diff --git a/api/src/opentrons/hardware_control/backends/ot3controller.py b/api/src/opentrons/hardware_control/backends/ot3controller.py index 7afbb2830ab..3b15a66e318 100644 --- a/api/src/opentrons/hardware_control/backends/ot3controller.py +++ b/api/src/opentrons/hardware_control/backends/ot3controller.py @@ -6,6 +6,7 @@ from functools import wraps import logging from copy import deepcopy +from numpy import isclose from typing import ( Any, Awaitable, @@ -14,7 +15,6 @@ List, Optional, Tuple, - TYPE_CHECKING, Sequence, AsyncIterator, cast, @@ -23,9 +23,10 @@ Iterator, KeysView, Union, + Mapping, ) from opentrons.config.types import OT3Config, GantryLoad -from opentrons.config import gripper_config, feature_flags as ff +from opentrons.config import gripper_config from .ot3utils import ( axis_convert, create_move_group, @@ -46,10 +47,14 @@ map_pipette_type_to_sensor_id, moving_axes_in_move_group, gripper_jaw_state_from_fw, + get_system_constraints, + get_system_constraints_for_calibration, + get_system_constraints_for_plunger_acceleration, ) +from .tip_presence_manager import TipPresenceManager try: - import aionotify # type: ignore[import] + import aionotify # type: ignore[import-untyped] except (OSError, ModuleNotFoundError): aionotify = None @@ -66,25 +71,27 @@ from opentrons_hardware.drivers.eeprom import EEPROMDriver, EEPROMData from opentrons_hardware.hardware_control.move_group_runner import MoveGroupRunner from opentrons_hardware.hardware_control.motion_planning import ( - Move, - Coordinates, + MoveManager, + MoveTarget, + ZeroLengthMoveError, ) from opentrons_hardware.hardware_control.estop.detector import ( EstopDetector, ) -from opentrons.hardware_control.estop_state import EstopStateMachine +from opentrons.hardware_control.backends.estop_state import EstopStateMachine from opentrons_hardware.hardware_control.motor_enable_disable import ( set_enable_motor, set_disable_motor, + set_enable_tip_motor, + set_disable_tip_motor, ) from opentrons_hardware.hardware_control.motor_position_status import ( get_motor_position, update_motor_position_estimation, ) from opentrons_hardware.hardware_control.limit_switches import get_limit_switches -from opentrons_hardware.hardware_control.tip_presence import get_tip_ejector_state from opentrons_hardware.hardware_control.current_settings import ( set_run_current, set_hold_current, @@ -125,21 +132,27 @@ SubSystemState, SubSystem, TipStateType, - FailedTipStateCheck, - EstopState, GripperJawState, + HardwareFeatureFlags, + EstopOverallStatus, + EstopAttachLocation, + EstopState, + HardwareEventHandler, + HardwareEventUnsubscriber, ) from opentrons.hardware_control.errors import ( InvalidPipetteName, InvalidPipetteModel, - FirmwareUpdateRequired, - OverPressureDetected, ) from opentrons_hardware.hardware_control.motion import ( MoveStopCondition, MoveGroup, ) -from opentrons_hardware.hardware_control.types import NodeMap +from opentrons_hardware.hardware_control.types import ( + NodeMap, + MotorPositionStatus, + MoveCompleteAck, +) from opentrons_hardware.hardware_control.tools import types as ohc_tool_types from opentrons_hardware.hardware_control.tool_sensors import ( @@ -168,17 +181,23 @@ from opentrons_shared_data.errors.exceptions import ( EStopActivatedError, EStopNotPresentError, - UnmatchedTipPresenceStates, + PipetteOverpressureError, + FirmwareUpdateRequiredError, + FailedGripperPickupError, ) from .subsystem_manager import SubsystemManager -if TYPE_CHECKING: - from ..dev_types import ( - AttachedPipette, - AttachedGripper, - OT3AttachedInstruments, - ) +from ..dev_types import ( + AttachedPipette, + AttachedGripper, + OT3AttachedInstruments, +) +from ..types import StatusBarState + +from .types import HWStopCondition +from .flex_protocol import FlexBackend +from .status_bar_state import StatusBarStateController log = logging.getLogger(__name__) @@ -187,12 +206,15 @@ def requires_update(func: Wrapped) -> Wrapped: - """Decorator that raises FirmwareUpdateRequired if the update_required flag is set.""" + """Decorator that raises FirmwareUpdateRequiredError if the update_required flag is set.""" @wraps(func) async def wrapper(self: Any, *args: Any, **kwargs: Any) -> Any: if self.update_required and self.initialized: - raise FirmwareUpdateRequired() + raise FirmwareUpdateRequiredError( + func.__name__, + self.subsystems_to_update, + ) return await func(self, *args, **kwargs) return cast(Wrapped, wrapper) @@ -204,7 +226,7 @@ def requires_estop(func: Wrapped) -> Wrapped: @wraps(func) async def wrapper(self: OT3Controller, *args: Any, **kwargs: Any) -> Any: state = self._estop_state_machine.state - if state == EstopState.NOT_PRESENT and ff.require_estop(): + if state == EstopState.NOT_PRESENT and self._feature_flags.require_estop: raise EStopNotPresentError( message="An Estop must be plugged in to move the robot." ) @@ -221,7 +243,7 @@ async def wrapper(self: OT3Controller, *args: Any, **kwargs: Any) -> Any: return cast(Wrapped, wrapper) -class OT3Controller: +class OT3Controller(FlexBackend): """OT3 Hardware Controller Backend.""" _initialized: bool @@ -234,7 +256,11 @@ class OT3Controller: @classmethod async def build( - cls, config: OT3Config, use_usb_bus: bool = False, check_updates: bool = True + cls, + config: OT3Config, + use_usb_bus: bool = False, + check_updates: bool = True, + feature_flags: Optional[HardwareFeatureFlags] = None, ) -> OT3Controller: """Create the OT3Controller instance. @@ -255,7 +281,11 @@ async def build( ) raise e inst = cls( - config, driver=driver, usb_driver=usb_driver, check_updates=check_updates + config, + driver=driver, + usb_driver=usb_driver, + check_updates=check_updates, + feature_flags=feature_flags, ) await inst._subsystem_manager.start() return inst @@ -267,6 +297,7 @@ def __init__( usb_driver: Optional[SerialUsbDriver] = None, eeprom_driver: Optional[EEPROMDriver] = None, check_updates: bool = True, + feature_flags: Optional[HardwareFeatureFlags] = None, ) -> None: """Construct. @@ -281,6 +312,7 @@ def __init__( self._drivers = self._build_system_hardware( self._messenger, usb_driver, eeprom_driver ) + self._feature_flags = feature_flags or HardwareFeatureFlags() self._usb_messenger = self._drivers.usb_messenger self._gpio_dev = self._drivers.gpio_dev self._subsystem_manager = SubsystemManager( @@ -299,6 +331,8 @@ def __init__( self._check_updates = check_updates self._initialized = False self._status_bar = status_bar.StatusBar(messenger=self._usb_messenger) + self._status_bar_controller = StatusBarStateController(self._status_bar) + try: self._event_watcher = self._build_event_watcher() except AttributeError: @@ -307,6 +341,52 @@ def __init__( "or door, likely because not running on linux" ) self._current_settings: Optional[OT3AxisMap[CurrentConfig]] = None + self._tip_presence_manager = TipPresenceManager(self._messenger) + self._move_manager = MoveManager( + constraints=get_system_constraints( + self._configuration.motion_settings, GantryLoad.LOW_THROUGHPUT + ) + ) + + @asynccontextmanager + async def restore_system_constraints(self) -> AsyncIterator[None]: + old_system_constraints = deepcopy(self._move_manager.get_constraints()) + try: + yield + finally: + self._move_manager.update_constraints(old_system_constraints) + log.debug(f"Restore previous system constraints: {old_system_constraints}") + + def update_constraints_for_calibration_with_gantry_load( + self, + gantry_load: GantryLoad, + ) -> None: + self._move_manager.update_constraints( + get_system_constraints_for_calibration( + self._configuration.motion_settings, gantry_load + ) + ) + log.debug( + f"Set system constraints for calibration: {self._move_manager.get_constraints()}" + ) + + def update_constraints_for_gantry_load(self, gantry_load: GantryLoad) -> None: + self._move_manager.update_constraints( + get_system_constraints(self._configuration.motion_settings, gantry_load) + ) + + def update_constraints_for_plunger_acceleration( + self, mount: OT3Mount, acceleration: float, gantry_load: GantryLoad + ) -> None: + new_constraints = get_system_constraints_for_plunger_acceleration( + self._configuration.motion_settings, gantry_load, mount, acceleration + ) + self._move_manager.update_constraints(new_constraints) + + async def get_serial_number(self) -> Optional[str]: + if not self.initialized: + return None + return self.eeprom_data.serial_number @property def initialized(self) -> bool: @@ -343,6 +423,10 @@ def eeprom_data(self) -> EEPROMData: def update_required(self) -> bool: return self._subsystem_manager.update_required and self._check_updates + @property + def subsystems_to_update(self) -> List[SubSystem]: + return self._subsystem_manager.subsystems_to_update + @staticmethod def _build_system_hardware( can_messenger: CanMessenger, @@ -366,8 +450,8 @@ def _build_system_hardware( ) @property - def gear_motor_position(self) -> Dict[NodeId, float]: - return self._gear_motor_position + def gear_motor_position(self) -> Optional[float]: + return self._gear_motor_position.get(NodeId.pipette_left, None) def _motor_nodes(self) -> Set[NodeId]: """Get a list of the motor controller nodes of all attached and ok devices.""" @@ -382,12 +466,19 @@ async def update_firmware( async for update in self._subsystem_manager.update_firmware(subsystems, force): yield update + def get_current_settings( + self, gantry_load: GantryLoad + ) -> OT3AxisMap[CurrentConfig]: + return get_current_settings(self._configuration.current_settings, gantry_load) + async def update_to_default_current_settings(self, gantry_load: GantryLoad) -> None: - self._current_settings = get_current_settings( - self._configuration.current_settings, gantry_load - ) + self._current_settings = self.get_current_settings(gantry_load) await self.set_default_currents() + def update_feature_flags(self, feature_flags: HardwareFeatureFlags) -> None: + """Update the hardware feature flags used by the hardware controller.""" + self._feature_flags = feature_flags + async def update_motor_status(self) -> None: """Retreieve motor and encoder status and position from all present nodes""" motor_nodes = self._motor_nodes() @@ -484,25 +575,26 @@ async def update_encoder_position(self) -> OT3AxisMap[float]: def _handle_motor_status_response( self, - response: NodeMap[Tuple[float, float, bool, bool]], + response: NodeMap[MotorPositionStatus], ) -> None: for axis, pos in response.items(): - self._position.update({axis: pos[0]}) - self._encoder_position.update({axis: pos[1]}) + self._position.update({axis: pos.motor_position}) + self._encoder_position.update({axis: pos.encoder_position}) # TODO (FPS 6-01-2023): Remove this once the Feature Flag to ignore stall detection is removed. # This check will latch the motor status for an axis at "true" if it was ever set to true. # To account for the case where a motor axis has its power reset, we also depend on the # "encoder_ok" flag staying set (it will only be False if the motor axis has not been # homed since a power cycle) motor_ok_latch = ( - (not ff.stall_detection_enabled()) + (not self._feature_flags.stall_detection_enabled) and ((axis in self._motor_status) and self._motor_status[axis].motor_ok) and self._motor_status[axis].encoder_ok ) self._motor_status.update( { axis: MotorStatus( - motor_ok=(pos[2] or motor_ok_latch), encoder_ok=pos[3] + motor_ok=(pos.motor_ok or motor_ok_latch), + encoder_ok=pos.encoder_ok, ) } ) @@ -511,9 +603,11 @@ def _handle_motor_status_response( @requires_estop async def move( self, - origin: Coordinates[Axis, float], - moves: List[Move[Axis]], - stop_condition: MoveStopCondition = MoveStopCondition.none, + origin: Dict[Axis, float], + target: Dict[Axis, float], + speed: float, + stop_condition: HWStopCondition = HWStopCondition.none, + nodes_in_moves_only: bool = True, ) -> None: """Move to a position. @@ -521,16 +615,45 @@ async def move( origin: The starting point of the move moves: List of moves. stop_condition: The stop condition. + nodes_in_moves_only: Default is True. If False, also send empty moves to + nodes that are present but not defined in moves. + + .. caution:: + Setting `nodes_in_moves_only` to False will enable *all* present motors in + the system. DO NOT USE when you want to keep one of the axes disabled. Returns: None """ - group = create_move_group(origin, moves, self._motor_nodes(), stop_condition) + move_target = MoveTarget.build(position=target, max_speed=speed) + try: + _, movelist = self._move_manager.plan_motion( + origin=origin, target_list=[move_target] + ) + except ZeroLengthMoveError as zme: + log.warning(f"Not moving because move was zero length {str(zme)}") + return + moves = movelist[0] + log.info(f"move: machine {target} from {origin} requires {moves}") + + ordered_nodes = self._motor_nodes() + if nodes_in_moves_only: + moving_axes = { + axis_to_node(ax) for move in moves for ax in move.unit_vector.keys() + } + ordered_nodes = ordered_nodes.intersection(moving_axes) + + group = create_move_group( + origin, moves, ordered_nodes, MoveStopCondition[stop_condition.name] + ) move_group, _ = group runner = MoveGroupRunner( move_groups=[move_group], - ignore_stalls=True if not ff.stall_detection_enabled() else False, + ignore_stalls=True + if not self._feature_flags.stall_detection_enabled + else False, ) + mounts_moving = [ k for k in moving_axes_in_move_group(move_group) @@ -679,44 +802,66 @@ async def home_tip_motors( runner = MoveGroupRunner( move_groups=[move_group], - ignore_stalls=True if not ff.stall_detection_enabled() else False, + ignore_stalls=True + if not self._feature_flags.stall_detection_enabled + else False, ) - positions = await runner.run(can_messenger=self._messenger) - if NodeId.pipette_left in positions: - self._gear_motor_position = { - NodeId.pipette_left: positions[NodeId.pipette_left][0] - } - else: - log.debug("no position returned from NodeId.pipette_left") + try: + positions = await runner.run(can_messenger=self._messenger) + if NodeId.pipette_left in positions: + self._gear_motor_position = { + NodeId.pipette_left: positions[NodeId.pipette_left].motor_position + } + else: + log.debug("no position returned from NodeId.pipette_left") + self._gear_motor_position = {} + except Exception as e: + log.error("Clearing tip motor position due to failed movement") + self._gear_motor_position = {} + raise e async def tip_action( - self, - moves: List[Move[Axis]], + self, origin: Dict[Axis, float], targets: List[Tuple[Dict[Axis, float], float]] ) -> None: - move_group = create_tip_action_group(moves, [NodeId.pipette_left], "clamp") + move_targets = [ + MoveTarget.build(target_pos, speed) for target_pos, speed in targets + ] + _, moves = self._move_manager.plan_motion( + origin=origin, target_list=move_targets + ) + move_group = create_tip_action_group(moves[0], [NodeId.pipette_left], "clamp") runner = MoveGroupRunner( move_groups=[move_group], - ignore_stalls=True if not ff.stall_detection_enabled() else False, + ignore_stalls=True + if not self._feature_flags.stall_detection_enabled + else False, ) - positions = await runner.run(can_messenger=self._messenger) - if NodeId.pipette_left in positions: - self._gear_motor_position = { - NodeId.pipette_left: positions[NodeId.pipette_left][0] - } - else: - log.debug("no position returned from NodeId.pipette_left") + try: + positions = await runner.run(can_messenger=self._messenger) + if NodeId.pipette_left in positions: + self._gear_motor_position = { + NodeId.pipette_left: positions[NodeId.pipette_left].motor_position + } + else: + log.debug("no position returned from NodeId.pipette_left") + self._gear_motor_position = {} + except Exception as e: + log.error("Clearing tip motor position due to failed movement") + self._gear_motor_position = {} + raise e @requires_update @requires_estop async def gripper_grip_jaw( self, duty_cycle: float, - stop_condition: MoveStopCondition = MoveStopCondition.none, + expected_displacement: float, # not used on real hardware + stop_condition: HWStopCondition = HWStopCondition.none, stay_engaged: bool = True, ) -> None: move_group = create_gripper_jaw_grip_group( - duty_cycle, stop_condition, stay_engaged + duty_cycle, MoveStopCondition[stop_condition.name], stay_engaged ) runner = MoveGroupRunner(move_groups=[move_group]) positions = await runner.run(can_messenger=self._messenger) @@ -768,7 +913,7 @@ def _build_attached_pip( attached: ohc_tool_types.PipetteInformation, mount: OT3Mount ) -> AttachedPipette: if attached.name == FirmwarePipetteName.unknown: - raise InvalidPipetteName(name=attached.name_int, mount=mount) + raise InvalidPipetteName(name=attached.name_int, mount=mount.name) try: # TODO (lc 12-8-2022) We should return model as an int rather than # a string. @@ -789,7 +934,7 @@ def _build_attached_pip( } except KeyError: raise InvalidPipetteModel( - name=attached.name.name, model=attached.model, mount=mount + name=attached.name.name, model=attached.model, mount=mount.name ) @staticmethod @@ -824,7 +969,7 @@ def _generate_attached_instrs( ) async def get_attached_instruments( - self, expected: Dict[OT3Mount, PipetteName] + self, expected: Mapping[OT3Mount, PipetteName] ) -> Dict[OT3Mount, OT3AttachedInstruments]: """Get attached instruments. @@ -845,34 +990,6 @@ async def get_limit_switches(self) -> OT3AxisMap[bool]: res = await get_limit_switches(self._messenger, motor_nodes) return {node_to_axis(node): bool(val) for node, val in res.items()} - async def check_for_tip_presence( - self, - mount: OT3Mount, - tip_state: TipStateType, - expect_multiple_responses: bool = False, - ) -> None: - """Raise an error if the expected tip state does not match the current state.""" - res = await self.get_tip_present_state(mount, expect_multiple_responses) - if res != tip_state.value: - raise FailedTipStateCheck(tip_state, res) - - async def get_tip_present_state( - self, - mount: OT3Mount, - expect_multiple_responses: bool = False, - ) -> bool: - """Get the state of the tip ejector flag for a given mount.""" - expected_responses = 2 if expect_multiple_responses else 1 - node = sensor_node_for_mount(OT3Mount(mount.value)) - assert node != NodeId.gripper - res = await get_tip_ejector_state(self._messenger, node, expected_responses) # type: ignore[arg-type] - vals = list(res.values()) - if not all([r == vals[0] for r in vals]): - states = {int(sensor): res[sensor] for sensor in res} - raise UnmatchedTipPresenceStates(states) - tip_present_state = bool(vals[0]) - return tip_present_state - @staticmethod def _tip_motor_nodes(axis_current_keys: KeysView[Axis]) -> List[NodeId]: return [axis_to_node(Axis.Q)] if Axis.Q in axis_current_keys else [] @@ -929,14 +1046,69 @@ async def set_hold_current(self, axis_currents: OT3AxisMap[float]) -> None: self._current_settings[axis].hold_current = current @asynccontextmanager - async def restore_current(self) -> AsyncIterator[None]: - """Save the current.""" - old_current_settings = deepcopy(self._current_settings) + async def motor_current( + self, + run_currents: Optional[OT3AxisMap[float]] = None, + hold_currents: Optional[OT3AxisMap[float]] = None, + ) -> AsyncIterator[None]: + """Update and restore current.""" + assert self._current_settings + old_settings = deepcopy(self._current_settings) + if run_currents: + await self.set_active_current(run_currents) + if hold_currents: + await self.set_hold_current(hold_currents) + try: + yield + finally: + if run_currents: + await self.set_active_current( + {ax: old_settings[ax].run_current for ax in run_currents.keys()} + ) + if hold_currents: + await self.set_hold_current( + {ax: old_settings[ax].hold_current for ax in hold_currents.keys()} + ) + if not run_currents and not hold_currents: + self._current_settings = old_settings + await self.set_default_currents() + + @asynccontextmanager + async def restore_z_r_run_current(self) -> AsyncIterator[None]: + """ + Temporarily restore the active current ONLY when homing or + retracting the Z_R axis while the 96-channel is attached. + """ + assert self._current_settings + high_throughput_settings = deepcopy(self._current_settings) + conf = self.get_current_settings(GantryLoad.LOW_THROUGHPUT)[Axis.Z_R] + # outside of homing and retracting, Z_R run current should + # be reduced to its hold current + await self.set_active_current({Axis.Z_R: conf.run_current}) + try: + yield + finally: + await self.set_active_current( + {Axis.Z_R: high_throughput_settings[Axis.Z_R].run_current} + ) + + @asynccontextmanager + async def increase_z_l_hold_current(self) -> AsyncIterator[None]: + """ + Temporarily increase the hold current when engaging the Z_L axis + while the 96-channel is attached + """ + assert self._current_settings + high_throughput_settings = deepcopy(self._current_settings) + await self.set_hold_current( + {Axis.Z_L: high_throughput_settings[Axis.Z_L].run_current} + ) try: yield finally: - self._current_settings = old_current_settings - await self.set_default_currents() + await self.set_hold_current( + {Axis.Z_L: high_throughput_settings[Axis.Z_L].hold_current} + ) @staticmethod def _build_event_watcher() -> aionotify.Watcher: @@ -944,7 +1116,12 @@ def _build_event_watcher() -> aionotify.Watcher: watcher.watch( alias="modules", path="/dev", - flags=(aionotify.Flags.CREATE | aionotify.Flags.DELETE), + flags=( + aionotify.Flags.CREATE + | aionotify.Flags.DELETE + | aionotify.Flags.MOVED_FROM + | aionotify.Flags.MOVED_TO + ), ) return watcher @@ -955,9 +1132,10 @@ async def _handle_watch_event(self) -> None: log.debug("incomplete read error when quitting watcher") return if event is not None: + flags = aionotify.Flags.parse(event.flags) + log.debug(f"aionotify: {flags} {event.name}") if "ot_module" in event.name: event_name = event.name - flags = aionotify.Flags.parse(event.flags) event_description = AionotifyEvent.build(event_name, flags) await self.module_controls.handle_module_appearance(event_description) @@ -991,13 +1169,19 @@ def engaged_axes(self) -> OT3AxisMap[bool]: async def disengage_axes(self, axes: List[Axis]) -> None: """Disengage axes.""" - nodes = {axis_to_node(ax) for ax in axes} - await set_disable_motor(self._messenger, nodes) + if Axis.Q in axes: + await set_disable_tip_motor(self._messenger, {axis_to_node(Axis.Q)}) + nodes = {axis_to_node(ax) for ax in axes if ax is not Axis.Q} + if len(nodes) > 0: + await set_disable_motor(self._messenger, nodes) async def engage_axes(self, axes: List[Axis]) -> None: """Engage axes.""" - nodes = {axis_to_node(ax) for ax in axes} - await set_enable_motor(self._messenger, nodes) + if Axis.Q in axes: + await set_enable_tip_motor(self._messenger, {axis_to_node(Axis.Q)}) + nodes = {axis_to_node(ax) for ax in axes if ax is not Axis.Q} + if len(nodes) > 0: + await set_enable_motor(self._messenger, nodes) @requires_update async def set_lights(self, button: Optional[bool], rails: Optional[bool]) -> None: @@ -1035,7 +1219,6 @@ async def probe(self, axis: Axis, distance: float) -> OT3AxisMap[float]: async def clean_up(self) -> None: """Clean up.""" - try: loop = asyncio.get_event_loop() except RuntimeError: @@ -1044,6 +1227,15 @@ async def clean_up(self) -> None: if hasattr(self, "_event_watcher"): if loop.is_running() and self._event_watcher: self._event_watcher.close() + + messenger = getattr(self, "_messenger", None) + if messenger: + await messenger.stop() + + usb_messenger = getattr(self, "_usb_messenger", None) + if usb_messenger: + await usb_messenger.stop() + return None @staticmethod @@ -1088,7 +1280,8 @@ def _axis_map_to_present_nodes( @asynccontextmanager async def _monitor_overpressure(self, mounts: List[NodeId]) -> AsyncIterator[None]: - if ff.overpressure_detection_enabled() and mounts: + msg = "The pressure sensor on the {} mount has exceeded operational limits." + if self._feature_flags.overpressure_detection_enabled and mounts: tools_with_id = map_pipette_type_to_sensor_id( mounts, self._subsystem_manager.device_info ) @@ -1113,8 +1306,10 @@ def _pop_queue() -> Optional[Tuple[NodeId, ErrorCode]]: q_msg = _pop_queue() if q_msg: mount = Axis.to_ot3_mount(node_to_axis(q_msg[0])) - raise OverPressureDetected(mount.name) - + raise PipetteOverpressureError( + message=msg.format(str(mount)), + detail={"mount": str(mount)}, + ) else: yield @@ -1129,7 +1324,7 @@ async def liquid_probe( auto_zero_sensor: bool = True, num_baseline_reads: int = 10, probe: InstrumentProbeType = InstrumentProbeType.PRIMARY, - ) -> Dict[NodeId, float]: + ) -> float: head_node = axis_to_node(Axis.by_mount(mount)) tool = sensor_node_for_pipette(OT3Mount(mount.value)) positions = await liquid_probe( @@ -1146,9 +1341,9 @@ async def liquid_probe( sensor_id_for_instrument(probe), ) for node, point in positions.items(): - self._position.update({node: point[0]}) - self._encoder_position.update({node: point[1]}) - return self._position + self._position.update({node: point.motor_position}) + self._encoder_position.update({node: point.encoder_position}) + return self._position[axis_to_node(Axis.by_mount(mount))] async def capacitive_probe( self, @@ -1158,8 +1353,8 @@ async def capacitive_probe( speed_mm_per_s: float, sensor_threshold_pf: float, probe: InstrumentProbeType, - ) -> None: - pos, _ = await capacitive_probe( + ) -> bool: + status = await capacitive_probe( self._messenger, sensor_node_for_mount(mount), axis_to_node(moving), @@ -1169,7 +1364,8 @@ async def capacitive_probe( relative_threshold_pf=sensor_threshold_pf, ) - self._position[axis_to_node(moving)] = pos + self._position[axis_to_node(moving)] = status.motor_position + return status.move_ack == MoveCompleteAck.stopped_by_condition async def capacitive_pass( self, @@ -1247,9 +1443,6 @@ def _door_listener(msg: BinaryMessageDefinition) -> None: ), ) - def status_bar_interface(self) -> status_bar.StatusBar: - return self._status_bar - async def build_estop_detector(self) -> bool: """Must be called to set up the estop detector & state machine.""" if self._drivers.usb_messenger is None: @@ -1261,6 +1454,119 @@ async def build_estop_detector(self) -> bool: return True @property - def estop_state_machine(self) -> EstopStateMachine: - """Accessor for the API to get the state machine, if it exists.""" - return self._estop_state_machine + def tip_presence_manager(self) -> TipPresenceManager: + return self._tip_presence_manager + + async def update_tip_detector(self, mount: OT3Mount, sensor_count: int) -> None: + """Build indiviudal tip detector for a mount.""" + await self.teardown_tip_detector(mount) + await self._tip_presence_manager.build_detector(mount, sensor_count) + + async def teardown_tip_detector(self, mount: OT3Mount) -> None: + await self._tip_presence_manager.clear_detector(mount) + + async def get_tip_status(self, mount: OT3Mount) -> TipStateType: + return await self.tip_presence_manager.get_tip_status(mount) + + def current_tip_state(self, mount: OT3Mount) -> Optional[bool]: + return self.tip_presence_manager.current_tip_state(mount) + + async def set_status_bar_state(self, state: StatusBarState) -> None: + await self._status_bar_controller.set_status_bar_state(state) + + async def set_status_bar_enabled(self, enabled: bool) -> None: + await self._status_bar_controller.set_enabled(enabled) + + def get_status_bar_state(self) -> StatusBarState: + return self._status_bar_controller.get_current_state() + + @property + def estop_status(self) -> EstopOverallStatus: + return EstopOverallStatus( + state=self._estop_state_machine.state, + left_physical_state=self._estop_state_machine.get_physical_status( + EstopAttachLocation.LEFT + ), + right_physical_state=self._estop_state_machine.get_physical_status( + EstopAttachLocation.RIGHT + ), + ) + + def estop_acknowledge_and_clear(self) -> EstopOverallStatus: + """Attempt to acknowledge an Estop event and clear the status. + + Returns the estop status after clearing the status.""" + self._estop_state_machine.acknowledge_and_clear() + return self.estop_status + + def get_estop_state(self) -> EstopState: + return self._estop_state_machine.state + + def add_estop_callback(self, cb: HardwareEventHandler) -> HardwareEventUnsubscriber: + return self._estop_state_machine.add_listener(cb) + + def check_gripper_position_within_bounds( + self, + expected_grip_width: float, + grip_width_uncertainty_wider: float, + grip_width_uncertainty_narrower: float, + jaw_width: float, + max_allowed_grip_error: float, + hard_limit_lower: float, + hard_limit_upper: float, + ) -> None: + """ + Check if the gripper is at the expected location. + + While this doesn't seem like it belongs here, it needs to act differently + when we're simulating, so it does. + """ + expected_gripper_position_min = ( + expected_grip_width - grip_width_uncertainty_narrower + ) + expected_gripper_position_max = ( + expected_grip_width + grip_width_uncertainty_wider + ) + current_gripper_position = jaw_width + if isclose(current_gripper_position, hard_limit_lower): + raise FailedGripperPickupError( + message="Failed to grip: jaws all the way closed", + details={ + "failure-type": "jaws-all-the-way-closed", + "actual-jaw-width": current_gripper_position, + }, + ) + if isclose(current_gripper_position, hard_limit_upper): + raise FailedGripperPickupError( + message="Failed to grip: jaws all the way open", + details={ + "failure-type": "jaws-all-the-way-open", + "actual-jaw-width": current_gripper_position, + }, + ) + if ( + current_gripper_position - expected_gripper_position_min + < -max_allowed_grip_error + ): + raise FailedGripperPickupError( + message="Failed to grip: jaws closed too far", + details={ + "failure-type": "jaws-more-closed-than-expected", + "lower-bound-labware-width": expected_grip_width + - grip_width_uncertainty_narrower, + "actual-jaw-width": current_gripper_position, + }, + ) + if ( + current_gripper_position - expected_gripper_position_max + > max_allowed_grip_error + ): + raise FailedGripperPickupError( + message="Failed to grip: jaws could not close far enough", + details={ + "failure-type": "jaws-more-open-than-expected", + "upper-bound-labware-width": expected_grip_width + - grip_width_uncertainty_narrower, + "actual-jaw-width": current_gripper_position, + }, + ) diff --git a/api/src/opentrons/hardware_control/backends/ot3simulator.py b/api/src/opentrons/hardware_control/backends/ot3simulator.py index 3984840611d..07eaaadda00 100644 --- a/api/src/opentrons/hardware_control/backends/ot3simulator.py +++ b/api/src/opentrons/hardware_control/backends/ot3simulator.py @@ -19,31 +19,7 @@ from opentrons.config.types import OT3Config, GantryLoad from opentrons.config import gripper_config -from .ot3utils import ( - axis_convert, - create_move_group, - get_current_settings, - node_to_axis, - axis_to_node, - create_gripper_jaw_hold_group, - create_gripper_jaw_grip_group, - create_gripper_jaw_home_group, - NODEID_SUBSYSTEM, - motor_nodes, - target_to_subsystem, -) -from opentrons_hardware.firmware_bindings.constants import ( - NodeId, - SensorId, - FirmwareTarget, -) -from opentrons_hardware.hardware_control.motion_planning import ( - Move, - Coordinates, -) -from opentrons.hardware_control.estop_state import EstopStateMachine -from opentrons_hardware.drivers.eeprom import EEPROMData from opentrons.hardware_control.module_control import AttachedModulesControl from opentrons.hardware_control import modules from opentrons.hardware_control.types import ( @@ -60,9 +36,14 @@ SubSystemState, TipStateType, GripperJawState, + HardwareFeatureFlags, + StatusBarState, + EstopOverallStatus, + EstopState, + EstopPhysicalStatus, + HardwareEventHandler, + HardwareEventUnsubscriber, ) -from opentrons_hardware.hardware_control.motion import MoveStopCondition -from opentrons_hardware.hardware_control import status_bar from opentrons_shared_data.pipette.dev_types import PipetteName, PipetteModel from opentrons_shared_data.pipette import ( @@ -71,7 +52,6 @@ ) from opentrons_shared_data.gripper.gripper_definition import GripperModel from opentrons.hardware_control.dev_types import ( - InstrumentHardwareConfigs, PipetteSpec, GripperSpec, AttachedPipette, @@ -79,16 +59,42 @@ OT3AttachedInstruments, ) from opentrons.util.async_helpers import ensure_yield +from .types import HWStopCondition +from .flex_protocol import FlexBackend log = logging.getLogger(__name__) +AXIS_TO_SUBSYSTEM = { + Axis.X: SubSystem.gantry_x, + Axis.Y: SubSystem.gantry_y, + Axis.Z_L: SubSystem.head, + Axis.Z_R: SubSystem.head, + Axis.Z_G: SubSystem.gripper, + Axis.G: SubSystem.gripper, + Axis.P_L: SubSystem.pipette_left, + Axis.P_R: SubSystem.pipette_right, +} + + +def coalesce_move_segments( + origin: Dict[Axis, float], targets: List[Dict[Axis, float]] +) -> Dict[Axis, float]: + for target in targets: + for axis, increment in target.items(): + origin[axis] += increment + return origin + -class OT3Simulator: +def axis_pad(positions: Dict[Axis, float], default_value: float) -> Dict[Axis, float]: + return {ax: positions.get(ax, default_value) for ax in Axis.node_axes()} + + +class OT3Simulator(FlexBackend): """OT3 Hardware Controller Backend.""" - _position: Dict[NodeId, float] - _encoder_position: Dict[NodeId, float] - _motor_status: Dict[NodeId, MotorStatus] + _position: Dict[Axis, float] + _encoder_position: Dict[Axis, float] + _motor_status: Dict[Axis, MotorStatus] @classmethod async def build( @@ -98,6 +104,7 @@ async def build( config: OT3Config, loop: asyncio.AbstractEventLoop, strict_attached_instruments: bool = True, + feature_flags: Optional[HardwareFeatureFlags] = None, ) -> OT3Simulator: """Create the OT3Simulator instance. @@ -113,6 +120,7 @@ async def build( config, loop, strict_attached_instruments, + feature_flags, ) def __init__( @@ -122,6 +130,7 @@ def __init__( config: OT3Config, loop: asyncio.AbstractEventLoop, strict_attached_instruments: bool = True, + feature_flags: Optional[HardwareFeatureFlags] = None, ) -> None: """Construct. @@ -136,8 +145,8 @@ def __init__( self._update_required = False self._initialized = False self._lights = {"button": False, "rails": False} - self._estop_state_machine = EstopStateMachine(detector=None) - self._gear_motor_position: Dict[NodeId, float] = {} + self._gear_motor_position: Dict[Axis, float] = {} + self._feature_flags = feature_flags or HardwareFeatureFlags() def _sanitize_attached_instrument( mount: OT3Mount, passed_ai: Optional[Dict[str, Optional[str]]] = None @@ -177,18 +186,52 @@ def _sanitize_attached_instrument( self._position = self._get_home_position() self._encoder_position = self._get_home_position() self._motor_status = {} - nodes = set((NodeId.head_l, NodeId.head_r, NodeId.gantry_x, NodeId.gantry_y)) + axes = set((Axis.Z_L, Axis.Z_R, Axis.X, Axis.Y)) if self._attached_instruments[OT3Mount.LEFT].get("model", None): - nodes.add(NodeId.pipette_left) + axes.add(Axis.P_L) if self._attached_instruments[OT3Mount.RIGHT].get("model", None): - nodes.add(NodeId.pipette_right) + axes.add(Axis.P_L) if self._attached_instruments.get( OT3Mount.GRIPPER ) and self._attached_instruments[OT3Mount.GRIPPER].get("model", None): - nodes.add(NodeId.gripper) - self._present_nodes = nodes + axes.update((Axis.G, Axis.Z_G)) + self._present_axes = axes self._current_settings: Optional[OT3AxisMap[CurrentConfig]] = None self._sim_jaw_state = GripperJawState.HOMED_READY + self._sim_tip_state: Dict[OT3Mount, Optional[bool]] = { + mount: False if self._attached_instruments[mount] else None + for mount in [OT3Mount.LEFT, OT3Mount.RIGHT] + } + self._sim_gantry_load = GantryLoad.LOW_THROUGHPUT + self._sim_status_bar_state = StatusBarState.IDLE + self._sim_estop_state = EstopState.DISENGAGED + self._sim_estop_left_state = EstopPhysicalStatus.DISENGAGED + self._sim_estop_right_state = EstopPhysicalStatus.DISENGAGED + + async def get_serial_number(self) -> Optional[str]: + return "simulator" + + @asynccontextmanager + async def restore_system_constraints(self) -> AsyncIterator[None]: + log.debug("Simulating saving system constraints") + try: + yield + finally: + log.debug("Simulating restoring system constraints") + + def update_constraints_for_gantry_load(self, gantry_load: GantryLoad) -> None: + self._sim_gantry_load = gantry_load + + def update_constraints_for_calibration_with_gantry_load( + self, + gantry_load: GantryLoad, + ) -> None: + self._sim_gantry_load = gantry_load + + def update_constraints_for_plunger_acceleration( + self, mount: OT3Mount, acceleration: float, gantry_load: GantryLoad + ) -> None: + self._sim_gantry_load = gantry_load @property def initialized(self) -> bool: @@ -200,12 +243,8 @@ def initialized(self, value: bool) -> None: self._initialized = value @property - def eeprom_data(self) -> EEPROMData: - return EEPROMData() - - @property - def gear_motor_position(self) -> Dict[NodeId, float]: - return self._gear_motor_position + def gear_motor_position(self) -> Optional[float]: + return self._gear_motor_position.get(Axis.Q, None) @property def board_revision(self) -> BoardRevision: @@ -226,11 +265,13 @@ def module_controls(self, module_controls: AttachedModulesControl) -> None: @ensure_yield async def update_to_default_current_settings(self, gantry_load: GantryLoad) -> None: - self._current_settings = get_current_settings( - self._configuration.current_settings, gantry_load - ) + self._gantry_load = gantry_load + + def update_feature_flags(self, feature_flags: HardwareFeatureFlags) -> None: + """Update the hardware feature flags used by the hardware controller.""" + self._feature_flags = feature_flags - def _handle_motor_status_update(self, response: Dict[NodeId, float]) -> None: + def _handle_motor_status_update(self, response: Dict[Axis, float]) -> None: self._position.update(response) self._encoder_position.update(response) self._motor_status.update( @@ -239,27 +280,27 @@ def _handle_motor_status_update(self, response: Dict[NodeId, float]) -> None: @ensure_yield async def update_motor_status(self) -> None: - """Retreieve motor and encoder status and position from all present nodes""" + """Retreieve motor and encoder status and position from all present devices""" if not self._motor_status: # Simulate condition at boot, status would not be ok self._motor_status.update( - (node, MotorStatus(False, False)) for node in self._present_nodes + (axis, MotorStatus(False, False)) for axis in self._present_axes ) else: self._motor_status.update( - (node, MotorStatus(True, True)) for node in self._present_nodes + (axis, MotorStatus(True, True)) for axis in self._present_axes ) @ensure_yield async def update_motor_estimation(self, axes: Sequence[Axis]) -> None: - """Update motor position estimation for commanded nodes, and update cache of data.""" + """Update motor position estimation for commanded axes, and update cache of data.""" # Simulate conditions as if there are no stalls, aka do nothing return None def _get_motor_status( self, axes: Sequence[Axis] ) -> Dict[Axis, Optional[MotorStatus]]: - return {ax: self._motor_status.get(axis_to_node(ax)) for ax in axes} + return {ax: self._motor_status.get(ax) for ax in axes} def get_invalid_motor_axes(self, axes: Sequence[Axis]) -> List[Axis]: """Get axes that currently do not have the motor-ok flag.""" @@ -285,17 +326,11 @@ def check_encoder_status(self, axes: Sequence[Axis]) -> bool: async def update_position(self) -> OT3AxisMap[float]: """Get the current position.""" - return axis_convert(self._position, 0.0) + return axis_pad(self._position, 0.0) async def update_encoder_position(self) -> OT3AxisMap[float]: """Get the encoder current position.""" - return axis_convert(self._encoder_position, 0.0) - - @asynccontextmanager - async def monitor_overpressure( - self, mount: OT3Mount, sensor_id: SensorId = SensorId.S0 - ) -> AsyncIterator[None]: - yield + return axis_pad(self._encoder_position, 0.0) @ensure_yield async def liquid_probe( @@ -309,21 +344,22 @@ async def liquid_probe( auto_zero_sensor: bool = True, num_baseline_reads: int = 10, probe: InstrumentProbeType = InstrumentProbeType.PRIMARY, - ) -> Dict[NodeId, float]: - - head_node = axis_to_node(Axis.by_mount(mount)) + ) -> float: + z_axis = Axis.by_mount(mount) pos = self._position - pos[head_node] += max_z_distance + pos[z_axis] += max_z_distance self._position.update(pos) self._encoder_position.update(pos) - return self._position + return self._position[z_axis] @ensure_yield async def move( self, - origin: Coordinates[Axis, float], - moves: List[Move[Axis]], - stop_condition: MoveStopCondition = MoveStopCondition.none, + origin: Dict[Axis, float], + target: Dict[Axis, float], + speed: Optional[float] = None, + stop_condition: HWStopCondition = HWStopCondition.none, + nodes_in_moves_only: bool = True, ) -> None: """Move to a position. @@ -336,9 +372,8 @@ async def move( Returns: None """ - _, final_positions = create_move_group(origin, moves, self._present_nodes) - self._position.update(final_positions) - self._encoder_position.update(final_positions) + self._position.update(target) + self._encoder_position.update(target) @ensure_yield async def home( @@ -353,30 +388,31 @@ async def home( Homed position. """ if axes: - homed = [axis_to_node(a) for a in axes] + homed = axes else: - homed = list(self._position.keys()) + homed = list(iter(self._position.keys())) for h in homed: self._position[h] = self._get_home_position()[h] self._motor_status[h] = MotorStatus(True, True) - return axis_convert(self._position, 0.0) + return axis_pad(self._position, 0.0) @ensure_yield async def gripper_grip_jaw( self, duty_cycle: float, - stop_condition: MoveStopCondition = MoveStopCondition.none, + expected_displacement: float, + stop_condition: HWStopCondition = HWStopCondition.none, stay_engaged: bool = True, ) -> None: """Move gripper inward.""" - _ = create_gripper_jaw_grip_group(duty_cycle, stop_condition, stay_engaged) self._sim_jaw_state = GripperJawState.GRIPPING + self._encoder_position[Axis.G] = expected_displacement @ensure_yield async def gripper_home_jaw(self, duty_cycle: float) -> None: """Move gripper outward.""" - _ = create_gripper_jaw_home_group(duty_cycle) - self._motor_status[NodeId.gripper_g] = MotorStatus(True, True) + self._motor_status[Axis.G] = MotorStatus(True, True) + self._encoder_position[Axis.G] = self._get_home_position()[Axis.G] self._sim_jaw_state = GripperJawState.HOMED_READY @ensure_yield @@ -384,34 +420,20 @@ async def gripper_hold_jaw( self, encoder_position_um: int, ) -> None: - _ = create_gripper_jaw_hold_group(encoder_position_um) - self._encoder_position[NodeId.gripper_g] = encoder_position_um / 1000.0 + self._encoder_position[Axis.G] = encoder_position_um / 1000.0 self._sim_jaw_state = GripperJawState.HOLDING - async def check_for_tip_presence( - self, - mount: OT3Mount, - tip_state: TipStateType, - expect_multiple_responses: bool = False, - ) -> None: - """Raise an error if the given state doesn't match the physical state.""" - pass - - async def get_tip_present_state( - self, mount: OT3Mount, expect_multiple_responses: bool = False - ) -> bool: - """Get the state of the tip ejector flag for a given mount.""" - pass - async def get_jaw_state(self) -> GripperJawState: """Get the state of the gripper jaw.""" return self._sim_jaw_state async def tip_action( - self, - moves: List[Move[Axis]], + self, origin: Dict[Axis, float], targets: List[Tuple[Dict[Axis, float], float]] ) -> None: - pass + self._gear_motor_position.update( + coalesce_move_segments(origin, [target[0] for target in targets]) + ) + await asyncio.sleep(0) async def home_tip_motors( self, @@ -424,7 +446,7 @@ async def home_tip_motors( def _attached_to_mount( self, mount: OT3Mount, expected_instr: Optional[PipetteName] ) -> OT3AttachedInstruments: - init_instr = self._attached_instruments.get(mount, {"model": None, "id": None}) # type: ignore + init_instr = self._attached_instruments.get(mount, {"model": None, "id": None}) if mount is OT3Mount.GRIPPER: return self._attached_gripper_to_mount(cast(GripperSpec, init_instr)) return self._attached_pipette_to_mount( @@ -540,10 +562,30 @@ async def set_active_current(self, axis_currents: OT3AxisMap[float]) -> None: return None @asynccontextmanager - async def restore_current(self) -> AsyncIterator[None]: + async def motor_current( + self, + run_currents: Optional[OT3AxisMap[float]] = None, + hold_currents: Optional[OT3AxisMap[float]] = None, + ) -> AsyncIterator[None]: """Save the current.""" yield + @asynccontextmanager + async def restore_z_r_run_current(self) -> AsyncIterator[None]: + """ + Temporarily restore the active current ONLY when homing or + retracting the Z_R axis while the 96-channel is attached. + """ + yield + + @asynccontextmanager + async def increase_z_l_hold_current(self) -> AsyncIterator[None]: + """ + Temporarily increase the hold current when engaging the Z_L axis + while the 96-channel is attached + """ + yield + @ensure_yield async def watch(self, loop: asyncio.AbstractEventLoop) -> None: new_mods_at_ports = [ @@ -571,18 +613,10 @@ def axis_bounds(self) -> OT3AxisMap[Tuple[float, float]]: @property def fw_version(self) -> Dict[SubSystem, int]: """Get the firmware version.""" - return { - NODEID_SUBSYSTEM[node.application_for()]: 0 for node in self._present_nodes - } + return {AXIS_TO_SUBSYSTEM[axis]: 0 for axis in self._present_axes} def axis_is_present(self, axis: Axis) -> bool: - try: - return axis_to_node(axis) in motor_nodes( - cast(Set[FirmwareTarget], self._present_nodes) - ) - except KeyError: - # Currently unhandled axis - return False + return axis in self._present_axes @property def update_required(self) -> bool: @@ -654,31 +688,22 @@ async def clean_up(self) -> None: """Clean up.""" pass - @ensure_yield - async def configure_mount( - self, mount: OT3Mount, config: InstrumentHardwareConfigs - ) -> None: - """Configure a mount.""" - return None - @staticmethod - def _get_home_position() -> Dict[NodeId, float]: + def _get_home_position() -> Dict[Axis, float]: return { - NodeId.head_l: 0, - NodeId.head_r: 0, - NodeId.gantry_x: 0, - NodeId.gantry_y: 0, - NodeId.pipette_left: 0, - NodeId.pipette_right: 0, - NodeId.gripper_z: 0, - NodeId.gripper_g: 0, + Axis.Z_L: 0, + Axis.Z_R: 0, + Axis.X: 0, + Axis.Y: 0, + Axis.P_L: 0, + Axis.P_R: 0, + Axis.Z_G: 0, + Axis.G: 0, } @staticmethod def home_position() -> OT3AxisMap[float]: - return { - node_to_axis(k): v for k, v in OT3Simulator._get_home_position().items() - } + return OT3Simulator._get_home_position() @ensure_yield async def capacitive_probe( @@ -689,8 +714,9 @@ async def capacitive_probe( speed_mm_per_s: float, sensor_threshold_pf: float, probe: InstrumentProbeType, - ) -> None: - self._position[axis_to_node(moving)] += distance_mm + ) -> bool: + self._position[moving] += distance_mm + return True @ensure_yield async def capacitive_pass( @@ -701,21 +727,13 @@ async def capacitive_pass( speed_mm_per_s: float, probe: InstrumentProbeType, ) -> List[float]: - self._position[axis_to_node(moving)] += distance_mm + self._position[moving] += distance_mm return [] - @ensure_yield - async def connect_usb_to_rear_panel(self) -> None: - """Connect to rear panel over usb.""" - return None - - def status_bar_interface(self) -> status_bar.StatusBar: - return status_bar.StatusBar(None) - @property def subsystems(self) -> Dict[SubSystem, SubSystemState]: return { - target_to_subsystem(target): SubSystemState( + AXIS_TO_SUBSYSTEM[axis]: SubSystemState( ok=True, current_fw_version=1, next_fw_version=1, @@ -724,10 +742,64 @@ def subsystems(self) -> Dict[SubSystem, SubSystemState]: pcba_revision="A1", update_state=None, ) - for target in self._present_nodes + for axis in self._present_axes } + async def get_tip_status(self, mount: OT3Mount) -> TipStateType: + return TipStateType(self._sim_tip_state[mount]) + + def current_tip_state(self, mount: OT3Mount) -> Optional[bool]: + return self._sim_tip_state[mount] + + async def update_tip_detector(self, mount: OT3Mount, sensor_count: int) -> None: + pass + + async def teardown_tip_detector(self, mount: OT3Mount) -> None: + pass + + async def set_status_bar_state(self, state: StatusBarState) -> None: + self._sim_status_bar_state = state + await asyncio.sleep(0) + + async def set_status_bar_enabled(self, enabled: bool) -> None: + await asyncio.sleep(0) + + def get_status_bar_state(self) -> StatusBarState: + return self._sim_status_bar_state + @property - def estop_state_machine(self) -> EstopStateMachine: - """Return an estop state machine locked in the "disengaged" state.""" - return self._estop_state_machine + def estop_status(self) -> EstopOverallStatus: + return EstopOverallStatus( + state=self._sim_estop_state, + left_physical_state=self._sim_estop_left_state, + right_physical_state=self._sim_estop_right_state, + ) + + def estop_acknowledge_and_clear(self) -> EstopOverallStatus: + """Attempt to acknowledge an Estop event and clear the status. + + Returns the estop status after clearing the status.""" + self._sim_estop_state = EstopState.DISENGAGED + self._sim_estop_left_state = EstopPhysicalStatus.DISENGAGED + self._sim_estop_right_state = EstopPhysicalStatus.DISENGAGED + return self.estop_status + + def get_estop_state(self) -> EstopState: + return self._sim_estop_state + + def add_estop_callback(self, cb: HardwareEventHandler) -> HardwareEventUnsubscriber: + return lambda: None + + def check_gripper_position_within_bounds( + self, + expected_grip_width: float, + grip_width_uncertainty_wider: float, + grip_width_uncertainty_narrower: float, + jaw_width: float, + max_allowed_grip_error: float, + hard_limit_lower: float, + hard_limit_upper: float, + ) -> None: + # This is a (pretty bad) simulation of the gripper actually gripping something, + # but it should work. + self._encoder_position[Axis.G] = (hard_limit_upper - jaw_width) / 2 diff --git a/api/src/opentrons/hardware_control/backends/ot3utils.py b/api/src/opentrons/hardware_control/backends/ot3utils.py index 2b1d50f5ade..3cc4b75bc76 100644 --- a/api/src/opentrons/hardware_control/backends/ot3utils.py +++ b/api/src/opentrons/hardware_control/backends/ot3utils.py @@ -80,6 +80,7 @@ SubSystem.pipette_left: NodeId.pipette_left, SubSystem.pipette_right: NodeId.pipette_right, SubSystem.gripper: NodeId.gripper, + SubSystem.hepa_uv: NodeId.hepa_uv, } NODEID_SUBSYSTEM = {node: subsystem for subsystem, node in SUBSYSTEM_NODEID.items()} @@ -105,16 +106,7 @@ def axis_nodes() -> List["NodeId"]: def node_axes() -> List[Axis]: - return [ - Axis.X, - Axis.Y, - Axis.Z_L, - Axis.Z_R, - Axis.P_L, - Axis.P_R, - Axis.Z_G, - Axis.G, - ] + return Axis.node_axes() def home_axes() -> List[Axis]: diff --git a/api/src/opentrons/hardware_control/backends/simulator.py b/api/src/opentrons/hardware_control/backends/simulator.py index 7766260ab11..d8bca2db353 100644 --- a/api/src/opentrons/hardware_control/backends/simulator.py +++ b/api/src/opentrons/hardware_control/backends/simulator.py @@ -169,6 +169,9 @@ def _sanitize_attached_instrument( # to the hardware api controller. self._module_controls: Optional[AttachedModulesControl] = None + async def get_serial_number(self) -> Optional[str]: + return "simulator" + @property def gpio_chardev(self) -> GPIODriverLike: return self._gpio_chardev @@ -187,11 +190,15 @@ def module_controls(self, module_controls: AttachedModulesControl) -> None: async def update_position(self) -> Dict[str, float]: return self._position + def _unhomed_axes(self, axes: Sequence[str]) -> List[str]: + return list( + axis + for axis in axes + if not self._smoothie_driver.homed_flags.get(axis, False) + ) + def is_homed(self, axes: Sequence[str]) -> bool: - for axis in axes: - if not self._smoothie_driver.homed_flags.get(axis, False): - return False - return True + return not any(self._unhomed_axes(axes)) @ensure_yield async def move( diff --git a/api/src/opentrons/hardware_control/status_bar_state.py b/api/src/opentrons/hardware_control/backends/status_bar_state.py similarity index 99% rename from api/src/opentrons/hardware_control/status_bar_state.py rename to api/src/opentrons/hardware_control/backends/status_bar_state.py index b38a709be86..616fec2ff3a 100644 --- a/api/src/opentrons/hardware_control/status_bar_state.py +++ b/api/src/opentrons/hardware_control/backends/status_bar_state.py @@ -1,4 +1,4 @@ -from .types import StatusBarState +from opentrons.hardware_control.types import StatusBarState from opentrons_hardware.hardware_control import status_bar from opentrons_hardware.firmware_bindings.binary_constants import ( LightAnimationType, diff --git a/api/src/opentrons/hardware_control/backends/subsystem_manager.py b/api/src/opentrons/hardware_control/backends/subsystem_manager.py index 130f265b0f9..1cc663ae99f 100644 --- a/api/src/opentrons/hardware_control/backends/subsystem_manager.py +++ b/api/src/opentrons/hardware_control/backends/subsystem_manager.py @@ -13,6 +13,7 @@ Callable, AsyncIterator, Union, + List, ) from opentrons_hardware.hardware_control import network, tools @@ -144,6 +145,10 @@ def _next_version(target: FirmwareTarget, current: int) -> int: def update_required(self) -> bool: return bool(self._updates_required) + @property + def subsystems_to_update(self) -> List[SubSystem]: + return [target_to_subsystem(t) for t in self._updates_required.keys()] + async def start(self) -> None: await self._probe_network_and_cache_fw_updates( self._expected_core_targets, True diff --git a/api/src/opentrons/hardware_control/backends/tip_presence_manager.py b/api/src/opentrons/hardware_control/backends/tip_presence_manager.py new file mode 100644 index 00000000000..9d2be3901da --- /dev/null +++ b/api/src/opentrons/hardware_control/backends/tip_presence_manager.py @@ -0,0 +1,147 @@ +import logging +from functools import partial +from typing import cast, Callable, Optional, List, Set +from typing_extensions import TypedDict, Literal + +from opentrons.hardware_control.types import TipStateType, OT3Mount + +from opentrons_hardware.drivers.can_bus import CanMessenger +from opentrons_hardware.firmware_bindings.constants import NodeId +from opentrons_hardware.hardware_control.tip_presence import ( + TipDetector, + types as tip_types, +) +from opentrons_shared_data.errors.exceptions import ( + TipDetectorNotFound, + UnmatchedTipPresenceStates, +) + +log = logging.getLogger(__name__) + +TipListener = Callable[[OT3Mount, bool], None] +PipetteMountKeys = Literal["left", "right"] + + +class TipDetectorByMount(TypedDict): + left: Optional[TipDetector] + right: Optional[TipDetector] + + +class UnsubMethodByMount(TypedDict): + left: Optional[Callable[[], None]] + right: Optional[Callable[[], None]] + + +class TipUpdateByMount(TypedDict): + left: Optional[bool] + right: Optional[bool] + + +def _mount_to_node(mount: OT3Mount) -> NodeId: + return { + OT3Mount.LEFT: NodeId.pipette_left, + OT3Mount.RIGHT: NodeId.pipette_right, + }[mount] + + +class TipPresenceManager: + """Handle tip change notification coming from CAN.""" + + _listeners: Set[TipListener] + _detectors: TipDetectorByMount + _unsub_methods: UnsubMethodByMount + _last_state: TipUpdateByMount + + def __init__( + self, + can_messenger: CanMessenger, + listeners: Set[TipListener] = set(), + ) -> None: + self._messenger = can_messenger + self._listeners = listeners + self._detectors = TipDetectorByMount(left=None, right=None) + self._unsub_methods = UnsubMethodByMount(left=None, right=None) + self._last_state = TipUpdateByMount(left=None, right=None) + + @staticmethod + def _get_key(mount: OT3Mount) -> PipetteMountKeys: + assert mount != OT3Mount.GRIPPER + return cast(PipetteMountKeys, mount.name.lower()) + + async def clear_detector(self, mount: OT3Mount) -> None: + """Clean up and remove tip detector.""" + + def _unsubscribe() -> None: + """Unsubscribe from detector.""" + unsub = self._unsub_methods[self._get_key(mount)] + if unsub: + unsub() + self.set_unsub(mount, None) + + try: + detector = self.get_detector(mount) + detector.cleanup() + except TipDetectorNotFound: + pass + finally: + _unsubscribe() + self.set_detector(mount, None) + + async def build_detector(self, mount: OT3Mount, sensor_count: int) -> None: + assert self._detectors.get(self._get_key(mount), None) is None + # set up and subscribe to the detector + d = TipDetector(self._messenger, _mount_to_node(mount), sensor_count) + # listens to the detector so we can immediately notify listeners + # the most up-to-date tip state + unsub = d.add_subscriber(partial(self._handle_tip_update, mount)) + self.set_unsub(mount, unsub) + self.set_detector(mount, d) + + def _handle_tip_update( + self, mount: OT3Mount, update: tip_types.TipNotification + ) -> None: + """Callback for detector.""" + self._last_state[self._get_key(mount)] = update.presence + + for listener in self._listeners: + listener(mount, update.presence) + + def current_tip_state(self, mount: OT3Mount) -> Optional[bool]: + state = self._last_state[self._get_key(mount)] + return state + + @staticmethod + def _get_tip_presence(results: List[tip_types.TipNotification]) -> TipStateType: + # more than one sensor reported, we have to check if their states match + if len(set(r.presence for r in results)) > 1: + raise UnmatchedTipPresenceStates( + {int(r.sensor): int(r.presence) for r in results} + ) + return TipStateType(results[0].presence) + + async def get_tip_status(self, mount: OT3Mount) -> TipStateType: + detector = self.get_detector(mount) + return self._get_tip_presence(await detector.request_tip_status()) + + def get_detector(self, mount: OT3Mount) -> TipDetector: + detector = self._detectors[self._get_key(mount)] + if not detector: + raise TipDetectorNotFound( + message=f"Tip detector not set up for {mount} mount", + detail={"mount": str(mount)}, + ) + return detector + + def set_detector(self, mount: OT3Mount, detector: Optional[TipDetector]) -> None: + self._detectors[self._get_key(mount)] = detector + + def set_unsub(self, mount: OT3Mount, unsub: Optional[Callable[[], None]]) -> None: + self._unsub_methods[self._get_key(mount)] = unsub + + def add_listener(self, listener: TipListener) -> Callable[[], None]: + self._listeners.add(listener) + + def remove() -> None: + self._listeners.discard(listener) + + return remove diff --git a/api/src/opentrons/hardware_control/backends/types.py b/api/src/opentrons/hardware_control/backends/types.py new file mode 100644 index 00000000000..e29001abee9 --- /dev/null +++ b/api/src/opentrons/hardware_control/backends/types.py @@ -0,0 +1,14 @@ +"""backends.types - wrapper types for api/backend interaction""" + +from enum import Enum, auto + + +class HWStopCondition(Enum): + none = auto() + limit_switch = auto() + sync_line = auto() + encoder_position = auto() + gripper_force = auto() + stall = auto() + ignore_stalls = auto() + limit_switch_backoff = auto() diff --git a/api/src/opentrons/hardware_control/dev_types.py b/api/src/opentrons/hardware_control/dev_types.py index 915761245e8..45c0f1bf9b0 100644 --- a/api/src/opentrons/hardware_control/dev_types.py +++ b/api/src/opentrons/hardware_control/dev_types.py @@ -28,6 +28,7 @@ from opentrons.drivers.types import MoveSplit from opentrons.types import Mount from opentrons.hardware_control.types import GripperJawState +from opentrons.hardware_control.nozzle_manager import NozzleMap class InstrumentSpec(TypedDict): @@ -94,6 +95,7 @@ class PipetteDict(InstrumentDict): has_tip: bool default_push_out_volume: Optional[float] supported_tips: Dict[PipetteTipType, SupportedTipsDefinition] + current_nozzle_map: NozzleMap # spp: why was this Optional? class PipetteStateDict(TypedDict): diff --git a/api/src/opentrons/hardware_control/errors.py b/api/src/opentrons/hardware_control/errors.py index 2a45464c745..6cde3fa076b 100644 --- a/api/src/opentrons/hardware_control/errors.py +++ b/api/src/opentrons/hardware_control/errors.py @@ -1,114 +1,43 @@ -from opentrons_shared_data.errors.exceptions import PipetteOverpressureError -from .types import OT3Mount +from typing import Optional, Dict, Any +from opentrons_shared_data.errors.exceptions import ( + MotionPlanningFailureError, + InvalidInstrumentData, + RobotInUseError, +) -class OutOfBoundsMove(RuntimeError): - def __init__(self, message: str): - self.message = message - super().__init__() +class OutOfBoundsMove(MotionPlanningFailureError): + def __init__(self, message: str, detail: Dict[str, Any]): + super().__init__(message=message, detail=detail) - def __str__(self) -> str: - return f"OutOfBoundsMove: {self.message}" - def __repr__(self) -> str: - return f"<{str(self.__class__)}: {self.message}>" - - -class ExecutionCancelledError(RuntimeError): - pass - - -class MustHomeError(RuntimeError): - pass - - -class NoTipAttachedError(RuntimeError): - pass - - -class TipAttachedError(RuntimeError): - pass - - -class InvalidMoveError(ValueError): - pass - - -class NotSupportedByHardware(ValueError): - """Error raised when attempting to use arguments and values not supported by the specific hardware.""" - - -class GripperNotAttachedError(Exception): - """An error raised if a gripper is accessed that is not attached.""" - - pass - - -class AxisNotPresentError(Exception): - """An error raised if an axis that is not present.""" - - pass - - -class FirmwareUpdateRequired(RuntimeError): - """An error raised when the firmware of the submodules needs to be updated.""" - - pass - - -class FirmwareUpdateFailed(RuntimeError): - """An error raised when a firmware update fails.""" - - pass - - -class OverPressureDetected(PipetteOverpressureError): - """An error raised when the pressure sensor max value is exceeded.""" - - def __init__(self, mount: str) -> None: - return super().__init__( - message=f"The pressure sensor on the {mount} mount has exceeded operational limits.", - detail={"mount": mount}, +class InvalidCriticalPoint(MotionPlanningFailureError): + def __init__(self, cp_name: str, instr: str, message: Optional[str] = None): + super().__init__( + message=(message or f"Critical point {cp_name} is invalid for a {instr}."), + detail={"instrument": instr, "critical point": cp_name}, ) -class InvalidPipetteName(KeyError): +class InvalidPipetteName(InvalidInstrumentData): """Raised for an invalid pipette.""" - def __init__(self, name: int, mount: OT3Mount) -> None: - self.name = name - self.mount = mount - - def __repr__(self) -> str: - return f"<{self.__class__.__name__}: name={self.name} mount={self.mount}>" - - def __str__(self) -> str: - return f"{self.__class__.__name__}: Pipette name key {self.name} on mount {self.mount.name} is not valid" + def __init__(self, name: int, mount: str) -> None: + super().__init__( + message=f"Invalid pipette name key {name} on mount {mount}", + detail={"mount": mount, "name": str(name)}, + ) -class InvalidPipetteModel(KeyError): +class InvalidPipetteModel(InvalidInstrumentData): """Raised for a pipette with an unknown model.""" - def __init__(self, name: str, model: str, mount: OT3Mount) -> None: - self.name = name - self.model = model - self.mount = mount + def __init__(self, name: str, model: str, mount: str) -> None: + super().__init__(detail={"mount": mount, "name": name, "model": model}) - def __repr__(self) -> str: - return f"<{self.__class__.__name__}: name={self.name}, model={self.model}, mount={self.mount}>" - def __str__(self) -> str: - return f"{self.__class__.__name__}: {self.name} on {self.mount.name} has an unknown model {self.model}" - - -class UpdateOngoingError(RuntimeError): +class UpdateOngoingError(RobotInUseError): """Error when an update is already happening.""" - def __init__(self, msg: str) -> None: - self.msg = msg - - def __repr__(self) -> str: - return f"<{self.__class__.__name__}: msg={self.msg}>" - - def __str__(self) -> str: - return self.msg + def __init__(self, message: str) -> None: + super().__init__(message=message) diff --git a/api/src/opentrons/hardware_control/execution_manager.py b/api/src/opentrons/hardware_control/execution_manager.py index 02cdaf9b8e1..7e4f570933f 100644 --- a/api/src/opentrons/hardware_control/execution_manager.py +++ b/api/src/opentrons/hardware_control/execution_manager.py @@ -1,8 +1,18 @@ import asyncio import functools -from typing import Set, TypeVar, Type, cast, Callable, Any, Awaitable, overload +from typing import ( + Set, + TypeVar, + Type, + cast, + Callable, + Any, + Coroutine, + ParamSpec, + Concatenate, +) from .types import ExecutionState -from .errors import ExecutionCancelledError +from opentrons_shared_data.errors.exceptions import ExecutionCancelledError TaskContents = TypeVar("TaskContents") @@ -64,7 +74,9 @@ async def wait_for_is_running(self) -> None: async with self._condition: if self._state == ExecutionState.PAUSED: await self._condition.wait() - if self._state == ExecutionState.CANCELLED: + # type-ignore needed because this is a reentrant function and narrowing cannot + # apply + if self._state == ExecutionState.CANCELLED: # type: ignore[comparison-overlap] raise ExecutionCancelledError elif self._state == ExecutionState.CANCELLED: raise ExecutionCancelledError @@ -72,14 +84,9 @@ async def wait_for_is_running(self) -> None: pass -DecoratedReturn = TypeVar("DecoratedReturn") -DecoratedMethodReturningValue = TypeVar( - "DecoratedMethodReturningValue", bound=Callable[..., Awaitable[DecoratedReturn]] -) -DecoratedMethodNoReturn = TypeVar( - "DecoratedMethodNoReturn", bound=Callable[..., Awaitable[None]] -) SubclassInstance = TypeVar("SubclassInstance", bound="ExecutionManagerProvider") +DecoratedMethodParams = ParamSpec("DecoratedMethodParams") +DecoratedReturn = TypeVar("DecoratedReturn") class ExecutionManagerProvider: @@ -92,42 +99,59 @@ class ExecutionManagerProvider: def __init__(self, simulator: bool) -> None: self._em_simulate = simulator self._execution_manager = ExecutionManager() + self._taskify_movement_execution: bool = False + + @property + def taskify_movement_execution(self) -> bool: + return self._taskify_movement_execution + + @taskify_movement_execution.setter + def taskify_movement_execution(self, cancellable: bool) -> None: + self._taskify_movement_execution = cancellable @property def execution_manager(self) -> ExecutionManager: return self._execution_manager - @overload - @classmethod - def wait_for_running( - cls: Type[SubclassInstance], decorated: DecoratedMethodReturningValue - ) -> DecoratedMethodReturningValue: - ... - - @overload @classmethod def wait_for_running( - cls: Type[SubclassInstance], decorated: DecoratedMethodNoReturn - ) -> DecoratedMethodNoReturn: - ... - - # this type ignore and the overloads are because mypy requires that a function - # whose signature declares it returns None not have a return statement, whereas - # this function's implementation relies on python having None actually be the - # thing you return, and it's mad at that - @classmethod # type: ignore - def wait_for_running( - cls: Type[SubclassInstance], decorated: DecoratedMethodReturningValue - ) -> DecoratedMethodReturningValue: + cls: Type["ExecutionManagerProvider"], + decorated: Callable[ + Concatenate[SubclassInstance, DecoratedMethodParams], + Coroutine[Any, Any, DecoratedReturn], + ], + ) -> Callable[ + Concatenate[SubclassInstance, DecoratedMethodParams], + Coroutine[Any, Any, DecoratedReturn], + ]: @functools.wraps(decorated) async def replace( - inst: SubclassInstance, *args: Any, **kwargs: Any + inst: SubclassInstance, + *args: DecoratedMethodParams.args, + **kwargs: DecoratedMethodParams.kwargs, ) -> DecoratedReturn: if not inst._em_simulate: await inst.execution_manager.wait_for_is_running() - return await decorated(inst, *args, **kwargs) - - return cast(DecoratedMethodReturningValue, replace) + if inst.taskify_movement_execution: + # Running these functions inside cancellable tasks makes it easier and + # faster to cancel protocol runs. In the higher, runner & engine layers, + # a cancellation request triggers cancellation of the running move task + # and hence, prevents any further communication with hardware. + decorated_task: "asyncio.Task[DecoratedReturn]" = asyncio.create_task( + decorated(inst, *args, **kwargs) + ) + inst.execution_manager.register_cancellable_task(decorated_task) + return await decorated_task + else: + return await decorated(inst, *args, **kwargs) + + return cast( + Callable[ + Concatenate[SubclassInstance, DecoratedMethodParams], + Coroutine[Any, Any, DecoratedReturn], + ], + replace, + ) async def do_delay(self, duration_s: float) -> None: if not self._em_simulate: diff --git a/api/src/opentrons/hardware_control/instruments/instrument_abc.py b/api/src/opentrons/hardware_control/instruments/instrument_abc.py index 46b4810e22f..1411c1b2b1d 100644 --- a/api/src/opentrons/hardware_control/instruments/instrument_abc.py +++ b/api/src/opentrons/hardware_control/instruments/instrument_abc.py @@ -12,11 +12,13 @@ class AbstractInstrument(ABC, Generic[InstrumentConfig]): """Defines the common methods of an instrument.""" @property + @abstractmethod def model(self) -> str: """Return model of the instrument.""" ... @property + @abstractmethod def config(self) -> InstrumentConfig: """Instrument config in dataclass format.""" ... diff --git a/api/src/opentrons/hardware_control/instruments/ot2/instrument_calibration.py b/api/src/opentrons/hardware_control/instruments/ot2/instrument_calibration.py index baea9a010aa..29900d68a6d 100644 --- a/api/src/opentrons/hardware_control/instruments/ot2/instrument_calibration.py +++ b/api/src/opentrons/hardware_control/instruments/ot2/instrument_calibration.py @@ -4,7 +4,7 @@ from datetime import datetime from opentrons.config.robot_configs import default_pipette_offset -from opentrons import calibration_storage +from opentrons.calibration_storage import ot2 as calibration_storage from opentrons.calibration_storage import types, helpers from opentrons.types import Mount, Point from opentrons.hardware_control.types import OT3Mount @@ -17,6 +17,11 @@ LabwareDefinition as TypeDictLabwareDef, ) +# These type aliases aid typechecking in tests that work the same on this and +# the hardware_control.instruments.ot3 variant +SourceType = types.SourceType +CalibrationStatus = types.CalibrationStatus + @dataclass class PipetteOffsetByPipetteMount: @@ -25,8 +30,8 @@ class PipetteOffsetByPipetteMount: """ offset: Point - source: types.SourceType - status: types.CalibrationStatus + source: SourceType + status: CalibrationStatus tiprack: typing.Optional[str] = None uri: typing.Optional[str] = None last_modified: typing.Optional[datetime] = None @@ -44,15 +49,15 @@ class PipetteOffsetCalibration: tiprack: str uri: str last_modified: datetime - source: types.SourceType - status: types.CalibrationStatus + source: SourceType + status: CalibrationStatus @dataclass class TipLengthCalibration: tip_length: float - source: types.SourceType - status: types.CalibrationStatus + source: SourceType + status: CalibrationStatus pipette: str tiprack: str last_modified: datetime @@ -65,8 +70,8 @@ def load_pipette_offset( # load default if pipette offset data do not exist pip_cal_obj = PipetteOffsetByPipetteMount( offset=Point(*default_pipette_offset()), - source=types.SourceType.default, - status=types.CalibrationStatus(), + source=SourceType.default, + status=CalibrationStatus(), ) # TODO this can be removed once we switch to using # ot3 pipette types in the ot3 hardware controller. diff --git a/api/src/opentrons/hardware_control/instruments/ot2/pipette.py b/api/src/opentrons/hardware_control/instruments/ot2/pipette.py index e94f4c68f06..f69d11f82b1 100644 --- a/api/src/opentrons/hardware_control/instruments/ot2/pipette.py +++ b/api/src/opentrons/hardware_control/instruments/ot2/pipette.py @@ -5,14 +5,15 @@ """ Classes and functions for pipette state tracking """ import logging -from typing import Any, Dict, Optional, Set, Tuple, Union, cast, List +from typing import Any, Dict, Optional, Set, Tuple, Union, cast from opentrons_shared_data.pipette.pipette_definition import ( PipetteConfigurations, PlungerPositions, MotorConfigurations, SupportedTipsDefinition, - TipHandlingConfigurations, + PickUpTipConfigurations, + DropTipConfigurations, PipetteModelVersionType, PipetteNameType, PipetteLiquidPropertiesDefinition, @@ -28,7 +29,7 @@ from opentrons.types import Point, Mount -from opentrons.config import robot_configs, feature_flags as ff +from opentrons.config import robot_configs from opentrons.config.types import RobotConfig from opentrons.drivers.types import MoveSplit from ..instrument_abc import AbstractInstrument @@ -45,7 +46,8 @@ CriticalPoint, BoardRevision, ) -from opentrons.hardware_control.errors import InvalidMoveError +from opentrons.hardware_control.errors import InvalidCriticalPoint +from opentrons.hardware_control import nozzle_manager from opentrons_shared_data.pipette.dev_types import ( @@ -54,7 +56,6 @@ PipetteModel, ) from opentrons.hardware_control.dev_types import InstrumentHardwareConfigs -from typing_extensions import Final RECONFIG_KEYS = {"quirks"} @@ -62,8 +63,6 @@ mod_log = logging.getLogger(__name__) -INTERNOZZLE_SPACING_MM: Final[float] = 9 - # TODO (lc 11-1-2022) Once we unify calibration loading # for the hardware controller, we will be able to # unify the pipette classes again. @@ -84,6 +83,7 @@ def __init__( config: PipetteConfigurations, pipette_offset_cal: PipetteOffsetByPipetteMount, pipette_id: Optional[str] = None, + use_old_aspiration_functions: bool = False, ) -> None: self._config = config self._config_as_dict = config.dict() @@ -92,6 +92,7 @@ def __init__( self._pipette_version = self._config.version self._max_channels = self._config.channels self._backlash_distance = config.backlash_distance + self._pick_up_configurations = config.pick_up_tip_configurations self._liquid_class_name = pip_types.LiquidClasses.default self._liquid_class = self._config.liquid_properties[self._liquid_class_name] @@ -109,6 +110,9 @@ def __init__( pipette_version=config.version, ) self._nozzle_offset = self._config.nozzle_offset + self._nozzle_manager = ( + nozzle_manager.NozzleConfigurationManager.build_from_config(self._config) + ) self._current_volume = 0.0 self._working_volume = float(self._liquid_class.max_volume) self._current_tip_length = 0.0 @@ -143,7 +147,7 @@ def __init__( self._tip_overlap_lookup = self._liquid_class.tip_overlap_dictionary - if ff.use_old_aspiration_functions(): + if use_old_aspiration_functions: self._pipetting_function_version = PIPETTING_FUNCTION_FALLBACK_VERSION else: self._pipetting_function_version = PIPETTING_FUNCTION_LATEST_VERSION @@ -197,8 +201,12 @@ def liquid_class_name(self) -> pip_types.LiquidClasses: return self._liquid_class_name @property - def nozzle_offset(self) -> List[float]: - return self._nozzle_offset + def nozzle_offset(self) -> Point: + return self._nozzle_manager.starting_nozzle_offset + + @property + def nozzle_manager(self) -> nozzle_manager.NozzleConfigurationManager: + return self._nozzle_manager @property def pipette_offset(self) -> PipetteOffsetByPipetteMount: @@ -221,17 +229,15 @@ def plunger_motor_current(self) -> MotorConfigurations: return self._config.plunger_motor_configurations @property - def pick_up_configurations(self) -> TipHandlingConfigurations: + def pick_up_configurations(self) -> PickUpTipConfigurations: return self._config.pick_up_tip_configurations @pick_up_configurations.setter - def pick_up_configurations( - self, pick_up_configs: TipHandlingConfigurations - ) -> None: + def pick_up_configurations(self, pick_up_configs: PickUpTipConfigurations) -> None: self._pick_up_configurations = pick_up_configs @property - def drop_configurations(self) -> TipHandlingConfigurations: + def drop_configurations(self) -> DropTipConfigurations: return self._config.drop_tip_configurations @property @@ -282,6 +288,9 @@ def reset_state(self) -> None: ) self._tip_overlap_lookup = self.liquid_class.tip_overlap_dictionary + self._nozzle_manager = ( + nozzle_manager.NozzleConfigurationManager.build_from_config(self._config) + ) def reset_pipette_offset(self, mount: Mount, to_default: bool) -> None: """Reset the pipette offset to system defaults.""" @@ -323,54 +332,30 @@ def critical_point(self, cp_override: Optional[CriticalPoint] = None) -> Point: we have a tip, or :py:attr:`CriticalPoint.XY_CENTER` - the specified critical point will be used. """ - instr = Point(*self._pipette_offset.offset) - offsets = self.nozzle_offset if cp_override in [ CriticalPoint.GRIPPER_JAW_CENTER, CriticalPoint.GRIPPER_FRONT_CALIBRATION_PIN, CriticalPoint.GRIPPER_REAR_CALIBRATION_PIN, ]: - raise InvalidMoveError( - f"Critical point {cp_override.name} is not valid for a pipette" - ) + raise InvalidCriticalPoint(cp_override.name, "pipette") - if not self.has_tip or cp_override == CriticalPoint.NOZZLE: - cp_type = CriticalPoint.NOZZLE - tip_length = 0.0 - else: - cp_type = CriticalPoint.TIP - tip_length = self.current_tip_length - if cp_override == CriticalPoint.XY_CENTER: - mod_offset_xy = [ - offsets[0], - offsets[1] - (INTERNOZZLE_SPACING_MM * (self._config.channels - 1) / 2), - offsets[2], - ] - cp_type = CriticalPoint.XY_CENTER - elif cp_override == CriticalPoint.FRONT_NOZZLE: - mod_offset_xy = [ - 0, - (offsets[1] - INTERNOZZLE_SPACING_MM * (self._config.channels - 1)), - offsets[2], - ] - cp_type = CriticalPoint.FRONT_NOZZLE - else: - mod_offset_xy = list(offsets) - mod_and_tip = Point( - mod_offset_xy[0], mod_offset_xy[1], mod_offset_xy[2] - tip_length + instr = Point(*self._pipette_offset.offset) + cp_with_tip_length = self._nozzle_manager.critical_point_with_tip_length( + cp_override, + self.current_tip_length if cp_override != CriticalPoint.NOZZLE else 0.0, ) - cp = mod_and_tip + instr + cp = cp_with_tip_length + instr if self._log.isEnabledFor(logging.DEBUG): info_str = "cp: {}{}: {} (from: ".format( - cp_type, " (from override)" if cp_override else "", cp + cp_override, " (from override)" if cp_override else "", cp ) info_str += "model offset: {} + instrument offset: {}".format( - mod_offset_xy, instr + cp_with_tip_length, instr ) - info_str += " - tip_length: {}".format(tip_length) + info_str += " - tip_length: {}".format(self.current_tip_length) info_str += ")" self._log.debug(info_str) @@ -487,6 +472,25 @@ def ok_to_push_out(self, push_out_dist_mm: float) -> bool: self.plunger_positions.bottom - self.plunger_positions.blow_out ) + def update_nozzle_configuration( + self, + back_left_nozzle: str, + front_right_nozzle: str, + starting_nozzle: Optional[str] = None, + ) -> None: + """ + Update nozzle configuration manager. + """ + self._nozzle_manager.update_nozzle_configuration( + back_left_nozzle, front_right_nozzle, starting_nozzle + ) + + def reset_nozzle_configuration(self) -> None: + """ + Reset nozzle configuration manager. + """ + self._nozzle_manager.reset_to_default_configuration() + def add_tip(self, tip_length: float) -> None: """ Add a tip to the pipette for position tracking and validation @@ -506,7 +510,6 @@ def remove_tip(self) -> None: Remove the tip from the pipette (effectively updates the pipette's critical point) """ - assert self.has_tip self._has_tip = False self._current_tip_length = 0.0 @@ -588,6 +591,7 @@ def _reload_and_check_skip( new_config: PipetteConfigurations, attached_instr: Pipette, pipette_offset: PipetteOffsetByPipetteMount, + use_old_aspiration_functions: bool, ) -> Tuple[Pipette, bool]: # Once we have determined that the new and attached pipettes # are similar enough that we might skip, see if the configs @@ -608,7 +612,12 @@ def _reload_and_check_skip( changed.add(k) if changed.intersection(RECONFIG_KEYS): # Something has changed that requires reconfig - p = Pipette(new_config, pipette_offset, attached_instr._pipette_id) + p = Pipette( + new_config, + pipette_offset, + attached_instr._pipette_id, + use_old_aspiration_functions, + ) p.act_as(attached_instr.acting_as) return p, False # Good to skip @@ -621,6 +630,7 @@ def load_from_config_and_check_skip( requested: Optional[PipetteName], serial: Optional[str], pipette_offset: PipetteOffsetByPipetteMount, + use_old_aspiration_functions: bool, ) -> Tuple[Optional[Pipette], bool]: """ Given the pipette config for an attached pipette (if any) freshly read @@ -648,16 +658,23 @@ def load_from_config_and_check_skip( # configured to the request if requested == str(attached.acting_as): # similar enough to check - return _reload_and_check_skip(config, attached, pipette_offset) + return _reload_and_check_skip( + config, attached, pipette_offset, use_old_aspiration_functions + ) else: # if there is no request, make sure that the old pipette # did not have backcompat applied if str(attached.acting_as) == attached.name: # similar enough to check - return _reload_and_check_skip(config, attached, pipette_offset) + return _reload_and_check_skip( + config, attached, pipette_offset, use_old_aspiration_functions + ) if config: - return Pipette(config, pipette_offset, serial), False + return ( + Pipette(config, pipette_offset, serial, use_old_aspiration_functions), + False, + ) else: return None, False diff --git a/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py b/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py index a73c0cdf5e2..32cd6f693bf 100644 --- a/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py +++ b/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py @@ -17,6 +17,10 @@ ) import numpy +from opentrons_shared_data.errors.exceptions import ( + UnexpectedTipRemovalError, + UnexpectedTipAttachError, +) from opentrons_shared_data.pipette.dev_types import UlPerMmAction from opentrons_shared_data.pipette.types import Quirks from opentrons_shared_data.errors.exceptions import CommandPreconditionViolated @@ -28,10 +32,6 @@ Axis, OT3Mount, ) -from opentrons.hardware_control.errors import ( - TipAttachedError, - NoTipAttachedError, -) from opentrons.hardware_control.constants import ( SHAKE_OFF_TIPS_SPEED, SHAKE_OFF_TIPS_PICKUP_DISTANCE, @@ -226,6 +226,7 @@ def get_attached_instrument(self, mount: MountType) -> PipetteDict: # this dict newly every time? Any why only a few items are being updated? for key in configs: result[key] = instr_dict[key] + result["current_nozzle_map"] = instr.nozzle_manager.current_configuration result["min_volume"] = instr.liquid_class.min_volume result["max_volume"] = instr.liquid_class.max_volume result["channels"] = instr.channels @@ -262,6 +263,14 @@ def get_attached_instrument(self, mount: MountType) -> PipetteDict: def attached_instruments(self) -> Dict[MountType, PipetteDict]: return self.get_attached_instruments() + @property + def attached_pipettes(self) -> Dict[MountType, PipetteDict]: + return self.get_attached_instruments() + + @property + def get_attached_pipettes(self) -> Dict[MountType, PipetteDict]: + return self.get_attached_instruments() + @property def hardware_instruments(self) -> InstrumentsByMount[MountType]: """Do not write new code that uses this.""" @@ -384,6 +393,24 @@ async def reset(self) -> None: k: None for k in self._attached_instruments.keys() } + async def update_nozzle_configuration( + self, + mount: MountType, + back_left_nozzle: str, + front_right_nozzle: str, + starting_nozzle: Optional[str] = None, + ) -> None: + instr = self._attached_instruments[mount] + if instr: + instr.update_nozzle_configuration( + back_left_nozzle, front_right_nozzle, starting_nozzle + ) + + async def reset_nozzle_configuration(self, mount: MountType) -> None: + instr = self._attached_instruments[mount] + if instr: + instr.reset_nozzle_configuration() + async def add_tip(self, mount: MountType, tip_length: float) -> None: instr = self._attached_instruments[mount] attached = self.attached_instruments @@ -432,9 +459,11 @@ def critical_point_for( # configured such that the end of a p300 single gen1's tip is 0. return top_types.Point(0, 0, 30) - def ready_for_tip_action(self, target: Pipette, action: HardwareAction) -> None: + def ready_for_tip_action( + self, target: Pipette, action: HardwareAction, mount: MountType + ) -> None: if not target.has_tip: - raise NoTipAttachedError(f"Cannot perform {action} without a tip attached") + raise UnexpectedTipRemovalError(action.name, target.name, mount.name) if ( action == HardwareAction.ASPIRATE and target.current_volume == 0 @@ -497,7 +526,7 @@ def plan_check_aspirate( # type: ignore[no-untyped-def] - Plunger distances (possibly calling an overridden plunger_volume) """ instrument = self.get_pipette(mount) - self.ready_for_tip_action(instrument, HardwareAction.ASPIRATE) + self.ready_for_tip_action(instrument, HardwareAction.ASPIRATE, mount) if volume is None: self._ihp_log.debug( "No aspirate volume defined. Aspirating up to " @@ -579,7 +608,7 @@ def plan_check_dispense( # type: ignore[no-untyped-def] """ instrument = self.get_pipette(mount) - self.ready_for_tip_action(instrument, HardwareAction.DISPENSE) + self.ready_for_tip_action(instrument, HardwareAction.DISPENSE, mount) if volume is None: disp_vol = instrument.current_volume @@ -590,7 +619,12 @@ def plan_check_dispense( # type: ignore[no-untyped-def] else: disp_vol = volume - # Ensure we don't dispense more than the current volume + # Ensure we don't dispense more than the current volume. + # + # This clamping is inconsistent with plan_check_aspirate(), which asserts + # that its input is in bounds instead of clamping it. This is left to avoid + # disturbing Python protocols with apiLevel <= 2.13. In newer Python protocols, + # the Protocol Engine layer applies its own bounds checking. disp_vol = min(instrument.current_volume, disp_vol) if disp_vol == 0: @@ -609,7 +643,7 @@ def plan_check_dispense( # type: ignore[no-untyped-def] message="Cannot push_out on a dispense that does not leave the pipette empty", detail={ "command": "dispense", - "remaining-volume": instrument.current_volume - disp_vol, + "remaining-volume": str(instrument.current_volume - disp_vol), }, ) push_out_ul = 0 @@ -660,7 +694,6 @@ def plan_check_blow_out(self, mount: OT3Mount) -> LiquidActionSpec: def plan_check_blow_out(self, mount): # type: ignore[no-untyped-def] """Check preconditions and calculate values for blowout.""" instrument = self.get_pipette(mount) - self.ready_for_tip_action(instrument, HardwareAction.BLOWOUT) speed = self.plunger_speed( instrument, instrument.blow_out_flow_rate, "dispense" ) @@ -736,20 +769,20 @@ def plan_check_pick_up_tip( # type: ignore[no-untyped-def] # Prechecks: ready for pickup tip and press/increment are valid instrument = self.get_pipette(mount) if instrument.has_tip: - raise TipAttachedError("Cannot pick up tip with a tip attached") + raise UnexpectedTipAttachError("pick_up_tip", instrument.name, mount.name) self._ihp_log.debug(f"Picking up tip on {mount.name}") if presses is None or presses < 0: - checked_presses = instrument.pick_up_configurations.presses + checked_presses = instrument.pick_up_configurations.press_fit.presses else: checked_presses = presses if not increment or increment < 0: - check_incr = instrument.pick_up_configurations.increment + check_incr = instrument.pick_up_configurations.press_fit.increment else: check_incr = increment - pick_up_speed = instrument.pick_up_configurations.speed + pick_up_speed = instrument.pick_up_configurations.press_fit.speed def build_presses() -> Iterator[Tuple[float, float]]: # Press the nozzle into the tip number of times, @@ -757,7 +790,7 @@ def build_presses() -> Iterator[Tuple[float, float]]: for i in range(checked_presses): # move nozzle down into the tip press_dist = ( - -1.0 * instrument.pick_up_configurations.distance + -1.0 * instrument.pick_up_configurations.press_fit.distance + -1.0 * check_incr * i ) # move nozzle back up @@ -780,7 +813,9 @@ def add_tip_to_instr() -> None: current={ Axis.by_mount( mount - ): instrument.pick_up_configurations.current + ): instrument.pick_up_configurations.press_fit.current_by_tip_count[ + instrument.nozzle_manager.current_configuration.tip_count + ] }, speed=pick_up_speed, relative_down=top_types.Point(0, 0, press_dist), @@ -789,7 +824,7 @@ def add_tip_to_instr() -> None: for press_dist, backup_dist in build_presses() ], shake_off_list=self._build_pickup_shakes(instrument), - retract_target=instrument.pick_up_configurations.distance + retract_target=instrument.pick_up_configurations.press_fit.distance + check_incr * checked_presses + 2, ), @@ -809,7 +844,9 @@ def add_tip_to_instr() -> None: current={ Axis.by_mount( mount - ): instrument.pick_up_configurations.current + ): instrument.pick_up_configurations.press_fit.current_by_tip_count[ + instrument.nozzle_manager.current_configuration.tip_count + ] }, speed=pick_up_speed, relative_down=top_types.Point(0, 0, press_dist), @@ -818,7 +855,7 @@ def add_tip_to_instr() -> None: for press_dist, backup_dist in build_presses() ], shake_off_list=self._build_pickup_shakes(instrument), - retract_target=instrument.pick_up_configurations.distance + retract_target=instrument.pick_up_configurations.press_fit.distance + check_incr * checked_presses + 2, ), @@ -894,11 +931,14 @@ def plan_check_drop_tip( # type: ignore[no-untyped-def] home_after, ): instrument = self.get_pipette(mount) - self.ready_for_tip_action(instrument, HardwareAction.DROPTIP) + if not instrument.drop_configurations.plunger_eject: + raise CommandPreconditionViolated( + f"Pipette {instrument.name} on {mount.name} has no plunger eject configuration" + ) bottom = instrument.plunger_positions.bottom droptip = instrument.plunger_positions.drop_tip - speed = instrument.drop_configurations.speed + speed = instrument.drop_configurations.plunger_eject.speed shakes: List[Tuple[top_types.Point, Optional[float]]] = [] if Quirks.dropTipShake in instrument.config.quirks: diameter = instrument.current_tiprack_diameter @@ -914,7 +954,11 @@ def _remove_tips() -> None: bottom, droptip, {Axis.of_plunger(mount): instrument.plunger_motor_current.run}, - {Axis.of_plunger(mount): instrument.drop_configurations.current}, + { + Axis.of_plunger( + mount + ): instrument.drop_configurations.plunger_eject.current + }, speed, home_after, (Axis.of_plunger(mount),), @@ -944,7 +988,7 @@ def _remove_tips() -> None: { Axis.of_main_tool_actuator( mount - ): instrument.drop_configurations.current + ): instrument.drop_configurations.plunger_eject.current }, speed, home_after, diff --git a/api/src/opentrons/hardware_control/instruments/ot3/gripper.py b/api/src/opentrons/hardware_control/instruments/ot3/gripper.py index 1737f5860ca..3f120f972a6 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/gripper.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/gripper.py @@ -3,7 +3,7 @@ """ Classes and functions for gripper state tracking """ import logging -from typing import Any, Optional, Set, Dict, Tuple +from typing import Any, Optional, Set, Dict, Tuple, Final from opentrons.types import Point from opentrons.config import gripper_config @@ -12,7 +12,9 @@ CriticalPoint, GripperJawState, ) -from opentrons.hardware_control.errors import InvalidMoveError +from opentrons.hardware_control.errors import ( + InvalidCriticalPoint, +) from .instrument_calibration import ( GripperCalibrationOffset, load_gripper_calibration_offset, @@ -20,6 +22,10 @@ ) from ..instrument_abc import AbstractInstrument from opentrons.hardware_control.dev_types import AttachedGripper, GripperDict +from opentrons_shared_data.errors.exceptions import ( + CommandPreconditionViolated, + MotionFailedError, +) from opentrons_shared_data.gripper import ( GripperDefinition, @@ -29,6 +35,7 @@ RECONFIG_KEYS = {"quirks"} +MAX_ACCEPTABLE_JAW_DISPLACEMENT: Final = 20 mod_log = logging.getLogger(__name__) @@ -76,6 +83,7 @@ def __init__( self._log.info( f"loaded: {self._model}, gripper offset: {self._calibration_offset}" ) + self._jaw_max_offset: Optional[float] = None @property def grip_force_profile(self) -> GripForceProfile: @@ -98,10 +106,21 @@ def remove_probe(self) -> None: assert self.attached_probe self._attached_probe = None + @property + def max_allowed_grip_error(self) -> float: + return self._geometry.max_allowed_grip_error + + @property + def max_jaw_width(self) -> float: + return self._config.geometry.jaw_width["max"] + (self._jaw_max_offset or 0) + + @property + def min_jaw_width(self) -> float: + return self._config.geometry.jaw_width["min"] + @property def jaw_width(self) -> float: - jaw_max = self.geometry.jaw_width["max"] - return jaw_max - (self.current_jaw_displacement * 2.0) + return self.max_jaw_width - (self.current_jaw_displacement * 2.0) @property def current_jaw_displacement(self) -> float: @@ -110,12 +129,13 @@ def current_jaw_displacement(self) -> float: @current_jaw_displacement.setter def current_jaw_displacement(self, mm: float) -> None: - max_mm = self._max_jaw_displacement() + 2.0 - assert mm <= max_mm, ( - f"jaw displacement {round(mm, 1)} mm exceeds max expected value: " - f"{max_mm} mm" - ) - self._current_jaw_displacement = mm + max_mm = self.max_jaw_displacement() + 2.0 + if mm > max_mm: + self._log.warning( + f"jaw displacement {round(mm, 1)} mm exceeds max expected value: " + f"{max_mm} mm, setting value to max value instead." + ) + self._current_jaw_displacement = min(mm, max_mm) @property def default_grip_force(self) -> float: @@ -129,9 +149,9 @@ def default_idle_force(self) -> float: def default_home_force(self) -> float: return self.grip_force_profile.default_home_force - def _max_jaw_displacement(self) -> float: + def max_jaw_displacement(self) -> float: geometry = self._config.geometry - return (geometry.jaw_width["max"] - geometry.jaw_width["min"]) / 2 + return (self.max_jaw_width - geometry.jaw_width["min"]) / 2 @property def state(self) -> GripperJawState: @@ -159,6 +179,41 @@ def gripper_id(self) -> str: def reload_configurations(self) -> None: return None + def update_jaw_open_position_from_closed_position( + self, jaw_at_closed: float + ) -> None: + """Update the estimation of the jaw position at open based on reading it at closed. + + This is necessary because the gripper jaw has a well-defined positional hard stop + when fully closed and empty but _not_ when open. The open position can vary unit to + unit. You can calibrate this out by reading the position of the encoder when the jaw + is closed, and then altering the logical open position so that it is whatever it needs + to be for the logical closed position to be the same as the config. + """ + jaw_min = self._config.geometry.jaw_width["min"] + jaw_nominal_max = self._config.geometry.jaw_width["max"] + if ( + abs((jaw_at_closed * 2) - (jaw_nominal_max - jaw_min)) + > MAX_ACCEPTABLE_JAW_DISPLACEMENT + ): + raise MotionFailedError( + message="Gripper jaw calibration out of bounds", + detail={ + "type": "gripper-jaw-calibration-out-of-bounds", + "actual-displacement": str(jaw_at_closed * 2), + "nominal-displacement": str(jaw_nominal_max - jaw_min), + }, + ) + + self._jaw_max_offset = jaw_min - (jaw_nominal_max - (jaw_at_closed * 2)) + self._log.info( + f"Gripper max jaw offset is now {self._jaw_max_offset} from input position {jaw_at_closed}" + ) + + @property + def has_jaw_width_calibration(self) -> bool: + return self._jaw_max_offset is not None + def reset_offset(self, to_default: bool) -> None: """Tempoarily reset the gripper offsets to default values.""" if to_default: @@ -176,9 +231,21 @@ def save_offset(self, delta: Point) -> GripperCalibrationOffset: def check_calibration_pin_location_is_accurate(self) -> None: if not self.attached_probe: - raise RuntimeError("must attach a probe before starting calibration") + raise CommandPreconditionViolated( + "Cannot calibrate gripper without attaching a calibration probe", + detail={ + "probe": str(self._attached_probe), + "jaw_state": str(self.state), + }, + ) if self.state != GripperJawState.GRIPPING: - raise RuntimeError("must grip the jaws before starting calibration") + raise CommandPreconditionViolated( + "Cannot calibrate gripper if jaw is not in gripping state", + detail={ + "probe": str(self._attached_probe), + "jaw_state": str(self.state), + }, + ) def critical_point(self, cp_override: Optional[CriticalPoint] = None) -> Point: """ @@ -186,9 +253,7 @@ def critical_point(self, cp_override: Optional[CriticalPoint] = None) -> Point: between the center of the gripper engagement volume and the calibration pins. """ if cp_override in [CriticalPoint.NOZZLE, CriticalPoint.TIP]: - raise InvalidMoveError( - f"Critical point {cp_override.name} is not valid for a gripper" - ) + raise InvalidCriticalPoint(cp_override.name, "gripper") if not self._attached_probe: cp = cp_override or CriticalPoint.GRIPPER_JAW_CENTER @@ -206,6 +271,7 @@ def critical_point(self, cp_override: Optional[CriticalPoint] = None) -> Point: self._front_calibration_pin_offset + Point(*self._calibration_offset.offset) + Point(y=self.current_jaw_displacement) + - Point(y=(self._jaw_max_offset or 0)) ) elif cp == CriticalPoint.GRIPPER_REAR_CALIBRATION_PIN: self.check_calibration_pin_location_is_accurate() @@ -213,9 +279,10 @@ def critical_point(self, cp_override: Optional[CriticalPoint] = None) -> Point: self._rear_calibration_pin_offset + Point(*self._calibration_offset.offset) - Point(y=self.current_jaw_displacement) + + Point(y=(self._jaw_max_offset or 0)) ) else: - raise InvalidMoveError(f"Critical point {cp_override} is not valid") + raise InvalidCriticalPoint(cp.name, "gripper") def duty_cycle_by_force(self, newton: float) -> float: return gripper_config.duty_cycle_by_force(newton, self.grip_force_profile) diff --git a/api/src/opentrons/hardware_control/instruments/ot3/gripper_handler.py b/api/src/opentrons/hardware_control/instruments/ot3/gripper_handler.py index 8de02635b7d..cf2ba55e23d 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/gripper_handler.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/gripper_handler.py @@ -13,9 +13,10 @@ GripperJawState, GripperProbe, ) -from opentrons.hardware_control.errors import ( - InvalidMoveError, - GripperNotAttachedError, +from opentrons.hardware_control.errors import InvalidCriticalPoint +from opentrons_shared_data.errors.exceptions import ( + GripperNotPresentError, + CommandPreconditionViolated, ) from .gripper import Gripper @@ -23,18 +24,6 @@ MOD_LOG = logging.getLogger(__name__) -class GripError(Exception): - """An error raised if a gripper action is blocked""" - - pass - - -class CalibrationError(Exception): - """An error raised if a gripper calibration is blocked""" - - pass - - class GripperHandler: GH_LOG = MOD_LOG.getChild("GripperHandler") @@ -48,8 +37,8 @@ def has_gripper(self) -> bool: def get_gripper(self) -> Gripper: gripper = self._gripper if not gripper: - raise GripperNotAttachedError( - "Cannot perform action without gripper attached" + raise GripperNotPresentError( + message="Cannot perform action without gripper attached" ) return gripper @@ -94,9 +83,13 @@ def save_instrument_offset(self, delta: Point) -> GripperCalibrationOffset: def get_critical_point(self, cp_override: Optional[CriticalPoint] = None) -> Point: if not self._gripper: - raise GripperNotAttachedError() + raise GripperNotPresentError() if cp_override == CriticalPoint.MOUNT: - raise InvalidMoveError("The gripper mount may not be moved directly.") + raise InvalidCriticalPoint( + cp_override.name, + "gripper", + "The gripper mount may not be moved directly.", + ) return self._gripper.critical_point(cp_override) def get_gripper_dict(self) -> Optional[GripperDict]: @@ -132,11 +125,17 @@ def check_ready_for_calibration(self) -> None: gripper = self.get_gripper() gripper.check_calibration_pin_location_is_accurate() - def check_ready_for_jaw_move(self) -> None: + def check_ready_for_jaw_move(self, command: str) -> None: """Raise an exception if it is not currently valid to move the jaw.""" gripper = self.get_gripper() if gripper.state == GripperJawState.UNHOMED: - raise GripError("Gripper jaw must be homed before moving") + raise CommandPreconditionViolated( + message=f"Cannot {command} gripper jaw before homing", + detail={ + "command": command, + "jaw_state": str(gripper.state), + }, + ) def is_ready_for_idle(self) -> bool: """Gripper can idle when the jaw is not currently gripping.""" diff --git a/api/src/opentrons/hardware_control/instruments/ot3/instrument_calibration.py b/api/src/opentrons/hardware_control/instruments/ot3/instrument_calibration.py index e09a6a65a95..7e7352170b9 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/instrument_calibration.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/instrument_calibration.py @@ -17,12 +17,17 @@ ) from opentrons.calibration_storage import ( types as cal_top_types, - ot3_gripper_offset, + gripper_offset, ) from opentrons.hardware_control.types import OT3Mount PIPETTE_OFFSET_CONSISTENCY_LIMIT: Final = 1.5 +# These type aliases aid typechecking in tests that work the same on this and +# the hardware_control.instruments.ot2 variant +SourceType = cal_top_types.SourceType +CalibrationStatus = cal_top_types.CalibrationStatus + @dataclass class InconsistentPipetteOffsets: @@ -41,8 +46,8 @@ class PipetteOffsetByPipetteMount: """ offset: Point - source: cal_top_types.SourceType - status: cal_top_types.CalibrationStatus + source: SourceType + status: CalibrationStatus last_modified: typing.Optional[datetime] = None @@ -63,8 +68,8 @@ class GripperCalibrationOffset: """ offset: Point - source: cal_top_types.SourceType - status: cal_top_types.CalibrationStatus + source: SourceType + status: CalibrationStatus last_modified: typing.Optional[datetime] = None @@ -74,8 +79,8 @@ def load_pipette_offset( # load default if pipette offset data do not exist pip_cal_obj = PipetteOffsetByPipetteMount( offset=Point(*default_pipette_offset()), - source=cal_top_types.SourceType.default, - status=cal_top_types.CalibrationStatus(), + source=SourceType.default, + status=CalibrationStatus(), ) # TODO this can be removed once we switch to using # ot3 pipette types in the ot3 hardware controller. @@ -90,7 +95,7 @@ def load_pipette_offset( offset=pip_offset_data.offset, last_modified=pip_offset_data.lastModified, source=pip_offset_data.source, - status=cal_top_types.CalibrationStatus( + status=CalibrationStatus( markedAt=pip_offset_data.status.markedAt, markedBad=pip_offset_data.status.markedBad, source=pip_offset_data.status.source, @@ -118,11 +123,11 @@ def load_gripper_calibration_offset( # load default if gripper offset data do not exist grip_cal_obj = GripperCalibrationOffset( offset=Point(*default_gripper_calibration_offset()), - source=cal_top_types.SourceType.default, - status=cal_top_types.CalibrationStatus(), + source=SourceType.default, + status=CalibrationStatus(), ) if gripper_id and ff.enable_ot3_hardware_controller(): - grip_offset_data = ot3_gripper_offset.get_gripper_calibration_offset(gripper_id) + grip_offset_data = gripper_offset.get_gripper_calibration_offset(gripper_id) if grip_offset_data: return GripperCalibrationOffset( offset=grip_offset_data.offset, @@ -141,7 +146,7 @@ def save_gripper_calibration_offset( gripper_id: typing.Optional[str], delta: Point ) -> None: if gripper_id and ff.enable_ot3_hardware_controller(): - ot3_gripper_offset.save_gripper_calibration(delta, gripper_id) + gripper_offset.save_gripper_calibration(delta, gripper_id) def check_instrument_offset_reasonability( diff --git a/api/src/opentrons/hardware_control/instruments/ot3/pipette.py b/api/src/opentrons/hardware_control/instruments/ot3/pipette.py index 7da7c4c5222..2d36460ca69 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/pipette.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/pipette.py @@ -1,18 +1,19 @@ import logging import functools -from typing import Any, List, Dict, Optional, Set, Tuple, Union, cast -from typing_extensions import Final +from typing import Any, Dict, Optional, Set, Tuple, Union, cast from opentrons.types import Point -from opentrons.config import feature_flags as ff from opentrons_shared_data.pipette.pipette_definition import ( PipetteConfigurations, PlungerPositions, MotorConfigurations, SupportedTipsDefinition, - TipHandlingConfigurations, + PickUpTipConfigurations, + PressFitPickUpTipConfiguration, + CamActionPickUpTipConfiguration, + DropTipConfigurations, PlungerHomingConfigurations, PipetteNameType, PipetteModelVersionType, @@ -45,13 +46,11 @@ types as pip_types, ) from opentrons.hardware_control.types import CriticalPoint, OT3Mount -from opentrons.hardware_control.errors import InvalidMoveError +from opentrons.hardware_control.errors import InvalidCriticalPoint +from opentrons.hardware_control import nozzle_manager mod_log = logging.getLogger(__name__) -# TODO (lc 12-2-2022) We should move this to the geometry configurations -INTERNOZZLE_SPACING_MM: Final[float] = 9 - class Pipette(AbstractInstrument[PipetteConfigurations]): """A class to gather and track pipette state and configs. @@ -68,6 +67,7 @@ def __init__( config: PipetteConfigurations, pipette_offset_cal: PipetteOffsetByPipetteMount, pipette_id: Optional[str] = None, + use_old_aspiration_functions: bool = False, ) -> None: self._config = config self._config_as_dict = config.dict() @@ -97,11 +97,14 @@ def __init__( pipette_version=config.version, ) self._nozzle_offset = self._config.nozzle_offset + self._nozzle_manager = ( + nozzle_manager.NozzleConfigurationManager.build_from_config(self._config) + ) self._current_volume = 0.0 self._working_volume = float(self._liquid_class.max_volume) self._current_tip_length = 0.0 + self._has_tip_length: Optional[bool] = None self._current_tiprack_diameter = 0.0 - self._has_tip = False self._pipette_id = pipette_id self._log = mod_log.getChild( self._pipette_id if self._pipette_id else "" @@ -132,7 +135,7 @@ def __init__( self._tip_overlap_lookup = self._liquid_class.tip_overlap_dictionary - if ff.use_old_aspiration_functions(): + if use_old_aspiration_functions: self._pipetting_function_version = PIPETTING_FUNCTION_FALLBACK_VERSION else: self._pipetting_function_version = PIPETTING_FUNCTION_LATEST_VERSION @@ -162,8 +165,12 @@ def tip_overlap(self) -> Dict[str, float]: return self._tip_overlap_lookup @property - def nozzle_offset(self) -> List[float]: - return self._nozzle_offset + def nozzle_offset(self) -> Point: + return self._nozzle_manager.starting_nozzle_offset + + @property + def nozzle_manager(self) -> nozzle_manager.NozzleConfigurationManager: + return self._nozzle_manager @property def pipette_offset(self) -> PipetteOffsetByPipetteMount: @@ -178,13 +185,11 @@ def plunger_motor_current(self) -> MotorConfigurations: return self._plunger_motor_current @property - def pick_up_configurations(self) -> TipHandlingConfigurations: + def pick_up_configurations(self) -> PickUpTipConfigurations: return self._pick_up_configurations @pick_up_configurations.setter - def pick_up_configurations( - self, pick_up_configs: TipHandlingConfigurations - ) -> None: + def pick_up_configurations(self, pick_up_configs: PickUpTipConfigurations) -> None: self._pick_up_configurations = pick_up_configs @property @@ -192,7 +197,7 @@ def plunger_homing_configurations(self) -> PlungerHomingConfigurations: return self._plunger_homing_configurations @property - def drop_configurations(self) -> TipHandlingConfigurations: + def drop_configurations(self) -> DropTipConfigurations: return self._drop_configurations @property @@ -231,8 +236,8 @@ def reset_state(self) -> None: self._current_volume = 0.0 self._working_volume = float(self.liquid_class.max_volume) self._current_tip_length = 0.0 + self._has_tip_length = None self._current_tiprack_diameter = 0.0 - self._has_tip = False self.ready_to_aspirate = False #: True if ready to aspirate self.set_liquid_class_by_name("default") @@ -250,6 +255,9 @@ def reset_state(self) -> None: self._flow_acceleration = self._active_tip_settings.default_flow_acceleration self._tip_overlap_lookup = self.liquid_class.tip_overlap_dictionary + self._nozzle_manager = ( + nozzle_manager.NozzleConfigurationManager.build_from_config(self._config) + ) def reset_pipette_offset(self, mount: OT3Mount, to_default: bool) -> None: """Reset the pipette offset to system defaults.""" @@ -293,75 +301,28 @@ def critical_point(self, cp_override: Optional[CriticalPoint] = None) -> Point: we have a tip, or :py:attr:`CriticalPoint.XY_CENTER` - the specified critical point will be used. """ - instr = Point(*self._pipette_offset.offset) - offsets = self.nozzle_offset - # Temporary solution for the 96 channel critical point locations. - # We should instead record every channel "critical point" in - # the pipette configurations. - X_DIRECTION_VALUE = 1 - Y_DIVISION = 2 - if self.channels == 96: - NUM_ROWS = 12 - NUM_COLS = 8 - X_DIRECTION_VALUE = -1 - elif self.channels == 8: - NUM_ROWS = 1 - NUM_COLS = 8 - else: - NUM_ROWS = 1 - NUM_COLS = 1 - - x_offset_to_right_nozzle = ( - X_DIRECTION_VALUE * INTERNOZZLE_SPACING_MM * (NUM_ROWS - 1) - ) - y_offset_to_front_nozzle = INTERNOZZLE_SPACING_MM * (NUM_COLS - 1) - if cp_override in [ CriticalPoint.GRIPPER_JAW_CENTER, CriticalPoint.GRIPPER_FRONT_CALIBRATION_PIN, CriticalPoint.GRIPPER_REAR_CALIBRATION_PIN, ]: - raise InvalidMoveError( - f"Critical point {cp_override.name} is not valid for a pipette" - ) - if not self.has_tip or cp_override == CriticalPoint.NOZZLE: - cp_type = CriticalPoint.NOZZLE - tip_length = 0.0 - else: - cp_type = CriticalPoint.TIP - tip_length = self.current_tip_length - if cp_override == CriticalPoint.XY_CENTER: - mod_offset_xy = [ - offsets[0] - x_offset_to_right_nozzle / 2, - offsets[1] - y_offset_to_front_nozzle / Y_DIVISION, - offsets[2], - ] - cp_type = CriticalPoint.XY_CENTER - elif cp_override == CriticalPoint.FRONT_NOZZLE: - # front left nozzle of the 96 channel and - # front nozzle of the 8 channel - mod_offset_xy = [ - offsets[0], - offsets[1] - y_offset_to_front_nozzle, - offsets[2], - ] - cp_type = CriticalPoint.FRONT_NOZZLE - else: - mod_offset_xy = list(offsets) - mod_and_tip = Point( - mod_offset_xy[0], mod_offset_xy[1], mod_offset_xy[2] - tip_length - ) + raise InvalidCriticalPoint(cp_override.name, "pipette") - cp = mod_and_tip + instr + instr = Point(*self._pipette_offset.offset) + cp_with_tip_length = self._nozzle_manager.critical_point_with_tip_length( + cp_override, + self.current_tip_length if cp_override != CriticalPoint.NOZZLE else 0.0, + ) + cp = cp_with_tip_length + instr if self._log.isEnabledFor(logging.DEBUG): info_str = "cp: {}{}: {} (from: ".format( - cp_type, " (from override)" if cp_override else "", cp + cp_override, " (from override)" if cp_override else "", cp ) info_str += "model offset: {} + instrument offset: {}".format( - mod_offset_xy, instr + cp_with_tip_length, instr ) - info_str += " - tip_length: {}".format(tip_length) + info_str += " - tip_length: {}".format(self.current_tip_length) info_str += ")" self._log.debug(info_str) @@ -380,6 +341,7 @@ def current_tip_length(self) -> float: @current_tip_length.setter def current_tip_length(self, tip_length: float) -> None: self._current_tip_length = tip_length + self._has_tip_length = True @property def current_tiprack_diameter(self) -> float: @@ -484,6 +446,25 @@ def ok_to_push_out(self, push_out_dist_mm: float) -> bool: self.plunger_positions.blow_out - self.plunger_positions.bottom ) + def update_nozzle_configuration( + self, + back_left_nozzle: str, + front_right_nozzle: str, + starting_nozzle: Optional[str] = None, + ) -> None: + """ + Update nozzle configuration manager. + """ + self._nozzle_manager.update_nozzle_configuration( + back_left_nozzle, front_right_nozzle, starting_nozzle + ) + + def reset_nozzle_configuration(self) -> None: + """ + Reset nozzle configuration manager. + """ + self._nozzle_manager.reset_to_default_configuration() + def add_tip(self, tip_length: float) -> None: """ Add a tip to the pipette for position tracking and validation @@ -494,22 +475,34 @@ def add_tip(self, tip_length: float) -> None: :return: """ assert tip_length > 0.0, "tip_length must be greater than 0" - assert not self.has_tip - self._has_tip = True + assert not self.has_tip_length self._current_tip_length = tip_length + self._has_tip_length = True def remove_tip(self) -> None: """ Remove the tip from the pipette (effectively updates the pipette's critical point) """ - assert self.has_tip - self._has_tip = False self._current_tip_length = 0.0 + self._has_tip_length = False @property def has_tip(self) -> bool: - return self._has_tip + return self.has_tip_length + + @property + def has_tip_length(self) -> bool: + return self.current_tip_length > 0.0 + + @property + def tip_presence_check_dist_mm(self) -> float: + return self._config.tip_presence_check_distance_mm + + @property + def tip_presence_responses(self) -> int: + # TODO: put this in shared-data + return 2 if self.channels > 8 else 1 # Cache max is chosen somewhat arbitrarily. With a float is input we don't # want this to unbounded. @@ -537,7 +530,7 @@ def __str__(self) -> str: return "{} current volume {}ul critical point: {} at {}".format( self._config.display_name, self.current_volume, - "tip end" if self.has_tip else "nozzle end", + "tip end" if self.has_tip_length else "nozzle end", 0, ) @@ -555,7 +548,7 @@ def as_dict(self) -> "Pipette.DictType": "name": self.name, "model": self.model, "pipette_id": self.pipette_id, - "has_tip": self.has_tip, + "has_tip": self.has_tip_length, "working_volume": self.working_volume, "aspirate_flow_rate": self.aspirate_flow_rate, "dispense_flow_rate": self.dispense_flow_rate, @@ -590,11 +583,11 @@ def set_liquid_class_by_name(self, class_name: str) -> None: message=f"Liquid class {class_name} is not valid for {self._config.display_name}", detail={ "requested-class-name": class_name, - "pipette-model": self._pipette_model, + "pipette-model": str(self._pipette_model), }, ) if ( - self.has_tip + self.has_tip_length and self._active_tip_setting_name not in new_class.supported_tips ): raise CommandPreconditionViolated( @@ -606,7 +599,7 @@ def set_liquid_class_by_name(self, class_name: str) -> None: ) self._liquid_class_name = new_name self._liquid_class = new_class - if not self.has_tip: + if not self.has_tip_length: new_tip_class = sorted( [tip for tip in self._liquid_class.supported_tips.keys()], key=lambda tt: tt.value, @@ -665,11 +658,27 @@ def set_tip_type(self, tip_type: pip_types.PipetteTipType) -> None: self._tip_overlap_lookup = self.liquid_class.tip_overlap_dictionary self._working_volume = min(tip_type.value, self.liquid_class.max_volume) + def get_pick_up_configuration_for_tip_count( + self, count: int + ) -> Union[CamActionPickUpTipConfiguration, PressFitPickUpTipConfiguration]: + for config in ( + self._config.pick_up_tip_configurations.press_fit, + self._config.pick_up_tip_configurations.cam_action, + ): + if not config: + continue + if count in config.current_by_tip_count: + return config + raise CommandPreconditionViolated( + message=f"No pick up tip configuration for {count} tips", + ) + def _reload_and_check_skip( new_config: PipetteConfigurations, attached_instr: Pipette, pipette_offset: PipetteOffsetByPipetteMount, + use_old_aspiration_functions: bool, ) -> Tuple[Pipette, bool]: # Once we have determined that the new and attached pipettes # are similar enough that we might skip, see if the configs @@ -688,7 +697,12 @@ def _reload_and_check_skip( changed.add(k) if changed.intersection("quirks"): # Something has changed that requires reconfig - p = Pipette(new_config, pipette_offset, attached_instr._pipette_id) + p = Pipette( + new_config, + pipette_offset, + attached_instr._pipette_id, + use_old_aspiration_functions, + ) p.act_as(attached_instr.acting_as) return p, False # Good to skip, just need to update calibration offset and update_info @@ -702,6 +716,7 @@ def load_from_config_and_check_skip( requested: Optional[PipetteName], serial: Optional[str], pipette_offset: PipetteOffsetByPipetteMount, + use_old_aspiration_functions: bool, ) -> Tuple[Optional[Pipette], bool]: """ Given the pipette config for an attached pipette (if any) freshly read @@ -733,6 +748,7 @@ def load_from_config_and_check_skip( config, attached, pipette_offset, + use_old_aspiration_functions, ) else: # if there is no request, make sure that the old pipette @@ -743,9 +759,13 @@ def load_from_config_and_check_skip( config, attached, pipette_offset, + use_old_aspiration_functions, ) if config: - return Pipette(config, pipette_offset, serial), False + return ( + Pipette(config, pipette_offset, serial, use_old_aspiration_functions), + False, + ) else: return None, False diff --git a/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py b/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py index 1f1b70ac4fa..16b9085392c 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py @@ -2,15 +2,12 @@ from dataclasses import dataclass import logging from typing import ( - Callable, Dict, Optional, Tuple, Any, cast, List, - Sequence, - Iterator, TypeVar, ) from typing_extensions import Final @@ -20,9 +17,13 @@ from opentrons_shared_data.errors.exceptions import ( CommandPreconditionViolated, CommandParameterLimitViolated, + UnexpectedTipRemovalError, + UnexpectedTipAttachError, ) from opentrons_shared_data.pipette.pipette_definition import ( liquid_class_for_volume_between_default_and_defaultlowvolume, + PressFitPickUpTipConfiguration, + CamActionPickUpTipConfiguration, ) from opentrons import types as top_types @@ -32,10 +33,6 @@ Axis, OT3Mount, ) -from opentrons.hardware_control.errors import ( - TipAttachedError, - NoTipAttachedError, -) from opentrons.hardware_control.constants import ( SHAKE_OFF_TIPS_SPEED, SHAKE_OFF_TIPS_PICKUP_DISTANCE, @@ -74,59 +71,21 @@ class LiquidActionSpec: current: float -# TODO during refactor we should figure out if -# we still need these dataclasses - - -@dataclass(frozen=True) -class PickUpTipPressSpec: - relative_down: top_types.Point - relative_up: top_types.Point - current: Dict[Axis, float] - speed: float - - @dataclass(frozen=True) -class TipMotorPickUpTipSpec: - tiprack_down: top_types.Point - tiprack_up: top_types.Point - pick_up_distance: float - speed: float - currents: Dict[Axis, float] - # FIXME we should throw this in a config - # file of some sort - home_buffer: float = 0 +class TipActionMoveSpec: + distance: float + currents: Optional[Dict[Axis, float]] + speed: Optional[ + float + ] # allow speed for a movement to default to its axes' speed settings @dataclass(frozen=True) -class PickUpTipSpec: - plunger_prep_pos: float - plunger_currents: Dict[Axis, float] - presses: List[PickUpTipPressSpec] - shake_off_list: List[Tuple[top_types.Point, Optional[float]]] - retract_target: float - pick_up_motor_actions: Optional[TipMotorPickUpTipSpec] - - -@dataclass(frozen=True) -class DropTipMove: - target_position: float - current: Dict[Axis, float] - speed: Optional[float] - home_after: bool = False - home_after_safety_margin: float = 0 - home_axes: Sequence[Axis] = tuple() - is_ht_tip_action: bool = False - # FIXME we should throw this in a config - # file of some sort - home_buffer: float = 0 - - -@dataclass(frozen=True) -class DropTipSpec: - drop_moves: List[DropTipMove] - shake_moves: List[Tuple[top_types.Point, Optional[float]]] - ending_current: Dict[Axis, float] +class TipActionSpec: + tip_action_moves: List[TipActionMoveSpec] + shake_off_moves: List[Tuple[top_types.Point, Optional[float]]] + z_distance_to_tiprack: Optional[float] = None + ending_z_retract_distance: Optional[float] = None class OT3PipetteHandler: @@ -284,6 +243,7 @@ def get_attached_instrument(self, mount: OT3Mount) -> PipetteDict: for key in configs: result[key] = instr_dict[key] + result["current_nozzle_map"] = instr.nozzle_manager.current_configuration result["min_volume"] = instr.liquid_class.min_volume result["max_volume"] = instr.liquid_class.max_volume result["channels"] = instr._max_channels @@ -441,6 +401,24 @@ async def reset(self) -> None: k: None for k in self._attached_instruments.keys() } + async def update_nozzle_configuration( + self, + mount: MountType, + back_left_nozzle: str, + front_right_nozzle: str, + starting_nozzle: Optional[str] = None, + ) -> None: + instr = self._attached_instruments[OT3Mount.from_mount(mount)] + if instr: + instr.update_nozzle_configuration( + back_left_nozzle, front_right_nozzle, starting_nozzle + ) + + async def reset_nozzle_configuration(self, mount: OT3Mount) -> None: + instr = self._attached_instruments[OT3Mount.from_mount(mount)] + if instr: + instr.reset_nozzle_configuration() + async def add_tip(self, mount: OT3Mount, tip_length: float) -> None: instr = self._attached_instruments[mount] attached = self.attached_instruments @@ -487,9 +465,11 @@ def critical_point_for( else: return top_types.Point(0, 0, 0) - def ready_for_tip_action(self, target: Pipette, action: HardwareAction) -> None: + def ready_for_tip_action( + self, target: Pipette, action: HardwareAction, mount: OT3Mount + ) -> None: if not target.has_tip: - raise NoTipAttachedError(f"Cannot perform {action} without a tip attached") + raise UnexpectedTipRemovalError(str(action), target.name, mount.name) if ( action == HardwareAction.ASPIRATE and target.current_volume == 0 @@ -545,7 +525,7 @@ def plan_check_aspirate( - Plunger distances (possibly calling an overridden plunger_volume) """ instrument = self.get_pipette(mount) - self.ready_for_tip_action(instrument, HardwareAction.ASPIRATE) + self.ready_for_tip_action(instrument, HardwareAction.ASPIRATE, mount) if volume is None: self._ihp_log.debug( "No aspirate volume defined. Aspirating up to " @@ -606,7 +586,7 @@ def plan_check_dispense( """ instrument = self.get_pipette(mount) - self.ready_for_tip_action(instrument, HardwareAction.DISPENSE) + self.ready_for_tip_action(instrument, HardwareAction.DISPENSE, mount) if volume is None: disp_vol = instrument.current_volume @@ -617,7 +597,12 @@ def plan_check_dispense( else: disp_vol = volume - # Ensure we don't dispense more than the current volume + # Ensure we don't dispense more than the current volume. + # + # This clamping is inconsistent with plan_check_aspirate(), which asserts + # that its input is in bounds instead of clamping it. This is to match a quirk + # of the OT-2 version of this class. Protocol Engine does its own clamping, + # so we don't expect this to trigger in practice. disp_vol = min(instrument.current_volume, disp_vol) is_full_dispense = numpy.isclose(instrument.current_volume - disp_vol, 0) @@ -635,7 +620,7 @@ def plan_check_dispense( message="Cannot push_out on a dispense that does not leave the pipette empty", detail={ "command": "dispense", - "remaining-volume": instrument.current_volume - disp_vol, + "remaining-volume": str(instrument.current_volume - disp_vol), }, ) push_out_ul = 0 @@ -674,7 +659,6 @@ def plan_check_blow_out( ) -> LiquidActionSpec: """Check preconditions and calculate values for blowout.""" instrument = self.get_pipette(mount) - self.ready_for_tip_action(instrument, HardwareAction.BLOWOUT) speed = self.plunger_speed(instrument, instrument.blow_out_flow_rate, "blowout") acceleration = self.plunger_acceleration( instrument, instrument.flow_acceleration @@ -705,6 +689,34 @@ def plan_check_blow_out( current=instrument.plunger_motor_current.run, ) + @staticmethod + def _build_tip_motor_moves( + prep_move_dist: float, + clamp_move_dist: float, + prep_move_speed: float, + clamp_move_speed: float, + tip_motor_current: float, + plunger_current: float, + ) -> List[TipActionMoveSpec]: + return [ + TipActionMoveSpec( + distance=prep_move_dist, + speed=prep_move_speed, + currents={ + Axis.P_L: plunger_current, + Axis.Q: tip_motor_current, + }, + ), + TipActionMoveSpec( + distance=prep_move_dist + clamp_move_dist, + speed=clamp_move_speed, + currents={ + Axis.P_L: plunger_current, + Axis.Q: tip_motor_current, + }, + ), + ] + @staticmethod def _build_pickup_shakes( instrument: Pipette, @@ -724,100 +736,99 @@ def build_one_shake() -> List[Tuple[top_types.Point, Optional[float]]]: return [] - def plan_check_pick_up_tip( + def plan_ht_pick_up_tip(self, tip_count: int) -> TipActionSpec: + # Prechecks: ready for pickup tip and press/increment are valid + mount = OT3Mount.LEFT + instrument = self.get_pipette(mount) + if instrument.has_tip: + raise UnexpectedTipAttachError("pick_up_tip", instrument.name, mount.name) + self._ihp_log.debug(f"Picking up tip on {mount.name}") + + pick_up_config = instrument.get_pick_up_configuration_for_tip_count(tip_count) + if not isinstance(pick_up_config, CamActionPickUpTipConfiguration): + raise CommandPreconditionViolated( + f"Low-throughput pick up tip got wrong config for {instrument.name} on {mount.name}" + ) + + tip_motor_moves = self._build_tip_motor_moves( + prep_move_dist=pick_up_config.prep_move_distance, + clamp_move_dist=pick_up_config.distance, + prep_move_speed=pick_up_config.prep_move_speed, + clamp_move_speed=pick_up_config.speed, + plunger_current=instrument.plunger_motor_current.run, + tip_motor_current=pick_up_config.current_by_tip_count[tip_count], + ) + + return TipActionSpec( + tip_action_moves=tip_motor_moves, + shake_off_moves=[], + z_distance_to_tiprack=(-1 * pick_up_config.connect_tiprack_distance_mm), + ending_z_retract_distance=instrument.config.end_tip_action_retract_distance_mm, + ) + + def plan_lt_pick_up_tip( self, mount: OT3Mount, - tip_length: float, + tip_count: int, presses: Optional[int], increment: Optional[float], - ) -> Tuple[PickUpTipSpec, Callable[[], None]]: + ) -> TipActionSpec: # Prechecks: ready for pickup tip and press/increment are valid instrument = self.get_pipette(mount) if instrument.has_tip: - raise TipAttachedError("Cannot pick up tip with a tip attached") + raise UnexpectedTipAttachError("pick_up_tip", instrument.name, mount.name) self._ihp_log.debug(f"Picking up tip on {mount.name}") - def add_tip_to_instr() -> None: - instrument.add_tip(tip_length=tip_length) - instrument.set_current_volume(0) - + pick_up_config = instrument.get_pick_up_configuration_for_tip_count(tip_count) + if not isinstance(pick_up_config, PressFitPickUpTipConfiguration): + raise CommandPreconditionViolated( + f"Low-throughput pick up tip got wrong config for {instrument.name} on {mount.name}" + ) if presses is None or presses < 0: - checked_presses = instrument.pick_up_configurations.presses + checked_presses = pick_up_config.presses else: checked_presses = presses if not increment or increment < 0: - check_incr = instrument.pick_up_configurations.increment + check_incr = pick_up_config.increment else: check_incr = increment - pick_up_speed = instrument.pick_up_configurations.speed + pick_up_speed = pick_up_config.speed - def build_presses() -> Iterator[Tuple[float, float]]: + def build_presses() -> List[TipActionMoveSpec]: # Press the nozzle into the tip number of times, # moving further by mm after each press + press_moves = [] for i in range(checked_presses): # move nozzle down into the tip - press_dist = ( - -1.0 * instrument.pick_up_configurations.distance - + -1.0 * check_incr * i + press_dist = -1.0 * pick_up_config.distance + -1.0 * check_incr * i + press_moves.append( + TipActionMoveSpec( + distance=press_dist, + speed=pick_up_speed, + currents={ + Axis.by_mount(mount): pick_up_config.current_by_tip_count[ + tip_count + ] + }, + ) ) # move nozzle back up backup_dist = -press_dist - yield (press_dist, backup_dist) - - if instrument.channels == 96: - return ( - PickUpTipSpec( - plunger_prep_pos=instrument.plunger_positions.bottom, - plunger_currents={ - Axis.of_main_tool_actuator( - mount - ): instrument.plunger_motor_current.run, - }, - presses=[], - shake_off_list=[], - retract_target=instrument.pick_up_configurations.distance, - pick_up_motor_actions=TipMotorPickUpTipSpec( - # Move onto the posts - tiprack_down=top_types.Point(0, 0, -7), - tiprack_up=top_types.Point(0, 0, 2), - pick_up_distance=instrument.pick_up_configurations.distance, - speed=instrument.pick_up_configurations.speed, - currents={Axis.Q: instrument.pick_up_configurations.current}, - home_buffer=10, - ), - ), - add_tip_to_instr, - ) - return ( - PickUpTipSpec( - plunger_prep_pos=instrument.plunger_positions.bottom, - plunger_currents={ - Axis.of_main_tool_actuator( - mount - ): instrument.plunger_motor_current.run - }, - presses=[ - PickUpTipPressSpec( - current={ - Axis.by_mount( - mount - ): instrument.pick_up_configurations.current - }, + press_moves.append( + TipActionMoveSpec( + distance=backup_dist, speed=pick_up_speed, - relative_down=top_types.Point(0, 0, press_dist), - relative_up=top_types.Point(0, 0, backup_dist), + currents=None, ) - for press_dist, backup_dist in build_presses() - ], - shake_off_list=self._build_pickup_shakes(instrument), - retract_target=instrument.pick_up_configurations.distance - + check_incr * checked_presses - + 2, - pick_up_motor_actions=None, - ), - add_tip_to_instr, + ) + return press_moves + + return TipActionSpec( + tip_action_moves=build_presses(), + shake_off_moves=self._build_pickup_shakes(instrument), + ending_z_retract_distance=instrument.config.end_tip_action_retract_distance_mm, ) @staticmethod @@ -840,90 +851,61 @@ def _shake_off_tips_drop( (top_types.Point(0, 0, DROP_TIP_RELEASE_DISTANCE), None), # top ] - def _droptip_sequence_builder( - self, - bottom_pos: float, - droptip_pos: float, - plunger_currents: Dict[Axis, float], - drop_tip_currents: Dict[Axis, float], - speed: float, - home_after: bool, - home_axes: Sequence[Axis], - is_ht_pipette: bool = False, - ) -> Callable[[], List[DropTipMove]]: - def build() -> List[DropTipMove]: - base = [ - DropTipMove( - target_position=bottom_pos, current=plunger_currents, speed=None - ), - DropTipMove( - target_position=droptip_pos, - current=drop_tip_currents, - speed=speed, - home_after=home_after, - home_after_safety_margin=abs(bottom_pos - droptip_pos), - home_axes=home_axes, - is_ht_tip_action=is_ht_pipette, - home_buffer=10 if is_ht_pipette else 0, - ), - DropTipMove( # always finish drop-tip at a known safe plunger position - target_position=bottom_pos, current=plunger_currents, speed=None - ), - ] - return base - - return build - - def plan_check_drop_tip( + def plan_lt_drop_tip( self, mount: OT3Mount, - home_after: bool, - ) -> Tuple[DropTipSpec, Callable[[], None]]: + ) -> TipActionSpec: instrument = self.get_pipette(mount) - self.ready_for_tip_action(instrument, HardwareAction.DROPTIP) - - is_96_chan = instrument.channels == 96 + config = instrument.drop_configurations.plunger_eject + if not config: + raise CommandPreconditionViolated( + f"No plunger-eject drop tip configurations for {instrument.name} on {mount.name}" + ) + drop_seq = [ + TipActionMoveSpec( + distance=instrument.plunger_positions.drop_tip, + speed=config.speed, + currents={ + Axis.of_main_tool_actuator(mount): config.current, + }, + ), + TipActionMoveSpec( + distance=instrument.plunger_positions.bottom, + speed=None, + currents={ + Axis.of_main_tool_actuator( + mount + ): instrument.plunger_motor_current.run, + }, + ), + ] - bottom = instrument.plunger_positions.bottom - droptip = ( - instrument.drop_configurations.distance - if is_96_chan - else instrument.plunger_positions.drop_tip + return TipActionSpec( + tip_action_moves=drop_seq, + shake_off_moves=[], ) - speed = instrument.drop_configurations.speed - shakes: List[Tuple[top_types.Point, Optional[float]]] = [] - def _remove_tips() -> None: - instrument.set_current_volume(0) - instrument.current_tiprack_diameter = 0.0 - instrument.remove_tip() + def plan_ht_drop_tip(self) -> TipActionSpec: + mount = OT3Mount.LEFT + instrument = self.get_pipette(mount) + config = instrument.drop_configurations.cam_action + if not config: + raise CommandPreconditionViolated( + f"No cam-action drop tip configurations for {instrument.name} on {mount.name}" + ) - drop_tip_current_axis = ( - Axis.Q if is_96_chan else Axis.of_main_tool_actuator(mount) - ) - seq_builder_ot3 = self._droptip_sequence_builder( - bottom, - droptip, - {Axis.of_main_tool_actuator(mount): instrument.plunger_motor_current.run}, - {drop_tip_current_axis: instrument.drop_configurations.current}, - speed, - home_after, - (Axis.of_main_tool_actuator(mount),), - is_96_chan, + drop_seq = self._build_tip_motor_moves( + prep_move_dist=config.prep_move_distance, + clamp_move_dist=config.distance, + prep_move_speed=config.prep_move_speed, + clamp_move_speed=config.speed, + plunger_current=instrument.plunger_motor_current.run, + tip_motor_current=config.current, ) - seq_ot3 = seq_builder_ot3() - return ( - DropTipSpec( - drop_moves=seq_ot3, - shake_moves=shakes, - ending_current={ - Axis.of_main_tool_actuator( - mount - ): instrument.plunger_motor_current.run - }, - ), - _remove_tips, + return TipActionSpec( + tip_action_moves=drop_seq, + shake_off_moves=[], ) def has_pipette(self, mount: OT3Mount) -> bool: @@ -952,3 +934,8 @@ async def configure_for_volume(self, mount: OT3Mount, volume: float) -> None: pip.config.liquid_properties, ) pip.set_liquid_class_by_name(new_class_name.name) + + def get_tip_sensor_count(self, mount: OT3Mount) -> int: + if not self.has_pipette(mount): + return 0 + return self.get_pipette(mount).tip_presence_responses diff --git a/api/src/opentrons/hardware_control/module_control.py b/api/src/opentrons/hardware_control/module_control.py index 20b8017a262..ee64b82dd9e 100644 --- a/api/src/opentrons/hardware_control/module_control.py +++ b/api/src/opentrons/hardware_control/module_control.py @@ -26,7 +26,13 @@ log = logging.getLogger(__name__) -MODULE_PORT_REGEX = re.compile("|".join(modules.MODULE_TYPE_BY_NAME.keys()), re.I) +MODULE_PORT_REGEX = re.compile( + # capture all modules by name using alternation + "(" + "|".join(modules.MODULE_TYPE_BY_NAME.keys()) + ")" + # add a negative lookahead to suppress matches on tempfiles udev creates + + r"\d+(?!\.tmp-c\d+:\d+)", + re.I, +) class AttachedModulesControl: @@ -183,7 +189,7 @@ def get_module_at_port(port: str) -> Optional[modules.ModuleAtPort]: """ match = MODULE_PORT_REGEX.search(port) if match: - name = match.group().lower() + name = match.group(1).lower() if name not in modules.MODULE_TYPE_BY_NAME: log.warning(f"Unexpected module connected: {name} on {port}") return None @@ -205,10 +211,10 @@ async def handle_module_appearance(self, event: AionotifyEvent) -> None: new_modules = None removed_modules = None if maybe_module_at_port is not None: - if hasattr(event.flags, "DELETE"): + if hasattr(event.flags, "DELETE") or hasattr(event.flags, "MOVED_FROM"): removed_modules = [maybe_module_at_port] log.info(f"Module Removed: {maybe_module_at_port}") - elif hasattr(event.flags, "CREATE"): + elif hasattr(event.flags, "CREATE") or hasattr(event.flags, "MOVED_TO"): new_modules = [maybe_module_at_port] log.info(f"Module Added: {maybe_module_at_port}") try: @@ -231,10 +237,10 @@ def get_module_by_module_id( return found_module def load_module_offset( - self, module_type: ModuleType, module_id: str, slot: Optional[str] = None - ) -> ModuleCalibrationOffset: + self, module_type: ModuleType, module_id: str + ) -> Optional[ModuleCalibrationOffset]: log.info(f"Loading module offset for {module_type} {module_id}") - return load_module_calibration_offset(module_type, module_id, slot) + return load_module_calibration_offset(module_type, module_id) def save_module_offset( self, @@ -244,9 +250,9 @@ def save_module_offset( slot: str, offset: Point, instrument_id: Optional[str] = None, - ) -> ModuleCalibrationOffset: + ) -> Optional[ModuleCalibrationOffset]: log.info(f"Saving module {module} {module_id} offset: {offset} for slot {slot}") save_module_calibration_offset( offset, mount, slot, module, module_id, instrument_id ) - return load_module_calibration_offset(module, module_id, slot) + return load_module_calibration_offset(module, module_id) diff --git a/api/src/opentrons/hardware_control/modules/module_calibration.py b/api/src/opentrons/hardware_control/modules/module_calibration.py index 9fcafd28e08..3976a6c8816 100644 --- a/api/src/opentrons/hardware_control/modules/module_calibration.py +++ b/api/src/opentrons/hardware_control/modules/module_calibration.py @@ -9,7 +9,6 @@ save_module_calibration, ) from opentrons.calibration_storage.types import SourceType -from opentrons.config.robot_configs import default_module_calibration_offset from opentrons.hardware_control.modules.types import ModuleType from opentrons.hardware_control.types import OT3Mount @@ -26,7 +25,7 @@ class ModuleCalibrationOffset: module: ModuleType source: SourceType status: CalibrationStatus - slot: Optional[str] = None + slot: str mount: Optional[OT3Mount] = None instrument_id: Optional[str] = None last_modified: Optional[datetime] = None @@ -35,37 +34,26 @@ class ModuleCalibrationOffset: def load_module_calibration_offset( module_type: ModuleType, module_id: str, - slot: Optional[str] = None, -) -> ModuleCalibrationOffset: +) -> Optional[ModuleCalibrationOffset]: """Loads the calibration offset for a module.""" - # load default if module offset data do not exist - module_cal_obj = ModuleCalibrationOffset( - slot=slot, - offset=Point(*default_module_calibration_offset()), + module_offset_data = get_module_offset(module_type, module_id) + if not module_offset_data: + return None + return ModuleCalibrationOffset( module=module_type, module_id=module_id, - source=SourceType.default, - status=CalibrationStatus(), + slot=module_offset_data.slot, + mount=module_offset_data.mount, + offset=module_offset_data.offset, + last_modified=module_offset_data.lastModified, + instrument_id=module_offset_data.instrument_id, + source=module_offset_data.source, + status=CalibrationStatus( + markedAt=module_offset_data.status.markedAt, + markedBad=module_offset_data.status.markedBad, + source=module_offset_data.status.source, + ), ) - if module_id: - module_offset_data = get_module_offset(module_type, module_id) - if module_offset_data: - return ModuleCalibrationOffset( - module=module_type, - module_id=module_id, - slot=module_offset_data.slot, - mount=module_offset_data.mount, - offset=module_offset_data.offset, - last_modified=module_offset_data.lastModified, - instrument_id=module_offset_data.instrument_id, - source=module_offset_data.source, - status=CalibrationStatus( - markedAt=module_offset_data.status.markedAt, - markedBad=module_offset_data.status.markedBad, - source=module_offset_data.status.source, - ), - ) - return module_cal_obj def save_module_calibration_offset( @@ -77,8 +65,7 @@ def save_module_calibration_offset( instrument_id: Optional[str] = None, ) -> None: """Save the calibration offset for a given module.""" - if module_id: - save_module_calibration(offset, mount, slot, module, module_id, instrument_id) + save_module_calibration(offset, mount, slot, module, module_id, instrument_id) def load_all_module_calibrations() -> List[ModuleCalibrationOffset]: diff --git a/api/src/opentrons/hardware_control/nozzle_manager.py b/api/src/opentrons/hardware_control/nozzle_manager.py new file mode 100644 index 00000000000..499ddf4c0f6 --- /dev/null +++ b/api/src/opentrons/hardware_control/nozzle_manager.py @@ -0,0 +1,392 @@ +from typing import Dict, List, Optional, Any, Sequence, Iterator, Tuple, cast +from dataclasses import dataclass +from collections import OrderedDict +from enum import Enum +from itertools import chain + +from opentrons.hardware_control.types import CriticalPoint +from opentrons.types import Point +from opentrons_shared_data.pipette.pipette_definition import ( + PipetteGeometryDefinition, + PipetteRowDefinition, +) +from opentrons_shared_data.errors import ErrorCodes, GeneralError, PythonException + + +def _nozzle_names_by_row(rows: List[PipetteRowDefinition]) -> Iterator[str]: + for row in rows: + for nozzle in row.ordered_nozzles: + yield nozzle + + +def _row_or_col_index_for_nozzle( + row_or_col: "OrderedDict[str, List[str]]", nozzle: str +) -> int: + for index, row_or_col_contents in enumerate(row_or_col.values()): + if nozzle in row_or_col_contents: + return index + raise KeyError(nozzle) + + +def _row_col_indices_for_nozzle( + rows: "OrderedDict[str, List[str]]", + cols: "OrderedDict[str, List[str]]", + nozzle: str, +) -> Tuple[int, int]: + return _row_or_col_index_for_nozzle(rows, nozzle), _row_or_col_index_for_nozzle( + cols, nozzle + ) + + +class NozzleConfigurationType(Enum): + """ + Nozzle Configuration Type. + + Represents the current nozzle + configuration stored in NozzleMap + """ + + COLUMN = "COLUMN" + ROW = "ROW" + SINGLE = "SINGLE" + FULL = "FULL" + SUBRECT = "SUBRECT" + + @classmethod + def determine_nozzle_configuration( + cls, + physical_rows: "OrderedDict[str, List[str]]", + current_rows: "OrderedDict[str, List[str]]", + physical_cols: "OrderedDict[str, List[str]]", + current_cols: "OrderedDict[str, List[str]]", + ) -> "NozzleConfigurationType": + """ + Determine the nozzle configuration based on the starting and + ending nozzle. + """ + if physical_rows == current_rows and physical_cols == current_cols: + return NozzleConfigurationType.FULL + if len(current_rows) == 1 and len(current_cols) == 1: + return NozzleConfigurationType.SINGLE + if len(current_rows) == 1: + return NozzleConfigurationType.ROW + if len(current_cols) == 1: + return NozzleConfigurationType.COLUMN + return NozzleConfigurationType.SUBRECT + + +@dataclass +class NozzleMap: + """ + A NozzleMap instance represents a specific configuration of active nozzles on a pipette. + + It exposes properties of the configuration like the configuration's front-right, front-left, + back-left and starting nozzles as well as a map of all the nozzles active in the configuration. + + Because NozzleMaps represent configurations directly, the properties of the NozzleMap may not + match the properties of the physical pipette. For instance, a NozzleMap for a single channel + configuration of an 8-channel pipette - say, A1 only - will have its front left, front right, + and active channels all be A1, while the physical configuration would have the front right + channel be H1. + """ + + starting_nozzle: str + #: The nozzle that automated operations that count nozzles should start at + # these are really ordered dicts but you can't say that even in quotes because pydantic needs to + # evaluate them to generate serdes code so please only use ordered dicts here + map_store: Dict[str, Point] + #: A map of all of the nozzles active in this configuration + rows: Dict[str, List[str]] + #: A map of all the rows active in this configuration + columns: Dict[str, List[str]] + #: A map of all the columns active in this configuration + configuration: NozzleConfigurationType + #: The kind of configuration this is + + full_instrument_map_store: Dict[str, Point] + #: A map of all of the nozzles of an instrument + full_instrument_rows: Dict[str, List[str]] + #: A map of all the rows of an instrument + + def __str__(self) -> str: + return f"back_left_nozzle: {self.back_left} front_right_nozzle: {self.front_right} configuration: {self.configuration}" + + @property + def back_left(self) -> str: + """The backest, leftest (i.e. back if it's a column, left if it's a row) nozzle of the configuration. + + Note: This is the value relevant for this particular configuration, and it may not represent the back left nozzle + of the underlying physical pipette. For instance, the back-left nozzle of a configuration representing nozzles + D7 to H12 of a 96-channel pipette is D7, which is not the back-left nozzle of the physical pipette (A1). + """ + return next(iter(self.rows.values()))[0] + + @property + def front_right(self) -> str: + """The frontest, rightest (i.e. front if it's a column, right if it's a row) nozzle of the configuration. + + Note: This is the value relevant for this configuration, not the physical pipette. See the note on back_left. + """ + return next(reversed(list(self.rows.values())))[-1] + + @property + def full_instrument_back_left(self) -> str: + """The backest, leftest (i.e. back if it's a column, left if it's a row) nozzle of the full instrument. + + Note: This value represents the back left nozzle of the underlying physical pipette. For instance, + the back-left nozzle of a 96-Channel pipette is A1. + """ + return next(iter(self.full_instrument_rows.values()))[0] + + @property + def full_instrument_front_right(self) -> str: + """The frontest, rightest (i.e. front if it's a column, right if it's a row) nozzle of the full instrument. + + Note: This value represents the front right nozzle of the physical pipette. See the note on full_instrument_back_left. + """ + return next(reversed(list(self.full_instrument_rows.values())))[-1] + + @property + def starting_nozzle_offset(self) -> Point: + """The position of the starting nozzle.""" + return self.map_store[self.starting_nozzle] + + @property + def xy_center_offset(self) -> Point: + """The position of the geometrical center of all nozzles in the configuration. + + Note: This is the value relevant for this configuration, not the physical pipette. See the note on back_left. + """ + difference = self.map_store[self.front_right] - self.map_store[self.back_left] + return self.map_store[self.back_left] + Point( + difference[0] / 2, difference[1] / 2, 0 + ) + + @property + def instrument_xy_center_offset(self) -> Point: + """The position of the geometrical center of all nozzles for the entire instrument. + + Note: This the value reflects the center of the maximum number of nozzles of the physical pipette. + This would be the same as a full configuration. + """ + difference = ( + self.full_instrument_map_store[self.full_instrument_front_right] + - self.full_instrument_map_store[self.full_instrument_back_left] + ) + return self.full_instrument_map_store[self.full_instrument_back_left] + Point( + difference[0] / 2, difference[1] / 2, 0 + ) + + @property + def y_center_offset(self) -> Point: + """The position in the center of the primary column of the map.""" + front_left = next(reversed(list(self.rows.values())))[0] + difference = self.map_store[front_left] - self.map_store[self.back_left] + return self.map_store[self.back_left] + Point(0, difference[1] / 2, 0) + + @property + def front_nozzle_offset(self) -> Point: + """The offset for the front_left nozzle.""" + # front left-most nozzle of the 96 channel in a given configuration + # and front nozzle of the 8 channel + front_left = next(iter(self.columns.values()))[-1] + return self.map_store[front_left] + + @property + def front_right_nozzle_offset(self) -> Point: + """The offset for the front_right nozzle.""" + # Front-right-most nozzle of the 96 channel in a given configuration + # and Front-most nozzle of the 8-channel + return self.map_store[self.front_right] + + @property + def back_left_nozzle_offset(self) -> Point: + """The offset for the back_left nozzle.""" + # Back-left-most nozzle of the 96-channel in a given configuration + # and back-most nozzle of the 8-channel + return self.map_store[self.back_left] + + @property + def tip_count(self) -> int: + """The total number of active nozzles in the configuration, and thus the number of tips that will be picked up.""" + return len(self.map_store) + + @classmethod + def build( + cls, + physical_nozzles: "OrderedDict[str, Point]", + physical_rows: "OrderedDict[str, List[str]]", + physical_columns: "OrderedDict[str, List[str]]", + starting_nozzle: str, + back_left_nozzle: str, + front_right_nozzle: str, + ) -> "NozzleMap": + try: + back_left_row_index, back_left_column_index = _row_col_indices_for_nozzle( + physical_rows, physical_columns, back_left_nozzle + ) + except KeyError as e: + raise IncompatibleNozzleConfiguration( + message=f"No entry for back left nozzle {e} in pipette", + wrapping=[PythonException(e)], + ) from e + try: + ( + front_right_row_index, + front_right_column_index, + ) = _row_col_indices_for_nozzle( + physical_rows, physical_columns, front_right_nozzle + ) + except KeyError as e: + raise IncompatibleNozzleConfiguration( + message=f"No entry for front right nozzle {e} in pipette", + wrapping=[PythonException(e)], + ) from e + + correct_rows_with_all_columns = list(physical_rows.items())[ + back_left_row_index : front_right_row_index + 1 + ] + correct_rows = [ + ( + row_name, + row_entries[back_left_column_index : front_right_column_index + 1], + ) + for row_name, row_entries in correct_rows_with_all_columns + ] + rows = OrderedDict(correct_rows) + correct_columns_with_all_rows = list(physical_columns.items())[ + back_left_column_index : front_right_column_index + 1 + ] + correct_columns = [ + (col_name, col_entries[back_left_row_index : front_right_row_index + 1]) + for col_name, col_entries in correct_columns_with_all_rows + ] + columns = OrderedDict(correct_columns) + + map_store = OrderedDict( + (nozzle, physical_nozzles[nozzle]) for nozzle in chain(*rows.values()) + ) + + return cls( + starting_nozzle=starting_nozzle, + map_store=map_store, + rows=rows, + full_instrument_map_store=physical_nozzles, + full_instrument_rows=physical_rows, + columns=columns, + configuration=NozzleConfigurationType.determine_nozzle_configuration( + physical_rows, rows, physical_columns, columns + ), + ) + + +class IncompatibleNozzleConfiguration(GeneralError): + """Error raised if nozzle configuration is incompatible with the currently loaded pipette.""" + + def __init__( + self, + message: Optional[str] = None, + detail: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[GeneralError]] = None, + ) -> None: + """Build a IncompatibleNozzleConfiguration error.""" + super().__init__( + code=ErrorCodes.API_MISCONFIGURATION, + message=message, + detail=detail, + wrapping=wrapping, + ) + + +class NozzleConfigurationManager: + def __init__( + self, + nozzle_map: NozzleMap, + ) -> None: + self._physical_nozzle_map = nozzle_map + self._current_nozzle_configuration = nozzle_map + + @classmethod + def build_from_config( + cls, pipette_geometry: PipetteGeometryDefinition + ) -> "NozzleConfigurationManager": + sorted_nozzle_map = OrderedDict( + ( + (k, Point(*pipette_geometry.nozzle_map[k])) + for k in _nozzle_names_by_row(pipette_geometry.ordered_rows) + ) + ) + sorted_rows = OrderedDict( + (entry.key, entry.ordered_nozzles) + for entry in pipette_geometry.ordered_rows + ) + sorted_cols = OrderedDict( + (entry.key, entry.ordered_nozzles) + for entry in pipette_geometry.ordered_columns + ) + back_left = next(iter(sorted_rows.values()))[0] + front_right = next(reversed(list(sorted_rows.values())))[-1] + starting_nozzle_config = NozzleMap.build( + physical_nozzles=sorted_nozzle_map, + physical_rows=sorted_rows, + physical_columns=sorted_cols, + starting_nozzle=back_left, + back_left_nozzle=back_left, + front_right_nozzle=front_right, + ) + return cls(starting_nozzle_config) + + @property + def starting_nozzle_offset(self) -> Point: + return self._current_nozzle_configuration.starting_nozzle_offset + + @property + def current_configuration(self) -> NozzleMap: + return self._current_nozzle_configuration + + def reset_to_default_configuration(self) -> None: + self._current_nozzle_configuration = self._physical_nozzle_map + + def update_nozzle_configuration( + self, + back_left_nozzle: str, + front_right_nozzle: str, + starting_nozzle: Optional[str] = None, + ) -> None: + self._current_nozzle_configuration = NozzleMap.build( + # these casts are because of pydantic in the protocol engine (see above) + physical_nozzles=cast( + "OrderedDict[str, Point]", self._physical_nozzle_map.map_store + ), + physical_rows=cast( + "OrderedDict[str, List[str]]", self._physical_nozzle_map.rows + ), + physical_columns=cast( + "OrderedDict[str, List[str]]", self._physical_nozzle_map.columns + ), + starting_nozzle=starting_nozzle or back_left_nozzle, + back_left_nozzle=back_left_nozzle, + front_right_nozzle=front_right_nozzle, + ) + + def get_tip_count(self) -> int: + return self._current_nozzle_configuration.tip_count + + def critical_point_with_tip_length( + self, + cp_override: Optional[CriticalPoint], + tip_length: float = 0.0, + ) -> Point: + if cp_override == CriticalPoint.INSTRUMENT_XY_CENTER: + current_nozzle = ( + self._current_nozzle_configuration.instrument_xy_center_offset + ) + elif cp_override == CriticalPoint.XY_CENTER: + current_nozzle = self._current_nozzle_configuration.xy_center_offset + elif cp_override == CriticalPoint.Y_CENTER: + current_nozzle = self._current_nozzle_configuration.y_center_offset + elif cp_override == CriticalPoint.FRONT_NOZZLE: + current_nozzle = self._current_nozzle_configuration.front_nozzle_offset + else: + current_nozzle = self.starting_nozzle_offset + return current_nozzle - Point(0, 0, tip_length) diff --git a/api/src/opentrons/hardware_control/ot3_calibration.py b/api/src/opentrons/hardware_control/ot3_calibration.py index 1868a284b03..e49b4de171f 100644 --- a/api/src/opentrons/hardware_control/ot3_calibration.py +++ b/api/src/opentrons/hardware_control/ot3_calibration.py @@ -7,9 +7,9 @@ import datetime import numpy as np from enum import Enum -from math import floor, copysign, isclose +from math import floor, copysign from logging import getLogger -from opentrons.util.linal import solve_attitude, SolvePoints +from opentrons.util.linal import solve_attitude, SolvePoints, DoubleMatrix from .types import OT3Mount, Axis, GripperProbe from opentrons.types import Point @@ -42,12 +42,12 @@ ) from opentrons.config.robot_configs import ( default_ot3_deck_calibration, - defaults_ot3, ) +from opentrons.config import defaults_ot3 from .util import DeckTransformState if TYPE_CHECKING: - from .ot3api import OT3API + from opentrons.hardware_control import OT3HardwareControlAPI LOG = getLogger(__name__) @@ -112,22 +112,18 @@ class AlignmentShift(Enum): } -def _deck_hit( +def _verify_height( found_pos: float, expected_pos: float, settings: EdgeSenseSettings -) -> bool: +) -> None: """ - Evaluate the height found by capacitive probe against search settings - to determine whether or not it had hit the deck. + Evaluate the height found by capacitive probe against search settings. """ if found_pos > expected_pos + settings.early_sense_tolerance_mm: raise EarlyCapacitiveSenseTrigger(found_pos, expected_pos) - return ( - True if found_pos >= (expected_pos - settings.overrun_tolerance_mm) else False - ) async def _verify_edge_pos( - hcapi: OT3API, + hcapi: OT3HardwareControlAPI, mount: OT3Mount, search_axis: Union[Literal[Axis.X, Axis.Y]], found_edge: Point, @@ -153,10 +149,10 @@ async def _verify_edge_pos( LOG.info( f"Checking {edge_name_str} in {dir} direction at {checking_pos}, stride_size: {check_stride}" ) - height = await _probe_deck_at( + height, hit_deck = await _probe_deck_at( hcapi, mount, checking_pos, edge_settings.pass_settings, probe=probe ) - hit_deck = _deck_hit(height, found_edge.z, edge_settings) + _verify_height(height, found_edge.z, edge_settings) LOG.info(f"Deck {'hit' if hit_deck else 'miss'} at check pos: {checking_pos}") if last_result is not None and hit_deck != last_result: LOG.info( @@ -181,7 +177,7 @@ def critical_edge_offset( async def find_edge_binary( - hcapi: OT3API, + hcapi: OT3HardwareControlAPI, mount: OT3Mount, slot_edge_nominal: Point, search_axis: Union[Literal[Axis.X, Axis.Y]], @@ -222,10 +218,10 @@ async def find_edge_binary( final_z_height_found = slot_edge_nominal.z for _ in range(edge_settings.search_iteration_limit): LOG.info(f"Checking position {checking_pos}") - interaction_pos = await _probe_deck_at( + interaction_pos, hit_deck = await _probe_deck_at( hcapi, mount, checking_pos, edge_settings.pass_settings, probe=probe ) - hit_deck = _deck_hit(interaction_pos, checking_pos.z, edge_settings) + _verify_height(interaction_pos, checking_pos.z, edge_settings) if hit_deck: # In this block, we've hit the deck LOG.info(f"hit at {interaction_pos}, stride size: {stride}") @@ -276,7 +272,7 @@ async def find_edge_binary( async def find_slot_center_binary( - hcapi: OT3API, + hcapi: OT3HardwareControlAPI, mount: OT3Mount, estimated_center: Point, raise_verify_error: bool = True, @@ -341,7 +337,7 @@ async def find_slot_center_binary( async def find_calibration_structure_height( - hcapi: OT3API, + hcapi: OT3HardwareControlAPI, mount: OT3Mount, nominal_center: Point, probe: InstrumentProbeType = InstrumentProbeType.PRIMARY, @@ -358,24 +354,24 @@ async def find_calibration_structure_height( """ z_pass_settings = hcapi.config.calibration.z_offset.pass_settings z_prep_point = nominal_center + PREP_OFFSET_DEPTH - structure_z = await _probe_deck_at( + z_limit = nominal_center.z - z_pass_settings.max_overrun_distance_mm + structure_z, hit_deck = await _probe_deck_at( hcapi, mount, z_prep_point, z_pass_settings, probe=probe ) - z_limit = nominal_center.z - z_pass_settings.max_overrun_distance_mm - if (structure_z < z_limit) or isclose(z_limit, structure_z, abs_tol=0.001): + if not hit_deck: raise CalibrationStructureNotFoundError(structure_z, z_limit) LOG.info(f"autocalibration: found structure at {structure_z}") return structure_z async def _probe_deck_at( - api: OT3API, + api: OT3HardwareControlAPI, mount: OT3Mount, target: Point, settings: CapacitivePassSettings, speed: float = 50, probe: InstrumentProbeType = InstrumentProbeType.PRIMARY, -) -> float: +) -> Tuple[float, bool]: here = await api.gantry_position(mount) abs_transit_height = max( target.z + LINEAR_TRANSIT_HEIGHT, target.z + settings.prep_distance_mm @@ -384,17 +380,17 @@ async def _probe_deck_at( await api.move_to(mount, here._replace(z=safe_height)) await api.move_to(mount, target._replace(z=safe_height), speed=speed) await api.move_to(mount, target._replace(z=abs_transit_height)) - _found_pos = await api.capacitive_probe( + _found_pos, contact = await api.capacitive_probe( mount, Axis.by_mount(mount), target.z, settings, probe=probe ) # don't use found Z position to calculate an updated transit height # because the probe may have gone through the hole await api.move_to(mount, target._replace(z=abs_transit_height)) - return _found_pos + return _found_pos, contact async def find_axis_center( - hcapi: OT3API, + hcapi: OT3HardwareControlAPI, mount: OT3Mount, minus_edge_nominal: Point, plus_edge_nominal: Point, @@ -481,7 +477,7 @@ def _edges_from_data( # an N-sample rolling average. by inverting the sign of half the kernel, which is # why we need it to be even, we do the same thing but while also taking a finite # difference. - average_difference_kernel = np.concatenate( # type: ignore + average_difference_kernel = np.concatenate( ( np.full(average_width_samples // 2, 1 / average_width_samples), np.full(average_width_samples // 2, -1 / average_width_samples), @@ -534,7 +530,7 @@ def _edges_from_data( async def find_slot_center_noncontact( - hcapi: OT3API, mount: OT3Mount, estimated_center: Point + hcapi: OT3HardwareControlAPI, mount: OT3Mount, estimated_center: Point ) -> Point: NONCONTACT_INTERVAL_MM: float = 0.1 travel_center = estimated_center + Point(0, 0, NONCONTACT_INTERVAL_MM) @@ -556,7 +552,7 @@ async def find_slot_center_noncontact( async def find_calibration_structure_center( - hcapi: OT3API, + hcapi: OT3HardwareControlAPI, mount: OT3Mount, nominal_center: Point, method: CalibrationMethod = CalibrationMethod.BINARY_SEARCH, @@ -578,7 +574,7 @@ async def find_calibration_structure_center( async def _calibrate_mount( - hcapi: OT3API, + hcapi: OT3HardwareControlAPI, mount: OT3Mount, slot: int = SLOT_CENTER, method: CalibrationMethod = CalibrationMethod.BINARY_SEARCH, @@ -645,7 +641,7 @@ async def _calibrate_mount( async def find_calibration_structure_position( - hcapi: OT3API, + hcapi: OT3HardwareControlAPI, mount: OT3Mount, nominal_center: Point, method: CalibrationMethod = CalibrationMethod.BINARY_SEARCH, @@ -677,7 +673,7 @@ async def find_calibration_structure_position( async def find_slot_center_binary_from_nominal_center( - hcapi: OT3API, + hcapi: OT3HardwareControlAPI, mount: OT3Mount, slot: int, ) -> Tuple[Point, Point]: @@ -702,7 +698,7 @@ async def find_slot_center_binary_from_nominal_center( async def _determine_transform_matrix( - hcapi: OT3API, + hcapi: OT3HardwareControlAPI, mount: OT3Mount, ) -> Tuple[types.AttitudeMatrix, Dict[str, Any]]: """ @@ -754,7 +750,7 @@ def gripper_pin_offsets_mean(front: Point, rear: Point) -> Point: async def calibrate_gripper_jaw( - hcapi: OT3API, + hcapi: OT3HardwareControlAPI, probe: GripperProbe, slot: int = 5, method: CalibrationMethod = CalibrationMethod.BINARY_SEARCH, @@ -778,7 +774,12 @@ async def calibrate_gripper_jaw( hcapi.add_gripper_probe(probe) await hcapi.grip(GRIPPER_GRIP_FORCE) offset = await _calibrate_mount( - hcapi, OT3Mount.GRIPPER, slot, method, raise_verify_error + hcapi, + OT3Mount.GRIPPER, + slot, + method, + raise_verify_error, + probe=probe.to_type(probe), ) LOG.info(f"Gripper {probe.name} probe offset: {offset}") return offset @@ -787,7 +788,7 @@ async def calibrate_gripper_jaw( async def calibrate_gripper( - hcapi: OT3API, offset_front: Point, offset_rear: Point + hcapi: OT3HardwareControlAPI, offset_front: Point, offset_rear: Point ) -> Point: """Calibrate gripper.""" offset = gripper_pin_offsets_mean(front=offset_front, rear=offset_rear) @@ -797,7 +798,7 @@ async def calibrate_gripper( async def find_pipette_offset( - hcapi: OT3API, + hcapi: OT3HardwareControlAPI, mount: Literal[OT3Mount.LEFT, OT3Mount.RIGHT], slot: int = 5, method: CalibrationMethod = CalibrationMethod.BINARY_SEARCH, @@ -828,7 +829,7 @@ async def find_pipette_offset( async def calibrate_pipette( - hcapi: OT3API, + hcapi: OT3HardwareControlAPI, mount: Literal[OT3Mount.LEFT, OT3Mount.RIGHT], slot: int = 5, method: CalibrationMethod = CalibrationMethod.BINARY_SEARCH, @@ -851,7 +852,7 @@ async def calibrate_pipette( async def calibrate_module( - hcapi: OT3API, + hcapi: OT3HardwareControlAPI, mount: OT3Mount, slot: str, module_id: str, @@ -906,7 +907,7 @@ async def calibrate_module( async def calibrate_belts( - hcapi: OT3API, + hcapi: OT3HardwareControlAPI, mount: OT3Mount, pipette_id: str, ) -> Tuple[types.AttitudeMatrix, Dict[str, Any]]: @@ -951,9 +952,11 @@ def apply_machine_transform( ------- Attitude matrix with regards to machine coordinate system. """ - belt_attitude_arr = np.array(belt_attitude) - machine_transform_arr = np.array(defaults_ot3.DEFAULT_MACHINE_TRANSFORM) - deck_attitude_arr = np.dot(belt_attitude_arr, machine_transform_arr) # type: ignore[no-untyped-call] + belt_attitude_arr: DoubleMatrix = np.array(belt_attitude) + machine_transform_arr: DoubleMatrix = np.array( + defaults_ot3.DEFAULT_MACHINE_TRANSFORM + ) + deck_attitude_arr = np.dot(belt_attitude_arr, machine_transform_arr) deck_attitude = deck_attitude_arr.round(4).tolist() return deck_attitude # type: ignore[no-any-return] @@ -990,9 +993,9 @@ def validate_attitude_deck_calibration( TODO(pm, 5/9/2023): As with the OT2, expand on this method, or create another method to diagnose bad instrument offset data """ - curr_cal = np.array(deck_cal.attitude) + curr_cal: DoubleMatrix = np.array(deck_cal.attitude) row, _ = curr_cal.shape - rank: int = np.linalg.matrix_rank(curr_cal) # type: ignore + rank: int = np.linalg.matrix_rank(curr_cal) if row != rank: # Check that the matrix is non-singular return DeckTransformState.SINGULARITY @@ -1004,7 +1007,7 @@ def validate_attitude_deck_calibration( return DeckTransformState.OK -def delete_belt_calibration_data(hcapi: OT3API) -> None: +def delete_belt_calibration_data(hcapi: OT3HardwareControlAPI) -> None: delete_robot_belt_attitude() hcapi.reset_deck_calibration() diff --git a/api/src/opentrons/hardware_control/ot3api.py b/api/src/opentrons/hardware_control/ot3api.py index c4606fa716d..4a586a43c4e 100644 --- a/api/src/opentrons/hardware_control/ot3api.py +++ b/api/src/opentrons/hardware_control/ot3api.py @@ -1,10 +1,9 @@ import asyncio from concurrent.futures import Future import contextlib -from functools import partial, lru_cache +from functools import partial, lru_cache, wraps from dataclasses import replace import logging -from copy import deepcopy from collections import OrderedDict from typing import ( AsyncIterator, @@ -20,6 +19,7 @@ TypeVar, Tuple, Mapping, + Awaitable, ) from opentrons.hardware_control.modules.module_calibration import ( ModuleCalibrationOffset, @@ -33,10 +33,12 @@ pipette_load_name_conversions as pipette_load_name, ) from opentrons_shared_data.robot.dev_types import RobotType -from opentrons_shared_data.errors.exceptions import StallOrCollisionDetectedError +from opentrons_shared_data.errors.exceptions import ( + StallOrCollisionDetectedError, +) from opentrons import types as top_types -from opentrons.config import robot_configs, feature_flags as ff +from opentrons.config import robot_configs from opentrons.config.types import ( RobotConfig, OT3Config, @@ -45,15 +47,16 @@ LiquidProbeSettings, ) from opentrons.drivers.rpi_drivers.types import USBPort, PortGroup -from opentrons_hardware.hardware_control.motion_planning import ( - Move, - MoveManager, - MoveTarget, - ZeroLengthMoveError, +from opentrons.hardware_control.nozzle_manager import NozzleConfigurationType +from opentrons_shared_data.errors.exceptions import ( + EnumeratedError, + PythonException, + PositionUnknownError, + GripperNotPresentError, + InvalidActuator, + FirmwareUpdateFailedError, ) -from opentrons_hardware.hardware_control.motion import MoveStopCondition - from .util import use_or_initialize_loop, check_motion_bounds from .instruments.ot3.pipette import ( @@ -64,15 +67,7 @@ GripperCalibrationOffset, PipetteOffsetSummary, ) -from .backends.ot3controller import OT3Controller -from .backends.ot3simulator import OT3Simulator -from .backends.ot3utils import ( - axis_convert, - get_system_constraints, - get_system_constraints_for_calibration, - get_system_constraints_for_plunger_acceleration, -) -from .backends.errors import SubsystemUpdating + from .execution_manager import ExecutionManagerProvider from .pause_manager import PauseManager from .module_control import AttachedModulesControl @@ -98,29 +93,26 @@ SubSystemState, TipStateType, EstopOverallStatus, - EstopAttachLocation, EstopStateNotification, EstopState, + HardwareFeatureFlags, + FailedTipStateCheck, ) from .errors import ( - MustHomeError, - GripperNotAttachedError, - AxisNotPresentError, UpdateOngoingError, - FirmwareUpdateFailed, ) from . import modules from .ot3_calibration import OT3Transforms, OT3RobotCalibrationProvider -from .protocols import HardwareControlInterface +from .protocols import FlexHardwareControlInterface # TODO (lc 09/15/2022) We should update our pipette handler to reflect OT-3 properties # in a follow-up PR. from .instruments.ot3.pipette_handler import ( OT3PipetteHandler, InstrumentsByMount, - PickUpTipSpec, - TipMotorPickUpTipSpec, + TipActionSpec, + TipActionMoveSpec, ) from .instruments.ot3.instrument_calibration import load_pipette_offset from .instruments.ot3.gripper_handler import GripperHandler @@ -146,10 +138,12 @@ InstrumentDict, GripperDict, ) +from .backends.types import HWStopCondition +from .backends.flex_protocol import FlexBackend +from .backends.ot3simulator import OT3Simulator +from .backends.errors import SubsystemUpdating -from .status_bar_state import StatusBarStateController - mod_log = logging.getLogger(__name__) AXES_IN_HOMING_ORDER: Tuple[Axis, Axis, Axis, Axis, Axis, Axis, Axis, Axis, Axis] = ( @@ -161,6 +155,24 @@ Axis.Q, ) +Wrapped = TypeVar("Wrapped", bound=Callable[..., Awaitable[Any]]) + + +def _adjust_high_throughput_z_current(func: Wrapped) -> Wrapped: + """ + A decorator that temproarily and conditionally changes the active current (based on the axis input) + before a function is executed and the cleans up afterwards + """ + # only home and retract should be wrappeed by this decorator + @wraps(func) + async def wrapper(self: Any, axis: Axis, *args: Any, **kwargs: Any) -> Any: + async with contextlib.AsyncExitStack() as stack: + if axis == Axis.Z_R and self.gantry_load == GantryLoad.HIGH_THROUGHPUT: + await stack.enter_async_context(self._backend.restore_z_r_run_current()) + return await func(self, axis, *args, **kwargs) + + return cast(Wrapped, wrapper) + class OT3API( ExecutionManagerProvider, @@ -170,7 +182,9 @@ class OT3API( # of methods that are present in the protocol will call the (empty, # do-nothing) methods in the protocol. This will happily make all the # tests fail. - HardwareControlInterface[OT3Transforms], + FlexHardwareControlInterface[ + OT3Transforms, Union[top_types.Mount, OT3Mount], OT3Config + ], ): """This API is the primary interface to the hardware controller. @@ -191,9 +205,10 @@ class OT3API( def __init__( self, - backend: Union[OT3Simulator, OT3Controller], + backend: FlexBackend, loop: asyncio.AbstractEventLoop, config: OT3Config, + feature_flags: HardwareFeatureFlags, ) -> None: """Initialize an API instance. @@ -209,7 +224,8 @@ def __init__( def estop_cb(event: HardwareEvent) -> None: self._update_estop_state(event) - backend.estop_state_machine.add_listener(estop_cb) + self._feature_flags = feature_flags + backend.add_estop_callback(estop_cb) self._callbacks: Set[HardwareEventHandler] = set() # {'X': 0.0, 'Y': 0.0, 'Z': 0.0, 'A': 0.0, 'B': 0.0, 'C': 0.0} @@ -225,21 +241,29 @@ def estop_cb(event: HardwareEvent) -> None: self._motion_lock = asyncio.Lock() self._door_state = DoorState.CLOSED self._pause_manager = PauseManager() - self._gantry_load = GantryLoad.LOW_THROUGHPUT - self._move_manager = MoveManager( - constraints=get_system_constraints( - self._config.motion_settings, self._gantry_load - ) - ) - self._status_bar_controller = StatusBarStateController( - self._backend.status_bar_interface() - ) - self._pipette_handler = OT3PipetteHandler({m: None for m in OT3Mount}) self._gripper_handler = GripperHandler(gripper=None) + self._gantry_load = GantryLoad.LOW_THROUGHPUT OT3RobotCalibrationProvider.__init__(self, self._config) ExecutionManagerProvider.__init__(self, isinstance(backend, OT3Simulator)) + def is_idle_mount(self, mount: Union[top_types.Mount, OT3Mount]) -> bool: + """Only the gripper mount or the 96-channel pipette mount would be idle + (disengaged). + + If gripper mount is NOT the last moved mount, it's idle. + If a 96-channel pipette is attached, the mount is idle if it's not + the last moved mount. + """ + realmount = OT3Mount.from_mount(mount) + if not self._last_moved_mount or realmount == self._last_moved_mount: + return False + + return ( + realmount == OT3Mount.LEFT + and self._gantry_load == GantryLoad.HIGH_THROUGHPUT + ) or (realmount == OT3Mount.GRIPPER) + @property def door_state(self) -> DoorState: return self._door_state @@ -255,39 +279,28 @@ def gantry_load(self) -> GantryLoad: async def set_gantry_load(self, gantry_load: GantryLoad) -> None: mod_log.info(f"Setting gantry load to {gantry_load}") self._gantry_load = gantry_load - self._move_manager.update_constraints( - get_system_constraints(self._config.motion_settings, gantry_load) - ) + self._backend.update_constraints_for_gantry_load(gantry_load) await self._backend.update_to_default_current_settings(gantry_load) + async def get_serial_number(self) -> Optional[str]: + return await self._backend.get_serial_number() + async def set_system_constraints_for_calibration(self) -> None: - self._move_manager.update_constraints( - get_system_constraints_for_calibration( - self._config.motion_settings, self._gantry_load - ) - ) - mod_log.debug( - f"Set system constraints for calibration: {self._move_manager.get_constraints()}" + self._backend.update_constraints_for_calibration_with_gantry_load( + self._gantry_load ) async def set_system_constraints_for_plunger_acceleration( self, mount: OT3Mount, acceleration: float ) -> None: - new_constraints = get_system_constraints_for_plunger_acceleration( - self._config.motion_settings, self._gantry_load, mount, acceleration + self._backend.update_constraints_for_plunger_acceleration( + mount, acceleration, self._gantry_load ) - self._move_manager.update_constraints(new_constraints) @contextlib.asynccontextmanager async def restore_system_constrants(self) -> AsyncIterator[None]: - old_system_constraints = deepcopy(self._move_manager.get_constraints()) - try: + async with self._backend.restore_system_constraints(): yield - finally: - self._move_manager.update_constraints(old_system_constraints) - mod_log.debug( - f"Restore previous system constraints: {old_system_constraints}" - ) def _update_door_state(self, door_state: DoorState) -> None: mod_log.info(f"Updating the window switch status: {door_state}") @@ -349,18 +362,32 @@ async def build_hardware_controller( use_usb_bus: bool = False, update_firmware: bool = True, status_bar_enabled: bool = True, + feature_flags: Optional[HardwareFeatureFlags] = None, ) -> "OT3API": """Build an ot3 hardware controller.""" checked_loop = use_or_initialize_loop(loop) + if feature_flags is None: + # If no feature flag set is defined, we will use the default values + feature_flags = HardwareFeatureFlags() if not isinstance(config, OT3Config): checked_config = robot_configs.load_ot3() else: checked_config = config + from .backends.ot3controller import OT3Controller + backend = await OT3Controller.build( - checked_config, use_usb_bus, check_updates=update_firmware + checked_config, + use_usb_bus, + check_updates=update_firmware, + feature_flags=feature_flags, ) - api_instance = cls(backend, loop=checked_loop, config=checked_config) + api_instance = cls( + backend, + loop=checked_loop, + config=checked_config, + feature_flags=feature_flags, + ) await api_instance.set_status_bar_enabled(status_bar_enabled) module_controls = await AttachedModulesControl.build( @@ -388,12 +415,15 @@ async def build_hardware_simulator( config: Union[RobotConfig, OT3Config, None] = None, loop: Optional[asyncio.AbstractEventLoop] = None, strict_attached_instruments: bool = True, + feature_flags: Optional[HardwareFeatureFlags] = None, ) -> "OT3API": """Build a simulating hardware controller. This method may be used both on a real robot and on dev machines. Multiple simulating hardware controllers may be active at one time. """ + if feature_flags is None: + feature_flags = HardwareFeatureFlags() checked_modules = attached_modules or [] @@ -402,6 +432,7 @@ async def build_hardware_simulator( checked_config = robot_configs.load_ot3() else: checked_config = config + backend = await OT3Simulator.build( {OT3Mount.from_mount(k): v for k, v in attached_instruments.items()} if attached_instruments @@ -410,8 +441,14 @@ async def build_hardware_simulator( checked_config, checked_loop, strict_attached_instruments, + feature_flags, + ) + api_instance = cls( + backend, + loop=checked_loop, + config=checked_config, + feature_flags=feature_flags, ) - api_instance = cls(backend, loop=checked_loop, config=checked_config) await api_instance.cache_instruments() module_controls = await AttachedModulesControl.build( api_instance, board_revision=backend.board_revision @@ -470,14 +507,22 @@ async def update_firmware( """Start the firmware update for one or more subsystems and return update progress iterator.""" subsystems = subsystems or set() # start the updates and yield the progress - try: - async for update_status in self._backend.update_firmware(subsystems, force): - yield update_status - except SubsystemUpdating as e: - raise UpdateOngoingError(e.msg) from e - except Exception as e: - mod_log.exception("Firmware update failed") - raise FirmwareUpdateFailed() from e + async with self._motion_lock: + try: + async for update_status in self._backend.update_firmware( + subsystems, force + ): + yield update_status + except SubsystemUpdating as e: + raise UpdateOngoingError(e.msg) from e + except EnumeratedError: + raise + except BaseException as e: + mod_log.exception("Firmware update failed") + raise FirmwareUpdateFailedError( + message="Update failed because of uncaught error", + wrapping=[PythonException(e)], + ) from e # Incidentals (i.e. not motion) API @@ -504,13 +549,13 @@ async def identify(self, duration_s: int = 5) -> None: await self.set_lights(button=True) async def set_status_bar_state(self, state: StatusBarState) -> None: - await self._status_bar_controller.set_status_bar_state(state) + await self._backend.set_status_bar_state(state) async def set_status_bar_enabled(self, enabled: bool) -> None: - await self._status_bar_controller.set_enabled(enabled) + await self._backend.set_status_bar_enabled(enabled) def get_status_bar_state(self) -> StatusBarState: - return self._status_bar_controller.get_current_state() + return self._backend.get_status_bar_state() @ExecutionManagerProvider.wait_for_running async def delay(self, duration_s: float) -> None: @@ -567,6 +612,7 @@ async def cache_pipette( req_instr, pip_id, pip_offset_cal, + self._feature_flags.use_old_aspiration_functions, ) self._pipette_handler.hardware_instruments[mount] = p # TODO (lc 12-5-2022) Properly support backwards compatibility @@ -678,6 +724,25 @@ async def _configure_instruments(self) -> None: """Configure instruments""" await self.set_gantry_load(self._gantry_load_from_instruments()) await self.refresh_positions() + await self.reset_tip_detectors(False) + + async def reset_tip_detectors( + self, + refresh_state: bool = True, + ) -> None: + """Reset tip detector whenever we configure instruments.""" + for mount in [OT3Mount.LEFT, OT3Mount.RIGHT]: + # rebuild tip detector using the attached instrument + self._log.info(f"resetting tip detector for mount {mount}") + if self._pipette_handler.has_pipette(mount): + await self._backend.update_tip_detector( + mount, self._pipette_handler.get_tip_sensor_count(mount) + ) + else: + await self._backend.teardown_tip_detector(mount) + + if refresh_state and self._pipette_handler.has_pipette(mount): + await self.get_tip_presence_status(mount) @ExecutionManagerProvider.wait_for_running async def _update_position_estimation( @@ -732,12 +797,17 @@ async def _chained_calls() -> None: asyncio.run_coroutine_threadsafe(_chained_calls(), self._loop) + def is_movement_execution_taskified(self) -> bool: + return self.taskify_movement_execution + + def should_taskify_movement_execution(self, taskify: bool) -> None: + self.taskify_movement_execution = taskify + async def _stop_motors(self) -> None: """Immediately stop motors.""" await self._backend.halt() - async def _cancel_execution_and_running_tasks(self) -> None: - """Cancel execution manager and all running (hardware module) tasks.""" + async def cancel_execution_and_running_tasks(self) -> None: await self._execution_manager.cancel() async def halt(self, disengage_before_stopping: bool = False) -> None: @@ -751,7 +821,7 @@ async def halt(self, disengage_before_stopping: bool = False) -> None: async def stop(self, home_after: bool = True) -> None: """Stop motion as soon as possible, reset, and optionally home.""" await self._stop_motors() - await self._cancel_execution_and_running_tasks() + await self.cancel_execution_and_running_tasks() self._log.info("Resetting OT3API") await self.reset() if home_after: @@ -787,19 +857,27 @@ async def home_z( axes = list(Axis.ot3_mount_axes()) await self.home(axes) - async def home_gripper_jaw(self) -> None: - """ - Home the jaw of the gripper. - """ - try: - gripper = self._gripper_handler.get_gripper() - self._log.info("Homing gripper jaw.") - - dc = self._gripper_handler.get_duty_cycle_by_grip_force( - gripper.default_home_force + async def _do_home_and_maybe_calibrate_gripper_jaw(self) -> None: + gripper = self._gripper_handler.get_gripper() + self._log.info("Homing gripper jaw.") + dc = self._gripper_handler.get_duty_cycle_by_grip_force( + gripper.default_home_force + ) + await self._ungrip(duty_cycle=dc) + if not gripper.has_jaw_width_calibration: + self._log.info("Calibrating gripper jaw.") + await self._grip( + duty_cycle=dc, expected_displacement=gripper.max_jaw_displacement() ) + jaw_at_closed = (await self._cache_encoder_position())[Axis.G] + gripper.update_jaw_open_position_from_closed_position(jaw_at_closed) await self._ungrip(duty_cycle=dc) - except GripperNotAttachedError: + + async def home_gripper_jaw(self) -> None: + """Home the jaw of the gripper.""" + try: + await self._do_home_and_maybe_calibrate_gripper_jaw() + except GripperNotPresentError: pass async def home_plunger(self, mount: Union[top_types.Mount, OT3Mount]) -> None: @@ -822,33 +900,38 @@ async def home_gear_motors(self) -> None: GantryLoad.HIGH_THROUGHPUT ][OT3AxisKind.Q] + max_distance = self._backend.axis_bounds[Axis.Q][1] # if position is not known, move toward limit switch at a constant velocity - if not any(self._backend.gear_motor_position): + if self._backend.gear_motor_position is None: await self._backend.home_tip_motors( - distance=self._backend.axis_bounds[Axis.Q][1], + distance=max_distance, velocity=homing_velocity, ) return - current_pos_float = axis_convert(self._backend.gear_motor_position, 0.0)[ - Axis.P_L - ] + current_pos_float = self._backend.gear_motor_position or 0.0 + + # We filter out a distance more than `max_distance` because, if the tip motor was stopped during + # a slow-home motion, the position may be stuck at an enormous large value. + if ( + current_pos_float > self._config.safe_home_distance + and current_pos_float < max_distance + ): - if current_pos_float > self._config.safe_home_distance: - fast_home_moves = self._build_moves( - {Axis.Q: current_pos_float}, {Axis.Q: self._config.safe_home_distance} - ) # move toward home until a safe distance - await self._backend.tip_action(moves=fast_home_moves[0]) + await self._backend.tip_action( + origin={Axis.Q: current_pos_float}, + targets=[({Axis.Q: self._config.safe_home_distance}, 400)], + ) # update current position - current_pos_float = axis_convert(self._backend.gear_motor_position, 0.0)[ - Axis.P_L - ] + current_pos_float = self._backend.gear_motor_position or 0.0 # move until the limit switch is triggered, with no acceleration await self._backend.home_tip_motors( - distance=(current_pos_float + self._config.safe_home_distance), + distance=min( + current_pos_float + self._config.safe_home_distance, max_distance + ), velocity=homing_velocity, ) @@ -877,17 +960,20 @@ async def current_position_ot3( specified mount. """ if mount == OT3Mount.GRIPPER and not self._gripper_handler.has_gripper(): - raise GripperNotAttachedError( - f"Cannot return position for {mount} if no gripper is attached" + raise GripperNotPresentError( + message=f"Cannot return position for {mount} if no gripper is attached", + detail={"mount": str(mount)}, ) - + mount_axes = [Axis.X, Axis.Y, Axis.by_mount(mount)] if refresh: await self.refresh_positions() elif not self._current_position: - raise MustHomeError( - f"Motor positions for {str(mount)} are missing; must first home motors." + raise PositionUnknownError( + message=f"Motor positions for {str(mount)} mount are missing (" + f"{mount_axes}); must first home motors.", + detail={"mount": str(mount), "missing_axes": str(mount_axes)}, ) - self._assert_motor_ok([Axis.X, Axis.Y, Axis.by_mount(mount)]) + self._assert_motor_ok(mount_axes) return self._effector_pos_from_carriage_pos( OT3Mount.from_mount(mount), self._current_position, critical_point @@ -905,7 +991,7 @@ async def _refresh_jaw_state(self) -> None: try: gripper = self._gripper_handler.get_gripper() gripper.state = await self._backend.get_jaw_state() - except GripperNotAttachedError: + except GripperNotPresentError: pass async def _cache_current_position(self) -> Dict[Axis, float]: @@ -928,18 +1014,26 @@ def _assert_motor_ok(self, axes: Sequence[Axis]) -> None: invalid_axes = self._backend.get_invalid_motor_axes(axes) if invalid_axes: axes_str = ",".join([ax.name for ax in invalid_axes]) - raise MustHomeError( - f"Motor position of axes ({axes_str}) is invalid; please home motors." + raise PositionUnknownError( + message=f"Motor position of axes ({axes_str}) is invalid; please home motors.", + detail={"axes": axes_str}, ) def _assert_encoder_ok(self, axes: Sequence[Axis]) -> None: invalid_axes = self._backend.get_invalid_motor_axes(axes) if invalid_axes: axes_str = ",".join([ax.name for ax in invalid_axes]) - raise MustHomeError( - f"Encoder position of axes ({axes_str}) is invalid; please home motors." + raise PositionUnknownError( + message=f"Encoder position of axes ({axes_str}) is invalid; please home motors.", + detail={"axes": axes_str}, ) + def motor_status_ok(self, axis: Axis) -> bool: + return self._backend.check_motor_status([axis]) + + def encoder_status_ok(self, axis: Axis) -> bool: + return self._backend.check_encoder_status([axis]) + async def encoder_current_position( self, mount: Union[top_types.Mount, OT3Mount], @@ -963,13 +1057,15 @@ async def encoder_current_position_ot3( if refresh: await self.refresh_positions() elif not self._encoder_position: - raise MustHomeError( - f"Encoder positions for {str(mount)} are missing; must first home motors." + raise PositionUnknownError( + message=f"Encoder positions for {str(mount)} are missing; must first home motors.", + detail={"mount": str(mount)}, ) if mount == OT3Mount.GRIPPER and not self._gripper_handler.has_gripper(): - raise GripperNotAttachedError( - f"Cannot return encoder position for {mount} if no gripper is attached" + raise GripperNotPresentError( + message=f"Cannot return encoder position for {mount} if no gripper is attached", + detail={"mount": str(mount)}, ) self._assert_encoder_ok([Axis.X, Axis.Y, Axis.by_mount(mount)]) @@ -1004,9 +1100,7 @@ def _effector_pos_from_carriage_pos( plunger_ax: carriage_position[plunger_ax], } if self._gantry_load == GantryLoad.HIGH_THROUGHPUT: - effector_pos[Axis.Q] = axis_convert(self._backend.gear_motor_position, 0.0)[ - Axis.P_L - ] + effector_pos[Axis.Q] = self._backend.gear_motor_position or 0.0 return effector_pos @@ -1076,7 +1170,7 @@ async def move_to( else: checked_max = None - await self._cache_and_maybe_retract_mount(realmount) + await self.prepare_for_mount_movement(realmount) await self._move( target_position, speed=speed, @@ -1099,7 +1193,9 @@ async def move_axes( # noqa: C901 for axis in position.keys(): if not self._backend.axis_is_present(axis): - raise AxisNotPresentError(f"{axis} is not present") + raise InvalidActuator( + message=f"{axis} is not present", detail={"axis": str(axis)} + ) if not self._backend.check_encoder_status(list(position.keys())): await self.home() @@ -1185,7 +1281,8 @@ async def move_rel( checked_max: Optional[OT3AxisMap[float]] = max_speeds else: checked_max = None - await self._cache_and_maybe_retract_mount(realmount) + + await self.prepare_for_mount_movement(realmount) await self._move( target_position, speed=speed, @@ -1195,19 +1292,48 @@ async def move_rel( ) async def _cache_and_maybe_retract_mount(self, mount: OT3Mount) -> None: - """Retract the 'other' mount if necessary + """Retract the 'other' mount if necessary. If `mount` does not match the value in :py:attr:`_last_moved_mount` (and :py:attr:`_last_moved_mount` exists) then retract the mount in :py:attr:`_last_moved_mount`. Also unconditionally update :py:attr:`_last_moved_mount` to contain `mount`. + + Disengage the 96-channel and gripper mount if retracted. Re-engage + the 96-channel or gripper mount if it is about to move. """ + if self.is_idle_mount(mount): + # home the left/gripper mount if it is current disengaged + await self.home_z(mount) + if mount != self._last_moved_mount and self._last_moved_mount: await self.retract(self._last_moved_mount, 10) + + # disengage Axis.Z_L motor and engage the brake to lower power + # consumption and reduce the chance of the 96-channel pipette dropping + if ( + self.gantry_load == GantryLoad.HIGH_THROUGHPUT + and self._last_moved_mount == OT3Mount.LEFT + ): + await self.disengage_axes([Axis.Z_L]) + + # disegnage Axis.Z_G when we can to reduce the chance of + # the gripper dropping + if self._last_moved_mount == OT3Mount.GRIPPER: + await self.disengage_axes([Axis.Z_G]) + if mount != OT3Mount.GRIPPER: await self.idle_gripper() + self._last_moved_mount = mount + async def prepare_for_mount_movement( + self, mount: Union[top_types.Mount, OT3Mount] + ) -> None: + """Retract the idle mount if necessary.""" + realmount = OT3Mount.from_mount(mount) + await self._cache_and_maybe_retract_mount(realmount) + async def idle_gripper(self) -> None: """Move gripper to its idle, gripped position.""" try: @@ -1217,23 +1343,38 @@ async def idle_gripper(self) -> None: force_newtons=gripper.default_idle_force, stay_engaged=False, ) - except GripperNotAttachedError: + except GripperNotPresentError: pass - def _build_moves( + def raise_error_if_gripper_pickup_failed( self, - origin: Dict[Axis, float], - target: Dict[Axis, float], - speed: Optional[float] = None, - ) -> List[List[Move[Axis]]]: - """Build move with Move Manager with machine positions.""" - # TODO: (2022-02-10) Use actual max speed for MoveTarget - checked_speed = speed or 400 - move_target = MoveTarget.build(position=target, max_speed=checked_speed) - _, moves = self._move_manager.plan_motion( - origin=origin, target_list=[move_target] + expected_grip_width: float, + grip_width_uncertainty_wider: float, + grip_width_uncertainty_narrower: float, + ) -> None: + """Ensure that a gripper pickup succeeded. + + The labware width is the width of the labware at the point of the grip, as closely as it is known. + The uncertainty values should be specified to handle the case where the labware definition does not + provide that information. + + Both values should be positive; their direcitonal sense is determined by which argument they are. + """ + # check if the gripper is at an acceptable position after attempting to + # pick up labware + gripper = self._gripper_handler.get_gripper() + self._backend.check_gripper_position_within_bounds( + expected_grip_width, + grip_width_uncertainty_wider, + grip_width_uncertainty_narrower, + gripper.jaw_width, + gripper.max_allowed_grip_error, + gripper.max_jaw_width, + gripper.min_jaw_width, ) - return moves + + def gripper_jaw_can_home(self) -> bool: + return self._gripper_handler.is_ready_for_jaw_home() @ExecutionManagerProvider.wait_for_running async def _move( @@ -1260,27 +1401,17 @@ async def _move( if ax in Axis.gantry_axes() } check_motion_bounds(to_check, target_position, bounds, check_bounds) - + self._log.info(f"Move: deck {target_position} becomes machine {machine_pos}") origin = await self._backend.update_position() - try: - moves = self._build_moves(origin, machine_pos, speed) - except ZeroLengthMoveError as zero_length_error: - self._log.info(f"{str(zero_length_error)}, ignoring") - return - self._log.info( - f"move: deck {target_position} becomes machine {machine_pos} from {origin} " - f"requiring {moves}" - ) async with contextlib.AsyncExitStack() as stack: if acquire_lock: await stack.enter_async_context(self._motion_lock) try: await self._backend.move( origin, - moves[0], - MoveStopCondition.stall - if expect_stalls - else MoveStopCondition.none, + machine_pos, + speed or 400.0, + HWStopCondition.stall if expect_stalls else HWStopCondition.none, ) except Exception: self._log.exception("Move failed") @@ -1307,34 +1438,33 @@ async def _set_plunger_current_and_home( if encoder_ok and motor_ok: if origin[axis] - target_pos[axis] > self._config.safe_home_distance: target_pos[axis] += self._config.safe_home_distance - moves = self._build_moves( - origin, target_pos, instr.config.plunger_homing_configurations.speed - ) - async with self._backend.restore_current(): - await self._backend.set_active_current( - {axis: instr.config.plunger_homing_configurations.current} - ) + async with self._backend.motor_current( + run_currents={ + axis: instr.config.plunger_homing_configurations.current + } + ): await self._backend.move( origin, - moves[0], - MoveStopCondition.none, + target_pos, + instr.config.plunger_homing_configurations.speed, + HWStopCondition.none, ) await self._backend.home([axis], self.gantry_load) else: - async with self._backend.restore_current(): - await self._backend.set_active_current( - {axis: instr.config.plunger_homing_configurations.current} - ) + async with self._backend.motor_current( + run_currents={axis: instr.config.plunger_homing_configurations.current} + ): await self._backend.home([axis], self.gantry_load) async def _retrieve_home_position( self, axis: Axis ) -> Tuple[OT3AxisMap[float], OT3AxisMap[float]]: origin = await self._backend.update_position() - target_pos = {ax: pos for ax, pos in origin.items()} - target_pos.update({axis: self._backend.home_position()[axis]}) - return origin, target_pos + origin_pos = {axis: origin[axis]} + target_pos = {axis: self._backend.home_position()[axis]} + return origin_pos, target_pos + @_adjust_high_throughput_z_current async def _home_axis(self, axis: Axis) -> None: """ Perform home; base on axis motor/encoder statuses, shorten homing time @@ -1359,7 +1489,14 @@ async def _home_axis(self, axis: Axis) -> None: if encoder_ok: # ensure stepper position can be updated after boot - await self.engage_axes([axis]) + if axis == Axis.Z_L and self.gantry_load == GantryLoad.HIGH_THROUGHPUT: + # we're here if the left mount has been idle and the brake is engaged + # we want to temporarily increase its hold current to prevent the z + # stage from dropping when switching off the ebrake + async with self._backend.increase_z_l_hold_current(): + await self.engage_axes([axis]) + else: + await self.engage_axes([axis]) await self._update_position_estimation([axis]) # refresh motor and encoder statuses after position estimation update motor_ok = self._backend.check_motor_status([axis]) @@ -1382,17 +1519,18 @@ async def _home_axis(self, axis: Axis) -> None: axis_home_dist = 20.0 if origin[axis] - target_pos[axis] > axis_home_dist: target_pos[axis] += axis_home_dist - moves = self._build_moves(origin, target_pos) try: await self._backend.move( origin, - moves[0], - MoveStopCondition.none, + target_pos, + speed=400, + stop_condition=HWStopCondition.none, ) except StallOrCollisionDetectedError: self._log.warning( f"Stall on {axis} during fast home, encoder may have missed an overflow" ) + await self.refresh_positions() await self._backend.home([axis], self.gantry_load) else: @@ -1410,9 +1548,6 @@ async def _home(self, axes: Sequence[Axis]) -> None: await self._backend.home([axis], self.gantry_load) else: await self._home_axis(axis) - except ZeroLengthMoveError: - self._log.info(f"{axis} already at home position, skip homing") - continue except BaseException as e: self._log.exception(f"Homing failed: {e}") self._current_position.clear() @@ -1440,16 +1575,6 @@ async def home( checked_axes = [ax for ax in Axis if ax != Axis.Q] if self.gantry_load == GantryLoad.HIGH_THROUGHPUT: checked_axes.append(Axis.Q) - # NOTE: Z_R current is dropped very low when 96CH attached, - # so trying to home it would cause timeout error - if not axes: - checked_axes.remove(Axis.Z_R) - elif Axis.Z_R in axes: - raise RuntimeError( - f"unable to home {Axis.Z_R.name} axis" - f"with {self.gantry_load.name} gantry load" - ) - if skip: checked_axes = [ax for ax in checked_axes if ax not in skip] self._log.info(f"Homing {axes}") @@ -1491,6 +1616,7 @@ async def retract( await self.retract_axis(Axis.by_mount(mount)) @ExecutionManagerProvider.wait_for_running + @_adjust_high_throughput_z_current async def retract_axis(self, axis: Axis) -> None: """ Move an axis to its home position, without engaging the limit switch, @@ -1500,12 +1626,6 @@ async def retract_axis(self, axis: Axis) -> None: the behaviors between the two robots similar, retract_axis on the FLEX will call home if the stepper position is inaccurate. """ - if self.gantry_load == GantryLoad.HIGH_THROUGHPUT and axis == Axis.Z_R: - raise RuntimeError( - f"unable to retract {Axis.Z_R.name} axis" - f"with {self.gantry_load.name} gantry load" - ) - motor_ok = self._backend.check_motor_status([axis]) encoder_ok = self._backend.check_encoder_status([axis]) @@ -1513,11 +1633,7 @@ async def retract_axis(self, axis: Axis) -> None: # we can move to the home position without checking the limit switch origin = await self._backend.update_position() target_pos = {axis: self._backend.home_position()[axis]} - try: - moves = self._build_moves(origin, target_pos) - await self._backend.move(origin, moves[0], MoveStopCondition.none) - except ZeroLengthMoveError: - self._log.info(f"{axis} already at home position, skip retract") + await self._backend.move(origin, target_pos, 400, HWStopCondition.none) else: # home the axis await self._home_axis(axis) @@ -1560,12 +1676,25 @@ async def update_config(self, **kwargs: Any) -> None: """Update values of the robot's configuration.""" self._config = replace(self._config, **kwargs) + @property + def hardware_feature_flags(self) -> HardwareFeatureFlags: + return self._feature_flags + + @hardware_feature_flags.setter + def hardware_feature_flags(self, feature_flags: HardwareFeatureFlags) -> None: + self._feature_flags = feature_flags + self._backend.update_feature_flags(self._feature_flags) + @ExecutionManagerProvider.wait_for_running - async def _grip(self, duty_cycle: float, stay_engaged: bool = True) -> None: + async def _grip( + self, duty_cycle: float, expected_displacement: float, stay_engaged: bool = True + ) -> None: """Move the gripper jaw inward to close.""" try: await self._backend.gripper_grip_jaw( - duty_cycle=duty_cycle, stay_engaged=stay_engaged + duty_cycle=duty_cycle, + expected_displacement=self._gripper_handler.get_gripper().max_jaw_displacement(), + stay_engaged=stay_engaged, ) await self._cache_encoder_position() self._gripper_handler.set_jaw_state(await self._backend.get_jaw_state()) @@ -1605,11 +1734,15 @@ async def _hold_jaw_width(self, jaw_width_mm: float) -> None: async def grip( self, force_newtons: Optional[float] = None, stay_engaged: bool = True ) -> None: - self._gripper_handler.check_ready_for_jaw_move() + self._gripper_handler.check_ready_for_jaw_move("grip") dc = self._gripper_handler.get_duty_cycle_by_grip_force( force_newtons or self._gripper_handler.get_gripper().default_grip_force ) - await self._grip(duty_cycle=dc, stay_engaged=stay_engaged) + await self._grip( + duty_cycle=dc, + expected_displacement=self._gripper_handler.get_gripper().max_jaw_displacement(), + stay_engaged=stay_engaged, + ) async def ungrip(self, force_newtons: Optional[float] = None) -> None: """ @@ -1618,7 +1751,7 @@ async def ungrip(self, force_newtons: Optional[float] = None) -> None: To simply open the jaw, use `home_gripper_jaw` instead. """ # get default grip force for release if not provided - self._gripper_handler.check_ready_for_jaw_move() + self._gripper_handler.check_ready_for_jaw_move("ungrip") # TODO: check jaw width to make sure it is actually gripping something dc = self._gripper_handler.get_duty_cycle_by_grip_force( force_newtons or self._gripper_handler.get_gripper().default_home_force @@ -1626,11 +1759,15 @@ async def ungrip(self, force_newtons: Optional[float] = None) -> None: await self._ungrip(duty_cycle=dc) async def hold_jaw_width(self, jaw_width_mm: int) -> None: - self._gripper_handler.check_ready_for_jaw_move() + self._gripper_handler.check_ready_for_jaw_move("hold_jaw_width") await self._hold_jaw_width(jaw_width_mm) async def _move_to_plunger_bottom( - self, mount: OT3Mount, rate: float, acquire_lock: bool = True + self, + mount: OT3Mount, + rate: float, + acquire_lock: bool = True, + check_current_vol: bool = True, ) -> None: """ Move an instrument's plunger to its bottom position, while no liquids @@ -1659,7 +1796,7 @@ async def _move_to_plunger_bottom( """ checked_mount = OT3Mount.from_mount(mount) instrument = self._pipette_handler.get_pipette(checked_mount) - if instrument.current_volume > 0: + if check_current_vol and instrument.current_volume > 0: raise RuntimeError("cannot position plunger while holding liquid") # target position is plunger BOTTOM target_pos = target_position_from_plunger( @@ -1669,7 +1806,7 @@ async def _move_to_plunger_bottom( ) pip_ax = Axis.of_main_tool_actuator(checked_mount) # speed depends on if there is a tip, and which direction to move - if instrument.has_tip: + if instrument.has_tip_length: # using slower aspirate flow-rate, to avoid pulling droplets up speed_up = self._pipette_handler.plunger_speed( instrument, instrument.aspirate_flow_rate, "aspirate" @@ -1690,10 +1827,11 @@ async def _move_to_plunger_bottom( # NOTE: plunger position (mm) decreases up towards homing switch # NOTE: if already at BOTTOM, we still need to run backlash-compensation movement, # because we do not know if we arrived at BOTTOM from above or below. - async with self._backend.restore_current(): - await self._backend.set_active_current( - {pip_ax: instrument.config.plunger_homing_configurations.current} - ) + async with self._backend.motor_current( + run_currents={ + pip_ax: instrument.config.plunger_homing_configurations.current + } + ): if self._current_position[pip_ax] < backlash_pos[pip_ax]: await self._move( backlash_pos, @@ -1730,7 +1868,7 @@ async def prepare_for_aspirate( checked_mount = OT3Mount.from_mount(mount) instrument = self._pipette_handler.get_pipette(checked_mount) self._pipette_handler.ready_for_tip_action( - instrument, HardwareAction.PREPARE_ASPIRATE + instrument, HardwareAction.PREPARE_ASPIRATE, checked_mount ) if instrument.current_volume == 0: await self._move_to_plunger_bottom(checked_mount, rate) @@ -1782,7 +1920,6 @@ async def dispense( mount: Union[top_types.Mount, OT3Mount], volume: Optional[float] = None, rate: float = 1.0, - # TODO (tz, 8-24-24): add implementation https://opentrons.atlassian.net/browse/RET-1373 push_out: Optional[float] = None, ) -> None: """ @@ -1818,6 +1955,10 @@ async def dispense( raise else: dispense_spec.instr.remove_current_volume(dispense_spec.volume) + bottom = dispense_spec.instr.plunger_positions.bottom + plunger_target_pos = target_pos[Axis.of_main_tool_actuator(realmount)] + if plunger_target_pos > bottom: + dispense_spec.instr.ready_to_aspirate = False async def blow_out( self, @@ -1871,54 +2012,90 @@ async def blow_out( blowout_spec.instr.set_current_volume(0) blowout_spec.instr.ready_to_aspirate = False + @contextlib.asynccontextmanager + async def _high_throughput_check_tip(self) -> AsyncIterator[None]: + """Tip action required for high throughput pipettes to get tip status.""" + instrument = self._pipette_handler.get_pipette(OT3Mount.LEFT) + tip_presence_check_target = instrument.tip_presence_check_dist_mm + + # if position is not known, home gear motors before any potential movement + if self._backend.gear_motor_position is None: + await self.home_gear_motors() + + tip_motor_pos_float = self._backend.gear_motor_position or 0.0 + + # only move tip motors if they are not already below the sensor + if tip_motor_pos_float < tip_presence_check_target: + await self._backend.tip_action( + origin={Axis.Q: tip_motor_pos_float}, + targets=[({Axis.Q: tip_presence_check_target}, 400)], + ) + try: + yield + finally: + await self.home_gear_motors() + + async def get_tip_presence_status( + self, + mount: Union[top_types.Mount, OT3Mount], + ) -> TipStateType: + """ + Check tip presence status. If a high throughput pipette is present, + move the tip motors down before checking the sensor status. + """ + async with self._motion_lock: + real_mount = OT3Mount.from_mount(mount) + async with contextlib.AsyncExitStack() as stack: + if ( + real_mount == OT3Mount.LEFT + and self._gantry_load == GantryLoad.HIGH_THROUGHPUT + ): + await stack.enter_async_context(self._high_throughput_check_tip()) + result = await self._backend.get_tip_status(real_mount) + return result + + async def verify_tip_presence( + self, mount: Union[top_types.Mount, OT3Mount], expected: TipStateType + ) -> None: + real_mount = OT3Mount.from_mount(mount) + status = await self.get_tip_presence_status(real_mount) + if status != expected: + raise FailedTipStateCheck(expected, status.value) + async def _force_pick_up_tip( - self, mount: OT3Mount, pipette_spec: PickUpTipSpec + self, mount: OT3Mount, pipette_spec: TipActionSpec ) -> None: - for press in pipette_spec.presses: - async with self._backend.restore_current(): - await self._backend.set_active_current( - {axis: current for axis, current in press.current.items()} - ) + for press in pipette_spec.tip_action_moves: + async with self._backend.motor_current(run_currents=press.currents): target_down = target_position_from_relative( - mount, press.relative_down, self._current_position + mount, top_types.Point(z=press.distance), self._current_position ) await self._move(target_down, speed=press.speed, expect_stalls=True) - # we expect a stall has happened during pick up, so we want to - # update the motor estimation - await self._update_position_estimation([Axis.by_mount(mount)]) - target_up = target_position_from_relative( - mount, press.relative_up, self._current_position - ) - await self._move(target_up) + if press.distance < 0: + # we expect a stall has happened during a downward movement into the tiprack, so + # we want to update the motor estimation + await self._update_position_estimation([Axis.by_mount(mount)]) - async def _motor_pick_up_tip( - self, mount: OT3Mount, pipette_spec: TipMotorPickUpTipSpec + async def _tip_motor_action( + self, mount: OT3Mount, pipette_spec: List[TipActionMoveSpec] ) -> None: - async with self._backend.restore_current(): - await self._backend.set_active_current( - {axis: current for axis, current in pipette_spec.currents.items()} - ) - # Move to pick up position - target_down = target_position_from_relative( - mount, - pipette_spec.tiprack_down, - self._current_position, - ) - await self._move(target_down) - # check if position is known before pick up tip - if not any(self._backend.gear_motor_position): + # currents should be the same for each move in tip motor pickup + assert [move.currents == pipette_spec[0].currents for move in pipette_spec] + currents = pipette_spec[0].currents + # Move to pickup position + async with self._backend.motor_current(run_currents=currents): + if self._backend.gear_motor_position is None: # home gear motor if position not known await self.home_gear_motors() - pipette_axis = Axis.of_main_tool_actuator(mount) - gear_origin_float = axis_convert(self._backend.gear_motor_position, 0.0)[ - pipette_axis + gear_origin_float = self._backend.gear_motor_position or 0.0 + + move_targets = [ + ({Axis.Q: move_segment.distance}, move_segment.speed or 400) + for move_segment in pipette_spec ] - clamp_move_target = pipette_spec.pick_up_distance - clamp_moves = self._build_moves( - {Axis.Q: gear_origin_float}, {Axis.Q: clamp_move_target} + await self._backend.tip_action( + origin={Axis.Q: gear_origin_float}, targets=move_targets ) - await self._backend.tip_action(moves=clamp_moves[0]) - await self.home_gear_motors() async def pick_up_tip( @@ -1931,36 +2108,49 @@ async def pick_up_tip( ) -> None: """Pick up tip from current location.""" realmount = OT3Mount.from_mount(mount) - spec, _add_tip_to_instrs = self._pipette_handler.plan_check_pick_up_tip( - realmount, tip_length, presses, increment - ) + instrument = self._pipette_handler.get_pipette(realmount) + + def add_tip_to_instr() -> None: + instrument.add_tip(tip_length=tip_length) + instrument.set_current_volume(0) await self._move_to_plunger_bottom(realmount, rate=1.0) - if spec.pick_up_motor_actions: - await self._motor_pick_up_tip(realmount, spec.pick_up_motor_actions) + if ( + self.gantry_load == GantryLoad.HIGH_THROUGHPUT + and instrument.nozzle_manager.current_configuration.configuration + == NozzleConfigurationType.FULL + ): + spec = self._pipette_handler.plan_ht_pick_up_tip( + instrument.nozzle_manager.current_configuration.tip_count + ) + if spec.z_distance_to_tiprack: + await self.move_rel( + realmount, top_types.Point(z=spec.z_distance_to_tiprack) + ) + await self._tip_motor_action(realmount, spec.tip_action_moves) else: + spec = self._pipette_handler.plan_lt_pick_up_tip( + realmount, + instrument.nozzle_manager.current_configuration.tip_count, + presses, + increment, + ) await self._force_pick_up_tip(realmount, spec) # neighboring tips tend to get stuck in the space between # the volume chamber and the drop-tip sleeve on p1000. # This extra shake ensures those tips are removed - for rel_point, speed in spec.shake_off_list: + for rel_point, speed in spec.shake_off_moves: await self.move_rel(realmount, rel_point, speed=speed) # fixme: really only need this during labware position check so user # can verify if a tip is properly attached - await self.move_rel(realmount, top_types.Point(z=spec.retract_target)) - - # TODO: implement tip-detection sequence during pick-up-tip for 96ch, - # but not with DVT pipettes because those can only detect drops - - if ( - self.gantry_load != GantryLoad.HIGH_THROUGHPUT - and ff.tip_presence_detection_enabled() - ): - await self._backend.check_for_tip_presence(realmount, TipStateType.PRESENT) + if spec.ending_z_retract_distance: + await self.move_rel( + realmount, top_types.Point(z=spec.ending_z_retract_distance) + ) - _add_tip_to_instrs() + add_tip_to_instr() if prep_after: await self.prepare_for_aspirate(realmount) @@ -1990,56 +2180,39 @@ async def drop_tip( ) -> None: """Drop tip at the current location.""" realmount = OT3Mount.from_mount(mount) - spec, _remove = self._pipette_handler.plan_check_drop_tip(realmount, home_after) - - for move in spec.drop_moves: - await self._backend.set_active_current(move.current) - - if move.is_ht_tip_action and move.speed: - # The speed check is needed because speed can sometimes be None. - # Not sure why - if not any(self._backend.gear_motor_position): - # home gear motor if position not known - await self.home_gear_motors() - - gear_start_position = axis_convert( - self._backend.gear_motor_position, 0.0 - )[Axis.P_L] - drop_moves = self._build_moves( - {Axis.Q: gear_start_position}, {Axis.Q: move.target_position} - ) - await self._backend.tip_action(moves=drop_moves[0]) + instrument = self._pipette_handler.get_pipette(realmount) - await self.home_gear_motors() + def _remove_tips() -> None: + instrument.set_current_volume(0) + instrument.current_tiprack_diameter = 0.0 + instrument.remove_tip() - else: - target_pos = target_position_from_plunger( - realmount, move.target_position, self._current_position - ) - await self._move( - target_pos, - speed=move.speed, - home_flagged_axes=False, - ) - if move.home_after: - await self._home(move.home_axes) + await self._move_to_plunger_bottom(realmount, rate=1.0, check_current_vol=False) - for shake in spec.shake_moves: - await self.move_rel(mount, shake[0], speed=shake[1]) + if self.gantry_load == GantryLoad.HIGH_THROUGHPUT: + spec = self._pipette_handler.plan_ht_drop_tip() + await self._tip_motor_action(realmount, spec.tip_action_moves) + else: + spec = self._pipette_handler.plan_lt_drop_tip(realmount) + for move in spec.tip_action_moves: + async with self._backend.motor_current(move.currents): + target_pos = target_position_from_plunger( + realmount, move.distance, self._current_position + ) + await self._move( + target_pos, + speed=move.speed, + home_flagged_axes=False, + ) - await self._backend.set_active_current(spec.ending_current) - # TODO: implement tip-detection sequence during drop-tip for 96ch - if ( - self.gantry_load != GantryLoad.HIGH_THROUGHPUT - and ff.tip_presence_detection_enabled() - ): - await self._backend.check_for_tip_presence(realmount, TipStateType.ABSENT) + for shake in spec.shake_off_moves: + await self.move_rel(mount, shake[0], speed=shake[1]) # home mount axis if home_after: await self._home([Axis.by_mount(mount)]) - _remove() + _remove_tips() async def clean_up(self) -> None: """Get the API ready to stop cleanly.""" @@ -2092,13 +2265,16 @@ def get_attached_instruments(self) -> Dict[top_types.Mount, PipetteDict]: return self.get_attached_pipettes() async def get_instrument_state( - self, mount: Union[top_types.Mount, OT3Mount] + self, + mount: Union[top_types.Mount, OT3Mount], ) -> PipetteStateDict: # TODO we should have a PipetteState that can be returned from # this function with additional state (such as critical points) realmount = OT3Mount.from_mount(mount) - res = await self._backend.get_tip_present_state(realmount) - pipette_state_for_mount: PipetteStateDict = {"tip_detected": res} + tip_attached = self._backend.current_tip_state(realmount) + pipette_state_for_mount: PipetteStateDict = { + "tip_detected": tip_attached if tip_attached is not None else False + } return pipette_state_for_mount def reset_instrument( @@ -2114,7 +2290,7 @@ def reset_instrument( self._pipette_handler.reset_instrument(checked_mount) def get_instrument_offset( - self, mount: OT3Mount + self, mount: Union[top_types.Mount, OT3Mount] ) -> Union[GripperCalibrationOffset, PipetteOffsetSummary, None]: """Get instrument calibration data.""" # TODO (spp, 2023-04-19): We haven't introduced a 'calibration_offset' key in @@ -2123,11 +2299,13 @@ def get_instrument_offset( # to be a part of the dict, this getter can be updated to fetch pipette offset # from the dict, or just remove this getter entirely. - if mount == OT3Mount.GRIPPER: + ot3_mount = OT3Mount.from_mount(mount) + + if ot3_mount == OT3Mount.GRIPPER: gripper_dict = self._gripper_handler.get_gripper_dict() return gripper_dict["calibration_offset"] if gripper_dict else None else: - return self._pipette_handler.get_instrument_offset(mount=mount) + return self._pipette_handler.get_instrument_offset(mount=ot3_mount) async def reset_instrument_offset( self, mount: Union[top_types.Mount, OT3Mount], to_default: bool = True @@ -2159,11 +2337,15 @@ async def save_module_offset( self._log.warning(f"Could not save calibration: unknown module {module_id}") return None # TODO (ba, 2023-03-22): gripper_id and pipette_id should probably be combined to instrument_id - instrument_id = None - if self._gripper_handler.has_gripper(): - instrument_id = self._gripper_handler.get_gripper().gripper_id - elif self._pipette_handler.has_pipette(mount): + if self._pipette_handler.has_pipette(mount): instrument_id = self._pipette_handler.get_pipette(mount).pipette_id + elif mount == OT3Mount.GRIPPER and self._gripper_handler.has_gripper(): + instrument_id = self._gripper_handler.get_gripper().gripper_id + else: + self._log.warning( + f"Could not save calibration: no instrument found for {mount}" + ) + return None module_type = module.MODULE_TYPE self._log.info( f"Saving module offset: {offset} for module {module_type.name} {module_id}." @@ -2262,7 +2444,42 @@ def get_instrument_max_height( OT3Mount.from_mount(mount), carriage_pos, critical_point ) - return pos_at_home[Axis.by_mount(mount)] - self._config.z_retract_distance + return pos_at_home[Axis.by_mount(mount)] + + async def update_nozzle_configuration_for_mount( + self, + mount: Union[top_types.Mount, OT3Mount], + back_left_nozzle: Optional[str] = None, + front_right_nozzle: Optional[str] = None, + starting_nozzle: Optional[str] = None, + ) -> None: + """ + The expectation of this function is that the back_left_nozzle/front_right_nozzle are the two corners + of a rectangle of nozzles. A call to this function that does not follow that schema will result + in an error. + + :param mount: A robot mount that the instrument is on. + :param back_left_nozzle: A string representing a nozzle name of the form such as 'A1'. + :param front_right_nozzle: A string representing a nozzle name of the form such as 'A1'. + :param starting_nozzle: A string representing the starting nozzle which will be used as the critical point + of the pipette nozzle configuration. By default, the back left nozzle will be the starting nozzle if + none is provided. + :return: None. + + If none of the nozzle parameters are provided, the nozzle configuration will be reset to default. + """ + if not back_left_nozzle and not front_right_nozzle and not starting_nozzle: + await self._pipette_handler.reset_nozzle_configuration( + OT3Mount.from_mount(mount) + ) + else: + assert back_left_nozzle and front_right_nozzle + await self._pipette_handler.update_nozzle_configuration( + OT3Mount.from_mount(mount), + back_left_nozzle, + front_right_nozzle, + starting_nozzle, + ) async def add_tip( self, mount: Union[top_types.Mount, OT3Mount], tip_length: float @@ -2304,7 +2521,7 @@ async def liquid_probe( checked_mount = OT3Mount.from_mount(mount) instrument = self._pipette_handler.get_pipette(checked_mount) self._pipette_handler.ready_for_tip_action( - instrument, HardwareAction.LIQUID_PROBE + instrument, HardwareAction.LIQUID_PROBE, checked_mount ) if not probe_settings: @@ -2352,30 +2569,7 @@ async def capacitive_probe( pass_settings: CapacitivePassSettings, retract_after: bool = True, probe: Optional[InstrumentProbeType] = None, - ) -> float: - """Determine the position of something using the capacitive sensor. - - This function orchestrates detecting the position of a collision between the - capacitive probe on the tool on the specified mount, and some fixed element - of the robot. - - When calling this function, the mount's probe critical point should already - be aligned in the probe axis with the item to be probed. - - It will move the mount's probe critical point to a small distance behind - the expected position of the element (which is target_pos, in deck coordinates, - in the axis to be probed) while running the tool's capacitive sensor. When the - sensor senses contact, the mount stops. - - This function moves away and returns the sensed position. - - This sensed position can be used in several ways, including - - To get an absolute position in deck coordinates of whatever was - targeted, if something was guaranteed to be physically present. - - To detect whether a collision occured at all. If this function - returns a value far enough past the anticipated position, then it indicates - there was no material there. - """ + ) -> Tuple[float, bool]: if moving_axis not in [ Axis.X, Axis.Y, @@ -2413,7 +2607,7 @@ async def capacitive_probe( else: # default to primary (rear) probe probe = InstrumentProbeType.PRIMARY - await self._backend.capacitive_probe( + contact = await self._backend.capacitive_probe( mount, moving_axis, machine_pass_distance, @@ -2424,7 +2618,7 @@ async def capacitive_probe( end_pos = await self.gantry_position(mount, refresh=True) if retract_after: await self.move_to(mount, pass_start_pos) - return moving_axis.of_point(end_pos) + return moving_axis.of_point(end_pos), contact async def capacitive_sweep( self, @@ -2480,22 +2674,14 @@ def attached_subsystems(self) -> Dict[SubSystem, SubSystemState]: @property def estop_status(self) -> EstopOverallStatus: - return EstopOverallStatus( - state=self._backend.estop_state_machine.state, - left_physical_state=self._backend.estop_state_machine.get_physical_status( - EstopAttachLocation.LEFT - ), - right_physical_state=self._backend.estop_state_machine.get_physical_status( - EstopAttachLocation.RIGHT - ), - ) + return self._backend.estop_status def estop_acknowledge_and_clear(self) -> EstopOverallStatus: """Attempt to acknowledge an Estop event and clear the status. Returns the estop status after clearing the status.""" - self._backend.estop_state_machine.acknowledge_and_clear() + self._backend.estop_acknowledge_and_clear() return self.estop_status def get_estop_state(self) -> EstopState: - return self._backend.estop_state_machine.state + return self._backend.get_estop_state() diff --git a/api/src/opentrons/hardware_control/poller.py b/api/src/opentrons/hardware_control/poller.py index 7b9684e38ff..27224bebaef 100644 --- a/api/src/opentrons/hardware_control/poller.py +++ b/api/src/opentrons/hardware_control/poller.py @@ -3,6 +3,7 @@ import logging from abc import ABC, abstractmethod from typing import AsyncGenerator, List, Optional +from opentrons_shared_data.errors.exceptions import ModuleCommunicationError log = logging.getLogger(__name__) @@ -48,6 +49,8 @@ async def stop(self) -> None: async with self._use_read_lock(): task.cancel() await asyncio.gather(task, return_exceptions=True) + for waiter in self._poll_waiters: + waiter.cancel(msg="Module was removed") async def wait_next_poll(self) -> None: """Wait for the next poll to complete. @@ -56,6 +59,9 @@ async def wait_next_poll(self) -> None: the next complete read. If a read raises an exception, it will be passed through to `wait_next_poll`. """ + if not self._poll_forever_task or self._poll_forever_task.done(): + raise ModuleCommunicationError(message="Module was removed") + poll_future = asyncio.get_running_loop().create_future() self._poll_waiters.append(poll_future) await poll_future @@ -73,6 +79,15 @@ async def _poll_forever(self) -> None: await self._poll_once() await asyncio.sleep(self.interval) + @staticmethod + def _set_waiter_complete( + waiter: "asyncio.Future[None]", e: Optional[Exception] = None + ) -> None: + try: + waiter.set_result(None) if e is None else waiter.set_exception(e) + except asyncio.InvalidStateError: + log.warning("Poller waiter was already cancelled") + async def _poll_once(self) -> None: """Trigger a single read, notifying listeners of success or error.""" previous_waiters = self._poll_waiters @@ -87,7 +102,7 @@ async def _poll_once(self) -> None: log.exception("Polling exception") self._reader.on_error(e) for waiter in previous_waiters: - waiter.set_exception(e) + Poller._set_waiter_complete(waiter, e) else: for waiter in previous_waiters: - waiter.set_result(None) + Poller._set_waiter_complete(waiter) diff --git a/api/src/opentrons/hardware_control/protocols/__init__.py b/api/src/opentrons/hardware_control/protocols/__init__.py index d4250a5d589..e47b54dba2c 100644 --- a/api/src/opentrons/hardware_control/protocols/__init__.py +++ b/api/src/opentrons/hardware_control/protocols/__init__.py @@ -1,12 +1,14 @@ """Typing protocols describing a hardware controller.""" -from typing_extensions import Protocol +from typing_extensions import Protocol, Type + +from opentrons.hardware_control.types import Axis from .module_provider import ModuleProvider from .hardware_manager import HardwareManager from .chassis_accessory_manager import ChassisAccessoryManager from .event_sourcer import EventSourcer from .liquid_handler import LiquidHandler -from .calibratable import Calibratable, CalibrationType +from .calibratable import Calibratable from .configurable import Configurable from .motion_controller import MotionController from .instrument_configurer import InstrumentConfigurer @@ -14,18 +16,31 @@ from .asyncio_configurable import AsyncioConfigurable from .stoppable import Stoppable from .simulatable import Simulatable +from .identifiable import Identifiable +from .gripper_controller import GripperController +from .flex_calibratable import FlexCalibratable +from .flex_instrument_configurer import FlexInstrumentConfigurer + +from .types import ( + CalibrationType, + MountArgType, + ConfigType, + OT2RobotType, + FlexRobotType, +) class HardwareControlInterface( ModuleProvider, ExecutionControllable, - LiquidHandler[CalibrationType], + LiquidHandler[CalibrationType, MountArgType, ConfigType], ChassisAccessoryManager, HardwareManager, AsyncioConfigurable, Stoppable, Simulatable, - Protocol[CalibrationType], + Identifiable[Type[OT2RobotType]], + Protocol[CalibrationType, MountArgType, ConfigType], ): """A mypy protocol for a hardware controller. @@ -41,11 +56,44 @@ class HardwareControlInterface( however, they can satisfy protocols. """ - ... + def get_robot_type(self) -> Type[OT2RobotType]: + return OT2RobotType + + +class FlexHardwareControlInterface( + ModuleProvider, + ExecutionControllable, + LiquidHandler[CalibrationType, MountArgType, ConfigType], + ChassisAccessoryManager, + HardwareManager, + AsyncioConfigurable, + Stoppable, + Simulatable, + GripperController, + FlexCalibratable, + FlexInstrumentConfigurer[MountArgType], + Identifiable[Type[FlexRobotType]], + Protocol[CalibrationType, MountArgType, ConfigType], +): + """A mypy protocol for a hardware controller with Flex-specific extensions. + + The interface for the Flex controller is mostly in-line with the OT-2 interface, + with some additional functionality and parameterization not supported on the OT-2. + """ + + def get_robot_type(self) -> Type[FlexRobotType]: + return FlexRobotType + + def motor_status_ok(self, axis: Axis) -> bool: + ... + + def encoder_status_ok(self, axis: Axis) -> bool: + ... __all__ = [ "HardwareControlAPI", + "FlexHardwareControlInterface", "Simulatable", "Stoppable", "AsyncioConfigurable", @@ -59,4 +107,6 @@ class HardwareControlInterface( "ChassisAccessoryManager", "HardwareManager", "ModuleProvider", + "Identifiable", + "FlexCalibratable", ] diff --git a/api/src/opentrons/hardware_control/protocols/calibratable.py b/api/src/opentrons/hardware_control/protocols/calibratable.py index 8c8bb65be42..530765d8249 100644 --- a/api/src/opentrons/hardware_control/protocols/calibratable.py +++ b/api/src/opentrons/hardware_control/protocols/calibratable.py @@ -1,10 +1,8 @@ from typing_extensions import Protocol -from typing import TypeVar +from .types import CalibrationType from ..util import DeckTransformState -CalibrationType = TypeVar("CalibrationType") - class Calibratable(Protocol[CalibrationType]): """Protocol specifying calibration information""" diff --git a/api/src/opentrons/hardware_control/protocols/configurable.py b/api/src/opentrons/hardware_control/protocols/configurable.py index 5bf7486620f..8e880d524ad 100644 --- a/api/src/opentrons/hardware_control/protocols/configurable.py +++ b/api/src/opentrons/hardware_control/protocols/configurable.py @@ -1,29 +1,39 @@ -from typing import Union, Dict, Any +from typing import Dict, Any from typing_extensions import Protocol -from opentrons.config.types import RobotConfig, OT3Config +from .types import ConfigType +from opentrons.hardware_control.types import HardwareFeatureFlags -class Configurable(Protocol): +class Configurable(Protocol[ConfigType]): """Protocol specifying hardware control configuration.""" - def get_config(self) -> Union[RobotConfig, OT3Config]: + def get_config(self) -> ConfigType: """Get the robot's configuration object. :returns .RobotConfig: The object. """ ... - def set_config(self, config: Union[RobotConfig, OT3Config]) -> None: + def set_config(self, config: ConfigType) -> None: """Replace the currently-loaded config""" ... @property - def config(self) -> Union[RobotConfig, OT3Config]: + def hardware_feature_flags(self) -> HardwareFeatureFlags: + ... + + @hardware_feature_flags.setter + def hardware_feature_flags(self, feature_flags: HardwareFeatureFlags) -> None: + """Replace the currently-configured hardware feature flags.""" + ... + + @property + def config(self) -> ConfigType: ... @config.setter - def config(self, config: Union[RobotConfig, OT3Config]) -> None: + def config(self, config: ConfigType) -> None: ... async def update_config(self, **kwargs: Dict[str, Any]) -> None: diff --git a/api/src/opentrons/hardware_control/protocols/flex_calibratable.py b/api/src/opentrons/hardware_control/protocols/flex_calibratable.py new file mode 100644 index 00000000000..d424f3bc654 --- /dev/null +++ b/api/src/opentrons/hardware_control/protocols/flex_calibratable.py @@ -0,0 +1,99 @@ +from typing import Optional, Tuple, List, AsyncIterator, Union +import contextlib +from typing_extensions import Protocol + +from opentrons import types as top_types +from opentrons.config.types import ( + CapacitivePassSettings, +) +from opentrons.hardware_control.types import ( + Axis, + OT3Mount, + InstrumentProbeType, + GripperProbe, +) +from opentrons.hardware_control.instruments.ot3.instrument_calibration import ( + GripperCalibrationOffset, + PipetteOffsetSummary, +) +from opentrons.hardware_control.modules.module_calibration import ( + ModuleCalibrationOffset, +) + + +class FlexCalibratable(Protocol): + """Calibration extensions for Flex hardware.""" + + async def capacitive_probe( + self, + mount: OT3Mount, + moving_axis: Axis, + target_pos: float, + pass_settings: CapacitivePassSettings, + retract_after: bool = True, + probe: Optional[InstrumentProbeType] = None, + ) -> Tuple[float, bool]: + """Determine the position of something using the capacitive sensor. + + This function orchestrates detecting the position of a collision between the + capacitive probe on the tool on the specified mount, and some fixed element + of the robot. + + When calling this function, the mount's probe critical point should already + be aligned in the probe axis with the item to be probed. + + It will move the mount's probe critical point to a small distance behind + the expected position of the element (which is target_pos, in deck coordinates, + in the axis to be probed) while running the tool's capacitive sensor. When the + sensor senses contact, the mount stops. + + This function moves away and returns the sensed position. + + This sensed position can be used in several ways, including + - To get an absolute position in deck coordinates of whatever was + targeted, if something was guaranteed to be physically present. + - To detect whether a collision occured at all. If this function + returns a value far enough past the anticipated position, then it indicates + there was no material there. + """ + ... + + async def capacitive_sweep( + self, + mount: OT3Mount, + moving_axis: Axis, + begin: top_types.Point, + end: top_types.Point, + speed_mm_s: float, + ) -> List[float]: + ... + + # Note that there is a default implementation of this function to allow for + # the asynccontextmanager decorator to propagate properly. + @contextlib.asynccontextmanager + async def restore_system_constrants(self) -> AsyncIterator[None]: + yield + + async def set_system_constraints_for_calibration(self) -> None: + ... + + async def reset_instrument_offset( + self, mount: Union[top_types.Mount, OT3Mount], to_default: bool = True + ) -> None: + ... + + def add_gripper_probe(self, probe: GripperProbe) -> None: + ... + + def remove_gripper_probe(self) -> None: + ... + + async def save_instrument_offset( + self, mount: Union[top_types.Mount, OT3Mount], delta: top_types.Point + ) -> Union[GripperCalibrationOffset, PipetteOffsetSummary]: + ... + + async def save_module_offset( + self, module_id: str, mount: OT3Mount, slot: str, offset: top_types.Point + ) -> Optional[ModuleCalibrationOffset]: + ... diff --git a/api/src/opentrons/hardware_control/protocols/flex_instrument_configurer.py b/api/src/opentrons/hardware_control/protocols/flex_instrument_configurer.py new file mode 100644 index 00000000000..0606b8847f4 --- /dev/null +++ b/api/src/opentrons/hardware_control/protocols/flex_instrument_configurer.py @@ -0,0 +1,48 @@ +"""Flex-specific extensions to instrument configuration.""" +from typing import Union +from typing_extensions import Protocol + +from .types import MountArgType + +from opentrons.hardware_control.dev_types import ( + PipetteStateDict, +) +from opentrons.hardware_control.types import ( + TipStateType, +) +from opentrons.hardware_control.instruments.ot3.instrument_calibration import ( + PipetteOffsetSummary, + GripperCalibrationOffset, +) + + +class FlexInstrumentConfigurer(Protocol[MountArgType]): + """A protocol specifying Flex-specific extensions to instrument configuration.""" + + async def get_instrument_state( + self, + mount: MountArgType, + ) -> PipetteStateDict: + ... + + def get_instrument_offset( + self, mount: MountArgType + ) -> Union[GripperCalibrationOffset, PipetteOffsetSummary, None]: + ... + + async def get_tip_presence_status( + self, + mount: MountArgType, + ) -> TipStateType: + """Check tip presence status. + + If a high throughput pipette is present, + move the tip motors down before checking the sensor status. + """ + ... + + async def verify_tip_presence( + self, mount: MountArgType, expected: TipStateType + ) -> None: + """Check tip presence status and raise if it does not match `expected`.""" + ... diff --git a/api/src/opentrons/hardware_control/protocols/gripper_controller.py b/api/src/opentrons/hardware_control/protocols/gripper_controller.py new file mode 100644 index 00000000000..fc81325193c --- /dev/null +++ b/api/src/opentrons/hardware_control/protocols/gripper_controller.py @@ -0,0 +1,52 @@ +"""Protocol specifying API gripper control.""" +from typing import Optional +from typing_extensions import Protocol + +from opentrons.hardware_control.dev_types import GripperDict +from opentrons.hardware_control.instruments.ot3.gripper import Gripper + + +class GripperController(Protocol): + """A protocol specifying gripper API functions.""" + + async def grip( + self, force_newtons: Optional[float] = None, stay_engaged: bool = True + ) -> None: + ... + + async def ungrip(self, force_newtons: Optional[float] = None) -> None: + """Release gripped object. + + To simply open the jaw, use `home_gripper_jaw` instead. + """ + ... + + async def idle_gripper(self) -> None: + """Move gripper to its idle, gripped position.""" + ... + + def gripper_jaw_can_home(self) -> bool: + """Check if it is valid to home the gripper jaw. + + This should return False if the API believes that the gripper is + currently holding something. + """ + ... + + def raise_error_if_gripper_pickup_failed( + self, + expected_grip_width: float, + grip_width_uncertainty_wider: float, + grip_width_uncertainty_narrower: float, + ) -> None: + """Ensure that a gripper pickup succeeded.""" + + @property + def attached_gripper(self) -> Optional[GripperDict]: + """Get a dict of all attached grippers.""" + ... + + @property + def hardware_gripper(self) -> Optional[Gripper]: + """Get attached gripper, if present.""" + ... diff --git a/api/src/opentrons/hardware_control/protocols/hardware_manager.py b/api/src/opentrons/hardware_control/protocols/hardware_manager.py index 2227c792c74..ee0228ae3b8 100644 --- a/api/src/opentrons/hardware_control/protocols/hardware_manager.py +++ b/api/src/opentrons/hardware_control/protocols/hardware_manager.py @@ -1,4 +1,4 @@ -from typing import Dict +from typing import Dict, Optional from typing_extensions import Protocol from ..types import SubSystem, SubSystemState @@ -41,3 +41,7 @@ def attached_subsystems(self) -> Dict[SubSystem, SubSystemState]: whether or not the hardware is operating properly. """ ... + + async def get_serial_number(self) -> Optional[str]: + """Get the robot serial number, if provisioned. If not provisioned, will be None.""" + ... diff --git a/api/src/opentrons/hardware_control/protocols/identifiable.py b/api/src/opentrons/hardware_control/protocols/identifiable.py new file mode 100644 index 00000000000..4e964f5633f --- /dev/null +++ b/api/src/opentrons/hardware_control/protocols/identifiable.py @@ -0,0 +1,16 @@ +from typing_extensions import Protocol + +from .types import ProtocolRobotType + + +class Identifiable(Protocol[ProtocolRobotType]): + """Protocol specifying support for hardware identification.""" + + def get_robot_type(self) -> ProtocolRobotType: + """Return the enumerated robot type that this API controls. + + When a caller needs to determine whether an API function is expected + to be present on a hardware_control instance, it is preferable to check + with this function rather than check the exact type via `isinstance`. + """ + ... diff --git a/api/src/opentrons/hardware_control/protocols/instrument_configurer.py b/api/src/opentrons/hardware_control/protocols/instrument_configurer.py index b4b95627321..810caad667b 100644 --- a/api/src/opentrons/hardware_control/protocols/instrument_configurer.py +++ b/api/src/opentrons/hardware_control/protocols/instrument_configurer.py @@ -3,6 +3,7 @@ from opentrons_shared_data.pipette.dev_types import PipetteName from opentrons.types import Mount +from .types import MountArgType # TODO (lc 12-05-2022) This protocol has deviated from the OT3 api. We # need to figure out how to combine them again in follow-up refactors. @@ -11,10 +12,10 @@ from ..types import CriticalPoint -class InstrumentConfigurer(Protocol): +class InstrumentConfigurer(Protocol[MountArgType]): """A protocol specifying how to interact with instrument presence and detection.""" - def reset_instrument(self, mount: Optional[Mount] = None) -> None: + def reset_instrument(self, mount: Optional[MountArgType] = None) -> None: """ Reset the internal state of a pipette by its mount, without doing any lower level reconfiguration. This is useful to make sure that no @@ -66,7 +67,7 @@ def get_attached_instruments(self) -> Dict[Mount, PipetteDict]: """ ... - def get_attached_instrument(self, mount: Mount) -> PipetteDict: + def get_attached_instrument(self, mount: MountArgType) -> PipetteDict: """Get the status dict of a single cached instrument. Return values and caveats are as get_attached_instruments. @@ -77,9 +78,21 @@ def get_attached_instrument(self, mount: Mount) -> PipetteDict: def attached_instruments(self) -> Dict[Mount, PipetteDict]: return self.get_attached_instruments() + def get_attached_pipettes(self) -> Dict[Mount, PipetteDict]: + """Get the status dicts of cached attached pipettes. + + Works like get_attached_instruments but for pipettes only - on the Flex, + there will be no gripper information here. + """ + ... + + @property + def attached_pipettes(self) -> Dict[Mount, PipetteDict]: + return self.get_attached_pipettes() + def calibrate_plunger( self, - mount: Mount, + mount: MountArgType, top: Optional[float] = None, bottom: Optional[float] = None, blow_out: Optional[float] = None, @@ -100,7 +113,7 @@ def calibrate_plunger( def set_flow_rate( self, - mount: Mount, + mount: MountArgType, aspirate: Optional[float] = None, dispense: Optional[float] = None, blow_out: Optional[float] = None, @@ -110,7 +123,7 @@ def set_flow_rate( def set_pipette_speed( self, - mount: Mount, + mount: MountArgType, aspirate: Optional[float] = None, dispense: Optional[float] = None, blow_out: Optional[float] = None, @@ -120,7 +133,7 @@ def set_pipette_speed( def get_instrument_max_height( self, - mount: Mount, + mount: MountArgType, critical_point: Optional[CriticalPoint] = None, ) -> float: """Return max achievable height of the attached instrument @@ -128,7 +141,7 @@ def get_instrument_max_height( """ ... - async def add_tip(self, mount: Mount, tip_length: float) -> None: + async def add_tip(self, mount: MountArgType, tip_length: float) -> None: """Inform the hardware that a tip is now attached to a pipette. This changes the critical point of the pipette to make sure that @@ -136,7 +149,7 @@ async def add_tip(self, mount: Mount, tip_length: float) -> None: """ ... - async def remove_tip(self, mount: Mount) -> None: + async def remove_tip(self, mount: MountArgType) -> None: """Inform the hardware that a tip is no longer attached to a pipette. This changes the critical point of the system to the end of the @@ -145,7 +158,7 @@ async def remove_tip(self, mount: Mount) -> None: ... def set_current_tiprack_diameter( - self, mount: Mount, tiprack_diameter: float + self, mount: MountArgType, tiprack_diameter: float ) -> None: """Inform the hardware of the diameter of the tiprack. @@ -154,7 +167,7 @@ def set_current_tiprack_diameter( """ ... - def set_working_volume(self, mount: Mount, tip_volume: float) -> None: + def set_working_volume(self, mount: MountArgType, tip_volume: float) -> None: """Inform the hardware how much volume a pipette can aspirate. This will set the limit of aspiration for the pipette, and is @@ -169,3 +182,12 @@ def hardware_instruments(self) -> Dict[Mount, Optional[Pipette]]: This should rarely be used. Do not write new code that uses it. """ ... + + def has_gripper(self) -> bool: + """Return whether there is a gripper attached to this instance. + + - On robots that do not support a gripper, this will always return False. + - On robots that support a gripper, this will return based on the current + presence of a gripper. + """ + ... diff --git a/api/src/opentrons/hardware_control/protocols/liquid_handler.py b/api/src/opentrons/hardware_control/protocols/liquid_handler.py index e25a25299ce..e55dbb88440 100644 --- a/api/src/opentrons/hardware_control/protocols/liquid_handler.py +++ b/api/src/opentrons/hardware_control/protocols/liquid_handler.py @@ -1,22 +1,46 @@ from typing import Optional from typing_extensions import Protocol -from opentrons.types import Mount +from .types import MountArgType, CalibrationType, ConfigType from .instrument_configurer import InstrumentConfigurer from .motion_controller import MotionController from .configurable import Configurable -from .calibratable import Calibratable, CalibrationType +from .calibratable import Calibratable class LiquidHandler( - InstrumentConfigurer, - MotionController, - Configurable, + InstrumentConfigurer[MountArgType], + MotionController[MountArgType], + Configurable[ConfigType], Calibratable[CalibrationType], - Protocol[CalibrationType], + Protocol[CalibrationType, MountArgType, ConfigType], ): - async def configure_for_volume(self, mount: Mount, volume: float) -> None: + async def update_nozzle_configuration_for_mount( + self, + mount: MountArgType, + back_left_nozzle: Optional[str], + front_right_nozzle: Optional[str], + starting_nozzle: Optional[str] = None, + ) -> None: + """ + The expectation of this function is that the back_left_nozzle/front_right_nozzle are the two corners + of a rectangle of nozzles. A call to this function that does not follow that schema will result + in an error. + + :param mount: A robot mount that the instrument is on. + :param back_left_nozzle: A string representing a nozzle name of the form such as 'A1'. + :param front_right_nozzle: A string representing a nozzle name of the form such as 'A1'. + :param starting_nozzle: A string representing the starting nozzle which will be used as the critical point + of the pipette nozzle configuration. By default, the back left nozzle will be the starting nozzle if + none is provided. + + If none of the nozzle parameters are provided, the nozzle configuration will be reset to default. + :return: None. + """ + ... + + async def configure_for_volume(self, mount: MountArgType, volume: float) -> None: """ Configure a pipette to handle the specified volume. @@ -29,7 +53,9 @@ async def configure_for_volume(self, mount: Mount, volume: float) -> None: """ ... - async def prepare_for_aspirate(self, mount: Mount, rate: float = 1.0) -> None: + async def prepare_for_aspirate( + self, mount: MountArgType, rate: float = 1.0 + ) -> None: """ Prepare the pipette for aspiration. @@ -51,7 +77,7 @@ async def prepare_for_aspirate(self, mount: Mount, rate: float = 1.0) -> None: async def aspirate( self, - mount: Mount, + mount: MountArgType, volume: Optional[float] = None, rate: float = 1.0, ) -> None: @@ -78,7 +104,7 @@ async def aspirate( async def dispense( self, - mount: Mount, + mount: MountArgType, volume: Optional[float] = None, rate: float = 1.0, push_out: Optional[float] = None, @@ -95,7 +121,9 @@ async def dispense( """ ... - async def blow_out(self, mount: Mount, volume: Optional[float] = None) -> None: + async def blow_out( + self, mount: MountArgType, volume: Optional[float] = None + ) -> None: """ Force any remaining liquid to dispense. The liquid will be dispensed at the current location of pipette @@ -104,7 +132,7 @@ async def blow_out(self, mount: Mount, volume: Optional[float] = None) -> None: async def pick_up_tip( self, - mount: Mount, + mount: MountArgType, tip_length: float, presses: Optional[int] = None, increment: Optional[float] = None, @@ -130,7 +158,7 @@ async def pick_up_tip( async def drop_tip( self, - mount: Mount, + mount: MountArgType, home_after: bool = True, ) -> None: """ diff --git a/api/src/opentrons/hardware_control/protocols/motion_controller.py b/api/src/opentrons/hardware_control/protocols/motion_controller.py index 8fbae1b9a1b..8387e4a907c 100644 --- a/api/src/opentrons/hardware_control/protocols/motion_controller.py +++ b/api/src/opentrons/hardware_control/protocols/motion_controller.py @@ -1,11 +1,12 @@ from typing import Dict, List, Optional, Mapping from typing_extensions import Protocol -from opentrons.types import Mount, Point +from opentrons.types import Point from ..types import Axis, CriticalPoint, MotionChecks +from .types import MountArgType -class MotionController(Protocol): +class MotionController(Protocol[MountArgType]): """Protocol specifying fundamental motion controls.""" async def halt(self, disengage_before_stopping: bool = False) -> None: @@ -44,13 +45,13 @@ async def reset(self) -> None: # Gantry/frame (i.e. not pipette) action API async def home_z( self, - mount: Optional[Mount] = None, + mount: Optional[MountArgType] = None, allow_home_other: bool = True, ) -> None: """Home a selected z-axis, or both if not specified.""" ... - async def home_plunger(self, mount: Mount) -> None: + async def home_plunger(self, mount: MountArgType) -> None: """ Home the plunger motor for a mount, and then return it to the 'bottom' position. @@ -69,7 +70,7 @@ async def home(self, axes: Optional[List[Axis]] = None) -> None: async def current_position( self, - mount: Mount, + mount: MountArgType, critical_point: Optional[CriticalPoint] = None, refresh: bool = False, # TODO(mc, 2021-11-15): combine with `refresh` for more reliable @@ -90,14 +91,14 @@ async def current_position( specified mount but `CriticalPoint.TIP` was specified, the position of the nozzle will be returned. - If `fail_on_not_homed` is `True`, this method will raise a `MustHomeError` + If `fail_on_not_homed` is `True`, this method will raise a `PositionUnknownError` if any of the relavent axes are not homed, regardless of `refresh`. """ ... async def gantry_position( self, - mount: Mount, + mount: MountArgType, critical_point: Optional[CriticalPoint] = None, refresh: bool = False, # TODO(mc, 2021-11-15): combine with `refresh` for more reliable @@ -114,7 +115,7 @@ async def gantry_position( async def move_to( self, - mount: Mount, + mount: MountArgType, abs_position: Point, speed: Optional[float] = None, critical_point: Optional[CriticalPoint] = None, @@ -173,7 +174,7 @@ async def move_axes( async def move_rel( self, - mount: Mount, + mount: MountArgType, delta: Point, speed: Optional[float] = None, max_speeds: Optional[Dict[Axis, float]] = None, @@ -186,7 +187,7 @@ async def move_rel( axes are to be moved, they will do so at the same speed. If fail_on_not_homed is True (default False), if an axis that is not - homed moves it will raise a MustHomeError. Otherwise, it will home the axis. + homed moves it will raise a PositionUnknownError. Otherwise, it will home the axis. """ ... @@ -203,7 +204,7 @@ async def disengage_axes(self, which: List[Axis]) -> None: """Disengage some axes.""" ... - async def retract(self, mount: Mount, margin: float = 10) -> None: + async def retract(self, mount: MountArgType, margin: float = 10) -> None: """Pull the specified mount up to its home position. Works regardless of critical point or home status. @@ -213,3 +214,19 @@ async def retract(self, mount: Mount, margin: float = 10) -> None: async def retract_axis(self, axis: Axis) -> None: """Retract the specified axis to its home position.""" ... + + def is_movement_execution_taskified(self) -> bool: + """Get whether move functions are being executed inside cancellable tasks.""" + ... + + def should_taskify_movement_execution(self, taskify: bool) -> None: + """Specify whether move functions should be executed inside cancellable tasks.""" + ... + + async def cancel_execution_and_running_tasks(self) -> None: + """Cancel all tasks and set execution manager state to Cancelled.""" + ... + + async def prepare_for_mount_movement(self, mount: MountArgType) -> None: + """Retract the other mount if necessary.""" + ... diff --git a/api/src/opentrons/hardware_control/protocols/types.py b/api/src/opentrons/hardware_control/protocols/types.py new file mode 100644 index 00000000000..bdd4a3799f4 --- /dev/null +++ b/api/src/opentrons/hardware_control/protocols/types.py @@ -0,0 +1,27 @@ +"""Types that are common across protocols.""" + +from typing import TypeVar, Union, Type +from opentrons.hardware_control.types import OT3Mount +from opentrons.types import Mount +from opentrons.config.types import RobotConfig, OT3Config + + +class OT2RobotType: + pass + + +class FlexRobotType: + pass + + +CalibrationType = TypeVar("CalibrationType") + +MountArgType = TypeVar( + "MountArgType", Mount, Union[OT3Mount, Mount], contravariant=True +) + +ConfigType = TypeVar("ConfigType", RobotConfig, OT3Config) + +ProtocolRobotType = TypeVar( + "ProtocolRobotType", Type[FlexRobotType], Type[OT2RobotType], covariant=True +) diff --git a/api/src/opentrons/hardware_control/robot_calibration.py b/api/src/opentrons/hardware_control/robot_calibration.py index 1c776bffbdc..270344fff2f 100644 --- a/api/src/opentrons/hardware_control/robot_calibration.py +++ b/api/src/opentrons/hardware_control/robot_calibration.py @@ -4,6 +4,7 @@ from datetime import datetime from dataclasses import dataclass from typing import Optional, List, Any, cast +from numpy.typing import NDArray from opentrons import config @@ -49,9 +50,9 @@ def validate_attitude_deck_calibration( TODO(lc, 8/10/2020): As with the OT2, expand on this method, or create another method to diagnose bad instrument offset data """ - curr_cal = np.array(deck_cal.attitude) + curr_cal: linal.DoubleMatrix = np.array(deck_cal.attitude) row, _ = curr_cal.shape - rank: int = np.linalg.matrix_rank(curr_cal) # type: ignore + rank: int = np.linalg.matrix_rank(curr_cal) if row != rank: # Check that the matrix is non-singular return DeckTransformState.SINGULARITY @@ -68,10 +69,10 @@ def validate_gantry_calibration(gantry_cal: List[List[float]]) -> DeckTransformS This function determines whether the gantry calibration is valid or not based on the following use-cases: """ - curr_cal = np.array(gantry_cal) + curr_cal: linal.DoubleMatrix = np.array(gantry_cal) row, _ = curr_cal.shape - rank: int = np.linalg.matrix_rank(curr_cal) # type: ignore + rank: int = np.linalg.matrix_rank(curr_cal) id_matrix = linal.identity_deck_transform() @@ -95,7 +96,7 @@ def validate_gantry_calibration(gantry_cal: List[List[float]]) -> DeckTransformS def migrate_affine_xy_to_attitude( gantry_cal: List[List[float]], ) -> types.AttitudeMatrix: - masked_transform = np.array( + masked_transform: NDArray[np.bool_] = np.array( [ [True, True, True, False], [True, True, True, False], @@ -108,7 +109,7 @@ def migrate_affine_xy_to_attitude( ] = np.ma.masked_array( # type: ignore gantry_cal, ~masked_transform ) - attitude_array = np.zeros((3, 3)) + attitude_array: linal.DoubleMatrix = np.zeros((3, 3)) np.put(attitude_array, [0, 1, 2], masked_array[0].compressed()) np.put(attitude_array, [3, 4, 5], masked_array[1].compressed()) np.put(attitude_array, 8, 1) diff --git a/api/src/opentrons/hardware_control/scripts/repl.py b/api/src/opentrons/hardware_control/scripts/repl.py index f2d1bf0d47c..1efbe0c2233 100644 --- a/api/src/opentrons/hardware_control/scripts/repl.py +++ b/api/src/opentrons/hardware_control/scripts/repl.py @@ -11,6 +11,7 @@ from logging.config import dictConfig from opentrons.hardware_control.api import API from opentrons.hardware_control.ot3api import OT3API +from opentrons.hardware_control.types import HardwareFeatureFlags update_firmware = True has_robot_server = True @@ -94,6 +95,7 @@ def build_thread_manager() -> ThreadManager[Union[API, OT3API]]: OT3API.build_hardware_controller, use_usb_bus=ff.rear_panel_integration(), update_firmware=update_firmware, + feature_flags=HardwareFeatureFlags.build_from_ff(), ) def wrap_async_util_fn(fn: Any, *bind_args: Any, **bind_kwargs: Any) -> Any: @@ -114,6 +116,7 @@ def build_thread_manager() -> ThreadManager[Union[API, OT3API]]: API.build_hardware_controller, use_usb_bus=ff.rear_panel_integration(), update_firmware=update_firmware, + feature_flags=HardwareFeatureFlags.build_from_ff(), ) diff --git a/api/src/opentrons/hardware_control/simulator_setup.py b/api/src/opentrons/hardware_control/simulator_setup.py index 4a210655af2..7c00821d293 100644 --- a/api/src/opentrons/hardware_control/simulator_setup.py +++ b/api/src/opentrons/hardware_control/simulator_setup.py @@ -10,7 +10,7 @@ from opentrons.config.types import RobotConfig, OT3Config from opentrons.types import Mount from opentrons.hardware_control import API, HardwareControlAPI, ThreadManager -from opentrons.hardware_control.types import OT3Mount +from opentrons.hardware_control.types import OT3Mount, HardwareFeatureFlags # Name and kwargs for a module function @@ -56,6 +56,7 @@ async def _simulator_for_setup( config=setup.config, strict_attached_instruments=setup.strict_attached_instruments, loop=loop, + feature_flags=HardwareFeatureFlags.build_from_ff(), ) else: from opentrons.hardware_control.ot3api import OT3API @@ -66,6 +67,7 @@ async def _simulator_for_setup( config=setup.config, strict_attached_instruments=setup.strict_attached_instruments, loop=loop, + feature_flags=HardwareFeatureFlags.build_from_ff(), ) @@ -100,6 +102,7 @@ def _thread_manager_for_setup( attached_modules=list(setup.attached_modules.keys()), config=setup.config, strict_attached_instruments=setup.strict_attached_instruments, + feature_flags=HardwareFeatureFlags.build_from_ff(), ) else: from opentrons.hardware_control.ot3api import OT3API @@ -110,6 +113,7 @@ def _thread_manager_for_setup( attached_modules=list(setup.attached_modules.keys()), config=setup.config, strict_attached_instruments=setup.strict_attached_instruments, + feature_flags=HardwareFeatureFlags.build_from_ff(), ) diff --git a/api/src/opentrons/hardware_control/thread_manager.py b/api/src/opentrons/hardware_control/thread_manager.py index 4a8a7ae5936..c72ec3857b9 100644 --- a/api/src/opentrons/hardware_control/thread_manager.py +++ b/api/src/opentrons/hardware_control/thread_manager.py @@ -18,6 +18,7 @@ AsyncGenerator, Union, Type, + ParamSpec, ) from .adapters import SynchronousAdapter from .modules.mod_abc import AbstractModule @@ -34,17 +35,14 @@ class ThreadManagerException(Exception): WrappedReturn = TypeVar("WrappedReturn", contravariant=True) WrappedYield = TypeVar("WrappedYield", contravariant=True) -WrappedCoro = TypeVar("WrappedCoro", bound=Callable[..., Awaitable[WrappedReturn]]) -WrappedAGenFunc = TypeVar( - "WrappedAGenFunc", bound=Callable[..., AsyncGenerator[WrappedYield, None]] -) +P = ParamSpec("P") async def call_coroutine_threadsafe( loop: asyncio.AbstractEventLoop, - coro: WrappedCoro, - *args: Sequence[Any], - **kwargs: Mapping[str, Any], + coro: Callable[P, Awaitable[WrappedReturn]], + *args: P.args, + **kwargs: P.kwargs, ) -> WrappedReturn: fut = cast( "asyncio.Future[WrappedReturn]", @@ -56,9 +54,9 @@ async def call_coroutine_threadsafe( async def execute_asyncgen_threadsafe( loop: asyncio.AbstractEventLoop, - agenfunc: WrappedAGenFunc, - *args: Sequence[Any], - **kwargs: Mapping[str, Any], + agenfunc: Callable[P, AsyncGenerator[WrappedYield, None]], + *args: P.args, + **kwargs: P.kwargs, ) -> AsyncGenerator[WrappedYield, None]: # This function should bridge an async generator function between two asyncio @@ -295,7 +293,7 @@ def sync(self) -> SynchronousAdapter[WrappedObj]: def __repr__(self) -> str: return "" - def clean_up(self) -> None: + def clean_up_tm(self) -> None: try: loop = object.__getattribute__(self, "_loop") loop.call_soon_threadsafe(loop.stop) @@ -348,7 +346,7 @@ def __getattribute__(self, attr_name: str) -> Any: wrapped_cleanup = getattr( object.__getattribute__(self, "bridged_obj"), "clean_up" ) - our_cleanup = object.__getattribute__(self, "clean_up") + our_cleanup = object.__getattribute__(self, "clean_up_tm") def call_both() -> None: # the wrapped cleanup wants to happen in the managed thread, diff --git a/api/src/opentrons/hardware_control/types.py b/api/src/opentrons/hardware_control/types.py index b99f6a17e6c..769abb8d85c 100644 --- a/api/src/opentrons/hardware_control/types.py +++ b/api/src/opentrons/hardware_control/types.py @@ -5,11 +5,10 @@ from typing_extensions import Literal from opentrons import types as top_types from opentrons_shared_data.pipette.types import PipetteChannelType +from opentrons.config import feature_flags MODULE_LOG = logging.getLogger(__name__) -MachineType = Literal["ot2", "ot3"] - class MotionChecks(enum.Enum): NONE = 0 @@ -39,6 +38,10 @@ def to_mount(self) -> top_types.Mount: return top_types.Mount.EXTENSION return top_types.Mount[self.name] + @classmethod + def pipette_mounts(cls) -> List["Literal[OT3Mount.LEFT, OT3Mount.RIGHT]"]: + return [cls.LEFT, cls.RIGHT] + class OT3AxisKind(enum.Enum): """An enum of the different kinds of axis we have. @@ -229,6 +232,13 @@ def of_plunger(cls, mount: top_types.Mount) -> "Axis": """ return cls.of_main_tool_actuator(mount) + @classmethod + def node_axes(cls) -> List["Axis"]: + """ + Get a list of axes that are backed by flex canbus nodes. + """ + return [cls.X, cls.Y, cls.Z_L, cls.Z_R, cls.P_L, cls.P_R, cls.Z_G, cls.G] + class SubSystem(enum.Enum): """An enumeration of ot3 components. @@ -244,6 +254,7 @@ class SubSystem(enum.Enum): gripper = 5 rear_panel = 6 motor_controller_board = 7 + hepa_uv = 8 def __str__(self) -> str: return self.name @@ -409,6 +420,7 @@ class ErrorMessageNotification: ] HardwareEventHandler = Callable[[HardwareEvent], None] +HardwareEventUnsubscriber = Callable[[], None] RevisionLiteral = Literal["2.1", "A", "B", "C", "UNKNOWN"] @@ -477,6 +489,13 @@ class CriticalPoint(enum.Enum): point. This is the same as the GRIPPER_JAW_CENTER for grippers. """ + INSTRUMENT_XY_CENTER = enum.auto() + """ + The INSTRUMENT_XY_CENTER means the critical point under consideration is + the XY center of the entire pipette, regardless of configuration. + No pipettes, single or multi, will change their instrument center point. + """ + FRONT_NOZZLE = enum.auto() """ The end of the front-most nozzle of a multipipette with a tip attached. @@ -502,6 +521,16 @@ class CriticalPoint(enum.Enum): back calibration pin slot. """ + Y_CENTER = enum.auto() + """ + Y_CENTER means the critical point under consideration is at the same X + coordinate as the default nozzle point (i.e. TIP | NOZZLE | FRONT_NOZZLE) + but halfway in between the Y axis bounding box of the pipette - it is the + XY center of the first column in the pipette. It's really only relevant for + the 96; it will produce the same position as XY_CENTER on an eight or one + channel pipette. + """ + class ExecutionState(enum.Enum): RUNNING = enum.auto() @@ -604,6 +633,40 @@ def __str__(self) -> str: return self.name +@dataclass +class HardwareFeatureFlags: + """ + Hardware configuration options that can be passed to API instances. + Some options may not be relevant to every robot. + + These generally map to the feature flag options in the opentrons.config + module. + """ + + use_old_aspiration_functions: bool = ( + False # To support pipette backwards compatability + ) + require_estop: bool = True + stall_detection_enabled: bool = True + overpressure_detection_enabled: bool = True + + @classmethod + def build_from_ff(cls) -> "HardwareFeatureFlags": + """Build from the feature flags configuration file on disc. + + Note that, if this class is built from the default constructor, the values + of all of the flags are just the default values instead of the values in the + feature_flags file or environment variables. Use this constructor to ensure + the right values are pulled in. + """ + return HardwareFeatureFlags( + use_old_aspiration_functions=feature_flags.use_old_aspiration_functions(), + require_estop=feature_flags.require_estop(), + stall_detection_enabled=feature_flags.stall_detection_enabled(), + overpressure_detection_enabled=feature_flags.overpressure_detection_enabled(), + ) + + class EarlyLiquidSenseTrigger(RuntimeError): """Error raised if sensor threshold reached before minimum probing distance.""" diff --git a/api/src/opentrons/hardware_control/util.py b/api/src/opentrons/hardware_control/util.py index d2d5a1f16d2..a7965853212 100644 --- a/api/src/opentrons/hardware_control/util.py +++ b/api/src/opentrons/hardware_control/util.py @@ -78,27 +78,29 @@ def check_motion_bounds( ) for ax in target_smoothie.keys(): if target_smoothie[ax] < bounds[ax][0]: - bounds_message = bounds_message_format.format( - axis=ax, - tsp=target_smoothie[ax], - tdp=target_deck.get(ax, "unknown"), - dir="low", - limsp=bounds.get(ax, ("unknown",))[0], - ) + format_detail = { + "axis": ax, + "tsp": target_smoothie[ax], + "tdp": target_deck.get(ax, "unknown"), + "dir": "low", + "limsp": bounds.get(ax, ("unknown",))[0], + } + bounds_message = bounds_message_format.format(**format_detail) mod_log.warning(bounds_message) if checks.value & MotionChecks.LOW.value: - raise OutOfBoundsMove(bounds_message) + raise OutOfBoundsMove(bounds_message, format_detail) elif target_smoothie[ax] > bounds[ax][1]: - bounds_message = bounds_message_format.format( - axis=ax, - tsp=target_smoothie[ax], - tdp=target_deck.get(ax, "unknown"), - dir="high", - limsp=bounds.get(ax, (None, "unknown"))[1], - ) + format_detail = { + "axis": ax, + "tsp": target_smoothie[ax], + "tdp": target_deck.get(ax, "unknown"), + "dir": "high", + "limsp": bounds.get(ax, (None, "unknown"))[1], + } + bounds_message = bounds_message_format.format(**format_detail) mod_log.warning(bounds_message) if checks.value & MotionChecks.HIGH.value: - raise OutOfBoundsMove(bounds_message) + raise OutOfBoundsMove(bounds_message, format_detail) def ot2_axis_to_string(axis: Axis) -> str: diff --git a/api/src/opentrons/broker.py b/api/src/opentrons/legacy_broker.py similarity index 66% rename from api/src/opentrons/broker.py rename to api/src/opentrons/legacy_broker.py index 494a3daf463..838a75b7759 100644 --- a/api/src/opentrons/broker.py +++ b/api/src/opentrons/legacy_broker.py @@ -1,3 +1,5 @@ +# noqa: D100 + from __future__ import annotations import logging from typing import Callable, Dict, List @@ -9,7 +11,15 @@ MODULE_LOG = logging.getLogger(__name__) -class Broker: +class LegacyBroker: + """A pub/sub message broker. + + Deprecated: + Use the newer, more generic `opentrons.utils.Broker` class instead. + This class is coupled to old types from `opentrons.commands`. + https://opentrons.atlassian.net/browse/RSS-270 + """ + def __init__(self) -> None: self.subscriptions: Dict[ Literal["command"], @@ -17,7 +27,7 @@ def __init__(self) -> None: ] = {} self.logger = MODULE_LOG - def subscribe( + def subscribe( # noqa: D102 self, topic: Literal["command"], handler: Callable[[types.CommandMessage], None], @@ -34,8 +44,10 @@ def unsubscribe() -> None: return unsubscribe - def publish(self, topic: Literal["command"], message: types.CommandMessage) -> None: + def publish( # noqa: D102 + self, topic: Literal["command"], message: types.CommandMessage + ) -> None: [handler(message) for handler in self.subscriptions.get(topic, [])] - def set_logger(self, logger: logging.Logger) -> None: + def set_logger(self, logger: logging.Logger) -> None: # noqa: D102 self.logger = logger diff --git a/api/src/opentrons/motion_planning/adjacent_slots_getters.py b/api/src/opentrons/motion_planning/adjacent_slots_getters.py index 5c8d5b07402..9644f40f157 100644 --- a/api/src/opentrons/motion_planning/adjacent_slots_getters.py +++ b/api/src/opentrons/motion_planning/adjacent_slots_getters.py @@ -1,6 +1,10 @@ """Getters for specific adjacent slots.""" +from dataclasses import dataclass +from typing import Optional, List, Dict, Union -from typing import Optional, List +from opentrons_shared_data.robot.dev_types import RobotType + +from opentrons.types import DeckSlotName, StagingSlotName def get_north_slot(slot: int) -> Optional[int]: @@ -35,6 +39,116 @@ def get_west_slot(slot: int) -> Optional[int]: return slot - 1 +def get_north_west_slot(slot: int) -> Optional[int]: + """Get the slot that's north-west of the given slot.""" + if slot in [1, 4, 7, 10, 11, 12]: + return None + else: + north_slot = get_north_slot(slot) + return north_slot - 1 if north_slot else None + + +def get_north_east_slot(slot: int) -> Optional[int]: + """Get the slot that's north-east of the given slot.""" + if slot in [3, 6, 9, 10, 11, 12]: + return None + else: + north_slot = get_north_slot(slot) + return north_slot + 1 if north_slot else None + + +def get_south_west_slot(slot: int) -> Optional[int]: + """Get the slot that's south-west of the given slot.""" + if slot in [1, 2, 3, 4, 7, 10]: + return None + else: + south_slot = get_south_slot(slot) + return south_slot - 1 if south_slot else None + + +def get_south_east_slot(slot: int) -> Optional[int]: + """Get the slot that's south-east of the given slot.""" + if slot in [1, 2, 3, 6, 9, 12]: + return None + else: + south_slot = get_south_slot(slot) + return south_slot + 1 if south_slot else None + + +@dataclass +class _MixedTypeSlots: + regular_slots: List[DeckSlotName] + staging_slots: List[StagingSlotName] + + +def get_surrounding_slots(slot: int, robot_type: RobotType) -> _MixedTypeSlots: + """Get all the surrounding slots, i.e., adjacent slots as well as corner slots.""" + corner_slots: List[Union[int, None]] = [ + get_north_east_slot(slot), + get_north_west_slot(slot), + get_south_east_slot(slot), + get_south_west_slot(slot), + ] + + surrounding_regular_slots_int = get_adjacent_slots(slot) + [ + maybe_slot for maybe_slot in corner_slots if maybe_slot is not None + ] + surrounding_regular_slots = [ + DeckSlotName.from_primitive(slot_int).to_equivalent_for_robot_type(robot_type) + for slot_int in surrounding_regular_slots_int + ] + surrounding_staging_slots = _SURROUNDING_STAGING_SLOTS_MAP.get( + DeckSlotName.from_primitive(slot).to_equivalent_for_robot_type(robot_type), [] + ) + return _MixedTypeSlots( + regular_slots=surrounding_regular_slots, staging_slots=surrounding_staging_slots + ) + + +_WEST_OF_STAGING_SLOT_MAP: Dict[StagingSlotName, DeckSlotName] = { + StagingSlotName.SLOT_A4: DeckSlotName.SLOT_A3, + StagingSlotName.SLOT_B4: DeckSlotName.SLOT_B3, + StagingSlotName.SLOT_C4: DeckSlotName.SLOT_C3, + StagingSlotName.SLOT_D4: DeckSlotName.SLOT_D3, +} + +_EAST_OF_FLEX_COLUMN_3_MAP: Dict[DeckSlotName, StagingSlotName] = { + deck_slot: staging_slot + for staging_slot, deck_slot in _WEST_OF_STAGING_SLOT_MAP.items() +} + + +_SURROUNDING_STAGING_SLOTS_MAP: Dict[DeckSlotName, List[StagingSlotName]] = { + DeckSlotName.SLOT_D3: [StagingSlotName.SLOT_C4, StagingSlotName.SLOT_D4], + DeckSlotName.SLOT_C3: [ + StagingSlotName.SLOT_B4, + StagingSlotName.SLOT_C4, + StagingSlotName.SLOT_D4, + ], + DeckSlotName.SLOT_B3: [ + StagingSlotName.SLOT_A4, + StagingSlotName.SLOT_B4, + StagingSlotName.SLOT_C4, + ], + DeckSlotName.SLOT_A3: [StagingSlotName.SLOT_A4, StagingSlotName.SLOT_B4], +} + + +def get_west_of_staging_slot(staging_slot: StagingSlotName) -> DeckSlotName: + """Get slot west of a staging slot.""" + return _WEST_OF_STAGING_SLOT_MAP[staging_slot] + + +def get_adjacent_staging_slot(deck_slot: DeckSlotName) -> Optional[StagingSlotName]: + """Get the adjacent staging slot if the deck slot is in the third column.""" + return _EAST_OF_FLEX_COLUMN_3_MAP.get(deck_slot) + + +def get_surrounding_staging_slots(deck_slot: DeckSlotName) -> List[StagingSlotName]: + """Get the staging slots surrounding the given deck slot.""" + return _SURROUNDING_STAGING_SLOTS_MAP.get(deck_slot, []) + + def get_east_west_slots(slot: int) -> List[int]: """Get slots east & west of the given slot.""" east = get_east_slot(slot) diff --git a/api/src/opentrons/motion_planning/deck_conflict.py b/api/src/opentrons/motion_planning/deck_conflict.py index c7cf00ba192..53c6a53930e 100644 --- a/api/src/opentrons/motion_planning/deck_conflict.py +++ b/api/src/opentrons/motion_planning/deck_conflict.py @@ -11,9 +11,10 @@ get_east_west_slots, get_south_slot, get_adjacent_slots, + get_adjacent_staging_slot, ) -from opentrons.types import DeckSlotName +from opentrons.types import DeckSlotName, StagingSlotName _FIXED_TRASH_SLOT: Final[Set[DeckSlotName]] = { DeckSlotName.FIXED_TRASH, @@ -59,6 +60,13 @@ class Labware: is_fixed_trash: bool +@dataclass +class TrashBin: + """A non-labware trash bin (loaded via api level 2.16 and above).""" + + name_for_errors: str + + @dataclass class _Module: name_for_errors: str @@ -70,6 +78,11 @@ class HeaterShakerModule(_Module): """A Heater-Shaker module.""" +@dataclass +class MagneticBlockModule(_Module): + """A Magnetic Block module.""" + + @dataclass class ThermocyclerModule(_Module): """A Thermocycler module.""" @@ -89,17 +102,19 @@ class OtherModule(_Module): DeckItem = Union[ Labware, HeaterShakerModule, + MagneticBlockModule, ThermocyclerModule, OtherModule, + TrashBin, ] class _NothingAllowed(NamedTuple): """Nothing is allowed in this slot.""" - location: DeckSlotName + location: Union[DeckSlotName, StagingSlotName] source_item: DeckItem - source_location: DeckSlotName + source_location: Union[DeckSlotName, StagingSlotName] def is_allowed(self, item: DeckItem) -> bool: return False @@ -122,6 +137,10 @@ def is_allowed(self, item: DeckItem) -> bool: return item.highest_z < self.max_height elif isinstance(item, _Module): return item.highest_z_including_labware < self.max_height + elif isinstance(item, TrashBin): + # Since this is a restriction for OT-2 only and OT-2 trashes exceeded the height limit, always return False + # TODO(jbl 2024-01-16) Include trash height and use that for check for more robustness + return False class _NoModule(NamedTuple): @@ -146,21 +165,11 @@ def is_allowed(self, item: DeckItem) -> bool: return not isinstance(item, HeaterShakerModule) -class _FixedTrashOnly(NamedTuple): - """Only fixed-trash labware is allowed in this slot.""" - - location: DeckSlotName - - def is_allowed(self, item: DeckItem) -> bool: - return _is_fixed_trash(item) - - _DeckRestriction = Union[ _NothingAllowed, _MaxHeight, _NoModule, _NoHeaterShakerModule, - _FixedTrashOnly, ] """A restriction on what is allowed in a given slot.""" @@ -173,9 +182,9 @@ class DeckConflictError(ValueError): # things that don't fit into a single deck slot, like the Thermocycler. # Refactor this interface to take a more symbolic location. def check( - existing_items: Mapping[DeckSlotName, DeckItem], + existing_items: Mapping[Union[DeckSlotName, StagingSlotName], DeckItem], new_item: DeckItem, - new_location: DeckSlotName, + new_location: Union[DeckSlotName, StagingSlotName], robot_type: RobotType, ) -> None: """Check a deck layout for conflicts. @@ -189,11 +198,7 @@ def check( Raises: DeckConflictError: Adding this item should not be allowed. """ - restrictions: List[_DeckRestriction] = [ - _FixedTrashOnly( - location=DeckSlotName.FIXED_TRASH.to_equivalent_for_robot_type(robot_type) - ) - ] + restrictions: List[_DeckRestriction] = [] # build restrictions driven by existing items for location, item in existing_items.items(): restrictions += _create_restrictions( @@ -224,10 +229,12 @@ def check( ) -def _create_ot2_restrictions( - item: DeckItem, location: DeckSlotName +def _create_ot2_restrictions( # noqa: C901 + item: DeckItem, location: Union[DeckSlotName, StagingSlotName] ) -> List[_DeckRestriction]: restrictions: List[_DeckRestriction] = [] + if isinstance(location, StagingSlotName): + raise DeckConflictError(f"OT-2 does not support staging slots ({location.id}).") if location not in _FIXED_TRASH_SLOT: # Disallow a different item from overlapping this item in this deck slot. @@ -239,7 +246,7 @@ def _create_ot2_restrictions( ) ) - if _is_fixed_trash(item): + if _is_ot2_fixed_trash(item): # A Heater-Shaker can't safely be placed just south of the fixed trash, # because the fixed trash blocks access to the screw that locks the # Heater-Shaker onto the deck. @@ -288,20 +295,35 @@ def _create_ot2_restrictions( def _create_flex_restrictions( - item: DeckItem, location: DeckSlotName + item: DeckItem, location: Union[DeckSlotName, StagingSlotName] ) -> List[_DeckRestriction]: - restrictions: List[_DeckRestriction] = [] + restrictions: List[_DeckRestriction] = [ + _NothingAllowed( + location=location, + source_item=item, + source_location=location, + ) + ] - if location not in _FIXED_TRASH_SLOT: - restrictions.append( - _NothingAllowed( - location=location, - source_item=item, - source_location=location, + if isinstance(item, (HeaterShakerModule, OtherModule)): + if isinstance(location, StagingSlotName): + raise DeckConflictError( + "Cannot have a module loaded on a staging area slot." + ) + adjacent_staging_slot = get_adjacent_staging_slot(location) + if adjacent_staging_slot is not None: + # You can't have anything on a staging area slot next to a heater-shaker or + # temperature module because the module caddy physically blocks you from having + # that staging area slot installed in the first place. + restrictions.append( + _NothingAllowed( + location=adjacent_staging_slot, + source_item=item, + source_location=location, + ) ) - ) - if isinstance(item, ThermocyclerModule): + elif isinstance(item, ThermocyclerModule): for covered_location in _flex_slots_covered_by_thermocycler(): restrictions.append( _NothingAllowed( @@ -315,7 +337,7 @@ def _create_flex_restrictions( def _create_restrictions( - item: DeckItem, location: DeckSlotName, robot_type: str + item: DeckItem, location: Union[DeckSlotName, StagingSlotName], robot_type: str ) -> List[_DeckRestriction]: if robot_type == "OT-2 Standard": @@ -333,10 +355,7 @@ def _create_deck_conflict_error_message( new_item is not None or existing_item is not None ), "Conflict error expects either new_item or existing_item" - if isinstance(restriction, _FixedTrashOnly): - message = f"Only fixed-trash is allowed in slot {restriction.location}" - - elif new_item is not None: + if new_item is not None: message = ( f"{restriction.source_item.name_for_errors}" f" in slot {restriction.source_location}" @@ -372,5 +391,7 @@ def _flex_slots_covered_by_thermocycler() -> Set[DeckSlotName]: return {DeckSlotName.SLOT_B1, DeckSlotName.SLOT_A1} -def _is_fixed_trash(item: DeckItem) -> bool: - return isinstance(item, Labware) and item.is_fixed_trash +def _is_ot2_fixed_trash(item: DeckItem) -> bool: + return (isinstance(item, Labware) and item.is_fixed_trash) or isinstance( + item, TrashBin + ) diff --git a/api/src/opentrons/motion_planning/types.py b/api/src/opentrons/motion_planning/types.py index 1251d00e18c..2c8ca3211ca 100644 --- a/api/src/opentrons/motion_planning/types.py +++ b/api/src/opentrons/motion_planning/types.py @@ -38,3 +38,5 @@ class GripperMovementWaypointsWithJawStatus: position: Point jaw_open: bool + dropping: bool + """This flag should only be set to True if this waypoint involves dropping a piece of labware.""" diff --git a/api/src/opentrons/motion_planning/waypoints.py b/api/src/opentrons/motion_planning/waypoints.py index 0f3634e449d..b9c62114215 100644 --- a/api/src/opentrons/motion_planning/waypoints.py +++ b/api/src/opentrons/motion_planning/waypoints.py @@ -126,6 +126,7 @@ def get_gripper_labware_movement_waypoints( to_labware_center: Point, gripper_home_z: float, offset_data: LabwareMovementOffsetData, + post_drop_slide_offset: Optional[Point], ) -> List[GripperMovementWaypointsWithJawStatus]: """Get waypoints for moving labware using a gripper.""" pick_up_offset = offset_data.pickUpOffset @@ -138,26 +139,45 @@ def get_gripper_labware_movement_waypoints( drop_offset.x, drop_offset.y, drop_offset.z ) + post_drop_home_pos = Point(drop_location.x, drop_location.y, gripper_home_z) + waypoints_with_jaw_status = [ GripperMovementWaypointsWithJawStatus( position=Point(pick_up_location.x, pick_up_location.y, gripper_home_z), jaw_open=False, + dropping=False, + ), + GripperMovementWaypointsWithJawStatus( + position=pick_up_location, jaw_open=True, dropping=False ), - GripperMovementWaypointsWithJawStatus(position=pick_up_location, jaw_open=True), # Gripper grips the labware here GripperMovementWaypointsWithJawStatus( position=Point(pick_up_location.x, pick_up_location.y, gripper_home_z), jaw_open=False, + dropping=False, ), GripperMovementWaypointsWithJawStatus( position=Point(drop_location.x, drop_location.y, gripper_home_z), jaw_open=False, + dropping=False, + ), + GripperMovementWaypointsWithJawStatus( + position=drop_location, jaw_open=False, dropping=False ), - GripperMovementWaypointsWithJawStatus(position=drop_location, jaw_open=False), # Gripper ungrips here GripperMovementWaypointsWithJawStatus( - position=Point(drop_location.x, drop_location.y, gripper_home_z), + position=post_drop_home_pos, jaw_open=True, + dropping=True, ), ] + if post_drop_slide_offset is not None: + # IF it is specified, add one more step after homing the gripper + waypoints_with_jaw_status.append( + GripperMovementWaypointsWithJawStatus( + position=post_drop_home_pos + post_drop_slide_offset, + jaw_open=True, + dropping=False, + ) + ) return waypoints_with_jaw_status diff --git a/api/src/opentrons/protocol_api/__init__.py b/api/src/opentrons/protocol_api/__init__.py index 25db104582f..6fedc494c82 100644 --- a/api/src/opentrons/protocol_api/__init__.py +++ b/api/src/opentrons/protocol_api/__init__.py @@ -14,7 +14,6 @@ from .deck import Deck from .instrument_context import InstrumentContext from .labware import Labware, Well -from ._types import OFF_DECK from .module_contexts import ( ModuleContext, ThermocyclerContext, @@ -24,6 +23,13 @@ MagneticBlockContext, ) from ._liquid import Liquid +from ._types import OFF_DECK +from ._trash_bin import TrashBin +from ._waste_chute import WasteChute +from ._nozzle_layout import ( + COLUMN, + ALL, +) from .create_protocol_context import ( create_protocol_context, @@ -44,8 +50,12 @@ "HeaterShakerContext", "MagneticBlockContext", "Labware", + "TrashBin", + "WasteChute", "Well", "Liquid", + "COLUMN", + "ALL", "OFF_DECK", # For internal Opentrons use only: "create_protocol_context", diff --git a/api/src/opentrons/protocol_api/_nozzle_layout.py b/api/src/opentrons/protocol_api/_nozzle_layout.py new file mode 100644 index 00000000000..8e8cdf99521 --- /dev/null +++ b/api/src/opentrons/protocol_api/_nozzle_layout.py @@ -0,0 +1,27 @@ +from typing_extensions import Final +import enum + + +class NozzleLayout(enum.Enum): + COLUMN = "COLUMN" + SINGLE = "SINGLE" + ROW = "ROW" + QUADRANT = "QUADRANT" + ALL = "ALL" + + +COLUMN: Final = NozzleLayout.COLUMN +ALL: Final = NozzleLayout.ALL + +# Set __doc__ manually as a workaround. When this docstring is written the normal way, right after +# the constant definition, Sphinx has trouble picking it up. +COLUMN.__doc__ = """\ +A special nozzle configuration type indicating a full single column pick up. Predominantly meant for the 96 channel. + +See for details on using ``COLUMN`` with :py:obj:`InstrumentContext.configure_nozzle_layout()`. +""" +ALL.__doc__ = """\ +A special nozzle configuration type indicating a reset back to default where the pipette will pick up its max capacity of tips. + +See for details on using ``ALL`` with :py:obj:`InstrumentContext.configure_nozzle_layout()`. +""" diff --git a/api/src/opentrons/protocol_api/_trash_bin.py b/api/src/opentrons/protocol_api/_trash_bin.py new file mode 100644 index 00000000000..60b5f7ac89a --- /dev/null +++ b/api/src/opentrons/protocol_api/_trash_bin.py @@ -0,0 +1,32 @@ +from opentrons.types import DeckSlotName + + +class TrashBin: + """Represents a Flex or OT-2 trash bin. + + See :py:meth:`.ProtocolContext.load_trash_bin`. + """ + + def __init__(self, location: DeckSlotName, addressable_area_name: str) -> None: + self._location = location + self._addressable_area_name = addressable_area_name + + @property + def location(self) -> DeckSlotName: + """Location of the trash bin. + + :meta private: + + This is intended for Opentrons internal use only and is not a guaranteed API. + """ + return self._location + + @property + def area_name(self) -> str: + """Addressable area name of the trash bin. + + :meta private: + + This is intended for Opentrons internal use only and is not a guaranteed API. + """ + return self._addressable_area_name diff --git a/api/src/opentrons/protocol_api/_types.py b/api/src/opentrons/protocol_api/_types.py index dea183c2eab..9890e29c2bc 100644 --- a/api/src/opentrons/protocol_api/_types.py +++ b/api/src/opentrons/protocol_api/_types.py @@ -1,3 +1,4 @@ +from __future__ import annotations from typing_extensions import Final import enum diff --git a/api/src/opentrons/protocol_api/_waste_chute.py b/api/src/opentrons/protocol_api/_waste_chute.py new file mode 100644 index 00000000000..8e7ab765151 --- /dev/null +++ b/api/src/opentrons/protocol_api/_waste_chute.py @@ -0,0 +1,5 @@ +class WasteChute: + """Represents a Flex waste chute. + + See :py:meth:`.ProtocolContext.load_waste_chute`. + """ diff --git a/api/src/opentrons/protocol_api/core/engine/deck_conflict.py b/api/src/opentrons/protocol_api/core/engine/deck_conflict.py index 7314d8074cd..0ba7e17621d 100644 --- a/api/src/opentrons/protocol_api/core/engine/deck_conflict.py +++ b/api/src/opentrons/protocol_api/core/engine/deck_conflict.py @@ -1,19 +1,81 @@ """A Protocol-Engine-friendly wrapper for opentrons.motion_planning.deck_conflict.""" - +from __future__ import annotations import itertools -from typing import Collection, Dict, Optional, Tuple, overload +import logging +from typing import ( + Collection, + Dict, + Optional, + Tuple, + overload, + Union, + TYPE_CHECKING, +) +from opentrons_shared_data.errors.exceptions import MotionPlanningFailureError + +from opentrons.hardware_control.nozzle_manager import NozzleConfigurationType from opentrons.hardware_control.modules.types import ModuleType from opentrons.motion_planning import deck_conflict as wrapped_deck_conflict +from opentrons.motion_planning import adjacent_slots_getters + from opentrons.protocol_engine import ( StateView, DeckSlotLocation, ModuleLocation, OnLabwareLocation, + AddressableAreaLocation, OFF_DECK_LOCATION, + WellLocation, + DropTipWellLocation, ) from opentrons.protocol_engine.errors.exceptions import LabwareNotLoadedOnModuleError -from opentrons.types import DeckSlotName +from opentrons.protocol_engine.types import StagingSlotLocation, Dimensions +from opentrons.types import DeckSlotName, StagingSlotName, Point +from ..._trash_bin import TrashBin +from ..._waste_chute import WasteChute + +if TYPE_CHECKING: + from ...labware import Labware + + +class PartialTipMovementNotAllowedError(MotionPlanningFailureError): + """Error raised when trying to perform a partial tip movement to an illegal location.""" + + def __init__(self, message: str) -> None: + super().__init__( + message=message, + ) + + +class UnsuitableTiprackForPipetteMotion(MotionPlanningFailureError): + """Error raised when trying to perform a pipette movement to a tip rack, based on adapter status.""" + + def __init__(self, message: str) -> None: + super().__init__( + message=message, + ) + + +_log = logging.getLogger(__name__) + +# TODO (spp, 2023-12-06): move this to a location like motion planning where we can +# derive these values from geometry definitions +# Also, verify y-axis extents values for the nozzle columns. +# Bounding box measurements +A12_column_front_left_bound = Point(x=-11.03, y=2) +A12_column_back_right_bound = Point(x=526.77, y=506.2) + +_NOZZLE_PITCH = 9 +A1_column_front_left_bound = Point( + x=A12_column_front_left_bound.x - _NOZZLE_PITCH * 11, y=2 +) +A1_column_back_right_bound = Point( + x=A12_column_back_right_bound.x - _NOZZLE_PITCH * 11, y=506.2 +) + +# Arbitrary safety margin in z-direction +Z_SAFETY_MARGIN = 10 @overload @@ -22,6 +84,7 @@ def check( engine_state: StateView, existing_labware_ids: Collection[str], existing_module_ids: Collection[str], + existing_disposal_locations: Collection[Union[Labware, WasteChute, TrashBin]], new_labware_id: str, ) -> None: pass @@ -33,22 +96,37 @@ def check( engine_state: StateView, existing_labware_ids: Collection[str], existing_module_ids: Collection[str], + existing_disposal_locations: Collection[Union[Labware, WasteChute, TrashBin]], new_module_id: str, ) -> None: pass +@overload +def check( + *, + engine_state: StateView, + existing_labware_ids: Collection[str], + existing_module_ids: Collection[str], + existing_disposal_locations: Collection[Union[Labware, WasteChute, TrashBin]], + new_trash_bin: TrashBin, +) -> None: + pass + + def check( *, engine_state: StateView, existing_labware_ids: Collection[str], existing_module_ids: Collection[str], + existing_disposal_locations: Collection[Union[Labware, WasteChute, TrashBin]], # TODO(mm, 2023-02-23): This interface is impossible to use correctly. In order # to have new_labware_id or new_module_id, the caller needs to have already loaded # the new item into Protocol Engine--but then, it's too late to do deck conflict. # checking. Find a way to do deck conflict checking before the new item is loaded. new_labware_id: Optional[str] = None, new_module_id: Optional[str] = None, + new_trash_bin: Optional[TrashBin] = None, ) -> None: """Check for conflicts between items on the deck. @@ -73,6 +151,8 @@ def check( new_location_and_item = _map_labware(engine_state, new_labware_id) if new_module_id is not None: new_location_and_item = _map_module(engine_state, new_module_id) + if new_trash_bin is not None: + new_location_and_item = _map_disposal_location(new_trash_bin) if new_location_and_item is None: # The new item should be excluded from deck conflict checking. Nothing to do. @@ -90,9 +170,19 @@ def check( ) mapped_existing_modules = (m for m in all_existing_modules if m is not None) - existing_items: Dict[DeckSlotName, wrapped_deck_conflict.DeckItem] = {} + all_exisiting_disposal_locations = ( + _map_disposal_location(disposal_location) + for disposal_location in existing_disposal_locations + ) + mapped_disposal_locations = ( + m for m in all_exisiting_disposal_locations if m is not None + ) + + existing_items: Dict[ + Union[DeckSlotName, StagingSlotName], wrapped_deck_conflict.DeckItem + ] = {} for existing_location, existing_item in itertools.chain( - mapped_existing_labware, mapped_existing_modules + mapped_existing_labware, mapped_existing_modules, mapped_disposal_locations ): assert existing_location not in existing_items existing_items[existing_location] = existing_item @@ -105,13 +195,238 @@ def check( ) +def check_safe_for_pipette_movement( # noqa: C901 + engine_state: StateView, + pipette_id: str, + labware_id: str, + well_name: str, + well_location: Union[WellLocation, DropTipWellLocation], +) -> None: + """Check if the labware is safe to move to with a pipette in partial tip configuration. + + Args: + engine_state: engine state view + pipette_id: ID of the pipette to be moved + labware_id: ID of the labware we are moving to + well_name: Name of the well to move to + well_location: exact location within the well to move to + """ + # TODO (spp, 2023-02-06): remove this check after thorough testing. + # This function is capable of checking for movement conflict regardless of + # nozzle configuration. + if not engine_state.pipettes.get_is_partially_configured(pipette_id): + return + + if isinstance(well_location, DropTipWellLocation): + # convert to WellLocation + well_location = engine_state.geometry.get_checked_tip_drop_location( + pipette_id=pipette_id, + labware_id=labware_id, + well_location=well_location, + partially_configured=True, + ) + well_location_point = engine_state.geometry.get_well_position( + labware_id=labware_id, well_name=well_name, well_location=well_location + ) + primary_nozzle = engine_state.pipettes.get_primary_nozzle(pipette_id) + + if not _is_within_pipette_extents( + engine_state=engine_state, pipette_id=pipette_id, location=well_location_point + ): + raise PartialTipMovementNotAllowedError( + f"Requested motion with the {primary_nozzle} nozzle partial configuration" + f" is outside of robot bounds for the pipette." + ) + + labware_slot = engine_state.geometry.get_ancestor_slot_name(labware_id) + pipette_bounds_at_well_location = ( + engine_state.pipettes.get_nozzle_bounds_at_specified_move_to_position( + pipette_id=pipette_id, + destination_position=well_location_point, + ) + ) + surrounding_slots = adjacent_slots_getters.get_surrounding_slots( + slot=labware_slot.as_int(), robot_type=engine_state.config.robot_type + ) + + def _check_conflict_with_slot_item( + surrounding_slot: Union[DeckSlotName, StagingSlotName], + ) -> None: + """Raises error if the pipette is expected to collide with surrounding slot items.""" + # Check if slot overlaps with pipette position + slot_pos = engine_state.addressable_areas.get_addressable_area_position( + addressable_area_name=surrounding_slot.id, + do_compatibility_check=False, + ) + slot_bounds = engine_state.addressable_areas.get_addressable_area_bounding_box( + addressable_area_name=surrounding_slot.id, + do_compatibility_check=False, + ) + for bound_vertex in pipette_bounds_at_well_location: + if not _point_overlaps_with_slot( + slot_pos, slot_bounds, nozzle_point=bound_vertex + ): + continue + # Check z-height of items in overlapping slot + if isinstance(surrounding_slot, DeckSlotName): + slot_highest_z = engine_state.geometry.get_highest_z_in_slot( + DeckSlotLocation(slotName=surrounding_slot) + ) + else: + slot_highest_z = engine_state.geometry.get_highest_z_in_slot( + StagingSlotLocation(slotName=surrounding_slot) + ) + if slot_highest_z + Z_SAFETY_MARGIN > pipette_bounds_at_well_location[0].z: + raise PartialTipMovementNotAllowedError( + f"Moving to {engine_state.labware.get_display_name(labware_id)} in slot" + f" {labware_slot} with {primary_nozzle} nozzle partial configuration" + f" will result in collision with items in deck slot {surrounding_slot}." + ) + + for regular_slot in surrounding_slots.regular_slots: + _check_conflict_with_slot_item(regular_slot) + for staging_slot in surrounding_slots.staging_slots: + _check_conflict_with_slot_item(staging_slot) + + +def _point_overlaps_with_slot( + slot_position: Point, + slot_dimensions: Dimensions, + nozzle_point: Point, +) -> bool: + """Check if the given nozzle point overlaps with any slot area in x & y""" + return ( + slot_position.x <= nozzle_point.x <= slot_position.x + slot_dimensions.x + and slot_position.y <= nozzle_point.y <= slot_position.y + slot_dimensions.y + ) + + +def check_safe_for_tip_pickup_and_return( + engine_state: StateView, + pipette_id: str, + labware_id: str, +) -> None: + """Check if the presence or absence of a tiprack adapter might cause any pipette movement issues. + + A 96 channel pipette will pick up tips using cam action when it's configured + to use ALL nozzles. For this, the tiprack needs to be on the Flex 96 channel tiprack adapter + or similar or the tips will not be picked up. + + On the other hand, if the pipette is configured with partial nozzle configuration, + it uses the usual pipette presses to pick the tips up, in which case, having the tiprack + on the Flex 96 channel tiprack adapter (or similar) will cause the pipette to + crash against the adapter posts. + + In order to check if the 96-channel can move and pickup/drop tips safely, this method + checks for the height attribute of the tiprack adapter rather than checking for the + specific official adapter since users might create custom labware &/or definitions + compatible with the official adapter. + """ + if not engine_state.pipettes.get_channels(pipette_id) == 96: + # Adapters only matter to 96 ch. + return + + is_partial_config = engine_state.pipettes.get_is_partially_configured(pipette_id) + tiprack_name = engine_state.labware.get_display_name(labware_id) + tiprack_parent = engine_state.labware.get_location(labware_id) + if isinstance(tiprack_parent, OnLabwareLocation): # tiprack is on an adapter + is_96_ch_tiprack_adapter = engine_state.labware.get_has_quirk( + labware_id=tiprack_parent.labwareId, quirk="tiprackAdapterFor96Channel" + ) + tiprack_height = engine_state.labware.get_dimensions(labware_id).z + adapter_height = engine_state.labware.get_dimensions(tiprack_parent.labwareId).z + if is_partial_config and tiprack_height < adapter_height: + raise PartialTipMovementNotAllowedError( + f"{tiprack_name} cannot be on an adapter taller than the tip rack" + f" when picking up fewer than 96 tips." + ) + elif not is_partial_config and not is_96_ch_tiprack_adapter: + raise UnsuitableTiprackForPipetteMotion( + f"{tiprack_name} must be on an Opentrons Flex 96 Tip Rack Adapter" + f" in order to pick up or return all 96 tips simultaneously." + ) + + elif ( + not is_partial_config + ): # tiprack is not on adapter and pipette is in full config + raise UnsuitableTiprackForPipetteMotion( + f"{tiprack_name} must be on an Opentrons Flex 96 Tip Rack Adapter" + f" in order to pick up or return all 96 tips simultaneously." + ) + + +# TODO (spp, 2023-02-06): update the extents check to use all nozzle bounds instead of +# just position of primary nozzle when checking if the pipette is out-of-bounds +def _is_within_pipette_extents( + engine_state: StateView, + pipette_id: str, + location: Point, +) -> bool: + """Whether a given point is within the extents of a configured pipette on the specified robot.""" + robot_type = engine_state.config.robot_type + pipette_channels = engine_state.pipettes.get_channels(pipette_id) + nozzle_config = engine_state.pipettes.get_nozzle_layout_type(pipette_id) + primary_nozzle = engine_state.pipettes.get_primary_nozzle(pipette_id) + if robot_type == "OT-3 Standard": + if pipette_channels == 96 and nozzle_config == NozzleConfigurationType.COLUMN: + # TODO (spp, 2023-12-18): change this eventually to use column mappings in + # the pipette geometry definitions. + if primary_nozzle == "A12": + return ( + A12_column_front_left_bound.x + <= location.x + <= A12_column_back_right_bound.x + and A12_column_front_left_bound.y + <= location.y + <= A12_column_back_right_bound.y + ) + elif primary_nozzle == "A1": + return ( + A1_column_front_left_bound.x + <= location.x + <= A1_column_back_right_bound.x + and A1_column_front_left_bound.y + <= location.y + <= A1_column_back_right_bound.y + ) + # TODO (spp, 2023-11-07): check for 8-channel nozzle A1 & H1 extents on Flex & OT2 + return True + + def _map_labware( engine_state: StateView, labware_id: str, -) -> Optional[Tuple[DeckSlotName, wrapped_deck_conflict.DeckItem]]: +) -> Optional[ + Tuple[Union[DeckSlotName, StagingSlotName], wrapped_deck_conflict.DeckItem] +]: location_from_engine = engine_state.labware.get_location(labware_id=labware_id) - if isinstance(location_from_engine, DeckSlotLocation): + if isinstance(location_from_engine, AddressableAreaLocation): + # This will be guaranteed to be either deck slot name or staging slot name + slot: Union[DeckSlotName, StagingSlotName] + try: + slot = DeckSlotName.from_primitive(location_from_engine.addressableAreaName) + except ValueError: + slot = StagingSlotName.from_primitive( + location_from_engine.addressableAreaName + ) + return ( + slot, + wrapped_deck_conflict.Labware( + name_for_errors=engine_state.labware.get_load_name( + labware_id=labware_id + ), + highest_z=engine_state.geometry.get_labware_highest_z( + labware_id=labware_id + ), + uri=engine_state.labware.get_definition_uri(labware_id=labware_id), + is_fixed_trash=engine_state.labware.is_fixed_trash( + labware_id=labware_id + ), + ), + ) + + elif isinstance(location_from_engine, DeckSlotLocation): # This labware is loaded directly into a deck slot. # Map it to a wrapped_deck_conflict.Labware. return ( @@ -171,6 +486,14 @@ def _map_module( highest_z_including_labware=highest_z_including_labware, ), ) + elif module_type == ModuleType.MAGNETIC_BLOCK: + return ( + mapped_location, + wrapped_deck_conflict.MagneticBlockModule( + name_for_errors=name_for_errors, + highest_z_including_labware=highest_z_including_labware, + ), + ) elif module_type == ModuleType.THERMOCYCLER: return ( mapped_location, @@ -192,6 +515,18 @@ def _map_module( ) +def _map_disposal_location( + disposal_location: Union[Labware, WasteChute, TrashBin], +) -> Optional[Tuple[DeckSlotName, wrapped_deck_conflict.DeckItem]]: + if isinstance(disposal_location, TrashBin): + return ( + disposal_location.location, + wrapped_deck_conflict.TrashBin(name_for_errors="trash bin"), + ) + else: + return None + + def _deck_slot_to_int(deck_slot_location: DeckSlotLocation) -> int: return deck_slot_location.slotName.as_int() diff --git a/api/src/opentrons/protocol_api/core/engine/instrument.py b/api/src/opentrons/protocol_api/core/engine/instrument.py index 630b37801a0..17626b1a777 100644 --- a/api/src/opentrons/protocol_api/core/engine/instrument.py +++ b/api/src/opentrons/protocol_api/core/engine/instrument.py @@ -1,7 +1,8 @@ """ProtocolEngine-based InstrumentContext core implementation.""" from __future__ import annotations -from typing import Optional, TYPE_CHECKING +from typing import Optional, TYPE_CHECKING, cast, Union +from opentrons.protocols.api_support.types import APIVersion from opentrons.types import Location, Mount from opentrons.hardware_control import SyncHardwareAPI @@ -14,20 +15,39 @@ WellLocation, WellOrigin, WellOffset, + AllNozzleLayoutConfiguration, + SingleNozzleLayoutConfiguration, + RowNozzleLayoutConfiguration, + ColumnNozzleLayoutConfiguration, + QuadrantNozzleLayoutConfiguration, +) +from opentrons.protocol_engine.types import ( + PRIMARY_NOZZLE_LITERAL, + NozzleLayoutConfigurationType, + AddressableOffsetVector, ) from opentrons.protocol_engine.errors.exceptions import TipNotAttachedError from opentrons.protocol_engine.clients import SyncClient as EngineClient from opentrons.protocols.api_support.definitions import MAX_SUPPORTED_VERSION from opentrons_shared_data.pipette.dev_types import PipetteNameType +from opentrons.protocol_api._nozzle_layout import NozzleLayout +from opentrons.hardware_control.nozzle_manager import NozzleConfigurationType +from . import deck_conflict from ..instrument import AbstractInstrument from .well import WellCore +from ..._trash_bin import TrashBin +from ..._waste_chute import WasteChute + if TYPE_CHECKING: from .protocol import ProtocolCore +_DISPENSE_VOLUME_VALIDATION_ADDED_IN = APIVersion(2, 17) + + class InstrumentCore(AbstractInstrument[WellCore]): """Instrument API core using a ProtocolEngine. @@ -126,7 +146,13 @@ def aspirate( absolute_point=location.point, ) ) - + deck_conflict.check_safe_for_pipette_movement( + engine_state=self._engine_client.state, + pipette_id=self._pipette_id, + labware_id=labware_id, + well_name=well_name, + well_location=well_location, + ) self._engine_client.aspirate( pipette_id=self._pipette_id, labware_id=labware_id, @@ -140,7 +166,7 @@ def aspirate( def dispense( self, - location: Location, + location: Union[Location, TrashBin, WasteChute], well_core: Optional[WellCore], volume: float, rate: float, @@ -158,17 +184,31 @@ def dispense( in_place: whether this is a in-place command. push_out: The amount to push the plunger below bottom position. """ + if self._protocol_core.api_version < _DISPENSE_VOLUME_VALIDATION_ADDED_IN: + # In older API versions, when you try to dispense more than you can, + # it gets clamped. + volume = min(volume, self.get_current_volume()) + else: + # Newer API versions raise an error if you try to dispense more than + # you can. Let the error come from Protocol Engine's validation. + pass + if well_core is None: if not in_place: - self._engine_client.move_to_coordinates( - pipette_id=self._pipette_id, - coordinates=DeckPoint( - x=location.point.x, y=location.point.y, z=location.point.z - ), - minimum_z_height=None, - force_direct=False, - speed=None, - ) + if isinstance(location, (TrashBin, WasteChute)): + self._move_to_disposal_location( + disposal_location=location, force_direct=False, speed=None + ) + else: + self._engine_client.move_to_coordinates( + pipette_id=self._pipette_id, + coordinates=DeckPoint( + x=location.point.x, y=location.point.y, z=location.point.z + ), + minimum_z_height=None, + force_direct=False, + speed=None, + ) self._engine_client.dispense_in_place( pipette_id=self._pipette_id, @@ -177,6 +217,8 @@ def dispense( push_out=push_out, ) else: + if isinstance(location, (TrashBin, WasteChute)): + raise ValueError("Trash Bin and Waste Chute have no Wells.") well_name = well_core.get_name() labware_id = well_core.labware_id @@ -187,7 +229,13 @@ def dispense( absolute_point=location.point, ) ) - + deck_conflict.check_safe_for_pipette_movement( + engine_state=self._engine_client.state, + pipette_id=self._pipette_id, + labware_id=labware_id, + well_name=well_name, + well_location=well_location, + ) self._engine_client.dispense( pipette_id=self._pipette_id, labware_id=labware_id, @@ -198,10 +246,18 @@ def dispense( push_out=push_out, ) - self._protocol_core.set_last_location(location=location, mount=self.get_mount()) + if isinstance(location, (TrashBin, WasteChute)): + self._protocol_core.set_last_location(location=None, mount=self.get_mount()) + else: + self._protocol_core.set_last_location( + location=location, mount=self.get_mount() + ) def blow_out( - self, location: Location, well_core: Optional[WellCore], in_place: bool + self, + location: Union[Location, TrashBin, WasteChute], + well_core: Optional[WellCore], + in_place: bool, ) -> None: """Blow liquid out of the tip. @@ -213,20 +269,27 @@ def blow_out( flow_rate = self.get_blow_out_flow_rate(1.0) if well_core is None: if not in_place: - self._engine_client.move_to_coordinates( - pipette_id=self._pipette_id, - coordinates=DeckPoint( - x=location.point.x, y=location.point.y, z=location.point.z - ), - force_direct=False, - minimum_z_height=None, - speed=None, - ) + if isinstance(location, (TrashBin, WasteChute)): + self._move_to_disposal_location( + disposal_location=location, force_direct=False, speed=None + ) + else: + self._engine_client.move_to_coordinates( + pipette_id=self._pipette_id, + coordinates=DeckPoint( + x=location.point.x, y=location.point.y, z=location.point.z + ), + force_direct=False, + minimum_z_height=None, + speed=None, + ) self._engine_client.blow_out_in_place( pipette_id=self._pipette_id, flow_rate=flow_rate ) else: + if isinstance(location, (TrashBin, WasteChute)): + raise ValueError("Trash Bin and Waste Chute have no Wells.") well_name = well_core.get_name() labware_id = well_core.labware_id @@ -237,7 +300,13 @@ def blow_out( absolute_point=location.point, ) ) - + deck_conflict.check_safe_for_pipette_movement( + engine_state=self._engine_client.state, + pipette_id=self._pipette_id, + labware_id=labware_id, + well_name=well_name, + well_location=well_location, + ) self._engine_client.blow_out( pipette_id=self._pipette_id, labware_id=labware_id, @@ -248,7 +317,12 @@ def blow_out( flow_rate=flow_rate, ) - self._protocol_core.set_last_location(location=location, mount=self.get_mount()) + if isinstance(location, (TrashBin, WasteChute)): + self._protocol_core.set_last_location(location=None, mount=self.get_mount()) + else: + self._protocol_core.set_last_location( + location=location, mount=self.get_mount() + ) def touch_tip( self, @@ -274,7 +348,13 @@ def touch_tip( well_location = WellLocation( origin=WellOrigin.TOP, offset=WellOffset(x=0, y=0, z=z_offset) ) - + deck_conflict.check_safe_for_pipette_movement( + engine_state=self._engine_client.state, + pipette_id=self._pipette_id, + labware_id=labware_id, + well_name=well_name, + well_location=well_location, + ) self._engine_client.touch_tip( pipette_id=self._pipette_id, labware_id=labware_id, @@ -316,7 +396,18 @@ def pick_up_tip( well_name=well_name, absolute_point=location.point, ) - + deck_conflict.check_safe_for_tip_pickup_and_return( + engine_state=self._engine_client.state, + pipette_id=self._pipette_id, + labware_id=labware_id, + ) + deck_conflict.check_safe_for_pipette_movement( + engine_state=self._engine_client.state, + pipette_id=self._pipette_id, + labware_id=labware_id, + well_name=well_name, + well_location=well_location, + ) self._engine_client.pick_up_tip( pipette_id=self._pipette_id, labware_id=labware_id, @@ -336,7 +427,7 @@ def drop_tip( """Move to and drop a tip into a given well. Args: - location: The location of the well we're picking up from. + location: The location of the well we're dropping tip into. Used to calculate the relative well offset for the drop command. well_core: The well we're dropping into home_after: Whether to home the pipette after the tip is dropped. @@ -362,6 +453,19 @@ def drop_tip( else: well_location = DropTipWellLocation() + if self._engine_client.state.labware.is_tiprack(labware_id): + deck_conflict.check_safe_for_tip_pickup_and_return( + engine_state=self._engine_client.state, + pipette_id=self._pipette_id, + labware_id=labware_id, + ) + deck_conflict.check_safe_for_pipette_movement( + engine_state=self._engine_client.state, + pipette_id=self._pipette_id, + labware_id=labware_id, + well_name=well_name, + well_location=well_location, + ) self._engine_client.drop_tip( pipette_id=self._pipette_id, labware_id=labware_id, @@ -373,6 +477,65 @@ def drop_tip( self._protocol_core.set_last_location(location=location, mount=self.get_mount()) + def drop_tip_in_disposal_location( + self, disposal_location: Union[TrashBin, WasteChute], home_after: Optional[bool] + ) -> None: + self._move_to_disposal_location( + disposal_location, + force_direct=False, + speed=None, + alternate_tip_drop=True, + ) + self._drop_tip_in_place(home_after=home_after) + self._protocol_core.set_last_location(location=None, mount=self.get_mount()) + + def _move_to_disposal_location( + self, + disposal_location: Union[TrashBin, WasteChute], + force_direct: bool, + speed: Optional[float], + alternate_tip_drop: bool = False, + ) -> None: + # TODO (nd, 2023-11-30): give appropriate offset when finalized + # https://opentrons.atlassian.net/browse/RSS-391 + offset = AddressableOffsetVector(x=0, y=0, z=0) + + if isinstance(disposal_location, TrashBin): + addressable_area_name = disposal_location._addressable_area_name + self._engine_client.move_to_addressable_area_for_drop_tip( + pipette_id=self._pipette_id, + addressable_area_name=addressable_area_name, + offset=offset, + force_direct=force_direct, + speed=speed, + minimum_z_height=None, + alternate_drop_location=alternate_tip_drop, + ignore_tip_configuration=True, + ) + + if isinstance(disposal_location, WasteChute): + num_channels = self.get_channels() + addressable_area_name = { + 1: "1ChannelWasteChute", + 8: "8ChannelWasteChute", + 96: "96ChannelWasteChute", + }[num_channels] + + self._engine_client.move_to_addressable_area( + pipette_id=self._pipette_id, + addressable_area_name=addressable_area_name, + offset=offset, + force_direct=force_direct, + speed=speed, + minimum_z_height=None, + ) + + def _drop_tip_in_place(self, home_after: Optional[bool]) -> None: + self._engine_client.drop_tip_in_place( + pipette_id=self._pipette_id, + home_after=home_after, + ) + def home(self) -> None: z_axis = self._engine_client.state.pipettes.get_z_axis(self._pipette_id) plunger_axis = self._engine_client.state.pipettes.get_plunger_axis( @@ -388,14 +551,15 @@ def home_plunger(self) -> None: def move_to( self, - location: Location, + location: Union[Location, TrashBin, WasteChute], well_core: Optional[WellCore], force_direct: bool, minimum_z_height: Optional[float], speed: Optional[float], ) -> None: - if well_core is not None: + if isinstance(location, (TrashBin, WasteChute)): + raise ValueError("Trash Bin and Waste Chute have no Wells.") labware_id = well_core.labware_id well_name = well_core.get_name() well_location = ( @@ -416,16 +580,26 @@ def move_to( speed=speed, ) else: - self._engine_client.move_to_coordinates( - pipette_id=self._pipette_id, - coordinates=DeckPoint( - x=location.point.x, y=location.point.y, z=location.point.z - ), - minimum_z_height=minimum_z_height, - force_direct=force_direct, - speed=speed, + if isinstance(location, (TrashBin, WasteChute)): + self._move_to_disposal_location( + disposal_location=location, force_direct=force_direct, speed=speed + ) + else: + self._engine_client.move_to_coordinates( + pipette_id=self._pipette_id, + coordinates=DeckPoint( + x=location.point.x, y=location.point.y, z=location.point.z + ), + minimum_z_height=minimum_z_height, + force_direct=force_direct, + speed=speed, + ) + if isinstance(location, (TrashBin, WasteChute)): + self._protocol_core.set_last_location(location=None, mount=self.get_mount()) + else: + self._protocol_core.set_last_location( + location=location, mount=self.get_mount() ) - self._protocol_core.set_last_location(location=location, mount=self.get_mount()) def get_mount(self) -> Mount: """Get the mount the pipette is attached to.""" @@ -490,6 +664,11 @@ def get_hardware_state(self) -> PipetteDict: def get_channels(self) -> int: return self._engine_client.state.tips.get_pipette_channels(self._pipette_id) + def get_active_channels(self) -> int: + return self._engine_client.state.tips.get_pipette_active_channels( + self._pipette_id + ) + def has_tip(self) -> bool: return ( self._engine_client.state.pipettes.get_attached_tip(self._pipette_id) @@ -511,6 +690,33 @@ def get_dispense_flow_rate(self, rate: float = 1.0) -> float: def get_blow_out_flow_rate(self, rate: float = 1.0) -> float: return self._blow_out_flow_rate * rate + def get_nozzle_configuration(self) -> NozzleConfigurationType: + return self._engine_client.state.pipettes.get_nozzle_layout_type( + self._pipette_id + ) + + def is_tip_tracking_available(self) -> bool: + primary_nozzle = self._engine_client.state.pipettes.get_primary_nozzle( + self._pipette_id + ) + if self.get_nozzle_configuration() == NozzleConfigurationType.FULL: + return True + else: + if self.get_channels() == 96: + # SINGLE configuration with H12 nozzle is technically supported by the + # current tip tracking implementation but we don't do any deck conflict + # checks for it, so we won't provide full support for it yet. + return ( + self.get_nozzle_configuration() == NozzleConfigurationType.COLUMN + and primary_nozzle == "A12" + ) + if self.get_channels() == 8: + return ( + self.get_nozzle_configuration() == NozzleConfigurationType.SINGLE + and primary_nozzle == "H1" + ) + return False + def set_flow_rate( self, aspirate: Optional[float] = None, @@ -531,3 +737,38 @@ def configure_for_volume(self, volume: float) -> None: self._engine_client.configure_for_volume( pipette_id=self._pipette_id, volume=volume ) + + def prepare_to_aspirate(self) -> None: + self._engine_client.prepare_to_aspirate(pipette_id=self._pipette_id) + + def configure_nozzle_layout( + self, + style: NozzleLayout, + primary_nozzle: Optional[str], + front_right_nozzle: Optional[str], + ) -> None: + if style == NozzleLayout.COLUMN: + configuration_model: NozzleLayoutConfigurationType = ( + ColumnNozzleLayoutConfiguration( + primaryNozzle=cast(PRIMARY_NOZZLE_LITERAL, primary_nozzle) + ) + ) + elif style == NozzleLayout.ROW: + configuration_model = RowNozzleLayoutConfiguration( + primaryNozzle=cast(PRIMARY_NOZZLE_LITERAL, primary_nozzle) + ) + elif style == NozzleLayout.QUADRANT: + assert front_right_nozzle is not None + configuration_model = QuadrantNozzleLayoutConfiguration( + primaryNozzle=cast(PRIMARY_NOZZLE_LITERAL, primary_nozzle), + frontRightNozzle=front_right_nozzle, + ) + elif style == NozzleLayout.SINGLE: + configuration_model = SingleNozzleLayoutConfiguration( + primaryNozzle=cast(PRIMARY_NOZZLE_LITERAL, primary_nozzle) + ) + else: + configuration_model = AllNozzleLayoutConfiguration() + self._engine_client.configure_nozzle_layout( + pipette_id=self._pipette_id, configuration_params=configuration_model + ) diff --git a/api/src/opentrons/protocol_api/core/engine/labware.py b/api/src/opentrons/protocol_api/core/engine/labware.py index eb823d2ba6a..5190831810c 100644 --- a/api/src/opentrons/protocol_api/core/engine/labware.py +++ b/api/src/opentrons/protocol_api/core/engine/labware.py @@ -30,7 +30,9 @@ def __init__(self, labware_id: str, engine_client: ProtocolEngineClient) -> None labware_state = engine_client.state.labware self._definition = labware_state.get_definition(labware_id) - self._user_display_name = labware_state.get_display_name(labware_id) + self._user_display_name = labware_state.get_user_specified_display_name( + labware_id + ) @property def labware_id(self) -> str: diff --git a/api/src/opentrons/protocol_api/core/engine/load_labware_params.py b/api/src/opentrons/protocol_api/core/engine/load_labware_params.py index c1738563cc2..ab853bb55ce 100644 --- a/api/src/opentrons/protocol_api/core/engine/load_labware_params.py +++ b/api/src/opentrons/protocol_api/core/engine/load_labware_params.py @@ -35,31 +35,10 @@ } -_MAP_OT3_TO_FLEX_LOAD_NAMES: Dict[str, str] = { - "opentrons_ot3_96_tiprack_50ul": "opentrons_flex_96_tiprack_50ul", - "opentrons_ot3_96_tiprack_200ul": "opentrons_flex_96_tiprack_200ul", - "opentrons_ot3_96_tiprack_1000ul": "opentrons_flex_96_tiprack_1000ul", -} - - class AmbiguousLoadLabwareParamsError(RuntimeError): """Error raised when specific labware parameters cannot be found due to multiple matching labware definitions.""" -def resolve_loadname(load_name: str) -> str: - """Temporarily check for old Flex tiprack loadnames so that an error is not raised. - - REMOVE FOR LAUNCH. - Args: - load_name: Load name of the labware. - - Returns: - Either the updated loadname or the original loadname if no match. - - """ - return _MAP_OT3_TO_FLEX_LOAD_NAMES.get(load_name, load_name) - - def resolve( load_name: str, namespace: Optional[str], diff --git a/api/src/opentrons/protocol_api/core/engine/protocol.py b/api/src/opentrons/protocol_api/core/engine/protocol.py index fef1a9bf05a..501dccc3621 100644 --- a/api/src/opentrons/protocol_api/core/engine/protocol.py +++ b/api/src/opentrons/protocol_api/core/engine/protocol.py @@ -1,14 +1,22 @@ """ProtocolEngine-based Protocol API core implementation.""" -from typing import Dict, Optional, Type, Union, List, Tuple +from __future__ import annotations +from typing import Dict, Optional, Type, Union, List, Tuple, TYPE_CHECKING from opentrons.protocol_engine.commands import LoadModuleResult -from opentrons_shared_data.deck.dev_types import DeckDefinitionV3, SlotDefV3 +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4, SlotDefV3 from opentrons_shared_data.labware.labware_definition import LabwareDefinition from opentrons_shared_data.labware.dev_types import LabwareDefinition as LabwareDefDict from opentrons_shared_data.pipette.dev_types import PipetteNameType from opentrons_shared_data.robot.dev_types import RobotType -from opentrons.types import DeckSlotName, Location, Mount, MountType, Point +from opentrons.types import ( + DeckSlotName, + Location, + Mount, + MountType, + Point, + StagingSlotName, +) from opentrons.hardware_control import SyncHardwareAPI, SynchronousAdapter from opentrons.hardware_control.modules import AbstractModule from opentrons.hardware_control.modules.types import ModuleModel, ModuleType @@ -16,8 +24,10 @@ from opentrons.protocols.api_support.util import AxisMaxSpeeds from opentrons.protocols.api_support.types import APIVersion + from opentrons.protocol_engine import ( DeckSlotLocation, + AddressableAreaLocation, ModuleLocation, OnLabwareLocation, ModuleModel as EngineModuleModel, @@ -41,6 +51,8 @@ from ... import validation from ..._types import OffDeckType from ..._liquid import Liquid +from ..._trash_bin import TrashBin +from ..._waste_chute import WasteChute from ..protocol import AbstractProtocol from ..labware import LabwareLoadParams from .labware import LabwareCore @@ -58,6 +70,9 @@ from . import load_labware_params from . import deck_conflict +if TYPE_CHECKING: + from ...labware import Labware + class ProtocolCore( AbstractProtocol[ @@ -87,6 +102,7 @@ def __init__( self._module_cores_by_id: Dict[ str, Union[ModuleCore, NonConnectedModuleCore] ] = {} + self._disposal_locations: List[Union[Labware, TrashBin, WasteChute]] = [] self._load_fixed_trash() @property @@ -99,17 +115,64 @@ def robot_type(self) -> RobotType: return self._engine_client.state.config.robot_type @property - def fixed_trash(self) -> LabwareCore: + def fixed_trash(self) -> Optional[LabwareCore]: """Get the fixed trash labware.""" trash_id = self._engine_client.state.labware.get_fixed_trash_id() - return self._labware_cores_by_id[trash_id] + if trash_id is not None and self._api_version < APIVersion(2, 16): + return self._labware_cores_by_id[trash_id] + return None def _load_fixed_trash(self) -> None: - trash_id = self._engine_client.state.labware.get_fixed_trash_id() - self._labware_cores_by_id[trash_id] = LabwareCore( - labware_id=trash_id, - engine_client=self._engine_client, - ) + if self.robot_type == "OT-2 Standard" or self._api_version < APIVersion(2, 16): + trash_id = self._engine_client.state.labware.get_fixed_trash_id() + if trash_id is not None: + self._labware_cores_by_id[trash_id] = LabwareCore( + labware_id=trash_id, + engine_client=self._engine_client, + ) + + def append_disposal_location( + self, + disposal_location: Union[Labware, TrashBin, WasteChute], + skip_add_to_engine: bool = False, + ) -> None: + """Append a disposal location object to the core""" + if isinstance(disposal_location, TrashBin): + self._engine_client.state.addressable_areas.raise_if_area_not_in_deck_configuration( + disposal_location.area_name + ) + deck_conflict.check( + engine_state=self._engine_client.state, + new_trash_bin=disposal_location, + existing_disposal_locations=self._disposal_locations, + # TODO: We can now fetch these IDs from engine too. + # See comment in self.load_labware(). + # + # Wrapping .keys() in list() is just to make Decoy verification easier. + existing_labware_ids=list(self._labware_cores_by_id.keys()), + existing_module_ids=list(self._module_cores_by_id.keys()), + ) + if not skip_add_to_engine: + self._engine_client.add_addressable_area(disposal_location.area_name) + elif isinstance(disposal_location, WasteChute): + # TODO(jbl 2024-01-25) hardcoding this specific addressable area should be refactored + # when analysis is fixed up + # + # We want to tell Protocol Engine that there's a waste chute in the waste chute location when it's loaded, + # so analysis can prevent the user from doing anything that would collide with it. At the same time, we + # do not want to create a false negative when it comes to addressable area conflict. We therefore use the + # addressable area `1ChannelWasteChute` because every waste chute cutout fixture provides it and it will + # provide the engine with the information it needs. + self._engine_client.state.addressable_areas.raise_if_area_not_in_deck_configuration( + "1ChannelWasteChute" + ) + if not skip_add_to_engine: + self._engine_client.add_addressable_area("1ChannelWasteChute") + self._disposal_locations.append(disposal_location) + + def get_disposal_locations(self) -> List[Union[Labware, TrashBin, WasteChute]]: + """Get disposal locations.""" + return self._disposal_locations def get_max_speeds(self) -> AxisMaxSpeeds: """Get a control interface for maximum move speeds.""" @@ -137,7 +200,12 @@ def load_labware( self, load_name: str, location: Union[ - DeckSlotName, LabwareCore, ModuleCore, NonConnectedModuleCore, OffDeckType + DeckSlotName, + StagingSlotName, + LabwareCore, + ModuleCore, + NonConnectedModuleCore, + OffDeckType, ], label: Optional[str], namespace: Optional[str], @@ -146,19 +214,15 @@ def load_labware( """Load a labware using its identifying parameters.""" load_location = self._convert_labware_location(location=location) - # TODO (lc 06-27-2023) Let's keep this around up to launch to - # make the user-facing name switching a bit easier for everyone. - mapped_load_name = load_labware_params.resolve_loadname(load_name) - custom_labware_params = ( self._engine_client.state.labware.find_custom_labware_load_params() ) namespace, version = load_labware_params.resolve( - mapped_load_name, namespace, version, custom_labware_params + load_name, namespace, version, custom_labware_params ) load_result = self._engine_client.load_labware( - load_name=mapped_load_name, + load_name=load_name, location=load_location, namespace=namespace, version=version, @@ -180,11 +244,12 @@ def load_labware( deck_conflict.check( engine_state=self._engine_client.state, new_labware_id=load_result.labwareId, - # It's important that we don't fetch these IDs from Protocol Engine, and - # use our own bookkeeping instead. If we fetched these IDs from Protocol - # Engine, it would have leaked state from Labware Position Check in the - # same HTTP run. - # + existing_disposal_locations=self._disposal_locations, + # TODO (spp, 2023-11-27): We've been using IDs from _labware_cores_by_id + # and _module_cores_by_id instead of getting the lists directly from engine + # because of the chance of engine carrying labware IDs from LPC too. + # But with https://github.com/Opentrons/opentrons/pull/13943, + # & LPC in maintenance runs, we can now rely on engine state for these IDs too. # Wrapping .keys() in list() is just to make Decoy verification easier. existing_labware_ids=list(self._labware_cores_by_id.keys()), existing_module_ids=list(self._module_cores_by_id.keys()), @@ -202,7 +267,13 @@ def load_labware( def load_adapter( self, load_name: str, - location: Union[DeckSlotName, ModuleCore, NonConnectedModuleCore, OffDeckType], + location: Union[ + DeckSlotName, + StagingSlotName, + ModuleCore, + NonConnectedModuleCore, + OffDeckType, + ], namespace: Optional[str], version: Optional[int], ) -> LabwareCore: @@ -228,10 +299,9 @@ def load_adapter( deck_conflict.check( engine_state=self._engine_client.state, new_labware_id=load_result.labwareId, - # It's important that we don't fetch these IDs from Protocol Engine, and - # use our own bookkeeping instead. If we fetched these IDs from Protocol - # Engine, it would have leaked state from Labware Position Check in the - # same HTTP run. + existing_disposal_locations=self._disposal_locations, + # TODO: We can now fetch these IDs from engine too. + # See comment in self.load_labware(). # # Wrapping .keys() in list() is just to make Decoy verification easier. existing_labware_ids=list(self._labware_cores_by_id.keys()), @@ -252,7 +322,13 @@ def move_labware( self, labware_core: LabwareCore, new_location: Union[ - DeckSlotName, LabwareCore, ModuleCore, NonConnectedModuleCore, OffDeckType + DeckSlotName, + StagingSlotName, + LabwareCore, + ModuleCore, + NonConnectedModuleCore, + OffDeckType, + WasteChute, ], use_gripper: bool, pause_for_manual_move: bool, @@ -260,8 +336,6 @@ def move_labware( drop_offset: Optional[Tuple[float, float, float]], ) -> None: """Move the given labware to a new location.""" - to_location = self._convert_labware_location(location=new_location) - if use_gripper: strategy = LabwareMovementStrategy.USING_GRIPPER elif pause_for_manual_move: @@ -282,8 +356,7 @@ def move_labware( else None ) - # TODO(mm, 2023-02-23): Check for conflicts with other items on the deck, - # when move_labware() support is no longer experimental. + to_location = self._convert_labware_location(location=new_location) self._engine_client.move_labware( labware_id=labware_core.labware_id, @@ -292,11 +365,27 @@ def move_labware( pick_up_offset=_pick_up_offset, drop_offset=_drop_offset, ) + if strategy == LabwareMovementStrategy.USING_GRIPPER: # Clear out last location since it is not relevant to pipetting # and we only use last location for in-place pipetting commands self.set_last_location(location=None, mount=Mount.EXTENSION) + # FIXME(jbl, 2024-01-04) deck conflict after execution logic issue, read notes in load_labware for more info: + deck_conflict.check( + engine_state=self._engine_client.state, + new_labware_id=labware_core.labware_id, + existing_disposal_locations=self._disposal_locations, + # TODO: We can now fetch these IDs from engine too. + # See comment in self.load_labware(). + existing_labware_ids=[ + labware_id + for labware_id in self._labware_cores_by_id + if labware_id != labware_core.labware_id + ], + existing_module_ids=list(self._module_cores_by_id.keys()), + ) + def _resolve_module_hardware( self, serial_number: str, model: ModuleModel ) -> AbstractModule: @@ -346,8 +435,9 @@ def load_module( deck_conflict.check( engine_state=self._engine_client.state, new_module_id=result.moduleId, - # It's important that we don't fetch these IDs from Protocol Engine. - # See comment in self.load_labware(). + existing_disposal_locations=self._disposal_locations, + # TODO: We can now fetch these IDs from engine too. + # See comment in self.load_labware(). # # Wrapping .keys() in list() is just to make Decoy verification easier. existing_labware_ids=list(self._labware_cores_by_id.keys()), @@ -478,12 +568,25 @@ def set_last_location( self._last_location = location self._last_mount = mount - def get_deck_definition(self) -> DeckDefinitionV3: + def get_deck_definition(self) -> DeckDefinitionV4: """Get the geometry definition of the robot's deck.""" return self._engine_client.state.labware.get_deck_definition() - def get_slot_definition(self, slot: DeckSlotName) -> SlotDefV3: - return self._engine_client.state.labware.get_slot_definition(slot) + def get_slot_definition( + self, slot: Union[DeckSlotName, StagingSlotName] + ) -> SlotDefV3: + """Get the slot definition from the robot's deck.""" + return self._engine_client.state.addressable_areas.get_slot_definition(slot.id) + + def get_slot_definitions(self) -> Dict[str, SlotDefV3]: + """Get all standard slot definitions available in the deck definition.""" + return self._engine_client.state.addressable_areas.get_deck_slot_definitions() + + def get_staging_slot_definitions(self) -> Dict[str, SlotDefV3]: + """Get all staging slot definitions available in the deck definition.""" + return ( + self._engine_client.state.addressable_areas.get_staging_slot_definitions() + ) def _ensure_module_location( self, slot: DeckSlotName, module_type: ModuleType @@ -494,13 +597,11 @@ def _ensure_module_location( raise ValueError(f"A {module_type.value} cannot be loaded into slot {slot}") def get_slot_item( - self, slot_name: DeckSlotName + self, slot_name: Union[DeckSlotName, StagingSlotName] ) -> Union[LabwareCore, ModuleCore, NonConnectedModuleCore, None]: """Get the contents of a given slot, if any.""" loaded_item = self._engine_client.state.geometry.get_slot_item( - slot_name=slot_name, - allowed_labware_ids=set(self._labware_cores_by_id.keys()), - allowed_module_ids=set(self._module_cores_by_id.keys()), + slot_name=slot_name ) if isinstance(loaded_item, LoadedLabware): @@ -535,13 +636,15 @@ def get_labware_on_labware( except LabwareNotLoadedOnLabwareError: return None - def get_slot_center(self, slot_name: DeckSlotName) -> Point: + def get_slot_center(self, slot_name: Union[DeckSlotName, StagingSlotName]) -> Point: """Get the absolute coordinate of a slot's center.""" - return self._engine_client.state.labware.get_slot_center_position(slot_name) + return self._engine_client.state.addressable_areas.get_addressable_area_center( + slot_name.id + ) def get_highest_z(self) -> float: """Get the highest Z point of all deck items.""" - return self._engine_client.state.geometry.get_all_labware_highest_z() + return self._engine_client.state.geometry.get_all_obstacle_highest_z() def get_labware_cores(self) -> List[LabwareCore]: """Get all loaded labware cores.""" @@ -582,6 +685,9 @@ def get_labware_location( return validation.internal_slot_to_public_string( labware_location.slotName, self._engine_client.state.config.robot_type ) + elif isinstance(labware_location, AddressableAreaLocation): + # This will only ever be a robot accurate deck slot name or Flex staging slot name + return labware_location.addressableAreaName elif isinstance(labware_location, ModuleLocation): return self._module_cores_by_id[labware_location.moduleId] elif isinstance(labware_location, OnLabwareLocation): @@ -592,7 +698,13 @@ def get_labware_location( def _convert_labware_location( self, location: Union[ - DeckSlotName, LabwareCore, ModuleCore, NonConnectedModuleCore, OffDeckType + DeckSlotName, + StagingSlotName, + LabwareCore, + ModuleCore, + NonConnectedModuleCore, + OffDeckType, + WasteChute, ], ) -> LabwareLocation: if isinstance(location, LabwareCore): @@ -602,7 +714,14 @@ def _convert_labware_location( @staticmethod def _get_non_stacked_location( - location: Union[DeckSlotName, ModuleCore, NonConnectedModuleCore, OffDeckType] + location: Union[ + DeckSlotName, + StagingSlotName, + ModuleCore, + NonConnectedModuleCore, + OffDeckType, + WasteChute, + ] ) -> NonStackedLocation: if isinstance(location, (ModuleCore, NonConnectedModuleCore)): return ModuleLocation(moduleId=location.module_id) @@ -610,3 +729,8 @@ def _get_non_stacked_location( return OFF_DECK_LOCATION elif isinstance(location, DeckSlotName): return DeckSlotLocation(slotName=location) + elif isinstance(location, StagingSlotName): + return AddressableAreaLocation(addressableAreaName=location.id) + elif isinstance(location, WasteChute): + # TODO(mm, 2023-12-06) This will need to determine the appropriate Waste Chute to return, but only move_labware uses this for now + return AddressableAreaLocation(addressableAreaName="gripperWasteChute") diff --git a/api/src/opentrons/protocol_api/core/engine/stringify.py b/api/src/opentrons/protocol_api/core/engine/stringify.py new file mode 100644 index 00000000000..78de37c5c5d --- /dev/null +++ b/api/src/opentrons/protocol_api/core/engine/stringify.py @@ -0,0 +1,63 @@ +from opentrons.protocol_engine.clients.sync_client import SyncClient +from opentrons.protocol_engine.types import ( + DeckSlotLocation, + LabwareLocation, + ModuleLocation, + OnLabwareLocation, + AddressableAreaLocation, +) + + +def well(engine_client: SyncClient, well_name: str, labware_id: str) -> str: + """Return a human-readable string representing a well and its location. + + For example: "A1 of My Cool Labware on C2". + """ + labware_location = OnLabwareLocation(labwareId=labware_id) + return f"{well_name} of {_labware_location_string(engine_client, labware_location)}" + + +def _labware_location_string( + engine_client: SyncClient, location: LabwareLocation +) -> str: + if isinstance(location, DeckSlotLocation): + # TODO(mm, 2023-10-11): + # Ideally, we might want to use the display name specified by the deck definition? + return f"slot {location.slotName.id}" + + elif isinstance(location, ModuleLocation): + module_name = engine_client.state.modules.get_definition( + module_id=location.moduleId + ).displayName + module_on = engine_client.state.modules.get_location( + module_id=location.moduleId + ) + module_on_string = _labware_location_string(engine_client, module_on) + return f"{module_name} on {module_on_string}" + + elif isinstance(location, OnLabwareLocation): + labware_name = _labware_name(engine_client, location.labwareId) + labware_on = engine_client.state.labware.get_location( + labware_id=location.labwareId + ) + labware_on_string = _labware_location_string(engine_client, labware_on) + return f"{labware_name} on {labware_on_string}" + + elif isinstance(location, AddressableAreaLocation): + # In practice this will always be a deck slot or staging slot + return f"slot {location.addressableAreaName}" + + elif location == "offDeck": + return "[off-deck]" + + +def _labware_name(engine_client: SyncClient, labware_id: str) -> str: + """Return the user-specified labware label, or fall back to the display name from the def.""" + user_name = engine_client.state.labware.get_user_specified_display_name( + labware_id=labware_id + ) + definition_name = engine_client.state.labware.get_definition( + labware_id=labware_id + ).metadata.displayName + + return user_name if user_name is not None else definition_name diff --git a/api/src/opentrons/protocol_api/core/engine/well.py b/api/src/opentrons/protocol_api/core/engine/well.py index 487101d3600..42f6f483f33 100644 --- a/api/src/opentrons/protocol_api/core/engine/well.py +++ b/api/src/opentrons/protocol_api/core/engine/well.py @@ -9,6 +9,7 @@ from opentrons.types import Point from . import point_calculations +from . import stringify from ..well import AbstractWellCore from ..._liquid import Liquid @@ -72,9 +73,12 @@ def set_has_tip(self, value: bool) -> None: ) def get_display_name(self) -> str: - """Get the well's full display name.""" - parent = self._engine_client.state.labware.get_display_name(self._labware_id) - return f"{self._name} of {parent}" + """Get the full display name of the well (e.g. "A1 of Some Labware on 5").""" + return stringify.well( + engine_client=self._engine_client, + well_name=self._name, + labware_id=self._labware_id, + ) def get_name(self) -> str: """Get the name of the well (e.g. "A1").""" diff --git a/api/src/opentrons/protocol_api/core/instrument.py b/api/src/opentrons/protocol_api/core/instrument.py index a2daeb25a5b..e6bf63347b2 100644 --- a/api/src/opentrons/protocol_api/core/instrument.py +++ b/api/src/opentrons/protocol_api/core/instrument.py @@ -3,12 +3,15 @@ from __future__ import annotations from abc import abstractmethod, ABC -from typing import Any, Generic, Optional, TypeVar +from typing import Any, Generic, Optional, TypeVar, Union from opentrons import types from opentrons.hardware_control.dev_types import PipetteDict from opentrons.protocols.api_support.util import FlowRates +from opentrons.protocol_api._nozzle_layout import NozzleLayout +from .._trash_bin import TrashBin +from .._waste_chute import WasteChute from .well import WellCoreType @@ -45,7 +48,7 @@ def aspirate( @abstractmethod def dispense( self, - location: types.Location, + location: Union[types.Location, TrashBin, WasteChute], well_core: Optional[WellCoreType], volume: float, rate: float, @@ -68,7 +71,7 @@ def dispense( @abstractmethod def blow_out( self, - location: types.Location, + location: Union[types.Location, TrashBin, WasteChute], well_core: Optional[WellCoreType], in_place: bool, ) -> None: @@ -132,6 +135,18 @@ def drop_tip( """ ... + @abstractmethod + def drop_tip_in_disposal_location( + self, disposal_location: Union[TrashBin, WasteChute], home_after: Optional[bool] + ) -> None: + """Move to and drop tip into a TrashBin or WasteChute. + + Args: + disposal_location: The disposal location object we're dropping to. + home_after: Whether to home the pipette after the tip is dropped. + """ + ... + @abstractmethod def home(self) -> None: ... @@ -143,7 +158,7 @@ def home_plunger(self) -> None: @abstractmethod def move_to( self, - location: types.Location, + location: Union[types.Location, TrashBin, WasteChute], well_core: Optional[WellCoreType], force_direct: bool, minimum_z_height: Optional[float], @@ -196,6 +211,10 @@ def get_hardware_state(self) -> PipetteDict: def get_channels(self) -> int: ... + @abstractmethod + def get_active_channels(self) -> int: + ... + @abstractmethod def has_tip(self) -> bool: ... @@ -220,6 +239,7 @@ def get_dispense_flow_rate(self, rate: float = 1.0) -> float: def get_blow_out_flow_rate(self, rate: float = 1.0) -> float: ... + @abstractmethod def set_flow_rate( self, aspirate: Optional[float] = None, @@ -228,13 +248,40 @@ def set_flow_rate( ) -> None: ... + @abstractmethod def configure_for_volume(self, volume: float) -> None: """Configure the pipette for a specific volume. Args: - volume: The volume to preppare to handle. + volume: The volume to prepare to handle. """ ... + @abstractmethod + def prepare_to_aspirate(self) -> None: + """Prepare the pipette to aspirate.""" + ... + + @abstractmethod + def configure_nozzle_layout( + self, + style: NozzleLayout, + primary_nozzle: Optional[str], + front_right_nozzle: Optional[str], + ) -> None: + """Configure the pipette to a specific nozzle layout. + + Args: + style: The type of configuration you wish to build. + primary_nozzle: The nozzle that will determine a pipette's critical point. + front_right_nozzle: The front right most nozzle in the requested layout. + """ + ... + + @abstractmethod + def is_tip_tracking_available(self) -> bool: + """Return whether auto tip tracking is available for the pipette's current nozzle configuration.""" + ... + InstrumentCoreType = TypeVar("InstrumentCoreType", bound=AbstractInstrument[Any]) diff --git a/api/src/opentrons/protocol_api/core/legacy/deck.py b/api/src/opentrons/protocol_api/core/legacy/deck.py index 0cddcabd9fc..9a9092af5ae 100644 --- a/api/src/opentrons/protocol_api/core/legacy/deck.py +++ b/api/src/opentrons/protocol_api/core/legacy/deck.py @@ -3,20 +3,25 @@ import functools import logging from collections import UserDict -from typing import Dict, Optional, List, Union -from typing_extensions import Protocol +from typing import Dict, Optional, List, Union, Mapping +from typing_extensions import Protocol, Final + +from opentrons_shared_data.deck import load as load_deck -from opentrons_shared_data.deck import ( - DEFAULT_DECK_DEFINITION_VERSION, - load as load_deck, -) from opentrons_shared_data.deck.dev_types import SlotDefV3 from opentrons_shared_data.labware.dev_types import LabwareUri from opentrons.hardware_control.modules.types import ModuleType from opentrons.motion_planning import deck_conflict from opentrons.protocols.api_support.labware_like import LabwareLike -from opentrons.types import DeckLocation, Location, Mount, Point, DeckSlotName +from opentrons.types import ( + DeckLocation, + Location, + Mount, + Point, + DeckSlotName, + StagingSlotName, +) from opentrons.protocol_api.core.labware import AbstractLabware from opentrons.protocol_api.deck import CalibrationPosition @@ -34,6 +39,9 @@ FIXED_TRASH_ID = "fixedTrash" +DEFAULT_LEGACY_DECK_DEFINITION_VERSION: Final = 3 + + class DeckItem(Protocol): @property def highest_z(self) -> float: @@ -50,7 +58,7 @@ class Deck(UserDict): # type: ignore[type-arg] def __init__(self, deck_type: str) -> None: super().__init__() self._definition = load_deck( - name=deck_type, version=DEFAULT_DECK_DEFINITION_VERSION + name=deck_type, version=DEFAULT_LEGACY_DECK_DEFINITION_VERSION ) self._positions = {} for slot in self._definition["locations"]["orderedSlots"]: @@ -166,7 +174,9 @@ def __delitem__(self, key: DeckLocation) -> None: def __setitem__(self, key: DeckLocation, val: DeckItem) -> None: slot_key_int = self._check_name(key) - existing_items = { + existing_items: Mapping[ + Union[DeckSlotName, StagingSlotName], deck_conflict.DeckItem + ] = { DeckSlotName.from_primitive(slot): self._map_to_conflict_checker_item(item) for slot, item in self.data.items() if item is not None diff --git a/api/src/opentrons/protocol_api/core/legacy/legacy_instrument_core.py b/api/src/opentrons/protocol_api/core/legacy/legacy_instrument_core.py index 65054982125..f70540534af 100644 --- a/api/src/opentrons/protocol_api/core/legacy/legacy_instrument_core.py +++ b/api/src/opentrons/protocol_api/core/legacy/legacy_instrument_core.py @@ -1,7 +1,7 @@ from __future__ import annotations import logging -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING, Optional, Union from opentrons import types from opentrons.hardware_control import CriticalPoint @@ -17,7 +17,10 @@ APIVersionError, ) from opentrons.protocols.geometry import planning +from opentrons.protocol_api._nozzle_layout import NozzleLayout +from ..._trash_bin import TrashBin +from ..._waste_chute import WasteChute from ..instrument import AbstractInstrument from .legacy_well_core import LegacyWellCore from .legacy_module_core import LegacyThermocyclerCore, LegacyHeaterShakerCore @@ -101,7 +104,7 @@ def aspirate( "cause over aspiration if the previous command is a " "blow_out." ) - self.prepare_for_aspirate() + self.prepare_to_aspirate() self.move_to(location=location) elif not in_place: self.move_to(location=location) @@ -110,7 +113,7 @@ def aspirate( def dispense( self, - location: types.Location, + location: Union[types.Location, TrashBin, WasteChute], well_core: Optional[LegacyWellCore], volume: float, rate: float, @@ -128,6 +131,10 @@ def dispense( in_place: Whether we should move_to location. push_out: The amount to push the plunger below bottom position. """ + if isinstance(location, (TrashBin, WasteChute)): + raise APIVersionError( + "Dispense in Moveable Trash or Waste Chute are not supported in this API Version." + ) if push_out: raise APIVersionError("push_out is not supported in this API version.") if not in_place: @@ -137,7 +144,7 @@ def dispense( def blow_out( self, - location: types.Location, + location: Union[types.Location, TrashBin, WasteChute], well_core: Optional[LegacyWellCore], in_place: bool, ) -> None: @@ -148,6 +155,11 @@ def blow_out( well_core: Unused by legacy core. in_place: Whether we should move_to location. """ + if isinstance(location, (TrashBin, WasteChute)): + raise APIVersionError( + "Blow Out in Moveable Trash or Waste Chute are not supported in this API Version." + ) + if not in_place: self.move_to(location=location) self._protocol_interface.get_hardware().blow_out(self._mount) @@ -282,6 +294,13 @@ def drop_tip( f"Could not return tip to {labware_core.get_display_name()}" ) + def drop_tip_in_disposal_location( + self, disposal_location: Union[TrashBin, WasteChute], home_after: Optional[bool] + ) -> None: + raise APIVersionError( + "Dropping tips in a trash bin or waste chute is not supported in this API Version." + ) + def home(self) -> None: """Home the mount""" self._protocol_interface.get_hardware().home_z( @@ -298,7 +317,7 @@ def home_plunger(self) -> None: def move_to( self, - location: types.Location, + location: Union[types.Location, TrashBin, WasteChute], well_core: Optional[LegacyWellCore] = None, force_direct: bool = False, minimum_z_height: Optional[float] = None, @@ -317,6 +336,10 @@ def move_to( LabwareHeightError: An item on the deck is taller than the computed safe travel height. """ + if isinstance(location, (TrashBin, WasteChute)): + raise APIVersionError( + "Move To Trash Bin and Waste Chute are not supported in this API Version." + ) self.flag_unsafe_move(location) # prevent direct movement bugs in PAPI version >= 2.10 @@ -435,7 +458,7 @@ def has_tip(self) -> bool: def is_ready_to_aspirate(self) -> bool: return self.get_hardware_state()["ready_to_aspirate"] - def prepare_for_aspirate(self) -> None: + def prepare_to_aspirate(self) -> None: self._protocol_interface.get_hardware().prepare_for_aspirate(self._mount) def get_return_height(self) -> float: @@ -511,3 +534,20 @@ def flag_unsafe_move(self, location: types.Location) -> None: def configure_for_volume(self, volume: float) -> None: """This will never be called because it was added in API 2.15.""" pass + + def configure_nozzle_layout( + self, + style: NozzleLayout, + primary_nozzle: Optional[str], + front_right_nozzle: Optional[str], + ) -> None: + """This will never be called because it was added in API 2.16.""" + pass + + def get_active_channels(self) -> int: + """This will never be called because it was added in API 2.16.""" + assert False, "get_active_channels only supported in API 2.16 & later" + + def is_tip_tracking_available(self) -> bool: + # Tip tracking is always available in legacy context + return True diff --git a/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py b/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py index 2c99d22bc85..2c2ac1eefe0 100644 --- a/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py +++ b/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py @@ -1,13 +1,13 @@ import logging from typing import Dict, List, Optional, Set, Union, cast, Tuple -from opentrons_shared_data.deck.dev_types import DeckDefinitionV3 +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4, SlotDefV3 from opentrons_shared_data.labware.dev_types import LabwareDefinition from opentrons_shared_data.pipette.dev_types import PipetteNameType from opentrons_shared_data.robot.dev_types import RobotType -from opentrons.types import DeckSlotName, Location, Mount, Point -from opentrons.equipment_broker import EquipmentBroker +from opentrons.types import DeckSlotName, StagingSlotName, Location, Mount, Point +from opentrons.util.broker import Broker from opentrons.hardware_control import SyncHardwareAPI from opentrons.hardware_control.modules import AbstractModule, ModuleModel, ModuleType from opentrons.hardware_control.types import DoorState, PauseType @@ -18,6 +18,8 @@ from ...labware import Labware from ..._liquid import Liquid from ..._types import OffDeckType +from ..._trash_bin import TrashBin +from ..._waste_chute import WasteChute from ..protocol import AbstractProtocol from ..labware import LabwareLoadParams @@ -44,7 +46,7 @@ def __init__( api_version: APIVersion, labware_offset_provider: AbstractLabwareOffsetProvider, deck_layout: Deck, - equipment_broker: Optional[EquipmentBroker[LoadInfo]] = None, + equipment_broker: Optional[Broker[LoadInfo]] = None, bundled_labware: Optional[Dict[str, LabwareDefinition]] = None, extra_labware: Optional[Dict[str, LabwareDefinition]] = None, ) -> None: @@ -73,7 +75,7 @@ def __init__( self._api_version = api_version self._labware_offset_provider = labware_offset_provider self._deck_layout = deck_layout - self._equipment_broker = equipment_broker or EquipmentBroker() + self._equipment_broker = equipment_broker or Broker() self._instruments: Dict[Mount, Optional[LegacyInstrumentCore]] = { mount: None for mount in Mount.ot2_mounts() # Legacy core works only on OT2 @@ -86,6 +88,7 @@ def __init__( self._loaded_modules: Set["AbstractModule"] = set() self._module_cores: List[legacy_module_core.LegacyModuleCore] = [] self._labware_cores: List[LegacyLabwareCore] = [self.fixed_trash] + self._disposal_locations: List[Union[Labware, TrashBin, WasteChute]] = [] @property def api_version(self) -> APIVersion: @@ -97,7 +100,7 @@ def robot_type(self) -> RobotType: return "OT-2 Standard" @property - def equipment_broker(self) -> EquipmentBroker[LoadInfo]: + def equipment_broker(self) -> Broker[LoadInfo]: """A message broker to to publish equipment load events. Subscribers to this broker will be notified with information about every @@ -130,6 +133,17 @@ def is_simulating(self) -> bool: """Returns true if hardware is being simulated.""" return self._sync_hardware.is_simulator # type: ignore[no-any-return] + def append_disposal_location( + self, + disposal_location: Union[Labware, TrashBin, WasteChute], + skip_add_to_engine: bool = False, + ) -> None: + if isinstance(disposal_location, (TrashBin, WasteChute)): + raise APIVersionError( + "Trash Bin and Waste Chute Disposal locations are not supported in this API Version." + ) + self._disposal_locations.append(disposal_location) + def add_labware_definition( self, definition: LabwareDefinition, @@ -151,6 +165,7 @@ def load_labware( DeckSlotName, LegacyLabwareCore, legacy_module_core.LegacyModuleCore, + StagingSlotName, OffDeckType, ], label: Optional[str], @@ -166,6 +181,8 @@ def load_labware( raise APIVersionError( "Loading a labware onto another labware or adapter is only supported with api version 2.15 and above" ) + elif isinstance(location, StagingSlotName): + raise APIVersionError("Using a staging deck slot requires apiLevel 2.16.") deck_slot = ( location if isinstance(location, DeckSlotName) else location.get_deck_slot() @@ -236,7 +253,12 @@ def load_labware( def load_adapter( self, load_name: str, - location: Union[DeckSlotName, legacy_module_core.LegacyModuleCore, OffDeckType], + location: Union[ + DeckSlotName, + StagingSlotName, + legacy_module_core.LegacyModuleCore, + OffDeckType, + ], namespace: Optional[str], version: Optional[int], ) -> LegacyLabwareCore: @@ -249,9 +271,11 @@ def move_labware( labware_core: LegacyLabwareCore, new_location: Union[ DeckSlotName, + StagingSlotName, LegacyLabwareCore, legacy_module_core.LegacyModuleCore, OffDeckType, + WasteChute, ], use_gripper: bool, pause_for_manual_move: bool, @@ -362,6 +386,10 @@ def get_loaded_instruments( """Get a mapping of mount to instrument.""" return self._instruments + def get_disposal_locations(self) -> List[Union[Labware, TrashBin, WasteChute]]: + """Get valid disposal locations.""" + return self._disposal_locations + def pause(self, msg: Optional[str]) -> None: """Pause the protocol.""" self._sync_hardware.pause(PauseType.PAUSE) @@ -450,17 +478,31 @@ def get_labware_on_labware( ) -> Optional[LegacyLabwareCore]: assert False, "get_labware_on_labware only supported on engine core" - def get_deck_definition(self) -> DeckDefinitionV3: + def get_deck_definition(self) -> DeckDefinitionV4: """Get the geometry definition of the robot's deck.""" assert False, "get_deck_definition only supported on engine core" + def get_slot_definition( + self, slot: Union[DeckSlotName, StagingSlotName] + ) -> SlotDefV3: + """Get the slot definition from the robot's deck.""" + assert False, "get_slot_definition only supported on engine core" + + def get_slot_definitions(self) -> Dict[str, SlotDefV3]: + """Get all standard slot definitions available in the deck definition.""" + assert False, "get_slot_definitions only supported on engine core" + + def get_staging_slot_definitions(self) -> Dict[str, SlotDefV3]: + """Get all staging slot definitions available in the deck definition.""" + assert False, "get_staging_slot_definitions only supported on engine core" + def get_slot_item( - self, slot_name: DeckSlotName + self, slot_name: Union[DeckSlotName, StagingSlotName] ) -> Union[LegacyLabwareCore, legacy_module_core.LegacyModuleCore, None]: """Get the contents of a given slot, if any.""" assert False, "get_slot_item only supported on engine core" - def get_slot_center(self, slot_name: DeckSlotName) -> Point: + def get_slot_center(self, slot_name: Union[DeckSlotName, StagingSlotName]) -> Point: """Get the absolute coordinate of a slot's center.""" assert False, "get_slot_center only supported on engine core." diff --git a/api/src/opentrons/protocol_api/core/legacy/legacy_well_core.py b/api/src/opentrons/protocol_api/core/legacy/legacy_well_core.py index c050cd1203b..81780f1006a 100644 --- a/api/src/opentrons/protocol_api/core/legacy/legacy_well_core.py +++ b/api/src/opentrons/protocol_api/core/legacy/legacy_well_core.py @@ -75,7 +75,7 @@ def set_has_tip(self, value: bool) -> None: self._has_tip = value def get_display_name(self) -> str: - """Get the well's full display name.""" + """Get the full display name of the well (e.g. "A1 of Some Labware on 5").""" return self._display_name def get_name(self) -> str: diff --git a/api/src/opentrons/protocol_api/core/legacy/module_geometry.py b/api/src/opentrons/protocol_api/core/legacy/module_geometry.py index 234a36fdc9a..839154a76d1 100644 --- a/api/src/opentrons/protocol_api/core/legacy/module_geometry.py +++ b/api/src/opentrons/protocol_api/core/legacy/module_geometry.py @@ -13,9 +13,11 @@ from typing import TYPE_CHECKING, Optional import numpy as np +from numpy.typing import NDArray from opentrons_shared_data import module from opentrons_shared_data.module.dev_types import ModuleDefinitionV3 +from opentrons_shared_data.module import OLD_TC_GEN2_LABWARE_OFFSET from opentrons.types import Location, Point, LocationLabware from opentrons.motion_planning.adjacent_slots_getters import ( @@ -29,9 +31,9 @@ ModuleModel, ModuleType, module_model_from_string, + ThermocyclerModuleModel, ) - if TYPE_CHECKING: from opentrons.protocol_api.labware import Labware @@ -431,14 +433,30 @@ def create_geometry( The definition should be schema checked before being passed to this function; all definitions passed here are assumed to be valid. """ - pre_transform = np.array( - ( - definition["labwareOffset"]["x"], - definition["labwareOffset"]["y"], - definition["labwareOffset"]["z"], - 1, + module_type = ModuleType(definition["moduleType"]) + module_model = module_model_from_string(definition["model"]) + overall_height = definition["dimensions"]["bareOverallHeight"] + height_over_labware = definition["dimensions"]["overLabwareHeight"] + display_name = definition["displayName"] + + if module_model == ThermocyclerModuleModel.THERMOCYCLER_V2: + pre_transform: NDArray[np.double] = np.array( + ( + OLD_TC_GEN2_LABWARE_OFFSET["x"], + OLD_TC_GEN2_LABWARE_OFFSET["y"], + OLD_TC_GEN2_LABWARE_OFFSET["z"], + 1, + ) + ) + else: + pre_transform = np.array( + ( + definition["labwareOffset"]["x"], + definition["labwareOffset"]["y"], + definition["labwareOffset"]["z"], + 1, + ) ) - ) if not parent.labware.is_slot: par = "" _log.warning( @@ -462,29 +480,29 @@ def create_geometry( xform_ser = xforms_ser["labwareOffset"] # apply the slot transform if any - xform = np.array(xform_ser) - xformed = np.dot(xform, pre_transform) # type: ignore[no-untyped-call] - module_type = ModuleType(definition["moduleType"]) + xform: NDArray[np.double] = np.array(xform_ser) + xformed = np.dot(xform, pre_transform) + labware_offset = Point(xformed[0], xformed[1], xformed[2]) if module_type == ModuleType.MAGNETIC or module_type == ModuleType.TEMPERATURE: return ModuleGeometry( parent=parent, - offset=Point(xformed[0], xformed[1], xformed[2]), - overall_height=definition["dimensions"]["bareOverallHeight"], - height_over_labware=definition["dimensions"]["overLabwareHeight"], - model=module_model_from_string(definition["model"]), - module_type=ModuleType(definition["moduleType"]), - display_name=definition["displayName"], + offset=labware_offset, + overall_height=overall_height, + height_over_labware=height_over_labware, + model=module_model, + module_type=module_type, + display_name=display_name, ) elif module_type == ModuleType.THERMOCYCLER: return ThermocyclerGeometry( parent=parent, - offset=Point(xformed[0], xformed[1], xformed[2]), - overall_height=definition["dimensions"]["bareOverallHeight"], - height_over_labware=definition["dimensions"]["overLabwareHeight"], - model=module_model_from_string(definition["model"]), - module_type=ModuleType(definition["moduleType"]), - display_name=definition["displayName"], + offset=labware_offset, + overall_height=overall_height, + height_over_labware=height_over_labware, + model=module_model, + module_type=module_type, + display_name=display_name, lid_height=definition["dimensions"]["lidHeight"], configuration=( ThermocyclerConfiguration(configuration) @@ -495,14 +513,13 @@ def create_geometry( elif module_type == ModuleType.HEATER_SHAKER: return HeaterShakerGeometry( parent=parent, - offset=Point(xformed[0], xformed[1], xformed[2]), - overall_height=definition["dimensions"]["bareOverallHeight"], - height_over_labware=definition["dimensions"]["overLabwareHeight"], - model=module_model_from_string(definition["model"]), - module_type=ModuleType(definition["moduleType"]), - display_name=definition["displayName"], + offset=labware_offset, + overall_height=overall_height, + height_over_labware=height_over_labware, + model=module_model, + module_type=module_type, + display_name=display_name, ) - else: raise AssertionError(f"Module type {module_type} is invalid") diff --git a/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py b/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py index e852564f9eb..cd1c3b84a5d 100644 --- a/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +++ b/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py @@ -1,10 +1,9 @@ from __future__ import annotations import logging -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING, Optional, Union from opentrons import types -from opentrons.hardware_control import NoTipAttachedError, TipAttachedError from opentrons.hardware_control.dev_types import PipetteDict from opentrons.hardware_control.types import HardwareAction from opentrons.protocols.api_support import instrument as instrument_support @@ -17,6 +16,14 @@ APIVersionError, ) from opentrons.protocols.geometry import planning +from opentrons_shared_data.errors.exceptions import ( + UnexpectedTipRemovalError, + UnexpectedTipAttachError, +) + +from ..._trash_bin import TrashBin +from ..._waste_chute import WasteChute +from opentrons.protocol_api._nozzle_layout import NozzleLayout from ..instrument import AbstractInstrument @@ -101,7 +108,7 @@ def aspirate( "cause over aspiration if the previous command is a " "blow_out." ) - self.prepare_for_aspirate() + self.prepare_to_aspirate() self.move_to(location=location, well_core=well_core) elif location != self._protocol_interface.get_last_location(): self.move_to(location=location, well_core=well_core) @@ -116,7 +123,7 @@ def aspirate( def dispense( self, - location: types.Location, + location: Union[types.Location, TrashBin, WasteChute], well_core: Optional[LegacyWellCore], volume: float, rate: float, @@ -124,6 +131,10 @@ def dispense( in_place: bool, push_out: Optional[float], ) -> None: + if isinstance(location, (TrashBin, WasteChute)): + raise APIVersionError( + "Dispense in Moveable Trash or Waste Chute are not supported in this API Version." + ) if not in_place: self.move_to(location=location, well_core=well_core) self._raise_if_no_tip(HardwareAction.DISPENSE.name) @@ -131,10 +142,14 @@ def dispense( def blow_out( self, - location: types.Location, + location: Union[types.Location, TrashBin, WasteChute], well_core: Optional[LegacyWellCore], in_place: bool, ) -> None: + if isinstance(location, (TrashBin, WasteChute)): + raise APIVersionError( + "Blow Out in Moveable Trash or Waste Chute are not supported in this API Version." + ) if not in_place: self.move_to(location=location, well_core=well_core) self._raise_if_no_tip(HardwareAction.BLOWOUT.name) @@ -247,6 +262,13 @@ def drop_tip( f"Could not return tip to {labware_core.get_display_name()}" ) + def drop_tip_in_disposal_location( + self, disposal_location: Union[TrashBin, WasteChute], home_after: Optional[bool] + ) -> None: + raise APIVersionError( + "Dropping tips in a trash bin or waste chute is not supported in this API Version." + ) + def home(self) -> None: self._protocol_interface.set_last_location(None) @@ -255,13 +277,18 @@ def home_plunger(self) -> None: def move_to( self, - location: types.Location, + location: Union[types.Location, TrashBin, WasteChute], well_core: Optional[LegacyWellCore] = None, force_direct: bool = False, minimum_z_height: Optional[float] = None, speed: Optional[float] = None, ) -> None: """Simulation of only the motion planning portion of move_to.""" + if isinstance(location, (TrashBin, WasteChute)): + raise APIVersionError( + "Move To Trash Bin and Waste Chute are not supported in this API Version." + ) + self.flag_unsafe_move(location) last_location = self._protocol_interface.get_last_location() @@ -324,7 +351,7 @@ def has_tip(self) -> bool: def is_ready_to_aspirate(self) -> bool: return self._pipette_dict["ready_to_aspirate"] - def prepare_for_aspirate(self) -> None: + def prepare_to_aspirate(self) -> None: self._raise_if_no_tip(HardwareAction.PREPARE_ASPIRATE.name) def get_return_height(self) -> float: @@ -409,15 +436,36 @@ def _update_flow_rate(self) -> None: self._pipette_dict["blow_out_speed"] = p["blow_out_speed"] def _raise_if_no_tip(self, action: str) -> None: - """Raise NoTipAttachedError if no tip.""" + """Raise UnexpectedTipRemovalError if no tip.""" if not self.has_tip(): - raise NoTipAttachedError(f"Cannot perform {action} without a tip attached") + raise UnexpectedTipRemovalError( + action, self._instrument_name, self._mount.name + ) def _raise_if_tip(self, action: str) -> None: - """Raise TipAttachedError if tip.""" + """Raise UnexpectedTipAttachError if tip.""" if self.has_tip(): - raise TipAttachedError(f"Cannot {action} with a tip attached") + raise UnexpectedTipAttachError( + action, self._instrument_name, self._mount.name + ) def configure_for_volume(self, volume: float) -> None: """This will never be called because it was added in API 2.15.""" pass + + def configure_nozzle_layout( + self, + style: NozzleLayout, + primary_nozzle: Optional[str], + front_right_nozzle: Optional[str], + ) -> None: + """This will never be called because it was added in API 2.15.""" + pass + + def get_active_channels(self) -> int: + """This will never be called because it was added in API 2.16.""" + assert False, "get_active_channels only supported in API 2.16 & later" + + def is_tip_tracking_available(self) -> bool: + # Tip tracking is always available in legacy context + return True diff --git a/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py b/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py index 93cebe167aa..9fb9d1a0f51 100644 --- a/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +++ b/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py @@ -2,6 +2,11 @@ from typing import Dict, Optional from opentrons_shared_data.pipette.dev_types import PipetteNameType +from opentrons_shared_data.pipette.pipette_load_name_conversions import ( + convert_to_pipette_name_type, +) +from opentrons_shared_data.pipette.types import PipetteGenerationType + from opentrons.types import Mount from ..protocol import AbstractProtocol @@ -27,6 +32,16 @@ def load_instrument( # type: ignore[override] self, instrument_name: PipetteNameType, mount: Mount ) -> LegacyInstrumentCoreSimulator: """Create a simulating instrument context.""" + pipette_generation = convert_to_pipette_name_type( + instrument_name.value + ).pipette_generation + + if pipette_generation not in [ + PipetteGenerationType.GEN1, + PipetteGenerationType.GEN2, + ]: + raise ValueError(f"{instrument_name} is not a valid OT-2 pipette.") + existing_instrument = self._instruments[mount] if ( diff --git a/api/src/opentrons/protocol_api/core/protocol.py b/api/src/opentrons/protocol_api/core/protocol.py index abab603c290..8443408eb1b 100644 --- a/api/src/opentrons/protocol_api/core/protocol.py +++ b/api/src/opentrons/protocol_api/core/protocol.py @@ -3,14 +3,14 @@ from __future__ import annotations from abc import abstractmethod, ABC -from typing import Generic, List, Optional, Union, Tuple +from typing import Generic, List, Optional, Union, Tuple, Dict, TYPE_CHECKING -from opentrons_shared_data.deck.dev_types import DeckDefinitionV3 +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4, SlotDefV3 from opentrons_shared_data.pipette.dev_types import PipetteNameType from opentrons_shared_data.labware.dev_types import LabwareDefinition from opentrons_shared_data.robot.dev_types import RobotType -from opentrons.types import DeckSlotName, Location, Mount, Point +from opentrons.types import DeckSlotName, StagingSlotName, Location, Mount, Point from opentrons.hardware_control import SyncHardwareAPI from opentrons.hardware_control.modules.types import ModuleModel from opentrons.protocols.api_support.util import AxisMaxSpeeds @@ -19,15 +19,20 @@ from .labware import LabwareCoreType, LabwareLoadParams from .module import ModuleCoreType from .._liquid import Liquid +from .._trash_bin import TrashBin +from .._waste_chute import WasteChute from .._types import OffDeckType +if TYPE_CHECKING: + from ..labware import Labware + class AbstractProtocol( ABC, Generic[InstrumentCoreType, LabwareCoreType, ModuleCoreType] ): @property @abstractmethod - def fixed_trash(self) -> LabwareCoreType: + def fixed_trash(self) -> Optional[LabwareCoreType]: """Get the fixed trash labware core.""" ... @@ -56,11 +61,22 @@ def add_labware_definition( """Add a labware definition to the set of loadable definitions.""" ... + @abstractmethod + def append_disposal_location( + self, + disposal_location: Union[Labware, TrashBin, WasteChute], + skip_add_to_engine: bool = False, + ) -> None: + """Append a disposal location object to the core""" + ... + @abstractmethod def load_labware( self, load_name: str, - location: Union[DeckSlotName, LabwareCoreType, ModuleCoreType, OffDeckType], + location: Union[ + DeckSlotName, StagingSlotName, LabwareCoreType, ModuleCoreType, OffDeckType + ], label: Optional[str], namespace: Optional[str], version: Optional[int], @@ -72,7 +88,7 @@ def load_labware( def load_adapter( self, load_name: str, - location: Union[DeckSlotName, ModuleCoreType, OffDeckType], + location: Union[DeckSlotName, StagingSlotName, ModuleCoreType, OffDeckType], namespace: Optional[str], version: Optional[int], ) -> LabwareCoreType: @@ -84,7 +100,14 @@ def load_adapter( def move_labware( self, labware_core: LabwareCoreType, - new_location: Union[DeckSlotName, LabwareCoreType, ModuleCoreType, OffDeckType], + new_location: Union[ + DeckSlotName, + StagingSlotName, + LabwareCoreType, + ModuleCoreType, + OffDeckType, + WasteChute, + ], use_gripper: bool, pause_for_manual_move: bool, pick_up_offset: Optional[Tuple[float, float, float]], @@ -127,6 +150,10 @@ def home(self) -> None: def set_rail_lights(self, on: bool) -> None: ... + @abstractmethod + def get_disposal_locations(self) -> List[Union[Labware, TrashBin, WasteChute]]: + ... + @abstractmethod def get_rail_lights_on(self) -> bool: ... @@ -151,12 +178,26 @@ def set_last_location( ... @abstractmethod - def get_deck_definition(self) -> DeckDefinitionV3: + def get_deck_definition(self) -> DeckDefinitionV4: """Get the geometry definition of the robot's deck.""" + @abstractmethod + def get_slot_definition( + self, slot: Union[DeckSlotName, StagingSlotName] + ) -> SlotDefV3: + """Get the slot definition from the robot's deck.""" + + @abstractmethod + def get_slot_definitions(self) -> Dict[str, SlotDefV3]: + """Get all standard slot definitions available in the deck definition.""" + + @abstractmethod + def get_staging_slot_definitions(self) -> Dict[str, SlotDefV3]: + """Get all staging slot definitions available in the deck definition.""" + @abstractmethod def get_slot_item( - self, slot_name: DeckSlotName + self, slot_name: Union[DeckSlotName, StagingSlotName] ) -> Union[LabwareCoreType, ModuleCoreType, None]: """Get the contents of a given slot, if any.""" @@ -173,7 +214,7 @@ def get_labware_on_labware( """Get the labware on a given labware, if any.""" @abstractmethod - def get_slot_center(self, slot_name: DeckSlotName) -> Point: + def get_slot_center(self, slot_name: Union[DeckSlotName, StagingSlotName]) -> Point: """Get the absolute coordinate of a slot's center.""" @abstractmethod diff --git a/api/src/opentrons/protocol_api/core/well.py b/api/src/opentrons/protocol_api/core/well.py index 580cbf802dd..bd58963a59c 100644 --- a/api/src/opentrons/protocol_api/core/well.py +++ b/api/src/opentrons/protocol_api/core/well.py @@ -41,7 +41,7 @@ def set_has_tip(self, value: bool) -> None: @abstractmethod def get_display_name(self) -> str: - """Get the full display name of the well (e.g. "A1 of Some Labware").""" + """Get the full display name of the well (e.g. "A1 of Some Labware on 5").""" @abstractmethod def get_name(self) -> str: diff --git a/api/src/opentrons/protocol_api/create_protocol_context.py b/api/src/opentrons/protocol_api/create_protocol_context.py index f2d8e492ecb..5a64e70cf99 100644 --- a/api/src/opentrons/protocol_api/create_protocol_context.py +++ b/api/src/opentrons/protocol_api/create_protocol_context.py @@ -4,14 +4,14 @@ from opentrons_shared_data.labware.dev_types import LabwareDefinition -from opentrons.broker import Broker -from opentrons.equipment_broker import EquipmentBroker from opentrons.config import feature_flags from opentrons.hardware_control import ( HardwareControlAPI, ThreadManager, SynchronousAdapter, ) +from opentrons.legacy_broker import LegacyBroker +from opentrons.util.broker import Broker from opentrons.protocol_engine import ProtocolEngine from opentrons.protocol_engine.clients import SyncClient, ChildThreadTransport from opentrons.protocols.api_support.types import APIVersion @@ -46,8 +46,8 @@ def create_protocol_context( deck_type: str, protocol_engine: Optional[ProtocolEngine] = None, protocol_engine_loop: Optional[asyncio.AbstractEventLoop] = None, - broker: Optional[Broker] = None, - equipment_broker: Optional[EquipmentBroker[Any]] = None, + broker: Optional[LegacyBroker] = None, + equipment_broker: Optional[Broker[Any]] = None, use_simulating_core: bool = False, extra_labware: Optional[Dict[str, LabwareDefinition]] = None, bundled_labware: Optional[Dict[str, LabwareDefinition]] = None, diff --git a/api/src/opentrons/protocol_api/deck.py b/api/src/opentrons/protocol_api/deck.py index 8907f8436b6..338b1bbecf6 100644 --- a/api/src/opentrons/protocol_api/deck.py +++ b/api/src/opentrons/protocol_api/deck.py @@ -7,7 +7,7 @@ from opentrons.motion_planning import adjacent_slots_getters from opentrons.protocols.api_support.types import APIVersion from opentrons.protocols.api_support.util import APIVersionError -from opentrons.types import DeckLocation, DeckSlotName, Location, Point +from opentrons.types import DeckLocation, DeckSlotName, StagingSlotName, Location, Point from opentrons_shared_data.robot.dev_types import RobotType @@ -22,6 +22,8 @@ DeckItem = Union[Labware, ModuleContext] +STAGING_SLOT_VERSION_GATE = APIVersion(2, 16) + @dataclass(frozen=True) class CalibrationPosition: @@ -40,11 +42,12 @@ class CalibrationPosition: def _get_slot_name( slot_key: DeckLocation, api_version: APIVersion, robot_type: RobotType -) -> DeckSlotName: +) -> Union[DeckSlotName, StagingSlotName]: try: - return validation.ensure_and_convert_deck_slot( + slot = validation.ensure_and_convert_deck_slot( slot_key, api_version, robot_type ) + return slot except (TypeError, ValueError) as error: raise KeyError(slot_key) from error @@ -65,13 +68,14 @@ def __init__( self._core_map = core_map self._api_version = api_version - self._protocol_core.robot_type - deck_locations = protocol_core.get_deck_definition()["locations"] - self._slot_definitions_by_name = { - slot["id"]: slot for slot in deck_locations["orderedSlots"] - } + self._slot_definitions_by_name = self._protocol_core.get_slot_definitions() + if self._api_version >= STAGING_SLOT_VERSION_GATE: + self._slot_definitions_by_name.update( + self._protocol_core.get_staging_slot_definitions() + ) + self._calibration_positions = [ CalibrationPosition( id=point["id"], @@ -147,7 +151,10 @@ def right_of(self, slot: DeckLocation) -> Optional[DeckItem]: slot_name = _get_slot_name( slot, self._api_version, self._protocol_core.robot_type ) - east_slot = adjacent_slots_getters.get_east_slot(slot_name.as_int()) + if isinstance(slot_name, DeckSlotName): + east_slot = adjacent_slots_getters.get_east_slot(slot_name.as_int()) + else: + east_slot = None return self[east_slot] if east_slot is not None else None @@ -157,7 +164,11 @@ def left_of(self, slot: DeckLocation) -> Optional[DeckItem]: slot_name = _get_slot_name( slot, self._api_version, self._protocol_core.robot_type ) - west_slot = adjacent_slots_getters.get_west_slot(slot_name.as_int()) + west_slot: Optional[DeckLocation] + if isinstance(slot_name, DeckSlotName): + west_slot = adjacent_slots_getters.get_west_slot(slot_name.as_int()) + else: + west_slot = adjacent_slots_getters.get_west_of_staging_slot(slot_name).id return self[west_slot] if west_slot is not None else None diff --git a/api/src/opentrons/protocol_api/instrument_context.py b/api/src/opentrons/protocol_api/instrument_context.py index a275ef96e1f..4403f8e5912 100644 --- a/api/src/opentrons/protocol_api/instrument_context.py +++ b/api/src/opentrons/protocol_api/instrument_context.py @@ -1,21 +1,23 @@ from __future__ import annotations import logging -from contextlib import nullcontext -from typing import Any, List, Optional, Sequence, Union, cast +from contextlib import ExitStack +from typing import Any, List, Optional, Sequence, Union, cast, Dict from opentrons_shared_data.errors.exceptions import ( CommandPreconditionViolated, CommandParameterLimitViolated, + UnexpectedTipRemovalError, ) -from opentrons.broker import Broker +from opentrons.legacy_broker import LegacyBroker from opentrons.hardware_control.dev_types import PipetteDict -from opentrons import types, hardware_control as hc +from opentrons import types from opentrons.commands import commands as cmds from opentrons.commands import publisher from opentrons.protocols.advanced_control.mix import mix_from_kwargs from opentrons.protocols.advanced_control import transfers +from opentrons.protocols.api_support.deck_type import NoTrashDefinedError from opentrons.protocols.api_support.types import APIVersion from opentrons.protocols.api_support import instrument from opentrons.protocols.api_support.util import ( @@ -30,6 +32,9 @@ from .core.engine import ENGINE_CORE_API_VERSION from .core.legacy.legacy_instrument_core import LegacyInstrumentCore from .config import Clearances +from ._trash_bin import TrashBin +from ._waste_chute import WasteChute +from ._nozzle_layout import NozzleLayout from . import labware, validation @@ -51,21 +56,26 @@ """The version after which the pick-up tip procedure deprecates presses and increment arguments.""" _DROP_TIP_LOCATION_ALTERNATING_ADDED_IN = APIVersion(2, 15) """The version after which a drop-tip-into-trash procedure drops tips in different alternating locations within the trash well.""" +_PARTIAL_NOZZLE_CONFIGURATION_ADDED_IN = APIVersion(2, 16) class InstrumentContext(publisher.CommandPublisher): - """A context for a specific pipette or instrument. + """ + A context for a specific pipette or instrument. + + The InstrumentContext class provides the objects, attributes, and methods that allow + you to use pipettes in your protocols. + + Methods generally fall into one of two categories. - This can be used to call methods related to pipettes - moves or - aspirates or dispenses, or higher-level methods. + - They can change the state of the InstrumentContext object, like how fast it + moves liquid or where it disposes of used tips. - Instances of this class bundle up state and config changes to a - pipette - for instance, changes to flow rates or trash containers. - Action methods (like :py:meth:`aspirate` or :py:meth:`distribute`) are - defined here for convenience. + - They can command the instrument to perform an action, like picking up tips, + moving to certain locations, and aspirating or dispensing liquid. - In general, this class should not be instantiated directly; rather, - instances are returned from :py:meth:`ProtocolContext.load_instrument`. + Objects in this class should not be instantiated directly. Instead, instances are + returned by :py:meth:`ProtocolContext.load_instrument`. .. versionadded:: 2.0 @@ -75,13 +85,12 @@ def __init__( self, core: InstrumentCore, protocol_core: ProtocolCore, - broker: Broker, + broker: LegacyBroker, api_version: APIVersion, tip_racks: List[labware.Labware], - trash: labware.Labware, + trash: Optional[Union[labware.Labware, TrashBin, WasteChute]], requested_as: str, ) -> None: - super().__init__(broker) self._api_version = api_version self._core = core @@ -93,16 +102,17 @@ def __init__( default_aspirate=_DEFAULT_ASPIRATE_CLEARANCE, default_dispense=_DEFAULT_DISPENSE_CLEARANCE, ) - - self.trash_container = trash + self._user_specified_trash: Union[ + labware.Labware, TrashBin, WasteChute, None + ] = trash self.requested_as = requested_as - @property # type: ignore + @property @requires_version(2, 0) def api_version(self) -> APIVersion: return self._api_version - @property # type: ignore + @property @requires_version(2, 0) def starting_tip(self) -> Union[labware.Well, None]: """ @@ -112,10 +122,10 @@ def starting_tip(self) -> Union[labware.Well, None]: .. note:: - In robot software versions 6.3.0 and 6.3.1, protocols specifying API level 2.14 would - not respect ``starting_tip`` on the second and subsequent calls to - :py:meth:`.InstrumentContext.pick_up_tip` with no argument. This is fixed for all API - levels as of robot software version 7.0.0. + In robot software versions 6.3.0 and 6.3.1, protocols specifying API level + 2.14 ignored ``starting_tip`` on the second and subsequent calls to + :py:meth:`.InstrumentContext.pick_up_tip` with no argument. This is fixed + for all API levels as of robot software version 7.0.0. """ return self._starting_tip @@ -125,20 +135,20 @@ def starting_tip(self, location: Union[labware.Well, None]) -> None: @requires_version(2, 0) def reset_tipracks(self) -> None: - """Reload all tips in each tip rack and reset starting tip""" + """Reload all tips in each tip rack and reset the starting tip.""" for tiprack in self.tip_racks: tiprack.reset() self.starting_tip = None - @property # type: ignore[misc] + @property @requires_version(2, 0) def default_speed(self) -> float: - """The speed at which the robot's gantry moves. + """The speed at which the robot's gantry moves in mm/s. - By default, 400 mm/s. Changing this value will change the speed of the - pipette when moving between labware. In addition to changing the - default, the speed of individual motions can be changed with the - ``speed`` argument to :py:meth:`InstrumentContext.move_to`. + The default speed for Flex varies between 300 and 350 mm/s. The OT-2 default is + 400 mm/s. In addition to changing the default, the speed of individual motions + can be changed with the ``speed`` argument of the + :py:meth:`InstrumentContext.move_to` method. See :ref:`gantry_speed`. """ return self._core.get_default_speed() @@ -154,36 +164,48 @@ def aspirate( rate: float = 1.0, ) -> InstrumentContext: """ - Aspirate a given volume of liquid from the specified location, using - this pipette. + Draw liquid into a pipette tip. + + See :ref:`new-aspirate` for more details and examples. - :param volume: The volume to aspirate, in microliters (µL). If 0 or - unspecified, defaults to the highest volume possible - with this pipette and its currently attached tip. + :param volume: The volume to aspirate, measured in µL. If unspecified, + defaults to the maximum volume for the pipette and its currently + attached tip. + + If ``aspirate`` is called with a volume of precisely 0, its behavior + depends on the API level of the protocol. On API levels below 2.16, + it will behave the same as a volume of ``None``/unspecified: aspirate + until the pipette is full. On API levels at or above 2.16, no liquid + will be aspirated. :type volume: int or float - :param location: Where to aspirate from. If `location` is a - :py:class:`.Well`, the robot will aspirate from - :py:obj:`well_bottom_clearance.aspirate ` - mm above the bottom of the well. If `location` is a - :py:class:`.Location` (i.e. the result of - :py:meth:`.Well.top` or :py:meth:`.Well.bottom`), the - robot will aspirate from the exact specified location. - If unspecified, the robot will aspirate from the - current position. - :param rate: A relative modifier for how quickly to aspirate liquid. - The flow rate for this aspirate will be - `rate` * :py:attr:`flow_rate.aspirate `. - If not specified, defaults to 1.0. + :param location: Tells the robot where to aspirate from. The location can be + a :py:class:`.Well` or a :py:class:`.Location`. + + - If the location is a ``Well``, the robot will aspirate at + or above the bottom center of the well. The distance (in mm) + from the well bottom is specified by + :py:obj:`well_bottom_clearance.aspirate + `. + + - If the location is a ``Location`` (e.g., the result of + :py:meth:`.Well.top` or :py:meth:`.Well.bottom`), the robot + will aspirate from that specified position. + + - If the ``location`` is unspecified, the robot will + aspirate from its current position. + :param rate: A multiplier for the default flow rate of the pipette. Calculated + as ``rate`` multiplied by :py:attr:`flow_rate.aspirate + `. If not specified, defaults to 1.0. See + :ref:`new-plunger-flow-rates`. :type rate: float :returns: This instance. .. note:: - If ``aspirate`` is called with a single argument, it will not try - to guess whether the argument is a volume or location - it is - required to be a volume. If you want to call ``aspirate`` with only - a location, specify it as a keyword argument: - ``instr.aspirate(location=wellplate['A1'])`` + If ``aspirate`` is called with a single, unnamed argument, it will treat + that argument as ``volume``. If you want to call ``aspirate`` with only + ``location``, specify it as a keyword argument: + ``pipette.aspirate(location=plate['A1'])`` """ _log.debug( @@ -215,7 +237,10 @@ def aspirate( well = target.well if isinstance(target, validation.PointTarget): move_to_location = target.location - + if isinstance(target, (TrashBin, WasteChute)): + raise ValueError( + "Trash Bin and Waste Chute are not acceptable location parameters for Aspirate commands." + ) if self.api_version >= APIVersion(2, 11): instrument.validate_takes_liquid( location=move_to_location, @@ -223,7 +248,10 @@ def aspirate( reject_adapter=self.api_version >= APIVersion(2, 15), ) - c_vol = self._core.get_available_volume() if not volume else volume + if self.api_version >= APIVersion(2, 16): + c_vol = self._core.get_available_volume() if volume is None else volume + else: + c_vol = self._core.get_available_volume() if not volume else volume flow_rate = self._core.get_aspirate_flow_rate(rate) with publisher.publish_context( @@ -248,55 +276,79 @@ def aspirate( return self @requires_version(2, 0) - def dispense( + def dispense( # noqa: C901 self, volume: Optional[float] = None, - location: Optional[Union[types.Location, labware.Well]] = None, + location: Optional[ + Union[types.Location, labware.Well, TrashBin, WasteChute] + ] = None, rate: float = 1.0, push_out: Optional[float] = None, ) -> InstrumentContext: """ - Dispense a volume of liquid (in microliters/uL) using this pipette - into the specified location. + Dispense liquid from a pipette tip. + + See :ref:`new-dispense` for more details and examples. - If only a volume is passed, the pipette will dispense from its current - position. If only a location is passed (as in - ``instr.dispense(location=wellplate['A1'])``), all of the liquid - aspirated into the pipette will be dispensed (this volume is accessible - through :py:attr:`current_volume`). + :param volume: The volume to dispense, measured in µL. If unspecified, + defaults to :py:attr:`current_volume`. If only a volume is + passed, the pipette will dispense from its current position. - :param volume: The volume of liquid to dispense, in microliters. If 0 - or unspecified, defaults to :py:attr:`current_volume`. + If ``dispense`` is called with a volume of precisely 0, its behavior + depends on the API level of the protocol. On API levels below 2.16, + it will behave the same as a volume of ``None``/unspecified: dispense + all liquid in the pipette. On API levels at or above 2.16, no liquid + will be dispensed. :type volume: int or float - :param location: Where to dispense into. If `location` is a - :py:class:`.Well`, the robot will dispense into - :py:obj:`well_bottom_clearance.dispense ` - mm above the bottom of the well. If `location` is a - :py:class:`.Location` (i.e. the result of - :py:meth:`.Well.top` or :py:meth:`.Well.bottom`), the - robot will dispense into the exact specified location. - If unspecified, the robot will dispense into the - current position. - :param rate: A relative modifier for how quickly to dispense liquid. - The flow rate for this dispense will be - `rate` * :py:attr:`flow_rate.dispense `. - If not specified, defaults to 1.0. + :param location: Tells the robot where to dispense liquid held in the pipette. + The location can be a :py:class:`.Well` or a + :py:class:`.Location`. + + - If the location is a ``Well``, the pipette will dispense + at or above the bottom center of the well. The distance (in + mm) from the well bottom is specified by + :py:obj:`well_bottom_clearance.dispense + `. + + - If the location is a ``Location`` (e.g., the result of + :py:meth:`.Well.top` or :py:meth:`.Well.bottom`), the robot + will dispense into that specified position. + + - If the ``location`` is unspecified, the robot will + dispense into its current position. + + If only a ``location`` is passed (e.g., + ``pipette.dispense(location=plate['A1'])``), all of the + liquid aspirated into the pipette will be dispensed (the + amount is accessible through :py:attr:`current_volume`). + + :param rate: How quickly a pipette dispenses liquid. The speed in µL/s is + calculated as ``rate`` multiplied by :py:attr:`flow_rate.dispense + `. If not specified, defaults to 1.0. See + :ref:`new-plunger-flow-rates`. :type rate: float - :param push_out: Continue past the plunger bottom to guarantee all liquid - leaves the tip. Specified in microliters. By default, this value is None. + :param push_out: Continue past the plunger bottom to help ensure all liquid + leaves the tip. Measured in µL. The default value is ``None``. + + See :ref:`push-out-dispense` for details. :type push_out: float :returns: This instance. .. note:: - If ``dispense`` is called with a single argument, it will not try - to guess whether the argument is a volume or location - it is - required to be a volume. If you want to call ``dispense`` with only - a location, specify it as a keyword argument: - ``instr.dispense(location=wellplate['A1'])`` + If ``dispense`` is called with a single, unnamed argument, it will treat + that argument as ``volume``. If you want to call ``dispense`` with only + ``location``, specify it as a keyword argument: + ``pipette.dispense(location=plate['A1'])``. + + .. versionchanged:: 2.15 + Added the ``push_out`` parameter. + .. versionchanged:: 2.17 + Now raises an exception if you try to dispense more than is available. + Previously, it would silently clamp. """ if self.api_version < APIVersion(2, 15) and push_out: raise APIVersionError( @@ -335,17 +387,44 @@ def dispense( if isinstance(target, validation.PointTarget): move_to_location = target.location - if self.api_version >= APIVersion(2, 11): + if self.api_version >= APIVersion(2, 11) and not isinstance( + target, (TrashBin, WasteChute) + ): instrument.validate_takes_liquid( location=move_to_location, reject_module=self.api_version >= APIVersion(2, 13), reject_adapter=self.api_version >= APIVersion(2, 15), ) - c_vol = self._core.get_current_volume() if not volume else volume + if self.api_version >= APIVersion(2, 16): + c_vol = self._core.get_current_volume() if volume is None else volume + else: + c_vol = self._core.get_current_volume() if not volume else volume flow_rate = self._core.get_dispense_flow_rate(rate) + if isinstance(target, (TrashBin, WasteChute)): + with publisher.publish_context( + broker=self.broker, + command=cmds.dispense_in_disposal_location( + instrument=self, + volume=c_vol, + location=target, + rate=rate, + flow_rate=flow_rate, + ), + ): + self._core.dispense( + volume=c_vol, + rate=rate, + location=target, + well_core=None, + flow_rate=flow_rate, + in_place=False, + push_out=push_out, + ) + return self + with publisher.publish_context( broker=self.broker, command=cmds.dispense( @@ -377,39 +456,37 @@ def mix( rate: float = 1.0, ) -> InstrumentContext: """ - Mix a volume of liquid (uL) using this pipette, by repeatedly - aspirating and dispensing in the same place. - - :param repetitions: how many times the pipette should mix (default: 1) - :param volume: number of microliters to mix. If 0 or unspecified, - defaults to the highest volume possible with this - pipette and its currently attached tip. - :param location: a Well or a position relative to well. - e.g, `plate.rows()[0][0].bottom()`. If unspecified, - the pipette will mix from its current position. - :type location: types.Location - :param rate: A relative modifier for how quickly to aspirate and - dispense liquid during this mix. When aspirating, the flow - rate will be - `rate` * :py:attr:`flow_rate.aspirate `, - and when dispensing, it will be - `rate` * :py:attr:`flow_rate.dispense `. - :raises: ``NoTipAttachedError`` -- if no tip is attached to the pipette. - :returns: This instance + Mix a volume of liquid by repeatedly aspirating and dispensing it in a single location. + + See :ref:`mix` for examples. + + :param repetitions: Number of times to mix (default is 1). + :param volume: The volume to mix, measured in µL. If unspecified, defaults + to the maximum volume for the pipette and its attached tip. + + If ``mix`` is called with a volume of precisely 0, its behavior + depends on the API level of the protocol. On API levels below 2.16, + it will behave the same as a volume of ``None``/unspecified: mix + the full working volume of the pipette. On API levels at or above 2.16, + no liquid will be mixed. + :param location: The :py:class:`.Well` or :py:class:`~.types.Location` where the + pipette will mix. If unspecified, the pipette will mix at its + current position. + :param rate: How quickly the pipette aspirates and dispenses liquid while + mixing. The aspiration flow rate is calculated as ``rate`` + multiplied by :py:attr:`flow_rate.aspirate `. The + dispensing flow rate is calculated as ``rate`` multiplied by + :py:attr:`flow_rate.dispense `. See + :ref:`new-plunger-flow-rates`. + :raises: ``UnexpectedTipRemovalError`` -- If no tip is attached to the pipette. + :returns: This instance. .. note:: - All the arguments to ``mix`` are optional; however, if you do - not want to specify one of them, all arguments after that one - should be keyword arguments. For instance, if you do not want - to specify volume, you would call - ``pipette.mix(1, location=wellplate['A1'])``. If you do not - want to specify repetitions, you would call - ``pipette.mix(volume=10, location=wellplate['A1'])``. Unlike - previous API versions, ``mix`` will not attempt to guess your - inputs; the first argument will always be interpreted as - ``repetitions``, the second as ``volume``, and the third as - ``location`` unless you use keywords. + All the arguments of ``mix`` are optional. However, if you omit one of them, + all subsequent arguments must be passed as keyword arguments. For instance, + ``pipette.mix(1, location=wellplate['A1'])`` is a valid call, but + ``pipette.mix(1, wellplate['A1'])`` is not. """ _log.debug( @@ -418,9 +495,16 @@ def mix( ) ) if not self._core.has_tip(): - raise hc.NoTipAttachedError("Pipette has no tip. Aborting mix()") + raise UnexpectedTipRemovalError("mix", self.name, self.mount) - c_vol = self._core.get_available_volume() if not volume else volume + if self.api_version >= APIVersion(2, 16): + c_vol = self._core.get_available_volume() if volume is None else volume + else: + c_vol = self._core.get_available_volume() if not volume else volume + + dispense_kwargs: Dict[str, Any] = {} + if self.api_version >= APIVersion(2, 16): + dispense_kwargs["push_out"] = 0.0 with publisher.publish_context( broker=self.broker, @@ -433,7 +517,7 @@ def mix( ): self.aspirate(volume, location, rate) while repetitions - 1 > 0: - self.dispense(volume, rate=rate) + self.dispense(volume, rate=rate, **dispense_kwargs) self.aspirate(volume, rate=rate) repetitions -= 1 self.dispense(volume, rate=rate) @@ -442,28 +526,28 @@ def mix( @requires_version(2, 0) def blow_out( - self, location: Optional[Union[types.Location, labware.Well]] = None + self, + location: Optional[ + Union[types.Location, labware.Well, TrashBin, WasteChute] + ] = None, ) -> InstrumentContext: """ - Blow liquid out of the tip. - - If :py:attr:`dispense` is used to completely empty a pipette, - usually a small amount of liquid will remain in the tip. This - method moves the plunger past its usual stops to fully remove - any remaining liquid from the tip. Regardless of how much liquid - was in the tip when this function is called, after it is done - the tip will be empty. - - :param location: The location to blow out into. If not specified, - defaults to the current location of the pipette - :type location: :py:class:`.Well` or :py:class:`.Location` or None - - :raises RuntimeError: If no location is specified and location cache is - None. This should happen if `blow_out` is called - without first calling a method that takes a - location (eg, :py:meth:`.aspirate`, - :py:meth:`dispense`) - :returns: This instance + Blow an extra amount of air through a pipette's tip to clear it. + + If :py:meth:`dispense` is used to empty a pipette, usually a small amount of + liquid remains in the tip. During a blowout, the pipette moves the plunger + beyond its normal limits to help remove all liquid from the pipette tip. See + :ref:`blow-out`. + + :param location: The blowout location. If no location is specified, the pipette + will blow out from its current position. + :type location: :py:class:`.Well` or :py:class:`.Location` or ``None`` + + :raises RuntimeError: If no location is specified and the location cache is + ``None``. This should happen if ``blow_out()`` is called + without first calling a method that takes a location, like + :py:meth:`.aspirate` or :py:meth:`dispense`. + :returns: This instance. """ well: Optional[labware.Well] = None move_to_location: types.Location @@ -491,6 +575,19 @@ def blow_out( well = target.well elif isinstance(target, validation.PointTarget): move_to_location = target.location + elif isinstance(target, (TrashBin, WasteChute)): + with publisher.publish_context( + broker=self.broker, + command=cmds.blow_out_in_disposal_location( + instrument=self, location=target + ), + ): + self._core.blow_out( + location=target, + well_core=None, + in_place=False, + ) + return self with publisher.publish_context( broker=self.broker, @@ -520,41 +617,38 @@ def touch_tip( speed: float = 60.0, ) -> InstrumentContext: """ - Touch the pipette tip to the sides of a well, with the intent of - removing left-over droplets - - :param location: If no location is passed, pipette will - touch tip at current well's edges - :type location: :py:class:`.Well` or None - :param radius: Describes the proportion of the target well's - radius. When `radius=1.0`, the pipette tip will move to - the edge of the target well; when `radius=0.5`, it will - move to 50% of the well's radius. Default: 1.0 (100%) + Touch the pipette tip to the sides of a well, with the intent of removing leftover droplets. + + See :ref:`touch-tip` for more details and examples. + + :param location: If no location is passed, the pipette will touch its tip at the + edges of the current well. + :type location: :py:class:`.Well` or ``None`` + :param radius: How far to move, as a proportion of the target well's radius. + When ``radius=1.0``, the pipette tip will move all the way to the + edge of the target well. When ``radius=0.5``, it will move to 50% + of the well's radius. Default is 1.0 (100%) :type radius: float - :param v_offset: The offset in mm from the top of the well to touch tip - A positive offset moves the tip higher above the well, - while a negative offset moves it lower into the well - Default: -1.0 mm + :param v_offset: How far above or below the well to touch the tip, measured in mm. + A positive offset moves the tip higher above the well. + A negative offset moves the tip lower into the well. + Default is -1.0 mm. :type v_offset: float :param speed: The speed for touch tip motion, in mm/s. - Default: 60.0 mm/s, Max: 80.0 mm/s, Min: 20.0 mm/s - :type speed: float - :raises: ``NoTipAttachedError`` -- if no tip is attached to the pipette - :raises RuntimeError: If no location is specified and location cache is - None. This should happen if `touch_tip` is called - without first calling a method that takes a - location (eg, :py:meth:`.aspirate`, - :py:meth:`dispense`) - :returns: This instance - - .. note:: - - This is behavior change from legacy API (which accepts any - ``Placeable`` as the ``location`` parameter) + - Default: 60.0 mm/s + - Maximum: 80.0 mm/s + - Minimum: 1.0 mm/s + :type speed: float + :raises: ``UnexpectedTipRemovalError`` -- If no tip is attached to the pipette. + :raises RuntimeError: If no location is specified and the location cache is + ``None``. This should happen if ``touch_tip`` is called + without first calling a method that takes a location, like + :py:meth:`.aspirate` or :py:meth:`dispense`. + :returns: This instance. """ if not self._core.has_tip(): - raise hc.NoTipAttachedError("Pipette has no tip to touch_tip()") + raise UnexpectedTipRemovalError("touch_tip", self.name, self.mount) checked_speed = self._determine_speed(speed) @@ -602,38 +696,38 @@ def air_gap( self, volume: Optional[float] = None, height: Optional[float] = None ) -> InstrumentContext: """ - Pull air into the pipette current tip at the current location + Draw air into the pipette's tip at the current well. + + See :ref:`air-gap`. - :param volume: The amount in uL to aspirate air into the tube. - (Default will use all remaining volume in tip) + :param volume: The amount of air, measured in µL. Calling ``air_gap()`` with no + arguments uses the entire remaining volume in the pipette. :type volume: float - :param height: The number of millimiters to move above the current Well - to air-gap aspirate. (Default: 5mm above current Well) + :param height: The height, in mm, to move above the current well before creating + the air gap. The default is 5 mm above the current well. :type height: float - :raises: ``NoTipAttachedError`` -- if no tip is attached to the pipette + :raises: ``UnexpectedTipRemovalError`` -- If no tip is attached to the pipette. - :raises RuntimeError: If location cache is None. - This should happen if `touch_tip` is called - without first calling a method that takes a - location (eg, :py:meth:`.aspirate`, + :raises RuntimeError: If location cache is ``None``. This should happen if + ``air_gap()`` is called without first calling a method + that takes a location (e.g., :py:meth:`.aspirate`, :py:meth:`dispense`) - :returns: This instance + :returns: This instance. .. note:: - Both ``volume`` and height are optional, but unlike previous API - versions, if you want to specify only ``height`` you must do it - as a keyword argument: ``pipette.air_gap(height=2)``. If you - call ``air_gap`` with only one unnamed argument, it will always - be interpreted as a volume. + Both ``volume`` and ``height`` are optional, but if you want to specify only + ``height`` you must do it as a keyword argument: + ``pipette.air_gap(height=2)``. If you call ``air_gap`` with a single, + unnamed argument, it will always be interpreted as a volume. """ if not self._core.has_tip(): - raise hc.NoTipAttachedError("Pipette has no tip. Aborting air_gap") + raise UnexpectedTipRemovalError("air_gap", self.name, self.mount) if height is None: height = 5 @@ -649,15 +743,14 @@ def air_gap( @requires_version(2, 0) def return_tip(self, home_after: Optional[bool] = None) -> InstrumentContext: """ - If a tip is currently attached to the pipette, then the pipette will - return the tip to its location in the tip rack. + Drop the currently attached tip in its original location in the tip rack. - This will not reset tip tracking, so the well flag will remain ``False``. + Returning a tip does not reset tip tracking, so :py:obj:`.Well.has_tip` will + remain ``False`` for the destination. - :returns: This instance + :returns: This instance. - :param home_after: - See the ``home_after`` parameter of :py:obj:`drop_tip`. + :param home_after: See the ``home_after`` parameter of :py:meth:`drop_tip`. """ if not self._core.has_tip(): _log.warning("Pipette has no tip to return") @@ -671,8 +764,8 @@ def return_tip(self, home_after: Optional[bool] = None) -> InstrumentContext: return self - @requires_version(2, 0) # noqa: C901 - def pick_up_tip( + @requires_version(2, 0) + def pick_up_tip( # noqa: C901 self, location: Union[types.Location, labware.Well, labware.Labware, None] = None, presses: Optional[int] = None, @@ -682,60 +775,50 @@ def pick_up_tip( """ Pick up a tip for the pipette to run liquid-handling commands. - If no location is passed, the Pipette will pick up the next available - tip in its :py:attr:`InstrumentContext.tip_racks` list. - Within each tip rack, tips will be picked up in the order specified by - the labware definition and :py:meth:`.Labware.wells`. - To adjust where the sequence starts, see :py:obj:`.starting_tip`. - - The tip to pick up can be manually specified with the `location` - argument. The `location` argument can be specified in several ways: - - * If the only thing to specify is which well from which to pick - up a tip, `location` can be a :py:class:`.Well`. For instance, - if you have a tip rack in a variable called `tiprack`, you can - pick up a specific tip from it with - ``instr.pick_up_tip(tiprack.wells()[0])``. This style of call can - be used to make the robot pick up a tip from a tip rack that - was not specified when creating the :py:class:`.InstrumentContext`. - - * If you want to pick up the next available tip(s) in a specific - tip rack, you may use the tip rack directly: - e.g. ``instr.pick_up_tip(tiprack)`` - - * If the position to move to in the well needs to be specified, - for instance to tell the robot to run its pick up tip routine - starting closer to or farther from the top of the tip, - `location` can be a :py:class:`.types.Location`; for instance, - you can call ``instr.pick_up_tip(tiprack.wells()[0].top())``. - - :param location: The location from which to pick up a tip. - :type location: :py:class:`.types.Location` or :py:class:`.Well` to - pick up a tip from. - :param presses: The number of times to lower and then raise the pipette - when picking up a tip, to ensure a good seal (0 [zero] - will result in the pipette hovering over the tip but - not picking it up--generally not desirable, but could - be used for dry-run). - - .. deprecated:: 2.14 - Use the Opentrons App to change pipette pick-up settings. + See :ref:`basic-tip-pickup`. + + If no location is passed, the pipette will pick up the next available tip in its + :py:attr:`~.InstrumentContext.tip_racks` list. Within each tip rack, tips will + be picked up in the order specified by the labware definition and + :py:meth:`.Labware.wells`. To adjust where the sequence starts, use + :py:obj:`.starting_tip`. + + :param location: The location from which to pick up a tip. The ``location`` + argument can be specified in several ways: + + * As a :py:class:`.Well`. For example, + ``pipette.pick_up_tip(tiprack.wells()[0])`` will always pick + up the first tip in ``tiprack``, even if the rack is not a + member of :py:obj:`.InstrumentContext.tip_racks`. + + * As a labware. ``pipette.pick_up_tip(tiprack)`` will pick up + the next available tip in ``tiprack``, even if the rack is + not a member of :py:obj:`.InstrumentContext.tip_racks`. + + * As a :py:class:`~.types.Location`. Use this to make fine + adjustments to the pickup location. For example, to tell + the robot to start its pick up tip routine 1 mm closer to + the top of the well in the tip rack, call + ``pipette.pick_up_tip(tiprack["A1"].top(z=-1))``. + :type location: :py:class:`.Well` or :py:class:`.Labware` or :py:class:`.types.Location` + :param presses: The number of times to lower and then raise the pipette when + picking up a tip, to ensure a good seal. Zero (``0``) will + result in the pipette hovering over the tip but not picking it + up (generally not desirable, but could be used for a dry run). + + .. deprecated:: 2.14 + Use the Opentrons App to change pipette pick-up settings. :type presses: int - :param increment: The additional distance to travel on each successive - press (e.g.: if `presses=3` and `increment=1.0`, then - the first press will travel down into the tip by - 3.5mm, the second by 4.5mm, and the third by 5.5mm). + :param increment: The additional distance to travel on each successive press. + For example, if ``presses=3`` and ``increment=1.0``, then the + first press will travel down into the tip by 3.5 mm, the + second by 4.5 mm, and the third by 5.5 mm). - .. deprecated:: 2.14 - Use the Opentrons App to change pipette pick-up settings. + .. deprecated:: 2.14 + Use the Opentrons App to change pipette pick-up settings. :type increment: float - :param prep_after: Whether the pipette plunger should prepare itself - to aspirate immediately after picking up a tip. - - .. warning:: - This is provided for compatibility with older - Python Protocol API behavior. You should normally - leave this unset. + :param prep_after: Whether the pipette plunger should prepare itself to aspirate + immediately after picking up a tip. If ``True``, the pipette will move its plunger position to bottom in preparation for any following calls to @@ -743,22 +826,26 @@ def pick_up_tip( If ``False``, the pipette will prepare its plunger later, during the next call to :py:meth:`.aspirate`. This is - accomplished by moving the tip to the top of the well, - and positioning the plunger outside any potential liquids. + accomplished by moving the tip to the top of the well, and + positioning the plunger outside any potential liquids. .. warning:: + This is provided for compatibility with older Python + Protocol API behavior. You should normally leave this + unset. + Setting ``prep_after=False`` may create an unintended pipette movement, when the pipette automatically moves the tip to the top of the well to prepare the plunger. :type prep_after: bool .. versionchanged:: 2.13 - Adds the ``prep_after`` argument. In version 2.12 and earlier, the plunger can't prepare - itself for aspiration during :py:meth:`.pick_up_tip`, and will instead always - prepare during :py:meth:`.aspirate`. Version 2.12 and earlier will raise an - ``APIVersionError`` if a value is set for ``prep_after``. + Adds the ``prep_after`` argument. In version 2.12 and earlier, the plunger + can't prepare itself for aspiration during :py:meth:`.pick_up_tip`, and will + instead always prepare during :py:meth:`.aspirate`. Version 2.12 and earlier + will raise an ``APIVersionError`` if a value is set for ``prep_after``. - :returns: This instance + :returns: This instance. """ if presses is not None and self._api_version >= _PRESSES_INCREMENT_REMOVED_IN: @@ -782,12 +869,25 @@ def pick_up_tip( well: labware.Well tip_rack: labware.Labware move_to_location: Optional[types.Location] = None + active_channels = ( + self.active_channels + if self._api_version >= _PARTIAL_NOZZLE_CONFIGURATION_ADDED_IN + else self.channels + ) if location is None: + if not self._core.is_tip_tracking_available(): + raise CommandPreconditionViolated( + "Automatic tip tracking is not available for the current pipette" + " nozzle configuration. We suggest switching to a configuration" + " that supports automatic tip tracking or specifying the exact tip" + " to pick up." + ) + tip_rack, well = labware.next_available_tip( starting_tip=self.starting_tip, tip_racks=self.tip_racks, - channels=self.channels, + channels=active_channels, ) elif isinstance(location, labware.Well): @@ -798,7 +898,7 @@ def pick_up_tip( tip_rack, well = labware.next_available_tip( starting_tip=None, tip_racks=[location], - channels=self.channels, + channels=active_channels, ) elif isinstance(location, types.Location): @@ -813,7 +913,7 @@ def pick_up_tip( tip_rack, well = labware.next_available_tip( starting_tip=None, tip_racks=[maybe_tip_rack], - channels=self.channels, + channels=active_channels, ) else: raise TypeError( @@ -858,85 +958,74 @@ def pick_up_tip( @requires_version(2, 0) def drop_tip( self, - location: Optional[Union[types.Location, labware.Well]] = None, + location: Optional[ + Union[ + types.Location, + labware.Well, + TrashBin, + WasteChute, + ] + ] = None, home_after: Optional[bool] = None, ) -> InstrumentContext: """ Drop the current tip. - If no location is passed, the Pipette will drop the tip into its - :py:attr:`trash_container`, which if not specified defaults to - the fixed trash in slot 12. From API version 2.15 on, if the trash container is - the default fixed trash in A3 (slot 12), the API will default to - dropping tips in different points within the trash container - in order to prevent tips from piling up in a single location in the trash. - - The location in which to drop the tip can be manually specified with - the `location` argument. The `location` argument can be specified in - several ways: - - - If the only thing to specify is which well into which to drop - a tip, `location` can be a :py:class:`.Well`. For instance, - if you have a tip rack in a variable called `tiprack`, you can - drop a tip into a specific well on that tiprack with the call - `instr.drop_tip(tiprack.wells()[0])`. This style of call can - be used to make the robot drop a tip into arbitrary labware. - - If the position to drop the tip from as well as the - :py:class:`.Well` to drop the tip into needs to be specified, - for instance to tell the robot to drop a tip from an unusually - large height above the tiprack, `location` - can be a :py:class:`.types.Location`; for instance, you can call - `instr.drop_tip(tiprack.wells()[0].top())`. + See :ref:`pipette-drop-tip` for examples. + + If no location is passed (e.g. ``pipette.drop_tip()``), the pipette will drop + the attached tip into its :py:attr:`trash_container`. + + Starting with API version 2.15, if the trash container is the default fixed + trash, the API will instruct the pipette to drop tips in different locations + within the trash container. Varying the tip drop location helps prevent tips + from piling up in a single location. + + The location in which to drop the tip can be manually specified with the + ``location`` argument. The ``location`` argument can be specified in several + ways: + + - As a :py:class:`.Well`. This uses a default location relative to the well. + This style of call can be used to make the robot drop a tip into labware + like a well plate or a reservoir. For example, + ``pipette.drop_tip(location=reservoir["A1"])``. + - As a :py:class:`~.types.Location`. For example, to drop a tip from an + unusually large height above the tip rack, you could call + ``pipette.drop_tip(tip_rack["A1"].top(z=10))``. + - As a :py:class:`.TrashBin`. This uses a default location relative to the + ``TrashBin`` object. For example, + ``pipette.drop_tip(location=trash_bin)``. + - As a :py:class:`.WasteChute`. This uses a default location relative to + the ``WasteChute`` object. For example, + ``pipette.drop_tip(location=waste_chute)``. :param location: - The location to drop the tip + The location to drop the tip. :type location: - :py:class:`.types.Location` or :py:class:`.Well` or None + :py:class:`~.types.Location` or :py:class:`.Well` or ``None`` :param home_after: - Whether to home this pipette's plunger after dropping the tip. - If not specified, defaults to ``True`` on an OT-2. - - Setting ``home_after=False`` saves waiting a couple of seconds - after the pipette drops the tip, but risks causing other problems. - - .. warning:: - Only set ``home_after=False`` if: - - * You're using a GEN2 pipette, not a GEN1 pipette. - * You've tested ``home_after=False`` extensively with your - particular pipette and your particular tips. - * You understand the risks described below. - - The ejector shroud that pops the tip off the end of the pipette is - driven by the plunger's stepper motor. Sometimes, the strain of - ejecting the tip can make that motor *skip* and fall out of sync - with where the robot thinks it is. - - Homing the plunger fixes this, so, to be safe, we normally do it - after every tip drop. - - If you set ``home_after=False`` to disable homing the plunger, and - the motor happens to skip, you might see problems like these until - the next time the plunger is homed: - - * The run might halt with a "hard limit" error message. - * The pipette might aspirate or dispense the wrong volumes. - * The pipette might not fully drop subsequent tips. - - GEN1 pipettes are especially vulnerable to this skipping, so you - should never set ``home_after=False`` with a GEN1 pipette. + Whether to home the pipette's plunger after dropping the tip. If not + specified, defaults to ``True`` on an OT-2. - Even on GEN2 pipettes, the motor can still skip. So, always - extensively test ``home_after=False`` with your particular pipette - and your particular tips before relying on it. + When ``False``, the pipette does not home its plunger. This can save a few + seconds, but is not recommended. Homing helps the robot track the pipette's + position. - :returns: This instance + :returns: This instance. """ alternate_drop_location: bool = False if location is None: - well = self.trash_container.wells()[0] + trash_container = self.trash_container if self.api_version >= _DROP_TIP_LOCATION_ALTERNATING_ADDED_IN: alternate_drop_location = True + if isinstance(trash_container, labware.Labware): + well = trash_container.wells()[0] + else: # implicit drop tip in disposal location, not well + self._core.drop_tip_in_disposal_location( + trash_container, home_after=home_after + ) + self._last_tip_picked_up_from = None + return self elif isinstance(location, labware.Well): well = location @@ -956,6 +1045,19 @@ def drop_tip( well = maybe_well + elif isinstance(location, (TrashBin, WasteChute)): + with publisher.publish_context( + broker=self.broker, + command=cmds.drop_tip_in_disposal_location( + instrument=self, location=location + ), + ): + self._core.drop_tip_in_disposal_location( + location, home_after=home_after + ) + self._last_tip_picked_up_from = None + return self + else: raise TypeError( "If specified, location should be an instance of" @@ -982,6 +1084,8 @@ def drop_tip( def home(self) -> InstrumentContext: """Home the robot. + See :ref:`utility-homing`. + :returns: This instance. """ @@ -996,7 +1100,7 @@ def home(self) -> InstrumentContext: @requires_version(2, 0) def home_plunger(self) -> InstrumentContext: - """Home the plunger associated with this mount + """Home the plunger associated with this mount. :returns: This instance. """ @@ -1022,12 +1126,14 @@ def distribute( :param kwargs: See :py:meth:`transfer` and the :ref:`complex_params` page. Some parameters behave differently than when transferring. - - ``disposal_volume`` aspirates additional liquid to improve the accuracy of each dispense. Defaults to the minimum volume of the pipette. See :ref:`param-disposal-volume` for details. + - ``disposal_volume`` aspirates additional liquid to improve the accuracy + of each dispense. Defaults to the minimum volume of the pipette. See + :ref:`param-disposal-volume` for details. - ``mix_after`` is ignored. - :returns: This instance + :returns: This instance. """ _log.debug("Distributing {} from {} to {}".format(volume, source, dest)) kwargs["mode"] = "distribute" @@ -1059,7 +1165,7 @@ def consolidate( :param kwargs: See :py:meth:`transfer` and the :ref:`complex_params` page. Some parameters behave differently than when transferring. ``disposal_volume`` and ``mix_before`` are ignored. - :returns: This instance + :returns: This instance. """ _log.debug("Consolidate {} from {} to {}".format(volume, source, dest)) kwargs["mode"] = "consolidate" @@ -1072,9 +1178,9 @@ def consolidate( return self.transfer(volume, source, dest, **kwargs) - @publisher.publish(command=cmds.transfer) # noqa: C901 + @publisher.publish(command=cmds.transfer) @requires_version(2, 0) - def transfer( + def transfer( # noqa: C901 self, volume: Union[float, Sequence[float]], source: AdvancedLiquidHandling, @@ -1091,25 +1197,26 @@ def transfer( # TODO: What should happen if the user passes a non-first-row well # TODO: ..as src/dest *while using multichannel pipette? """ - Transfer moves liquid from one well or group of wells to another. It is a - higher-level command, incorporating other :py:class:`InstrumentContext` - commands, like :py:meth:`aspirate` and :py:meth:`dispense`. It makes writing a - protocol easier at the cost of specificity. See :ref:`v2-complex-commands` for - details on how transfer and other complex commands perform their component steps. - - :param volume: The amount, in µL, to aspirate from each source and - dispense to each destination. - If ``volume`` is a list, each amount will be used for the source - and destination at the matching index. A list item of ``0`` will - skip the corresponding wells entirely. See + Move liquid from one well or group of wells to another. + + Transfer is a higher-level command, incorporating other + :py:class:`InstrumentContext` commands, like :py:meth:`aspirate` and + :py:meth:`dispense`. It makes writing a protocol easier at the cost of + specificity. See :ref:`v2-complex-commands` for details on how transfer and + other complex commands perform their component steps. + + :param volume: The amount, in µL, to aspirate from each source and dispense to + each destination. If ``volume`` is a list, each amount will be + used for the source and destination at the matching index. A list + item of ``0`` will skip the corresponding wells entirely. See :ref:`complex-list-volumes` for details and examples. :param source: A single well or a list of wells to aspirate liquid from. :param dest: A single well or a list of wells to dispense liquid into. :Keyword Arguments: Transfer accepts a number of optional parameters that give - you greater control over the exact steps it performs. See :ref:`complex_params` - or the links under each argument's entry below for additional details and - examples. + you greater control over the exact steps it performs. See + :ref:`complex_params` or the links under each argument's entry below for + additional details and examples. * **new_tip** (*string*) -- When to pick up and drop tips during the command. Defaults to ``"once"``. @@ -1148,7 +1255,8 @@ def transfer( If ``blow_out`` is ``True`` and this parameter is not set: - - Blow out into the trash, if the pipette is empty or only contains the disposal volume. + - Blow out into the trash, if the pipette is empty or only contains the + disposal volume. - Blow out into the source well, if the pipette otherwise contains liquid. @@ -1173,7 +1281,7 @@ def transfer( See :ref:`param-disposal-volume` for details. - :returns: This instance + :returns: This instance. """ _log.debug("Transfer {} from {} to {}".format(volume, source, dest)) @@ -1197,6 +1305,11 @@ def transfer( blow_out = kwargs.get("blow_out") blow_out_strategy = None + active_channels = ( + self.active_channels + if self._api_version >= _PARTIAL_NOZZLE_CONFIGURATION_ADDED_IN + else self.channels + ) if blow_out and not blowout_location: if self.current_volume: @@ -1213,7 +1326,7 @@ def transfer( if new_tip != types.TransferTipPolicy.NEVER: tr, next_tip = labware.next_available_tip( - self.starting_tip, self.tip_racks, self.channels + self.starting_tip, self.tip_racks, active_channels ) max_volume = min(next_tip.max_volume, self.max_volume) else: @@ -1297,7 +1410,7 @@ def delay(self, *args: Any, **kwargs: Any) -> None: @requires_version(2, 0) def move_to( self, - location: types.Location, + location: Union[types.Location, TrashBin, WasteChute], force_direct: bool = False, minimum_z_height: Optional[float] = None, speed: Optional[float] = None, @@ -1305,74 +1418,93 @@ def move_to( ) -> InstrumentContext: """Move the instrument. + See :ref:`move-to` for examples. + :param location: The location to move to. - :type location: :py:class:`.types.Location` - :param force_direct: If set to true, move directly to destination - without arc motion. - :param minimum_z_height: When specified, this Z margin is able to raise - (but never lower) the mid-arc height. - :param speed: The speed at which to move. By default, - :py:attr:`InstrumentContext.default_speed`. This controls - the straight linear speed of the motion; to limit - individual axis speeds, you can use - :py:obj:`.ProtocolContext.max_speeds`. - :param publish: Whether a call to this function should publish to the - runlog or not. - """ - publish_ctx = nullcontext() + :type location: :py:class:`~.types.Location` + :param force_direct: If ``True``, move directly to the destination without arc + motion. - if publish: - publish_ctx = publisher.publish_context( - broker=self.broker, - command=cmds.move_to(instrument=self, location=location), - ) - with publish_ctx: - _, well = location.labware.get_parent_labware_and_well() + .. warning:: + Forcing direct motion can cause the pipette to crash + into labware, modules, or other objects on the deck. - self._core.move_to( - location=location, - well_core=well._core if well is not None else None, - force_direct=force_direct, - minimum_z_height=minimum_z_height, - speed=speed, - ) + :param minimum_z_height: An amount, measured in mm, to raise the mid-arc height. + The mid-arc height can't be lowered. + :param speed: The speed at which to move. By default, + :py:attr:`InstrumentContext.default_speed`. This controls the + straight linear speed of the motion. To limit individual axis + speeds, use :py:obj:`.ProtocolContext.max_speeds`. + + :param publish: Whether to list this function call in the run preview. + Default is ``True``. + """ + with ExitStack() as contexts: + if isinstance(location, (TrashBin, WasteChute)): + if publish: + contexts.enter_context( + publisher.publish_context( + broker=self.broker, + command=cmds.move_to_disposal_location( + instrument=self, location=location + ), + ) + ) + + self._core.move_to( + location=location, + well_core=None, + force_direct=force_direct, + minimum_z_height=minimum_z_height, + speed=speed, + ) + else: + if publish: + contexts.enter_context( + publisher.publish_context( + broker=self.broker, + command=cmds.move_to(instrument=self, location=location), + ) + ) + + _, well = location.labware.get_parent_labware_and_well() + + self._core.move_to( + location=location, + well_core=well._core if well is not None else None, + force_direct=force_direct, + minimum_z_height=minimum_z_height, + speed=speed, + ) return self - @property # type: ignore + @property @requires_version(2, 0) def mount(self) -> str: - """Return the name of the mount this pipette is attached to""" + """ + Return the name of the mount the pipette is attached to. + + The possible names are ``"left"`` and ``"right"``. + """ return self._core.get_mount().name.lower() - @property # type: ignore + @property @requires_version(2, 0) def speed(self) -> "PlungerSpeeds": """The speeds (in mm/s) configured for the pipette plunger. - This is an object with attributes ``aspirate``, ``dispense``, and - ``blow_out`` holding the plunger speeds for the corresponding - operation. + This is an object with attributes ``aspirate``, ``dispense``, and ``blow_out`` + holding the plunger speeds for the corresponding operation. .. note:: - This property is equivalent to :py:attr:`flow_rate`; the only - difference is the units in which this property is specified. - Specifying this attribute uses the units of the linear speed of - the plunger inside the pipette, while :py:attr:`flow_rate` uses - the units of the volumetric flow rate of liquid into or out of the - tip. Because :py:attr:`speed` and :py:attr:`flow_rate` modify the - same values, setting one will override the other. - - For instance, to set the plunger speed during an aspirate action, do - - .. code-block :: python - - instrument.speed.aspirate = 50 + Setting values of :py:attr:`flow_rate` will override the values in + :py:attr:`speed`. .. versionchanged:: 2.14 - This property has been removed because it's fundamentally misaligned - with the step-wise nature of a pipette's plunger speed configuration. - Use :py:attr:`.flow_rate` instead. + This property has been removed because it's fundamentally misaligned with + the step-wise nature of a pipette's plunger speed configuration. Use + :py:attr:`.flow_rate` instead. """ if self._api_version >= ENGINE_CORE_API_VERSION: raise APIVersionError( @@ -1385,53 +1517,44 @@ def speed(self) -> "PlungerSpeeds": assert isinstance(self._core, LegacyInstrumentCore) return cast(LegacyInstrumentCore, self._core).get_speed() - @property # type: ignore + @property @requires_version(2, 0) def flow_rate(self) -> "FlowRates": - """The speeds (in uL/s) configured for the pipette. - - This is an object with attributes ``aspirate``, ``dispense``, and - ``blow_out`` holding the flow rates for the corresponding operation. - - .. note:: - This property is equivalent to :py:attr:`speed`; the only - difference is the units in which this property is specified. - specifying this property uses the units of the volumetric flow rate - of liquid into or out of the tip, while :py:attr:`speed` uses the - units of the linear speed of the plunger inside the pipette. - Because :py:attr:`speed` and :py:attr:`flow_rate` modify the - same values, setting one will override the other. + """The speeds, in µL/s, configured for the pipette. - For instance, to change the flow rate for aspiration on an instrument - you would do + See :ref:`new-plunger-flow-rates`. - .. code-block :: python + This is an object with attributes ``aspirate``, ``dispense``, and ``blow_out`` + holding the flow rate for the corresponding operation. - instrument.flow_rate.aspirate = 50 + .. note:: + Setting values of :py:attr:`speed`, which is deprecated, will override the + values in :py:attr:`flow_rate`. """ return self._core.get_flow_rate() - @property # type: ignore + @property @requires_version(2, 0) def type(self) -> str: - """One of `'single'` or `'multi'`.""" - model = self.name - if "single" in model: + """``'single'`` if this is a 1-channel pipette, or ``'multi'`` otherwise. + + See also :py:obj:`.channels`, which can distinguish between 8-channel and 96-channel + pipettes. + """ + if self.channels == 1: return "single" - elif "multi" in model: - return "multi" else: - raise RuntimeError("Bad pipette name: {}".format(model)) + return "multi" - @property # type: ignore + @property @requires_version(2, 0) def tip_racks(self) -> List[labware.Labware]: """ The tip racks that have been linked to this pipette. - This is the property used to determine which tips to pick up next when - calling :py:meth:`pick_up_tip` without arguments. + This is the property used to determine which tips to pick up next when calling + :py:meth:`pick_up_tip` without arguments. See :ref:`basic-tip-pickup`. """ return self._tip_racks @@ -1439,68 +1562,97 @@ def tip_racks(self) -> List[labware.Labware]: def tip_racks(self, racks: List[labware.Labware]) -> None: self._tip_racks = racks - @property # type: ignore + @property @requires_version(2, 0) - def trash_container(self) -> labware.Labware: + def trash_container(self) -> Union[labware.Labware, TrashBin, WasteChute]: """The trash container associated with this pipette. - This is the property used to determine where to drop tips and blow out - liquids when calling :py:meth:`drop_tip` or :py:meth:`blow_out` without - arguments. + This is the property used to determine where to drop tips and blow out liquids + when calling :py:meth:`drop_tip` or :py:meth:`blow_out` without arguments. + + You can set this to a :py:obj:`Labware`, :py:class:`.TrashBin`, or :py:class:`.WasteChute`. + + The default value depends on the robot type and API version: + + - :py:obj:`ProtocolContext.fixed_trash`, if it exists. + - Otherwise, the first item previously loaded with + :py:obj:`ProtocolContext.load_trash_bin()` or + :py:obj:`ProtocolContext.load_waste_chute()`. + + .. versionchanged:: 2.16 + Added support for ``TrashBin`` and ``WasteChute`` objects. """ - return self._trash + if self._user_specified_trash is None: + disposal_locations = self._protocol_core.get_disposal_locations() + if len(disposal_locations) == 0: + raise NoTrashDefinedError( + "No trash container has been defined in this protocol." + ) + return disposal_locations[0] + return self._user_specified_trash @trash_container.setter - def trash_container(self, trash: labware.Labware) -> None: - self._trash = trash + def trash_container( + self, trash: Union[labware.Labware, TrashBin, WasteChute] + ) -> None: + self._user_specified_trash = trash - @property # type: ignore + @property @requires_version(2, 0) def name(self) -> str: """ - The name string for the pipette (e.g. 'p300_single') + The name string for the pipette (e.g., ``"p300_single"``). """ return self._core.get_pipette_name() - @property # type: ignore + @property @requires_version(2, 0) def model(self) -> str: """ - The model string for the pipette (e.g. 'p300_single_v1.3') + The model string for the pipette (e.g., ``'p300_single_v1.3'``) """ return self._core.get_model() - @property # type: ignore + @property @requires_version(2, 0) def min_volume(self) -> float: + """ + The minimum volume, in µL, that the pipette can hold. This value may change + based on the :ref:`volume mode ` that the pipette is + currently configured for. + """ return self._core.get_min_volume() - @property # type: ignore + @property @requires_version(2, 0) def max_volume(self) -> float: """ - The maximum volume, in microliters (µL), that this pipette can hold. + The maximum volume, in µL, that the pipette can hold. - The maximum volume that you can actually aspirate might be lower than - this, depending on what kind of tip is attached to this pipette. For - example, a P300 Single-Channel pipette always has a ``max_volume`` of - 300 µL, but if it's using a 200 µL filter tip, its usable volume would - be limited to 200 µL. + The maximum volume that you can actually aspirate might be lower than this, + depending on what kind of tip is attached to this pipette. For example, a P300 + Single-Channel pipette always has a ``max_volume`` of 300 µL, but if it's using + a 200 µL filter tip, its usable volume would be limited to 200 µL. """ return self._core.get_max_volume() - @property # type: ignore + @property @requires_version(2, 0) def current_volume(self) -> float: """ - The current amount of liquid, in microliters, held in the pipette. + The current amount of liquid held in the pipette, measured in µL. """ return self._core.get_current_volume() - @property # type: ignore + @property @requires_version(2, 7) def has_tip(self) -> bool: - """Return whether this instrument has a tip attached or not.""" + """Whether this instrument has a tip attached or not. + + The value of this property is determined logically by the API, not by detecting + the physical presence of a tip. This is the case even on Flex, which has sensors + to detect tip attachment. + """ return self._core.has_tip() @property @@ -1511,52 +1663,64 @@ def _has_tip(self) -> bool: """ return self._core.has_tip() - @property # type: ignore + @property @requires_version(2, 0) def hw_pipette(self) -> PipetteDict: """View the information returned by the hardware API directly. - :raises: a :py:class:`.types.PipetteNotAttachedError` if the pipette is + :raises: :py:class:`.types.PipetteNotAttachedError` if the pipette is no longer attached (should not happen). """ return self._core.get_hardware_state() - @property # type: ignore + @property @requires_version(2, 0) def channels(self) -> int: - """The number of channels on the pipette.""" + """The number of channels on the pipette. + + Possible values are 1, 8, or 96. + + See also :py:obj:`.type`. + """ return self._core.get_channels() - @property # type: ignore + @property + @requires_version(2, 16) + def active_channels(self) -> int: + """The number of channels the pipette will use to pick up tips. + + By default, all channels on the pipette. Use :py:meth:`.configure_nozzle_layout` + to set the pipette to use fewer channels. + """ + return self._core.get_active_channels() + + @property @requires_version(2, 2) def return_height(self) -> float: - """The height to return a tip to its tiprack. + """The height to return a tip to its tip rack. :returns: A scaling factor to apply to the tip length. - During a drop tip, this factor will be multiplied by the tip length - to get the distance from the top of the well where the tip is dropped. + During :py:meth:`.drop_tip`, this factor is multiplied by the tip + length to get the distance from the top of the well to drop the tip. """ return self._core.get_return_height() - @property # type: ignore + @property @requires_version(2, 0) def well_bottom_clearance(self) -> "Clearances": """The distance above the bottom of a well to aspirate or dispense. - This is an object with attributes ``aspirate`` and ``dispense``, - describing the default heights of the corresponding operation. The - default is 1.0mm for both aspirate and dispense. - - When :py:meth:`aspirate` or :py:meth:`dispense` is given a - :py:class:`.Well` rather than a full :py:class:`.Location`, the robot - will move this distance above the bottom of the well to aspirate or - dispense. + This is an object with attributes ``aspirate`` and ``dispense``, describing the + default height of the corresponding operation. The default is 1.0 mm for both + aspirate and dispense. - To change, set the corresponding attribute. For instance, + When :py:meth:`aspirate` or :py:meth:`dispense` is given a :py:class:`.Well` + rather than a full :py:class:`.Location`, the robot will move this distance + above the bottom of the well to aspirate or dispense. - .. code-block:: python + To change, set the corresponding attribute:: - instr.well_bottom_clearance.aspirate = 1 + pipette.well_bottom_clearance.aspirate = 2 """ return self._well_bottom_clearances @@ -1584,27 +1748,30 @@ def __str__(self) -> str: @requires_version(2, 15) def configure_for_volume(self, volume: float) -> None: - """Configure a pipette to handle a specific volume of liquid, specified in µL. Depending on the - volume, the pipette will enter a certain pipetting mode. Changing pipette modes alters properties - of the instance of :py:class:`.InstrumentContext`, such as default flow rate, minimum volume, and - maximum volume. The pipette will remain in the mode set by this function until it is called again. - - The Flex 1-Channel 50 µL and Flex 8-Channel 50 µL pipettes must operate in a low-volume mode - to accurately dispense 1 µL of liquid. Low-volume mode can only be set by calling this function. - - For more information on available modes for certain pipettes, see :ref:`pipette-volume-modes`. + """Configure a pipette to handle a specific volume of liquid, measured in µL. + The pipette enters a volume mode depending on the volume provided. Changing + pipette modes alters properties of the instance of + :py:class:`.InstrumentContext`, such as default flow rate, minimum volume, and + maximum volume. The pipette remains in the mode set by this function until it is + called again. + + The Flex 1-Channel 50 µL and Flex 8-Channel 50 µL pipettes must operate in a + low-volume mode to accurately dispense very small volumes of liquid. Low-volume + mode can only be set by calling ``configure_for_volume()``. See + :ref:`pipette-volume-modes`. .. note :: - Changing a pipette's mode will reset its :ref:`flow rates `. + Changing a pipette's mode will reset its :ref:`flow rates + `. - This function will raise an error if called when the pipette's tip contains liquid. It won't - raise an error if no tip is attached, but changing modes may affect which tips the pipette can - subsequently pick up without raising an error. + This function will raise an error if called when the pipette's tip contains + liquid. It won't raise an error if a tip is not attached, but changing modes may + affect which tips the pipette can subsequently pick up without raising an error. - This function will also raise an error if ``volume`` is outside the :ref:`overall minimum and - maximum capacities ` of the pipette (e.g., setting ``volume=1`` for a Flex - 1000 µL pipette). + This function will also raise an error if ``volume`` is outside of the + :ref:`minimum and maximum capacities ` of the pipette (e.g., + setting ``volume=1`` for a Flex 1000 µL pipette). :param volume: The volume, in µL, that the pipette will prepare to handle. :type volume: float @@ -1624,3 +1791,121 @@ def configure_for_volume(self, volume: float) -> None: if last_location and isinstance(last_location.labware, labware.Well): self.move_to(last_location.labware.top()) self._core.configure_for_volume(volume) + + @requires_version(2, 16) + def prepare_to_aspirate(self) -> None: + """Prepare a pipette for aspiration. + + Before a pipette can aspirate into an empty tip, the plunger must be in its + bottom position. After dropping a tip or blowing out, the plunger will be in a + different position. This function moves the plunger to the bottom position, + regardless of its current position, to make sure that the pipette is ready to + aspirate. + + You rarely need to call this function. The API automatically prepares the + pipette for aspiration as part of other commands: + + - After picking up a tip with :py:meth:`.pick_up_tip`. + - When calling :py:meth:`.aspirate`, if the pipette isn't already prepared. + If the pipette is in a well, it will move out of the well, move the plunger, + and then move back. + + Use ``prepare_to_aspirate`` when you need to control exactly when the plunger + motion will happen. A common use case is a pre-wetting routine, which requires + preparing for aspiration, moving into a well, and then aspirating *without + leaving the well*:: + + pipette.move_to(well.bottom(z=2)) + pipette.delay(5) + pipette.mix(10, 10) + pipette.move_to(well.top(z=5)) + pipette.blow_out() + pipette.prepare_to_aspirate() + pipette.move_to(well.bottom(z=2)) + pipette.delay(5) + pipette.aspirate(10, well.bottom(z=2)) + + The call to ``prepare_to_aspirate()`` means that the plunger will be in the + bottom position before the call to ``aspirate()``. Since it doesn't need to + prepare again, it will not move up out of the well to move the plunger. It will + aspirate in place. + """ + if self._core.get_current_volume(): + raise CommandPreconditionViolated( + message=f"Cannot prepare {str(self)} for aspirate while it contains liquid." + ) + self._core.prepare_to_aspirate() + + @requires_version(2, 16) + def configure_nozzle_layout( + self, + style: NozzleLayout, + start: Optional[str] = None, + front_right: Optional[str] = None, + tip_racks: Optional[List[labware.Labware]] = None, + ) -> None: + """Configure how many tips the 96-channel pipette will pick up. + + Changing the nozzle layout will affect gantry movement for all subsequent + pipetting actions that the pipette performs. It also alters the pipette's + behavior for picking up tips. The pipette will continue to use the specified + layout until this function is called again. + + .. note:: + When picking up fewer than 96 tips at once, the tip rack *must not* be + placed in a tip rack adapter in the deck. If you try to pick up fewer than 96 + tips from a tip rack that is in an adapter, the API will raise an error. + + :param style: The shape of the nozzle layout. + + - ``COLUMN`` sets the pipette to use 8 nozzles, aligned from front to back + with respect to the deck. This corresponds to a column of wells on labware. + - ``ALL`` resets the pipette to use all of its nozzles. Calling + ``configure_nozzle_layout`` with no arguments also resets the pipette. + + :type style: ``NozzleLayout`` or ``None`` + :param start: The nozzle at the back left of the layout, which the robot uses + to determine how it will move to different locations on the deck. The string + should be of the same format used when identifying wells by name. + Required unless setting ``style=ALL``. + + .. note:: + When using the ``COLUMN`` layout, the only fully supported value is + ``start="A12"``. You can use ``start="A1"``, but this will disable tip + tracking and you will have to specify the ``location`` every time you + call :py:meth:`.pick_up_tip`, such that the pipette picks up columns of + tips *from right to left* on the tip rack. + + :type start: str or ``None`` + :param tip_racks: Behaves the same as setting the ``tip_racks`` parameter of + :py:meth:`.load_instrument`. If not specified, the new configuration resets + :py:obj:`.InstrumentContext.tip_racks` and you must specify the location + every time you call :py:meth:`~.InstrumentContext.pick_up_tip`. + :type tip_racks: List[:py:class:`.Labware`] + """ + # TODO: add the following back into the docstring when QUADRANT is supported + # + # :param front_right: The nozzle at the front left of the layout. Only used for + # NozzleLayout.QUADRANT configurations. + # :type front_right: str or ``None`` + if style != NozzleLayout.ALL: + if start is None: + raise ValueError( + f"Cannot configure a nozzle layout of style {style.value} without a starting nozzle." + ) + if start not in types.ALLOWED_PRIMARY_NOZZLES: + raise ValueError( + f"Starting nozzle specified is not one of {types.ALLOWED_PRIMARY_NOZZLES}" + ) + if style == NozzleLayout.QUADRANT: + if front_right is None: + raise ValueError( + "Cannot configure a QUADRANT layout without a front right nozzle." + ) + self._core.configure_nozzle_layout( + style, + primary_nozzle=start, + front_right_nozzle=front_right, + ) + # TODO (spp, 2023-12-05): verify that tipracks are on adapters for only full 96 channel config + self._tip_racks = tip_racks or [] diff --git a/api/src/opentrons/protocol_api/labware.py b/api/src/opentrons/protocol_api/labware.py index 8385b461880..f0338d062af 100644 --- a/api/src/opentrons/protocol_api/labware.py +++ b/api/src/opentrons/protocol_api/labware.py @@ -68,10 +68,13 @@ class OutOfTipsError(Exception): class Well: """ - The Well class represents a single well in a :py:class:`Labware` + The Well class represents a single well in a :py:class:`Labware`. It provides parameters and functions for three major uses: - It provides functions to return positions used in operations on the well - such as :py:meth:`top`, :py:meth:`bottom` + - Calculating positions relative to the well. See :ref:`position-relative-labware` for details. + + - Returning well measurements. See :ref:`new-labware-well-properties` for details. + + - Specifying what liquid should be in the well at the beginning of a protocol. See :ref:`labeling-liquids` for details. """ def __init__(self, parent: Labware, core: WellCore, api_version: APIVersion): @@ -82,20 +85,22 @@ def __init__(self, parent: Labware, core: WellCore, api_version: APIVersion): self._core = core self._api_version = api_version - @property # type: ignore + @property @requires_version(2, 0) def api_version(self) -> APIVersion: return self._api_version - @property # type: ignore[misc] + @property @requires_version(2, 0) def parent(self) -> Labware: + """The :py:class:`.Labware` object that the well is a part of.""" return self._parent - @property # type: ignore[misc] + @property @requires_version(2, 0) def has_tip(self) -> bool: - """If parent labware is a tip rack, whether this well contains a tip.""" + """Whether this well contains a tip. Always ``False`` if the parent labware + isn't a tip rack.""" return self._core.has_tip() @has_tip.setter @@ -109,6 +114,10 @@ def has_tip(self, value: bool) -> None: @property def max_volume(self) -> float: + """The maximum volume, in µL, that the well can hold. + + This amount is set by the JSON labware definition, specifically the ``totalLiquidVolume`` property of the particular well. + """ return self._core.get_max_volume() @property @@ -117,97 +126,132 @@ def geometry(self) -> WellGeometry: return self._core.geometry raise APIVersionError("Well.geometry has been deprecated.") - @property # type: ignore + @property @requires_version(2, 0) def diameter(self) -> Optional[float]: + """ + The diameter, in mm, of a circular well. Returns ``None`` + if the well is not circular. + """ return self._core.diameter - @property # type: ignore + @property @requires_version(2, 9) def length(self) -> Optional[float]: """ - The length of a well, if the labware has - square wells. + The length, in mm, of a rectangular well along the x-axis (left to right). + Returns ``None`` if the well is not rectangular. """ return self._core.length - @property # type: ignore + @property @requires_version(2, 9) def width(self) -> Optional[float]: """ - The width of a well, if the labware has - square wells. + The width, in mm, of a rectangular well along the y-axis (front to back). + Returns ``None`` if the well is not rectangular. """ return self._core.width - @property # type: ignore + @property @requires_version(2, 9) def depth(self) -> float: """ - The depth of a well in a labware. + The depth, in mm, of a well along the z-axis, from the very top of the well to + the very bottom. """ return self._core.depth @property def display_name(self) -> str: + """A human-readable name for the well, including labware and deck location. + + For example, "A1 of Corning 96 Well Plate 360 µL Flat on slot D1". Run log + entries use this format for identifying wells. See + :py:meth:`.ProtocolContext.commands`. + """ return self._core.get_display_name() - @property # type: ignore + @property @requires_version(2, 7) def well_name(self) -> str: + """A string representing the well's coordinates. + + For example, "A1" or "H12". + + The format of strings that this property returns is the same format as the key + for :ref:`accessing wells in a dictionary `. + """ return self._core.get_name() @requires_version(2, 0) def top(self, z: float = 0.0) -> Location: """ - :param z: the z distance in mm - :return: a Point corresponding to the absolute position of the - top-center of the well relative to the deck (with the - front-left corner of slot 1 as (0,0,0)). If z is specified, - returns a point offset by z mm from top-center + :param z: An offset on the z-axis, in mm. Positive offsets are higher and + negative offsets are lower. + + :return: A :py:class:`~opentrons.types.Location` corresponding to the + absolute position of the top-center of the well, plus the ``z`` offset + (if specified). """ return Location(self._core.get_top(z_offset=z), self) @requires_version(2, 0) def bottom(self, z: float = 0.0) -> Location: """ - :param z: the z distance in mm - :return: a Point corresponding to the absolute position of the - bottom-center of the well (with the front-left corner of - slot 1 as (0,0,0)). If z is specified, returns a point - offset by z mm from bottom-center + :param z: An offset on the z-axis, in mm. Positive offsets are higher and + negative offsets are lower. + + :return: A :py:class:`~opentrons.types.Location` corresponding to the + absolute position of the bottom-center of the well, plus the ``z`` offset + (if specified). """ return Location(self._core.get_bottom(z_offset=z), self) @requires_version(2, 0) def center(self) -> Location: """ - :return: a Point corresponding to the absolute position of the center - of the well relative to the deck (with the front-left corner - of slot 1 as (0,0,0)) + :return: A :py:class:`~opentrons.types.Location` corresponding to the + absolute position of the center of the well (in all three dimensions). """ return Location(self._core.get_center(), self) @requires_version(2, 8) def from_center_cartesian(self, x: float, y: float, z: float) -> Point: """ - Specifies an arbitrary point in deck coordinates based - on percentages of the radius in each axis. For example, to specify the - back-right corner of a well at 1/4 of the well depth from the bottom, - the call would be ``from_center_cartesian(1, 1, -0.5)``. + Specifies a :py:class:`~opentrons.types.Point` based on fractions of the + distance from the center of the well to the edge along each axis. - No checks are performed to ensure that the resulting position will be - inside of the well. + For example, ``from_center_cartesian(0, 0, 0.5)`` specifies a point at the + well's center on the x- and y-axis, and half of the distance from the center of + the well to its top along the z-axis. To move the pipette to that location, + construct a :py:class:`~opentrons.types.Location` relative to the same well:: - :param x: a float in the range [-1.0, 1.0] for a percentage of half of - the radius/length in the X axis - :param y: a float in the range [-1.0, 1.0] for a percentage of half of - the radius/width in the Y axis - :param z: a float in the range [-1.0, 1.0] for a percentage of half of - the height above/below the center + location = types.Location( + plate["A1"].from_center_cartesian(0, 0, 0.5), plate["A1"] + ) + pipette.move_to(location) + + See :ref:`points-locations` for more information. + + :param x: The fraction of the distance from the well's center to its edge + along the x-axis. Negative values are to the left, and positive values + are to the right. + :param y: The fraction of the distance from the well's center to its edge + along the y-axis. Negative values are to the front, and positive values + are to the back. + :param z: The fraction of the distance from the well's center to its edge + along the x-axis. Negative values are down, and positive values are up. + + :return: A :py:class:`~opentrons.types.Point` representing the specified + position in absolute deck coordinates. + + .. note:: Even if the absolute values of ``x``, ``y``, and ``z`` are all less + than 1, a location constructed from the well and the result of + ``from_center_cartesian`` may be outside of the physical well. For example, + ``from_center_cartesian(0.9, 0.9, 0)`` would be outside of a cylindrical + well, but inside a square well. - :return: a :py:class:`opentrons.types.Point` representing the specified - location in absolute deck coordinates """ return self._core.from_center_cartesian(x, y, z) @@ -323,7 +367,7 @@ def separate_calibration(self) -> bool: ) return False - @property # type: ignore + @property @requires_version(2, 0) def api_version(self) -> APIVersion: return self._api_version @@ -331,35 +375,35 @@ def api_version(self) -> APIVersion: def __getitem__(self, key: str) -> Well: return self.wells_by_name()[key] - @property # type: ignore + @property @requires_version(2, 0) def uri(self) -> str: """A string fully identifying the labware. - :returns: The uri, ``"namespace/loadname/version"`` + :returns: The URI, ``"namespace/loadname/version"`` """ return self._core.get_uri() - @property # type: ignore[misc] + @property @requires_version(2, 0) def parent(self) -> Union[str, Labware, ModuleTypes, OffDeckType]: """The parent of this labware---where this labware is loaded. Returns: - If the labware is directly on the robot's deck, the `str` name of the deck slot, + If the labware is directly on the robot's deck, the ``str`` name of the deck slot, like ``"D1"`` (Flex) or ``"1"`` (OT-2). See :ref:`deck-slots`. - If the labware is on a module, a :py:class:`ModuleContext`. + If the labware is on a module, a module context. If the labware is on a labware or adapter, a :py:class:`Labware`. If the labware is off-deck, :py:obj:`OFF_DECK`. .. versionchanged:: 2.14 - Return type for module parent changed to :py:class:`ModuleContext`. - Prior to this version, an internal geometry interface is returned. + Return type for module parent changed. + Prior to this version, an internal geometry interface was returned. .. versionchanged:: 2.15 - Will return a :py:class:`Labware` if the labware was loaded onto a labware/adapter. + Will return a :py:class:`Labware` if the labware is loaded onto a labware/adapter. Will now return :py:obj:`OFF_DECK` if the labware is off-deck. Formerly, if the labware was removed by using ``del`` on :py:obj:`.deck`, this would return where it was before its removal. @@ -377,7 +421,7 @@ def parent(self) -> Union[str, Labware, ModuleTypes, OffDeckType]: return labware_location - @property # type: ignore[misc] + @property @requires_version(2, 0) def name(self) -> str: """Can either be the canonical name of the labware, which is used to @@ -399,19 +443,19 @@ def name(self, new_name: str) -> None: assert isinstance(self._core, LegacyLabwareCore) cast(LegacyLabwareCore, self._core).set_name(new_name) - @property # type: ignore[misc] + @property @requires_version(2, 0) def load_name(self) -> str: - """The API load name of the labware definition""" + """The API load name of the labware definition.""" return self._core.load_name - @property # type: ignore[misc] + @property @requires_version(2, 0) def parameters(self) -> "LabwareParameters": - """Internal properties of a labware including type and quirks""" + """Internal properties of a labware including type and quirks.""" return self._core.get_parameters() - @property # type: ignore + @property @requires_version(2, 0) def quirks(self) -> List[str]: """Quirks specific to this labware.""" @@ -420,7 +464,7 @@ def quirks(self) -> List[str]: # TODO(mm, 2023-02-08): # Specify units and origin after we resolve RSS-110. # Remove warning once we resolve RSS-109 more broadly. - @property # type: ignore + @property @requires_version(2, 0) def magdeck_engage_height(self) -> Optional[float]: """Return the default magnet engage height that @@ -445,7 +489,7 @@ def magdeck_engage_height(self) -> Optional[float]: else: return p["magneticModuleEngageHeight"] - @property # type: ignore[misc] + @property @requires_version(2, 15) def child(self) -> Optional[Labware]: """The labware (if any) present on this labware.""" @@ -532,7 +576,7 @@ def set_offset(self, x: float, y: float, z: float) -> None: (see :ref:`protocol-api-deck-coords`) that the motion system will add to any movement targeting this labware instance. - The offset will *not* apply to any other labware instances, + The offset *will not* apply to any other labware instances, even if those labware are of the same type. .. caution:: @@ -563,14 +607,14 @@ def set_offset(self, x: float, y: float, z: float) -> None: else: self._core.set_calibration(Point(x=x, y=y, z=z)) - @property # type: ignore + @property @requires_version(2, 0) def calibrated_offset(self) -> Point: return self._core.get_calibrated_offset() @requires_version(2, 0) def well(self, idx: Union[int, str]) -> Well: - """Deprecated---use result of `wells` or `wells_by_name`""" + """Deprecated. Use result of :py:meth:`wells` or :py:meth:`wells_by_name`.""" if isinstance(idx, int): return self.wells()[idx] elif isinstance(idx, str): @@ -583,20 +627,16 @@ def well(self, idx: Union[int, str]) -> Well: @requires_version(2, 0) def wells(self, *args: Union[str, int]) -> List[Well]: """ - Accessor function used to generate a list of wells in top -> down, - left -> right order. This is representative of moving down `rows` and - across `columns` (e.g. 'A1', 'B1', 'C1'...'A2', 'B2', 'C2') + Accessor function that generates a list of wells in a top down, + left to right order. This is representative of moving down rows and + across columns (i.e., A1, B1, C1…A2, B2, C2…). With indexing one can treat it as a typical python - list. To access well A1, for example, write: labware.wells()[0] + list. For example, access well A1 with ``labware.wells()[0]``. - Note that this method takes args for backward-compatibility, but use - of args is deprecated and will be removed in future versions. Args - can be either strings or integers, but must all be the same type (e.g.: - `self.wells(1, 4, 8)` or `self.wells('A1', 'B2')`, but - `self.wells('A1', 4)` is invalid. + Note that this method takes args for backward-compatibility. But using args is deprecated and will be removed in future versions. Args can be either strings or integers, but must all be the same type. For example, ``self.columns(1, 4, 8)`` or ``self.columns('1', '2')`` are valid, but ``self.columns('1', 4)`` is not. - :return: Ordered list of all wells in a labware + :return: Ordered list of all wells in a labware. """ if not args: return list(self._wells_by_name.values()) @@ -618,13 +658,13 @@ def wells(self, *args: Union[str, int]) -> List[Well]: @requires_version(2, 0) def wells_by_name(self) -> Dict[str, Well]: """ - Accessor function used to create a look-up table of Wells by name. + Accessor function used to create a look-up table of wells by name. - With indexing one can treat it as a typical python - dictionary whose keys are well names. To access well A1, for example, - write: labware.wells_by_name()['A1'] + With indexing one can treat it as a typical Python + dictionary whose keys are well names. For example, access well A1 + with ``labware.wells_by_name()['A1']``. - :return: Dictionary of well objects keyed by well name + :return: Dictionary of :py:class:`.Well` objects keyed by well name. """ return dict(self._wells_by_name) @@ -645,16 +685,12 @@ def rows(self, *args: Union[int, str]) -> List[List[Well]]: Accessor function used to navigate through a labware by row. With indexing one can treat it as a typical python nested list. - To access row A for example, write: labware.rows()[0]. This - will output ['A1', 'A2', 'A3', 'A4'...] + For example, access row A with ``labware.rows()[0]``. This + will output ``['A1', 'A2', 'A3', 'A4'...]``. - Note that this method takes args for backward-compatibility, but use - of args is deprecated and will be removed in future versions. Args - can be either strings or integers, but must all be the same type (e.g.: - `self.rows(1, 4, 8)` or `self.rows('A', 'B')`, but `self.rows('A', 4)` - is invalid. + Note that this method takes args for backward-compatibility. But using args is deprecated and will be removed in future versions. Args can be either strings or integers, but must all be the same type. For example, ``self.columns(1, 4, 8)`` or ``self.columns('1', '2')`` are valid, but ``self.columns('1', 4)`` is not. - :return: A list of row lists + :return: A list of row lists. """ if not args: return [ @@ -682,10 +718,10 @@ def rows_by_name(self) -> Dict[str, List[Well]]: Accessor function used to navigate through a labware by row name. With indexing one can treat it as a typical python dictionary. - To access row A for example, write: labware.rows_by_name()['A'] - This will output ['A1', 'A2', 'A3', 'A4'...]. + For example, access row A with ``labware.rows_by_name()['A']``. + This will output ``['A1', 'A2', 'A3', 'A4'...]``. - :return: Dictionary of Well lists keyed by row name + :return: Dictionary of :py:class:`.Well` lists keyed by row name. """ return { row_name: [self._wells_by_name[well_name] for well_name in row] @@ -707,17 +743,15 @@ def columns(self, *args: Union[int, str]) -> List[List[Well]]: Accessor function used to navigate through a labware by column. With indexing one can treat it as a typical python nested list. - To access row A for example, - write: labware.columns()[0] - This will output ['A1', 'B1', 'C1', 'D1'...]. + For example, access row A with ``labware.columns()[0]``. + This will output ``['A1', 'B1', 'C1', 'D1'...]``. - Note that this method takes args for backward-compatibility, but use - of args is deprecated and will be removed in future versions. Args - can be either strings or integers, but must all be the same type (e.g.: - `self.columns(1, 4, 8)` or `self.columns('1', '2')`, but - `self.columns('1', 4)` is invalid. + Note that this method takes args for backward-compatibility. But using args is deprecated and will be removed in future versions. Args + can be either strings or integers, but must all be the same type. For example, + ``self.columns(1, 4, 8)`` or ``self.columns('1', '2')`` are valid, but + ``self.columns('1', 4)`` is not. - :return: A list of column lists + :return: A list of column lists. """ if not args: return [ @@ -745,11 +779,10 @@ def columns_by_name(self) -> Dict[str, List[Well]]: Accessor function used to navigate through a labware by column name. With indexing one can treat it as a typical python dictionary. - To access row A for example, - write: labware.columns_by_name()['1'] - This will output ['A1', 'B1', 'C1', 'D1'...]. + For example, access row A with ``labware.columns_by_name()['1']``. + This will output ``['A1', 'B1', 'C1', 'D1'...]``. - :return: Dictionary of Well lists keyed by column name + :return: Dictionary of :py:class:`.Well` lists keyed by column name. """ return { column_name: [self._wells_by_name[well_name] for well_name in column] @@ -765,13 +798,13 @@ def columns_by_index(self) -> Dict[str, List[Well]]: _log.warning("columns_by_index is deprecated. Use columns_by_name instead.") return self.columns_by_name() - @property # type: ignore + @property @requires_version(2, 0) def highest_z(self) -> float: """ - The z-coordinate of the tallest single point anywhere on the labware. + The z-coordinate of the highest single point anywhere on the labware. - This is drawn from the 'dimensions'/'zDimension' elements of the + This is taken from the ``zDimension`` property of the ``dimensions`` object in the labware definition and takes into account the calibration offset. """ return self._core.highest_z @@ -781,17 +814,17 @@ def _is_tiprack(self) -> bool: """as is_tiprack but not subject to version checking for speed""" return self._core.is_tip_rack() - @property # type: ignore[misc] + @property @requires_version(2, 0) def is_tiprack(self) -> bool: return self._is_tiprack - @property # type: ignore[misc] + @property @requires_version(2, 15) def is_adapter(self) -> bool: return self._core.is_adapter() - @property # type: ignore[misc] + @property @requires_version(2, 0) def tip_length(self) -> float: return self._core.get_tip_length() @@ -809,7 +842,7 @@ def tip_length(self, length: float) -> None: raise APIVersionError("Labware.tip_length setter has been deprecated") # TODO(mc, 2023-02-06): this assert should be enough for mypy - # invvestigate if upgrading mypy allows the `cast` to be removed + # investigate if upgrading mypy allows the `cast` to be removed assert isinstance(self._core, LegacyLabwareCore) cast(LegacyLabwareCore, self._core).set_tip_length(length) @@ -996,7 +1029,7 @@ def select_tiprack_from_list( if starting_point and starting_point.parent != first: raise TipSelectionError( - "The starting tip you selected " f"does not exist in {first}" + f"The starting tip you selected does not exist in {first}" ) elif starting_point: first_well = starting_point diff --git a/api/src/opentrons/protocol_api/module_contexts.py b/api/src/opentrons/protocol_api/module_contexts.py index d4984c66af0..f525fe6b320 100644 --- a/api/src/opentrons/protocol_api/module_contexts.py +++ b/api/src/opentrons/protocol_api/module_contexts.py @@ -6,7 +6,7 @@ from opentrons_shared_data.labware.dev_types import LabwareDefinition from opentrons_shared_data.module.dev_types import ModuleModel, ModuleType -from opentrons.broker import Broker +from opentrons.legacy_broker import LegacyBroker from opentrons.hardware_control.modules import ThermocyclerStep from opentrons.commands import module_commands as cmds from opentrons.commands.publisher import CommandPublisher, publish @@ -55,7 +55,7 @@ def __init__( protocol_core: ProtocolCore, core_map: LoadedCoreMap, api_version: APIVersion, - broker: Broker, + broker: LegacyBroker, ) -> None: super().__init__(broker=broker) self._core = core @@ -63,18 +63,18 @@ def __init__( self._core_map = core_map self._api_version = api_version - @property # type: ignore[misc] + @property @requires_version(2, 0) def api_version(self) -> APIVersion: return self._api_version - @property # type: ignore[misc] + @property @requires_version(2, 14) def model(self) -> ModuleModel: """Get the module's model identifier.""" return cast(ModuleModel, self._core.get_model().value) - @property # type: ignore[misc] + @property @requires_version(2, 14) def type(self) -> ModuleType: """Get the module's general type identifier.""" @@ -265,14 +265,14 @@ def load_adapter_from_definition(self, definition: LabwareDefinition) -> Labware version=load_params.version, ) - @property # type: ignore[misc] + @property @requires_version(2, 0) def labware(self) -> Optional[Labware]: """The labware (if any) present on this module.""" labware_core = self._protocol_core.get_labware_on_module(self._core) return self._core_map.get(labware_core) - @property # type: ignore[misc] + @property @requires_version(2, 14) def parent(self) -> str: """The name of the slot the module is on. @@ -282,7 +282,7 @@ def parent(self) -> str: """ return self._core.get_deck_slot_id() - @property # type: ignore[misc] + @property @requires_version(2, 0) def geometry(self) -> LegacyModuleGeometry: """The object representing the module as an item on the deck. @@ -319,7 +319,7 @@ class TemperatureModuleContext(ModuleContext): _core: TemperatureModuleCore - @property # type: ignore[misc] + @property @requires_version(2, 14) def serial_number(self) -> str: """Get the module's unique hardware serial number.""" @@ -361,7 +361,7 @@ def deactivate(self) -> None: """Stop heating or cooling, and turn off the fan.""" self._core.deactivate() - @property # type: ignore[misc] + @property @requires_version(2, 0) def temperature(self) -> float: """The current temperature of the Temperature Module's deck in °C. @@ -370,7 +370,7 @@ def temperature(self) -> float: """ return self._core.get_current_temperature() - @property # type: ignore[misc] + @property @requires_version(2, 0) def target(self) -> Optional[float]: """The target temperature of the Temperature Module's deck in °C. @@ -379,7 +379,7 @@ def target(self) -> Optional[float]: """ return self._core.get_target_temperature() - @property # type: ignore[misc] + @property @requires_version(2, 3) def status(self) -> str: """One of four possible temperature statuses: @@ -404,7 +404,7 @@ class MagneticModuleContext(ModuleContext): _core: MagneticModuleCore - @property # type: ignore[misc] + @property @requires_version(2, 14) def serial_number(self) -> str: """Get the module's unique hardware serial number.""" @@ -493,7 +493,7 @@ def disengage(self) -> None: """Lower the magnets back into the Magnetic Module.""" self._core.disengage() - @property # type: ignore + @property @requires_version(2, 0) def status(self) -> str: """The status of the module, either ``engaged`` or ``disengaged``.""" @@ -511,7 +511,7 @@ class ThermocyclerContext(ModuleContext): _core: ThermocyclerCore - @property # type: ignore[misc] + @property @requires_version(2, 14) def serial_number(self) -> str: """Get the module's unique hardware serial number.""" @@ -642,7 +642,7 @@ def deactivate(self) -> None: """Turn off both the well block temperature controller and the lid heater.""" self._core.deactivate() - @property # type: ignore[misc] + @property @requires_version(2, 0) def lid_position(self) -> Optional[str]: """One of these possible lid statuses: @@ -655,7 +655,7 @@ def lid_position(self) -> Optional[str]: status = self._core.get_lid_position() return status.value if status is not None else None - @property # type: ignore[misc] + @property @requires_version(2, 0) def block_temperature_status(self) -> str: """One of five possible temperature statuses: @@ -669,7 +669,7 @@ def block_temperature_status(self) -> str: """ return self._core.get_block_temperature_status().value - @property # type: ignore[misc] + @property @requires_version(2, 0) def lid_temperature_status(self) -> Optional[str]: """One of five possible temperature statuses: @@ -685,61 +685,61 @@ def lid_temperature_status(self) -> Optional[str]: status = self._core.get_lid_temperature_status() return status.value if status is not None else None - @property # type: ignore[misc] + @property @requires_version(2, 0) def block_temperature(self) -> Optional[float]: """The current temperature of the well block in °C.""" return self._core.get_block_temperature() - @property # type: ignore[misc] + @property @requires_version(2, 0) def block_target_temperature(self) -> Optional[float]: """The target temperature of the well block in °C.""" return self._core.get_block_target_temperature() - @property # type: ignore[misc] + @property @requires_version(2, 0) def lid_temperature(self) -> Optional[float]: """The current temperature of the lid in °C.""" return self._core.get_lid_temperature() - @property # type: ignore[misc] + @property @requires_version(2, 0) def lid_target_temperature(self) -> Optional[float]: """The target temperature of the lid in °C.""" return self._core.get_lid_target_temperature() - @property # type: ignore[misc] + @property @requires_version(2, 0) def ramp_rate(self) -> Optional[float]: """The current ramp rate in °C/s.""" return self._core.get_ramp_rate() - @property # type: ignore[misc] + @property @requires_version(2, 0) def hold_time(self) -> Optional[float]: """Remaining hold time in seconds.""" return self._core.get_hold_time() - @property # type: ignore[misc] + @property @requires_version(2, 0) def total_cycle_count(self) -> Optional[int]: """Number of repetitions for current set cycle""" return self._core.get_total_cycle_count() - @property # type: ignore[misc] + @property @requires_version(2, 0) def current_cycle_index(self) -> Optional[int]: """Index of the current set cycle repetition""" return self._core.get_current_cycle_index() - @property # type: ignore[misc] + @property @requires_version(2, 0) def total_step_count(self) -> Optional[int]: """Number of steps within the current cycle""" return self._core.get_total_step_count() - @property # type: ignore[misc] + @property @requires_version(2, 0) def current_step_index(self) -> Optional[int]: """Index of the current step within the current cycle""" @@ -757,13 +757,13 @@ class HeaterShakerContext(ModuleContext): _core: HeaterShakerCore - @property # type: ignore[misc] + @property @requires_version(2, 14) def serial_number(self) -> str: """Get the module's unique hardware serial number.""" return self._core.get_serial_number() - @property # type: ignore[misc] + @property @requires_version(2, 13) def target_temperature(self) -> Optional[float]: """The target temperature of the Heater-Shaker's plate in °C. @@ -772,7 +772,7 @@ def target_temperature(self) -> Optional[float]: """ return self._core.get_target_temperature() - @property # type: ignore[misc] + @property @requires_version(2, 13) def current_temperature(self) -> float: """The current temperature of the Heater-Shaker's plate in °C. @@ -781,19 +781,19 @@ def current_temperature(self) -> float: """ return self._core.get_current_temperature() - @property # type: ignore[misc] + @property @requires_version(2, 13) def current_speed(self) -> int: """The current speed of the Heater-Shaker's plate in rpm.""" return self._core.get_current_speed() - @property # type: ignore[misc] + @property @requires_version(2, 13) def target_speed(self) -> Optional[int]: """Target speed of the Heater-Shaker's plate in rpm.""" return self._core.get_target_speed() - @property # type: ignore[misc] + @property @requires_version(2, 13) def temperature_status(self) -> str: """One of five possible temperature statuses: @@ -808,7 +808,7 @@ def temperature_status(self) -> str: """ return self._core.get_temperature_status().value - @property # type: ignore[misc] + @property @requires_version(2, 13) def speed_status(self) -> str: """One of five possible shaking statuses: @@ -823,7 +823,7 @@ def speed_status(self) -> str: """ return self._core.get_speed_status().value - @property # type: ignore[misc] + @property @requires_version(2, 13) def labware_latch_status(self) -> str: """One of six possible latch statuses: diff --git a/api/src/opentrons/protocol_api/protocol_context.py b/api/src/opentrons/protocol_api/protocol_context.py index a975cb229a5..3920f6446f9 100644 --- a/api/src/opentrons/protocol_api/protocol_context.py +++ b/api/src/opentrons/protocol_api/protocol_context.py @@ -16,13 +16,18 @@ from opentrons_shared_data.labware.dev_types import LabwareDefinition from opentrons_shared_data.pipette.dev_types import PipetteNameType -from opentrons.types import Mount, Location, DeckLocation, DeckSlotName -from opentrons.broker import Broker +from opentrons.types import Mount, Location, DeckLocation, DeckSlotName, StagingSlotName +from opentrons.legacy_broker import LegacyBroker from opentrons.hardware_control import SyncHardwareAPI from opentrons.hardware_control.modules.types import MagneticBlockModel from opentrons.commands import protocol_commands as cmds, types as cmd_types -from opentrons.commands.publisher import CommandPublisher, publish +from opentrons.commands.helpers import stringify_labware_movement_command +from opentrons.commands.publisher import CommandPublisher, publish, publish_context from opentrons.protocols.api_support import instrument as instrument_support +from opentrons.protocols.api_support.deck_type import ( + NoTrashDefinedError, + should_load_fixed_trash_for_python_protocol, +) from opentrons.protocols.api_support.types import APIVersion from opentrons.protocols.api_support.util import ( AxisMaxSpeeds, @@ -46,6 +51,8 @@ from . import validation from ._liquid import Liquid +from ._trash_bin import TrashBin +from ._waste_chute import WasteChute from .deck import Deck from .instrument_context import InstrumentContext from .labware import Labware @@ -81,17 +88,24 @@ class HardwareManager(NamedTuple): class ProtocolContext(CommandPublisher): - """The Context class is a container for the state of a protocol. + """A context for the state of a protocol. + + The ``ProtocolContext`` class provides the objects, attributes, and methods that + allow you to configure and control the protocol. + + Methods generally fall into one of two categories. - It encapsulates many of the methods formerly found in the Robot class, - including labware, instrument, and module loading, as well as core - functions like pause and resume. + - They can change the state of the ``ProtocolContext`` object, such as adding + pipettes, hardware modules, or labware to your protocol. + - They can control the flow of a running protocol, such as pausing, displaying + messages, or controlling built-in robot hardware like the ambient lighting. - Unlike the old robot class, it is designed to be ephemeral. The lifetime - of a particular instance should be about the same as the lifetime of a - protocol. The only exception is the one stored in - ``.legacy_api.api.robot``, which is provided only for back - compatibility and should be used less and less as time goes by. + Do not instantiate a ``ProtocolContext`` directly. + The ``run()`` function of your protocol does that for you. + See the :ref:`Tutorial ` for more information. + + Use :py:meth:`opentrons.execute.get_protocol_api` to instantiate a ``ProtocolContext`` when + using Jupyter Notebook. See :ref:`advanced-control`. .. versionadded:: 2.0 @@ -101,7 +115,7 @@ def __init__( self, api_version: APIVersion, core: ProtocolCore, - broker: Optional[Broker] = None, + broker: Optional[LegacyBroker] = None, core_map: Optional[LoadedCoreMap] = None, deck: Optional[Deck] = None, bundled_data: Optional[Dict[str, bytes]] = None, @@ -135,21 +149,56 @@ def __init__( mount: None for mount in Mount } self._bundled_data: Dict[str, bytes] = bundled_data or {} + + # With the addition of Movable Trashes and Waste Chute support, it is not necessary + # to ensure that the list of "disposal locations", essentially the list of trashes, + # is initialized correctly on protocols utilizing former API versions prior to 2.16 + # and also to ensure that any protocols after 2.16 initialize a Fixed Trash for OT-2 + # protocols so that no load trash bin behavior is required within the protocol itself. + # Protocols prior to 2.16 expect the Fixed Trash to exist as a Labware object, while + # protocols after 2.16 expect trash to exist as either a TrashBin or WasteChute object. + self._load_fixed_trash() + if should_load_fixed_trash_for_python_protocol(self._api_version): + self._core.append_disposal_location(self.fixed_trash) + elif ( + self._api_version >= APIVersion(2, 16) + and self._core.robot_type == "OT-2 Standard" + ): + _fixed_trash_trashbin = TrashBin( + location=DeckSlotName.FIXED_TRASH, addressable_area_name="fixedTrash" + ) + # We have to skip adding this fixed trash bin to engine because this __init__ is called in the main thread + # and any calls to sync client will cause a deadlock. This means that OT-2 fixed trashes are not added to + # the engine store until one is first referenced. This should have minimal consequences for OT-2 given that + # we do not need to worry about the 96 channel pipette and partial tip configuration with that pipette. + self._core.append_disposal_location( + _fixed_trash_trashbin, skip_add_to_engine=True + ) self._commands: List[str] = [] self._unsubscribe_commands: Optional[Callable[[], None]] = None self.clear_commands() - @property # type: ignore + @property @requires_version(2, 0) def api_version(self) -> APIVersion: - """Return the API version supported by this protocol context. - - The supported API version was specified when the protocol context - was initialized. It may be lower than the highest version supported - by the robot software. For the highest version supported by the - robot software, see ``protocol_api.MAX_SUPPORTED_VERSION``. + """Return the API version specified for this protocol context. + + This value is set when the protocol context + is initialized. + + - When the context is the argument of ``run()``, the ``"apiLevel"`` key of the + :ref:`metadata ` or :ref:`requirements + ` dictionary determines ``api_version``. + - When the context is instantiated with + :py:meth:`opentrons.execute.get_protocol_api` or + :py:meth:`opentrons.simulate.get_protocol_api`, the value of its ``version`` + argument determines ``api_version``. + + It may be lower than the :ref:`maximum version ` supported by the + robot software, which is accessible via the + ``protocol_api.MAX_SUPPORTED_VERSION`` constant. """ return self._api_version @@ -163,15 +212,16 @@ def _hw_manager(self) -> HardwareManager: ) return HardwareManager(hardware=self._core.get_hardware()) - @property # type: ignore + @property @requires_version(2, 0) def bundled_data(self) -> Dict[str, bytes]: """Accessor for data files bundled with this protocol, if any. - This is a dictionary mapping the filenames of bundled datafiles, with - extensions but without paths (e.g. if a file is stored in the bundle as - ``data/mydata/aspirations.csv`` it will be in the dict as - ``'aspirations.csv'``) to the bytes contents of the files. + This is a dictionary mapping the filenames of bundled datafiles to their + contents. The filename keys are formatted with extensions but without paths. For + example, a file stored in the bundle as ``data/mydata/aspirations.csv`` will + have the key ``"aspirations.csv"``. The values are :py:class:`bytes` objects + representing the contents of the files. """ return self._bundled_data @@ -185,39 +235,24 @@ def __del__(self) -> None: if getattr(self, "_unsubscribe_commands", None): self._unsubscribe_commands() # type: ignore - @property # type: ignore + @property @requires_version(2, 0) def max_speeds(self) -> AxisMaxSpeeds: - """Per-axis speed limits when moving this instrument. + """Per-axis speed limits for moving instruments. - Changing this value changes the speed limit for each non-plunger - axis of the robot, when moving this pipette. Note that this does - only sets a limit on how fast movements can be; movements can - still be slower than this. However, it is useful if you require - the robot to move much more slowly than normal when using this - pipette. + Changing values within this property sets the speed limit for each non-plunger + axis of the robot. Note that this property only sets upper limits and can't + exceed the physical speed limits of the movement system. - This is a dictionary mapping string names of axes to float values - limiting speeds. To change a speed, set that axis's value. To + This property is a dict mapping string names of axes to float values + of maximum speeds in mm/s. To change a speed, set that axis's value. To reset an axis's speed to default, delete the entry for that axis or assign it to ``None``. - For instance, - - .. code-block:: py + See :ref:`axis_speed_limits` for examples. - def run(protocol): - protocol.comment(str(right.max_speeds)) # '{}' - all default - protocol.max_speeds['A'] = 10 # limit max speed of - # right pipette Z to 10mm/s - del protocol.max_speeds['A'] # reset to default - protocol.max_speeds['X'] = 10 # limit max speed of x to - # 10 mm/s - protocol.max_speeds['X'] = None # reset to default - - .. caution:: - This property is not yet supported on - :ref:`API version ` 2.14 or higher. + .. note:: + This property is not yet supported in API version 2.14 or higher. """ if self._api_version >= ENGINE_CORE_API_VERSION: # TODO(mc, 2023-02-23): per-axis max speeds not yet supported on the engine @@ -238,7 +273,7 @@ def commands(self) -> List[str]: far. For example, "Aspirating 123 µL from well A1 of 96 well plate in slot 1." The exact format of these entries is not guaranteed. The format here may differ from other - places that show the run log, such as the Opentrons App. + places that show the run log, such as the Opentrons App or touchscreen. """ return self._commands @@ -268,6 +303,20 @@ def on_command(message: cmd_types.CommandMessage) -> None: @requires_version(2, 0) def is_simulating(self) -> bool: + """Returns ``True`` if the protocol is running in simulation. + + Returns ``False`` if the protocol is running on actual hardware. + + You can evaluate the result of this method in an ``if`` statement to make your + protocol behave differently in different environments. For example, you could + refer to a data file on your computer when simulating and refer to a data file + stored on the robot when not simulating. + + You can also use it to skip time-consuming aspects of your protocol. Most Python + Protocol API methods, like :py:meth:`.delay`, are designed to evaluate + instantaneously in simulation. But external methods, like those from the + :py:mod:`time` module, will run at normal speed if not skipped. + """ return self._core.is_simulating() @requires_version(2, 0) @@ -277,19 +326,18 @@ def load_labware_from_definition( location: Union[DeckLocation, OffDeckType], label: Optional[str] = None, ) -> Labware: - """Specify the presence of a piece of labware on the OT2 deck. + """Specify the presence of a labware on the deck. - This function loads the labware definition specified by `labware_def` - to the location specified by `location`. + This function loads the labware definition specified by ``labware_def`` + to the location specified by ``location``. - :param labware_def: The labware definition to load + :param labware_def: The labware's definition. :param location: The slot into which to load the labware, such as ``1``, ``"1"``, or ``"D1"``. See :ref:`deck-slots`. :type location: int or str or :py:obj:`OFF_DECK` - :param str label: An optional special name to give the labware. If - specified, this is the name the labware will appear - as in the run log and the calibration view in the - Opentrons app. + :param str label: An optional special name to give the labware. If specified, + this is how the labware will appear in the run log, Labware Position + Check, and elsewhere in the Opentrons App and on the touchscreen. """ load_params = self._core.add_labware_definition(labware_def) @@ -313,7 +361,7 @@ def load_labware( ) -> Labware: """Load a labware onto a location. - For labware already defined by Opentrons, this is a convenient way + For Opentrons-verified labware, this is a convenient way to collapse the two stages of labware initialization (creating the labware and adding it to the protocol) into one. @@ -321,8 +369,8 @@ def load_labware( later in the protocol. :param str load_name: A string to use for looking up a labware definition. - You can find the ``load_name`` for any standard labware on the Opentrons - `Labware Library `_. + You can find the ``load_name`` for any Opentrons-verified labware on the + `Labware Library `__. :param location: Either a :ref:`deck slot `, like ``1``, ``"1"``, or ``"D1"``, or the special value :py:obj:`OFF_DECK`. @@ -332,25 +380,30 @@ def load_labware( :type location: int or str or :py:obj:`OFF_DECK` - :param str label: An optional special name to give the labware. If specified, this - is the name the labware will appear as in the run log and the calibration - view in the Opentrons app. + :param str label: An optional special name to give the labware. If specified, + this is how the labware will appear in the run log, Labware Position + Check, and elsewhere in the Opentrons App and on the touchscreen. :param str namespace: The namespace that the labware definition belongs to. - If unspecified, will search both: + If unspecified, the API will automatically search two namespaces: - * ``"opentrons"``, to load standard Opentrons labware definitions. - * ``"custom_beta"``, to load custom labware definitions created with the - `Custom Labware Creator `_. + - ``"opentrons"``, to load standard Opentrons labware definitions. + - ``"custom_beta"``, to load custom labware definitions created with the + `Custom Labware Creator `__. You might need to specify an explicit ``namespace`` if you have a custom - definition whose ``load_name`` is the same as an Opentrons standard + definition whose ``load_name`` is the same as an Opentrons-verified definition, and you want to explicitly choose one or the other. :param version: The version of the labware definition. You should normally - leave this unspecified to let the implementation choose a good default. - :param adapter: Load name of an adapter to load the labware on top of. The adapter - will be loaded from the same given namespace, but version will be automatically chosen. + leave this unspecified to let ``load_labware()`` choose a version + automatically. + :param adapter: An adapter to load the labware on top of. Accepts the same + values as the ``load_name`` parameter of :py:meth:`.load_adapter`. The + adapter will use the same namespace as the labware, and the API will + choose the adapter's version automatically. + + .. versionadded:: 2.15 """ if isinstance(location, OffDeckType) and self._api_version < APIVersion(2, 15): raise APIVersionError( @@ -358,7 +411,7 @@ def load_labware( ) load_name = validation.ensure_lowercase_name(load_name) - load_location: Union[OffDeckType, DeckSlotName, LabwareCore] + load_location: Union[OffDeckType, DeckSlotName, StagingSlotName, LabwareCore] if adapter is not None: if self._api_version < APIVersion(2, 15): raise APIVersionError( @@ -436,6 +489,54 @@ def load_adapter_from_definition( location=location, ) + @requires_version(2, 16) + def load_trash_bin(self, location: DeckLocation) -> TrashBin: + """Load a trash bin on the deck of a Flex. + + See :ref:`configure-trash-bin` for details. + + If you try to load a trash bin on an OT-2, the API will raise an error. + + :param location: The :ref:`deck slot ` where the trash bin is. The + location can be any unoccupied slot in column 1 or 3. + + If you try to load a trash bin in column 2 or 4, the API will raise an error. + """ + slot_name = validation.ensure_and_convert_deck_slot( + location, + api_version=self._api_version, + robot_type=self._core.robot_type, + ) + if not isinstance(slot_name, DeckSlotName): + raise ValueError("Staging areas not permitted for trash bin.") + addressable_area_name = validation.ensure_and_convert_trash_bin_location( + location, + api_version=self._api_version, + robot_type=self._core.robot_type, + ) + trash_bin = TrashBin( + location=slot_name, addressable_area_name=addressable_area_name + ) + self._core.append_disposal_location(trash_bin) + return trash_bin + + @requires_version(2, 16) + def load_waste_chute( + self, + ) -> WasteChute: + """Load the waste chute on the deck of a Flex. + + See :ref:`configure-waste-chute` for details, including the deck configuration + variants of the waste chute. + + The deck plate adapter for the waste chute can only go in slot D3. If you try to + load another item in slot D3 after loading the waste chute, or vice versa, the + API will raise an error. + """ + waste_chute = WasteChute() + self._core.append_disposal_location(waste_chute) + return waste_chute + @requires_version(2, 15) def load_adapter( self, @@ -463,7 +564,7 @@ def load_adapter( :type location: int or str or :py:obj:`OFF_DECK` :param str namespace: The namespace that the labware definition belongs to. - If unspecified, will search both: + If unspecified, the API will automatically search two namespaces: * ``"opentrons"``, to load standard Opentrons labware definitions. * ``"custom_beta"``, to load custom labware definitions created with the @@ -474,10 +575,10 @@ def load_adapter( definition, and you want to explicitly choose one or the other. :param version: The version of the labware definition. You should normally - leave this unspecified to let the implementation choose a good default. + leave this unspecified to let ``load_adapter()`` choose a version automatically. """ load_name = validation.ensure_lowercase_name(load_name) - load_location: Union[OffDeckType, DeckSlotName] + load_location: Union[OffDeckType, DeckSlotName, StagingSlotName] if isinstance(location, OffDeckType): load_location = location else: @@ -504,7 +605,7 @@ def load_adapter( # TODO(mm, 2023-06-07): Figure out what to do with this, now that the Flex has non-integer # slot names and labware can be stacked. https://opentrons.atlassian.net/browse/RLAB-354 - @property # type: ignore + @property @requires_version(2, 0) def loaded_labwares(self) -> Dict[int, Labware]: """Get the labwares that have been loaded into the protocol context. @@ -518,7 +619,7 @@ def loaded_labwares(self) -> Dict[int, Labware]: be no entry for that slot in this value. That means you should not use ``loaded_labwares`` to determine if a slot is available or not, only to get a list of labwares. If you want a data structure of all - objects on the deck regardless of type, see :py:attr:`deck`. + objects on the deck regardless of type, use :py:attr:`deck`. :returns: Dict mapping deck slot number to labware, sorted in order of @@ -539,12 +640,16 @@ def loaded_labwares(self) -> Dict[int, Labware]: def move_labware( self, labware: Labware, - new_location: Union[DeckLocation, Labware, ModuleTypes, OffDeckType], + new_location: Union[ + DeckLocation, Labware, ModuleTypes, OffDeckType, WasteChute + ], use_gripper: bool = False, pick_up_offset: Optional[Mapping[str, float]] = None, drop_offset: Optional[Mapping[str, float]] = None, ) -> None: - """Move a loaded labware to a new location. See :ref:`moving-labware` for more details. + """Move a loaded labware to a new location. + + See :ref:`moving-labware` for more details. :param labware: The labware to move. It should be a labware already loaded using :py:meth:`load_labware`. @@ -560,9 +665,9 @@ def move_labware( :param use_gripper: Whether to use the Flex Gripper for this movement. - * If ``True``, will use the gripper to perform an automatic - movement. This will raise an error on an OT-2 protocol. - * If ``False``, will pause protocol execution until the user + * If ``True``, use the gripper to perform an automatic + movement. This will raise an error in an OT-2 protocol. + * If ``False``, pause protocol execution until the user performs the movement. Protocol execution remains paused until the user presses **Confirm and resume**. @@ -581,10 +686,17 @@ def move_labware( f"Expected labware of type 'Labware' but got {type(labware)}." ) - location: Union[ModuleCore, LabwareCore, OffDeckType, DeckSlotName] + location: Union[ + ModuleCore, + LabwareCore, + WasteChute, + OffDeckType, + DeckSlotName, + StagingSlotName, + ] if isinstance(new_location, (Labware, ModuleContext)): location = new_location._core - elif isinstance(new_location, OffDeckType): + elif isinstance(new_location, (OffDeckType, WasteChute)): location = new_location else: location = validation.ensure_and_convert_deck_slot( @@ -601,14 +713,23 @@ def move_labware( if drop_offset else None ) - self._core.move_labware( - labware_core=labware._core, - new_location=location, - use_gripper=use_gripper, - pause_for_manual_move=True, - pick_up_offset=_pick_up_offset, - drop_offset=_drop_offset, - ) + with publish_context( + broker=self.broker, + command=cmds.move_labware( + # This needs to be called from protocol context and not the command for import loop reasons + text=stringify_labware_movement_command( + labware, new_location, use_gripper + ) + ), + ): + self._core.move_labware( + labware_core=labware._core, + new_location=location, + use_gripper=use_gripper, + pause_for_manual_move=True, + pick_up_offset=_pick_up_offset, + drop_offset=_drop_offset, + ) @requires_version(2, 0) def load_module( @@ -625,8 +746,8 @@ def load_module( context, which will be a different class depending on the kind of module loaded. - A map of deck positions to loaded modules can be accessed later - by using :py:attr:`loaded_modules`. + After loading modules, you can access a map of deck positions to loaded modules + with :py:attr:`loaded_modules`. :param str module_name: The name or model of the module. See :ref:`available_modules` for possible values. @@ -643,7 +764,7 @@ def load_module( .. versionchanged:: 2.15 You can now specify a deck slot as a coordinate, like ``"D1"``. - :param configuration: Configure a thermocycler to be in the ``semi`` position. + :param configuration: Configure a Thermocycler to be in the ``semi`` position. This parameter does not work. Do not use it. .. versionchanged:: 2.14 @@ -691,6 +812,8 @@ def load_module( location, self._api_version, self._core.robot_type ) ) + if isinstance(deck_slot, StagingSlotName): + raise ValueError("Cannot load a module onto a staging slot.") module_core = self._core.load_module( model=requested_model, @@ -712,21 +835,20 @@ def load_module( # TODO(mm, 2023-06-07): Figure out what to do with this, now that the Flex has non-integer # slot names and labware can be stacked. https://opentrons.atlassian.net/browse/RLAB-354 - @property # type: ignore + @property @requires_version(2, 0) def loaded_modules(self) -> Dict[int, ModuleTypes]: """Get the modules loaded into the protocol context. - This is a map of deck positions to modules loaded by previous calls - to :py:meth:`load_module`. It is not necessarily the same as the - modules attached to the robot - for instance, if the robot has a - Magnetic Module and a Temperature Module attached, but the protocol - has only loaded the Temperature Module with :py:meth:`load_module`, - only the Temperature Module will be present. + This is a map of deck positions to modules loaded by previous calls to + :py:meth:`load_module`. It does not reflect what modules are actually attached + to the robot. For example, if the robot has a Magnetic Module and a Temperature + Module attached, but the protocol has only loaded the Temperature Module with + :py:meth:`load_module`, only the Temperature Module will be included in + ``loaded_modules``. - :returns Dict[int, ModuleContext]: Dict mapping slot name to module - contexts. The elements may not be - ordered by slot number. + :returns: Dict mapping slot name to module contexts. The elements may not be + ordered by slot number. """ return { core.get_deck_slot().as_int(): self._core_map.get(core) @@ -737,39 +859,44 @@ def loaded_modules(self) -> Dict[int, ModuleTypes]: def load_instrument( self, instrument_name: str, - mount: Union[Mount, str], + mount: Union[Mount, str, None] = None, tip_racks: Optional[List[Labware]] = None, replace: bool = False, ) -> InstrumentContext: - """Load a specific instrument required by the protocol. - - This value will actually be checked when the protocol runs, to - ensure that the correct instrument is attached in the specified - location. - - :param str instrument_name: The name of the instrument model, or a - prefix. For instance, 'p10_single' may be - used to request a P10 single regardless of - the version. - :param mount: The mount in which this instrument should be attached. - This can either be an instance of the enum type - :py:class:`.types.Mount` or one of the strings `'left'` - and `'right'`. - :type mount: types.Mount or str - :param tip_racks: A list of tip racks from which to pick tips if - :py:meth:`.InstrumentContext.pick_up_tip` is called - without arguments. + """Load a specific instrument for use in the protocol. + + When analyzing the protocol on the robot, instruments loaded with this method + are compared against the instruments attached to the robot. You won't be able to + start the protocol until the correct instruments are attached and calibrated. + + Currently, this method only loads pipettes. You do not need to load the Flex + Gripper to use it in protocols. See :ref:`automatic-manual-moves`. + + :param str instrument_name: The instrument to load. See :ref:`new-pipette-models` + for the valid values. + :param mount: The mount where the instrument should be attached. + This can either be an instance of :py:class:`.types.Mount` or one + of the strings ``"left"`` or ``"right"``. When loading a Flex + 96-Channel Pipette (``instrument_name="flex_96channel_1000"``), + you can leave this unspecified, since it always occupies both + mounts; if you do specify a value, it will be ignored. + :type mount: types.Mount or str or ``None`` + :param tip_racks: A list of tip racks from which to pick tips when calling + :py:meth:`.InstrumentContext.pick_up_tip` without arguments. :type tip_racks: List[:py:class:`.Labware`] - :param bool replace: Indicate that the currently-loaded instrument in - `mount` (if such an instrument exists) should be - replaced by `instrument_name`. + :param bool replace: If ``True``, replace the currently loaded instrument in + ``mount``, if any. This is intended for :ref:`advanced + control ` applications. You cannot + replace an instrument in the middle of a protocol being run + from the Opentrons App or touchscreen. """ - # TODO (spp: 2023-08-30): disallow loading Flex pipettes on OT-2 by checking robotType instrument_name = validation.ensure_lowercase_name(instrument_name) checked_instrument_name = validation.ensure_pipette_name(instrument_name) - is_96_channel = checked_instrument_name == PipetteNameType.P1000_96 + checked_mount = validation.ensure_mount_for_pipette( + mount, checked_instrument_name + ) - checked_mount = Mount.LEFT if is_96_channel else validation.ensure_mount(mount) + is_96_channel = checked_instrument_name == PipetteNameType.P1000_96 tip_racks = tip_racks or [] @@ -778,7 +905,7 @@ def load_instrument( if is_96_channel and on_right_mount is not None: raise RuntimeError( f"Instrument already present on right:" - f" {on_right_mount.name}. In order to load a 96 channel pipette both mounts need to be available." + f" {on_right_mount.name}. In order to load a 96-channel pipette, both mounts need to be available." ) existing_instrument = self._instruments[checked_mount] @@ -805,13 +932,19 @@ def load_instrument( log=logger, ) + trash: Optional[Union[Labware, TrashBin]] + try: + trash = self.fixed_trash + except (NoTrashDefinedError, APIVersionError): + trash = None + instrument = InstrumentContext( core=instrument_core, protocol_core=self._core, broker=self._broker, api_version=self._api_version, tip_racks=tip_racks, - trash=self.fixed_trash, + trash=trash, requested_as=instrument_name, ) @@ -819,23 +952,21 @@ def load_instrument( return instrument - @property # type: ignore + @property @requires_version(2, 0) def loaded_instruments(self) -> Dict[str, InstrumentContext]: """Get the instruments that have been loaded into the protocol. This is a map of mount name to instruments previously loaded with - :py:meth:`load_instrument`. It is not necessarily the same as the - instruments attached to the robot - for instance, if the robot has - an instrument in both mounts but your protocol has only loaded one - of them with :py:meth:`load_instrument`, the unused one will not - be present. - - :returns: A dict mapping mount name - (``'left'`` or ``'right'``) - to the instrument in that mount. - If a mount has no loaded instrument, - that key will be missing from the dict. + :py:meth:`load_instrument`. It does not reflect what instruments are actually + installed on the robot. For example, if the robot has instruments installed on + both mounts but your protocol has only loaded one of them with + :py:meth:`load_instrument`, the unused one will not be included in + ``loaded_instruments``. + + :returns: A dict mapping mount name (``"left"`` or ``"right"``) to the + instrument in that mount. If a mount has no loaded instrument, that key + will be missing from the dict. """ return { mount.name.lower(): instr @@ -848,14 +979,13 @@ def loaded_instruments(self) -> Dict[str, InstrumentContext]: def pause(self, msg: Optional[str] = None) -> None: """Pause execution of the protocol until it's resumed. - A human can resume the protocol through the Opentrons App. + A human can resume the protocol in the Opentrons App or on the touchscreen. This function returns immediately, but the next function call that is blocked by a paused robot (anything that involves moving) will not return until the protocol is resumed. - :param str msg: An optional message to show to connected clients. The - Opentrons App will show this in the run log. + :param str msg: An optional message to show in the run log entry for the pause step. """ self._core.pause(msg=msg) @@ -866,7 +996,6 @@ def resume(self) -> None: .. deprecated:: 2.12 The Python Protocol API supports no safe way for a protocol to resume itself. - See https://github.com/Opentrons/opentrons/issues/8209. If you're looking for a way for your protocol to resume automatically after a period of time, use :py:meth:`delay`. """ @@ -885,12 +1014,15 @@ def resume(self) -> None: @requires_version(2, 0) def comment(self, msg: str) -> None: """ - Add a user-readable comment string that will be echoed to the Opentrons - app. + Add a user-readable message to the run log. + + The message is visible anywhere you can view the run log, including the Opentrons App and the touchscreen on Flex. + + .. note:: - The value of the message is computed during protocol simulation, - so cannot be used to communicate real-time information from the robot's - actual run. + The value of the message is computed during protocol analysis, + so ``comment()`` can't communicate real-time information during the + actual protocol run. """ self._core.comment(msg=msg) @@ -904,17 +1036,17 @@ def delay( ) -> None: """Delay protocol execution for a specific amount of time. - :param float seconds: A time to delay in seconds - :param float minutes: A time to delay in minutes + :param float seconds: The time to delay in seconds. + :param float minutes: The time to delay in minutes. - If both `seconds` and `minutes` are specified, they will be added. + If both ``seconds`` and ``minutes`` are specified, they will be added together. """ delay_time = seconds + minutes * 60 self._core.delay(seconds=delay_time, msg=msg) @requires_version(2, 0) def home(self) -> None: - """Homes the robot.""" + """Home the movement system of the robot.""" self._core.home() @property @@ -926,18 +1058,18 @@ def location_cache(self) -> Optional[Location]: def location_cache(self, loc: Optional[Location]) -> None: self._core.set_last_location(loc) - @property # type: ignore + @property @requires_version(2, 0) def deck(self) -> Deck: """An interface to provide information about what's currently loaded on the deck. - This object is useful for determining if a slot in the deck is free. + This object is useful for determining if a slot on the deck is free. - This object behaves like a dictionary whose keys are the deck slot names. - For instance, ``protocol.deck[1]``, ``protocol.deck["1"]``, and ``protocol.deck["D1"]`` - will all return the object loaded in the front-left slot. (See :ref:`deck-slots`.) + This object behaves like a dictionary whose keys are the :ref:`deck slot ` names. + For instance, ``deck[1]``, ``deck["1"]``, and ``deck["D1"]`` + will all return the object loaded in the front-left slot. The value will be a :py:obj:`~opentrons.protocol_api.Labware` if the slot contains a - labware, a :py:obj:`~opentrons.protocol_api.ModuleContext` if the slot contains a hardware + labware, a module context if the slot contains a hardware module, or ``None`` if the slot doesn't contain anything. Rather than filtering the objects in the deck map yourself, @@ -946,7 +1078,7 @@ def deck(self) -> Deck: For :ref:`advanced-control` *only*, you can delete an element of the ``deck`` dict. This only works for deck slots that contain labware objects. For example, if slot - 1 contains a labware, ``del protocol.deck['1']`` will free the slot so you can + 1 contains a labware, ``del protocol.deck["1"]`` will free the slot so you can load another labware there. .. warning:: @@ -960,32 +1092,58 @@ def deck(self) -> Deck: """ return self._deck - @property # type: ignore + @property @requires_version(2, 0) - def fixed_trash(self) -> Labware: - """The trash fixed to slot 12 of the robot deck. + def fixed_trash(self) -> Union[Labware, TrashBin]: + """The trash fixed to slot 12 of an OT-2's deck. + + In API version 2.15 and earlier, the fixed trash is a :py:class:`.Labware` object with one well. Access it like labware in your protocol. For example, ``protocol.fixed_trash["A1"]``. + + In API version 2.15 only, Flex protocols have a fixed trash in slot A3. + + In API version 2.16 and later, the fixed trash only exists in OT-2 protocols. It is a :py:class:`.TrashBin` object, which doesn't have any wells. Trying to access ``fixed_trash`` in a Flex protocol will raise an error. See :ref:`configure-trash-bin` for details on using the movable trash in Flex protocols. - It has one well and should be accessed like labware in your protocol. - e.g. ``protocol.fixed_trash['A1']`` + .. versionchanged:: 2.16 + Returns a ``TrashBin`` object. """ - return self._core_map.get(self._core.fixed_trash) + if self._api_version >= APIVersion(2, 16): + if self._core.robot_type == "OT-3 Standard": + raise APIVersionError( + "Fixed Trash is not supported on Flex protocols in API Version 2.16 and above." + ) + disposal_locations = self._core.get_disposal_locations() + if len(disposal_locations) == 0: + raise NoTrashDefinedError( + "No trash container has been defined in this protocol." + ) + if isinstance(disposal_locations[0], TrashBin): + return disposal_locations[0] + + fixed_trash = self._core_map.get(self._core.fixed_trash) + if fixed_trash is None: + raise NoTrashDefinedError( + "No trash container has been defined in this protocol." + ) + + return fixed_trash def _load_fixed_trash(self) -> None: fixed_trash_core = self._core.fixed_trash - fixed_trash = Labware( - core=fixed_trash_core, - api_version=self._api_version, - protocol_core=self._core, - core_map=self._core_map, - ) - self._core_map.add(fixed_trash_core, fixed_trash) + if fixed_trash_core is not None: + fixed_trash = Labware( + core=fixed_trash_core, + api_version=self._api_version, + protocol_core=self._core, + core_map=self._core_map, + ) + self._core_map.add(fixed_trash_core, fixed_trash) @requires_version(2, 5) def set_rail_lights(self, on: bool) -> None: """ - Controls the robot rail lights + Controls the robot's ambient lighting (rail lights). - :param bool on: If true, turn on rail lights; otherwise, turn off. + :param bool on: If ``True``, turn on the lights; otherwise, turn them off. """ self._core.set_rail_lights(on=on) @@ -1008,16 +1166,16 @@ def define_liquid( display_color=display_color, ) - @property # type: ignore + @property @requires_version(2, 5) def rail_lights_on(self) -> bool: - """Returns True if the rail lights are on""" + """Returns ``True`` if the robot's ambient lighting is on.""" return self._core.get_rail_lights_on() - @property # type: ignore + @property @requires_version(2, 5) def door_closed(self) -> bool: - """Returns True if the robot door is closed""" + """Returns ``True`` if the front door of the robot is closed.""" return self._core.door_closed() @@ -1026,7 +1184,7 @@ def _create_module_context( protocol_core: ProtocolCore, core_map: LoadedCoreMap, api_version: APIVersion, - broker: Broker, + broker: LegacyBroker, ) -> ModuleTypes: module_cls: Optional[Type[ModuleTypes]] = None if isinstance(module_core, AbstractTemperatureModuleCore): diff --git a/api/src/opentrons/protocol_api/validation.py b/api/src/opentrons/protocol_api/validation.py index c6767ebc71f..372913ad20e 100644 --- a/api/src/opentrons/protocol_api/validation.py +++ b/api/src/opentrons/protocol_api/validation.py @@ -21,7 +21,7 @@ from opentrons.protocols.api_support.types import APIVersion from opentrons.protocols.api_support.util import APIVersionError from opentrons.protocols.models import LabwareDefinition -from opentrons.types import Mount, DeckSlotName, Location +from opentrons.types import Mount, DeckSlotName, StagingSlotName, Location from opentrons.hardware_control.modules.types import ( ModuleModel, MagneticModuleModel, @@ -32,6 +32,9 @@ ThermocyclerStep, ) +from ._trash_bin import TrashBin +from ._waste_chute import WasteChute + if TYPE_CHECKING: from .labware import Well @@ -39,6 +42,9 @@ # The first APIVersion where Python protocols can specify deck labels like "D1" instead of "1". _COORDINATE_DECK_LABEL_VERSION_GATE = APIVersion(2, 15) +# The first APIVersion where Python protocols can specify staging deck slots (e.g. "D4") +_STAGING_DECK_SLOT_VERSION_GATE = APIVersion(2, 16) + # Mapping of public Python Protocol API pipette load names # to names used by the internal Opentrons system _PIPETTE_NAMES_MAP = { @@ -78,7 +84,31 @@ class LabwareDefinitionIsNotLabwareError(ValueError): """An error raised when a labware is not loaded using `load_labware`.""" -def ensure_mount(mount: Union[str, Mount]) -> Mount: +class InvalidTrashBinLocationError(ValueError): + """An error raised when attempting to load trash bins in invalid slots.""" + + +def ensure_mount_for_pipette( + mount: Union[str, Mount, None], pipette: PipetteNameType +) -> Mount: + """Ensure that an input value represents a valid mount, and is valid for the given pipette.""" + if pipette == PipetteNameType.P1000_96: + # Always validate the raw mount input, even if the pipette is a 96-channel and we're not going + # to use the mount value. + if mount is not None: + _ensure_mount(mount) + # Internal layers treat the 96-channel as being on the left mount. + return Mount.LEFT + else: + if mount is None: + raise InvalidPipetteMountError( + f"You must specify a left or right mount to load {pipette.value}." + ) + else: + return _ensure_mount(mount) + + +def _ensure_mount(mount: Union[str, Mount]) -> Mount: """Ensure that an input value represents a valid Mount.""" if mount in [Mount.EXTENSION, "extension"]: # This would cause existing protocols that might be iterating over mount types @@ -125,9 +155,12 @@ def ensure_pipette_name(pipette_name: str) -> PipetteNameType: ) from None +# TODO(jbl 11-17-2023) this function's original purpose was ensure a valid deck slot for a given robot type +# With deck configuration, the shape of this should change to better represent it checking if a deck slot +# (and maybe any addressable area) being valid for that deck configuration def ensure_and_convert_deck_slot( deck_slot: Union[int, str], api_version: APIVersion, robot_type: RobotType -) -> DeckSlotName: +) -> Union[DeckSlotName, StagingSlotName]: """Ensure that a primitive value matches a named deck slot. Also, convert the deck slot to match the given `robot_type`. @@ -149,25 +182,33 @@ def ensure_and_convert_deck_slot( if not isinstance(deck_slot, (int, str)): raise TypeError(f"Deck slot must be a string or integer, but got {deck_slot}") - try: - parsed_slot = DeckSlotName.from_primitive(deck_slot) - except ValueError as e: - raise ValueError(f"'{deck_slot}' is not a valid deck slot") from e - - is_ot2_style = parsed_slot.to_ot2_equivalent() == parsed_slot - if not is_ot2_style and api_version < _COORDINATE_DECK_LABEL_VERSION_GATE: - alternative = parsed_slot.to_ot2_equivalent().id - raise APIVersionError( - f'Specifying a deck slot like "{deck_slot}" requires apiLevel' - f" {_COORDINATE_DECK_LABEL_VERSION_GATE}." - f' Increase your protocol\'s apiLevel, or use slot "{alternative}" instead.' - ) + if str(deck_slot).upper() in {"A4", "B4", "C4", "D4"}: + if api_version < APIVersion(2, 16): + raise APIVersionError( + f"Using a staging deck slot requires apiLevel {_STAGING_DECK_SLOT_VERSION_GATE}." + ) + # Don't need a try/except since we're already pre-validating this + parsed_staging_slot = StagingSlotName.from_primitive(str(deck_slot)) + return parsed_staging_slot + else: + try: + parsed_slot = DeckSlotName.from_primitive(deck_slot) + except ValueError as e: + raise ValueError(f"'{deck_slot}' is not a valid deck slot") from e + is_ot2_style = parsed_slot.to_ot2_equivalent() == parsed_slot + if not is_ot2_style and api_version < _COORDINATE_DECK_LABEL_VERSION_GATE: + alternative = parsed_slot.to_ot2_equivalent().id + raise APIVersionError( + f'Specifying a deck slot like "{deck_slot}" requires apiLevel' + f" {_COORDINATE_DECK_LABEL_VERSION_GATE}." + f' Increase your protocol\'s apiLevel, or use slot "{alternative}" instead.' + ) - return parsed_slot.to_equivalent_for_robot_type(robot_type) + return parsed_slot.to_equivalent_for_robot_type(robot_type) def internal_slot_to_public_string( - slot_name: DeckSlotName, robot_type: RobotType + slot_name: Union[DeckSlotName, StagingSlotName], robot_type: RobotType ) -> str: """Convert an internal `DeckSlotName` to a user-facing Python Protocol API string. @@ -175,7 +216,11 @@ def internal_slot_to_public_string( Flexes. This probably won't change anything because the internal `DeckSlotName` should already match the robot's native format, but it's nice to have an explicit interface barrier. """ - return slot_name.to_equivalent_for_robot_type(robot_type).id + if isinstance(slot_name, DeckSlotName): + return slot_name.to_equivalent_for_robot_type(robot_type).id + else: + # No need to convert staging slot names per robot type, since they only exist on Flex. + return slot_name.id def ensure_lowercase_name(name: str) -> str: @@ -246,6 +291,48 @@ def ensure_module_model(load_name: str) -> ModuleModel: return model +def ensure_and_convert_trash_bin_location( + deck_slot: Union[int, str], api_version: APIVersion, robot_type: RobotType +) -> str: + """Ensure trash bin load location is valid. + + Also, convert the deck slot to a valid trash bin addressable area. + """ + + if robot_type == "OT-2 Standard": + raise InvalidTrashBinLocationError("Cannot load trash on OT-2.") + + # map trash bin location to addressable area + trash_bin_slots = [ + DeckSlotName(slot) for slot in ["A1", "B1", "C1", "D1", "A3", "B3", "C3", "D3"] + ] + trash_bin_addressable_areas = [ + "movableTrashA1", + "movableTrashB1", + "movableTrashC1", + "movableTrashD1", + "movableTrashA3", + "movableTrashB3", + "movableTrashC3", + "movableTrashD3", + ] + map_trash_bin_addressable_area = { + slot: addressable_area + for slot, addressable_area in zip(trash_bin_slots, trash_bin_addressable_areas) + } + + slot_name_ot3 = ensure_and_convert_deck_slot(deck_slot, api_version, robot_type) + if not isinstance(slot_name_ot3, DeckSlotName): + raise ValueError("Staging areas not permitted for trash bin.") + if slot_name_ot3 not in trash_bin_slots: + raise InvalidTrashBinLocationError( + f"Invalid location for trash bin: {slot_name_ot3}.\n" + f"Valid slots: Any slot in column 1 or 3." + ) + + return map_trash_bin_addressable_area[slot_name_ot3] + + def ensure_hold_time_seconds( seconds: Optional[float], minutes: Optional[float] ) -> float: @@ -342,8 +429,9 @@ class LocationTypeError(TypeError): def validate_location( - location: Union[Location, Well, None], last_location: Optional[Location] -) -> Union[WellTarget, PointTarget]: + location: Union[Location, Well, TrashBin, WasteChute, None], + last_location: Optional[Location], +) -> Union[WellTarget, PointTarget, TrashBin, WasteChute]: """Validate a given location for a liquid handling command. Args: @@ -365,11 +453,14 @@ def validate_location( if target_location is None: raise NoLocationError() - if not isinstance(target_location, (Location, Well)): + if not isinstance(target_location, (Location, Well, TrashBin, WasteChute)): raise LocationTypeError( - f"location should be a Well or Location, but it is {location}" + f"location should be a Well, Location, TrashBin or WasteChute, but it is {location}" ) + if isinstance(target_location, (TrashBin, WasteChute)): + return target_location + in_place = target_location == last_location if isinstance(target_location, Well): diff --git a/api/src/opentrons/protocol_engine/__init__.py b/api/src/opentrons/protocol_engine/__init__.py index a975b497332..f6737a71432 100644 --- a/api/src/opentrons/protocol_engine/__init__.py +++ b/api/src/opentrons/protocol_engine/__init__.py @@ -30,11 +30,13 @@ LabwareOffsetVector, LabwareOffsetLocation, LabwareMovementStrategy, + AddressableOffsetVector, DeckPoint, DeckType, DeckSlotLocation, ModuleLocation, OnLabwareLocation, + AddressableAreaLocation, OFF_DECK_LOCATION, Dimensions, EngineStatus, @@ -52,6 +54,11 @@ ModuleModel, ModuleDefinition, Liquid, + AllNozzleLayoutConfiguration, + SingleNozzleLayoutConfiguration, + RowNozzleLayoutConfiguration, + ColumnNozzleLayoutConfiguration, + QuadrantNozzleLayoutConfiguration, ) @@ -83,11 +90,13 @@ "LabwareOffsetVector", "LabwareOffsetLocation", "LabwareMovementStrategy", + "AddressableOffsetVector", "DeckSlotLocation", "DeckPoint", "DeckType", "ModuleLocation", "OnLabwareLocation", + "AddressableAreaLocation", "OFF_DECK_LOCATION", "Dimensions", "EngineStatus", @@ -105,6 +114,11 @@ "ModuleModel", "ModuleDefinition", "Liquid", + "AllNozzleLayoutConfiguration", + "SingleNozzleLayoutConfiguration", + "RowNozzleLayoutConfiguration", + "ColumnNozzleLayoutConfiguration", + "QuadrantNozzleLayoutConfiguration", # plugins "AbstractPlugin", ] diff --git a/api/src/opentrons/protocol_engine/actions/__init__.py b/api/src/opentrons/protocol_engine/actions/__init__.py index e72c8b7db25..b7875021cf3 100644 --- a/api/src/opentrons/protocol_engine/actions/__init__.py +++ b/api/src/opentrons/protocol_engine/actions/__init__.py @@ -19,6 +19,7 @@ AddLabwareOffsetAction, AddLabwareDefinitionAction, AddLiquidAction, + AddAddressableAreaAction, AddModuleAction, FinishErrorDetails, DoorChangeAction, @@ -44,6 +45,7 @@ "AddLabwareOffsetAction", "AddLabwareDefinitionAction", "AddLiquidAction", + "AddAddressableAreaAction", "AddModuleAction", "DoorChangeAction", "ResetTipsAction", diff --git a/api/src/opentrons/protocol_engine/actions/actions.py b/api/src/opentrons/protocol_engine/actions/actions.py index 64e4a5a1fad..318b6a0e676 100644 --- a/api/src/opentrons/protocol_engine/actions/actions.py +++ b/api/src/opentrons/protocol_engine/actions/actions.py @@ -15,7 +15,13 @@ from opentrons_shared_data.errors import EnumeratedError from ..commands import Command, CommandCreate, CommandPrivateResult -from ..types import LabwareOffsetCreate, ModuleDefinition, Liquid +from ..types import ( + LabwareOffsetCreate, + ModuleDefinition, + Liquid, + DeckConfigurationType, + AddressableAreaLocation, +) @dataclass(frozen=True) @@ -23,6 +29,7 @@ class PlayAction: """Start or resume processing commands in the engine.""" requested_at: datetime + deck_configuration: Optional[DeckConfigurationType] class PauseSource(str, Enum): @@ -152,6 +159,18 @@ class AddLiquidAction: liquid: Liquid +@dataclass(frozen=True) +class AddAddressableAreaAction: + """Add a single addressable area to state. + + This differs from the deck configuration in PlayAction which sends over a mapping of cutout fixtures. + This action will only load one addressable area and that should be pre-validated before being sent via + the action. + """ + + addressable_area: AddressableAreaLocation + + @dataclass(frozen=True) class AddModuleAction: """Add an attached module directly to state without a location.""" @@ -193,6 +212,7 @@ class SetPipetteMovementSpeedAction: AddLabwareOffsetAction, AddLabwareDefinitionAction, AddModuleAction, + AddAddressableAreaAction, AddLiquidAction, ResetTipsAction, SetPipetteMovementSpeedAction, diff --git a/api/src/opentrons/protocol_engine/clients/sync_client.py b/api/src/opentrons/protocol_engine/clients/sync_client.py index f68183b81f1..53703c16dee 100644 --- a/api/src/opentrons/protocol_engine/clients/sync_client.py +++ b/api/src/opentrons/protocol_engine/clients/sync_client.py @@ -23,6 +23,8 @@ LabwareOffsetVector, MotorAxis, Liquid, + NozzleLayoutConfigurationType, + AddressableOffsetVector, ) from .transports import ChildThreadTransport @@ -69,6 +71,12 @@ def add_labware_definition(self, definition: LabwareDefinition) -> LabwareUri: definition=definition, ) + def add_addressable_area(self, addressable_area_name: str) -> None: + """Add an addressable area to the engine's state.""" + self._transport.call_method( + "add_addressable_area", addressable_area_name=addressable_area_name + ) + def add_liquid( self, name: str, color: Optional[str], description: Optional[str] ) -> Liquid: @@ -179,6 +187,58 @@ def move_to_well( return cast(commands.MoveToWellResult, result) + def move_to_addressable_area( + self, + pipette_id: str, + addressable_area_name: str, + offset: AddressableOffsetVector, + minimum_z_height: Optional[float], + force_direct: bool, + speed: Optional[float], + ) -> commands.MoveToAddressableAreaResult: + """Execute a MoveToAddressableArea command and return the result.""" + request = commands.MoveToAddressableAreaCreate( + params=commands.MoveToAddressableAreaParams( + pipetteId=pipette_id, + addressableAreaName=addressable_area_name, + offset=offset, + forceDirect=force_direct, + minimumZHeight=minimum_z_height, + speed=speed, + ) + ) + result = self._transport.execute_command(request=request) + + return cast(commands.MoveToAddressableAreaResult, result) + + def move_to_addressable_area_for_drop_tip( + self, + pipette_id: str, + addressable_area_name: str, + offset: AddressableOffsetVector, + minimum_z_height: Optional[float], + force_direct: bool, + speed: Optional[float], + alternate_drop_location: Optional[bool], + ignore_tip_configuration: Optional[bool] = True, + ) -> commands.MoveToAddressableAreaForDropTipResult: + """Execute a MoveToAddressableArea command and return the result.""" + request = commands.MoveToAddressableAreaForDropTipCreate( + params=commands.MoveToAddressableAreaForDropTipParams( + pipetteId=pipette_id, + addressableAreaName=addressable_area_name, + offset=offset, + forceDirect=force_direct, + minimumZHeight=minimum_z_height, + speed=speed, + alternateDropLocation=alternate_drop_location, + ignoreTipConfiguration=ignore_tip_configuration, + ) + ) + result = self._transport.execute_command(request=request) + + return cast(commands.MoveToAddressableAreaForDropTipResult, result) + def move_to_coordinates( self, pipette_id: str, @@ -257,6 +317,21 @@ def drop_tip( result = self._transport.execute_command(request=request) return cast(commands.DropTipResult, result) + def drop_tip_in_place( + self, + pipette_id: str, + home_after: Optional[bool], + ) -> commands.DropTipInPlaceResult: + """Execute a DropTipInPlace command and return the result.""" + request = commands.DropTipInPlaceCreate( + params=commands.DropTipInPlaceParams( + pipetteId=pipette_id, + homeAfter=home_after, + ) + ) + result = self._transport.execute_command(request=request) + return cast(commands.DropTipInPlaceResult, result) + def configure_for_volume( self, pipette_id: str, volume: float ) -> commands.ConfigureForVolumeResult: @@ -269,6 +344,28 @@ def configure_for_volume( result = self._transport.execute_command(request=request) return cast(commands.ConfigureForVolumeResult, result) + def prepare_to_aspirate(self, pipette_id: str) -> commands.PrepareToAspirateResult: + """Execute a PrepareToAspirate command.""" + request = commands.PrepareToAspirateCreate( + params=commands.PrepareToAspirateParams(pipetteId=pipette_id) + ) + result = self._transport.execute_command(request=request) + return cast(commands.PrepareToAspirateResult, result) + + def configure_nozzle_layout( + self, + pipette_id: str, + configuration_params: NozzleLayoutConfigurationType, + ) -> commands.ConfigureNozzleLayoutResult: + """Execute a ConfigureForVolume command.""" + request = commands.ConfigureNozzleLayoutCreate( + params=commands.ConfigureNozzleLayoutParams( + pipetteId=pipette_id, configurationParams=configuration_params + ) + ) + result = self._transport.execute_command(request=request) + return cast(commands.ConfigureNozzleLayoutResult, result) + def aspirate( self, pipette_id: str, diff --git a/api/src/opentrons/protocol_engine/commands/__init__.py b/api/src/opentrons/protocol_engine/commands/__init__.py index 90e1387b267..3dfe6eaf51f 100644 --- a/api/src/opentrons/protocol_engine/commands/__init__.py +++ b/api/src/opentrons/protocol_engine/commands/__init__.py @@ -37,6 +37,7 @@ CommandResult, CommandType, CommandPrivateResult, + CommandT, ) from .aspirate import ( @@ -177,6 +178,22 @@ MoveToWellCommandType, ) +from .move_to_addressable_area import ( + MoveToAddressableArea, + MoveToAddressableAreaParams, + MoveToAddressableAreaCreate, + MoveToAddressableAreaResult, + MoveToAddressableAreaCommandType, +) + +from .move_to_addressable_area_for_drop_tip import ( + MoveToAddressableAreaForDropTip, + MoveToAddressableAreaForDropTipParams, + MoveToAddressableAreaForDropTipCreate, + MoveToAddressableAreaForDropTipResult, + MoveToAddressableAreaForDropTipCommandType, +) + from .wait_for_resume import ( WaitForResume, WaitForResumeParams, @@ -266,6 +283,39 @@ ConfigureForVolumeCommandType, ) +from .prepare_to_aspirate import ( + PrepareToAspirate, + PrepareToAspirateCreate, + PrepareToAspirateParams, + PrepareToAspirateResult, + PrepareToAspirateCommandType, +) + +from .configure_nozzle_layout import ( + ConfigureNozzleLayout, + ConfigureNozzleLayoutCreate, + ConfigureNozzleLayoutParams, + ConfigureNozzleLayoutResult, + ConfigureNozzleLayoutPrivateResult, + ConfigureNozzleLayoutCommandType, +) + +from .get_tip_presence import ( + GetTipPresence, + GetTipPresenceCreate, + GetTipPresenceParams, + GetTipPresenceResult, + GetTipPresenceCommandType, +) + +from .verify_tip_presence import ( + VerifyTipPresence, + VerifyTipPresenceCreate, + VerifyTipPresenceParams, + VerifyTipPresenceResult, + VerifyTipPresenceCommandType, +) + __all__ = [ # command type unions "Command", @@ -274,6 +324,7 @@ "CommandResult", "CommandType", "CommandPrivateResult", + "CommandT", # base interfaces "AbstractCommandImpl", "AbstractCommandWithPrivateResultImpl", @@ -388,6 +439,18 @@ "MoveToWellParams", "MoveToWellResult", "MoveToWellCommandType", + # move to addressable area command models + "MoveToAddressableArea", + "MoveToAddressableAreaParams", + "MoveToAddressableAreaCreate", + "MoveToAddressableAreaResult", + "MoveToAddressableAreaCommandType", + # move to addressable area for drop tip command models + "MoveToAddressableAreaForDropTip", + "MoveToAddressableAreaForDropTipParams", + "MoveToAddressableAreaForDropTipCreate", + "MoveToAddressableAreaForDropTipResult", + "MoveToAddressableAreaForDropTipCommandType", # wait for resume command models "WaitForResume", "WaitForResumeParams", @@ -463,4 +526,29 @@ "ConfigureForVolumeParams", "ConfigureForVolumeResult", "ConfigureForVolumeCommandType", + # prepare pipette for aspirate command bundle + "PrepareToAspirate", + "PrepareToAspirateCreate", + "PrepareToAspirateParams", + "PrepareToAspirateResult", + "PrepareToAspirateCommandType", + # configure nozzle layout command bundle + "ConfigureNozzleLayout", + "ConfigureNozzleLayoutCreate", + "ConfigureNozzleLayoutParams", + "ConfigureNozzleLayoutResult", + "ConfigureNozzleLayoutCommandType", + "ConfigureNozzleLayoutPrivateResult", + # get pipette tip presence bundle + "GetTipPresence", + "GetTipPresenceCreate", + "GetTipPresenceParams", + "GetTipPresenceResult", + "GetTipPresenceCommandType", + # verify pipette tip presence bundle + "VerifyTipPresence", + "VerifyTipPresenceCreate", + "VerifyTipPresenceParams", + "VerifyTipPresenceResult", + "VerifyTipPresenceCommandType", ] diff --git a/api/src/opentrons/protocol_engine/commands/aspirate.py b/api/src/opentrons/protocol_engine/commands/aspirate.py index d80fc12b4c8..35f0878612b 100644 --- a/api/src/opentrons/protocol_engine/commands/aspirate.py +++ b/api/src/opentrons/protocol_engine/commands/aspirate.py @@ -5,7 +5,7 @@ from .pipetting_common import ( PipetteIdMixin, - VolumeMixin, + AspirateVolumeMixin, FlowRateMixin, WellLocationMixin, BaseLiquidHandlingResult, @@ -25,7 +25,9 @@ AspirateCommandType = Literal["aspirate"] -class AspirateParams(PipetteIdMixin, VolumeMixin, FlowRateMixin, WellLocationMixin): +class AspirateParams( + PipetteIdMixin, AspirateVolumeMixin, FlowRateMixin, WellLocationMixin +): """Parameters required to aspirate from a specific well.""" pass diff --git a/api/src/opentrons/protocol_engine/commands/aspirate_in_place.py b/api/src/opentrons/protocol_engine/commands/aspirate_in_place.py index 3c8632c1d87..4cdcd36297c 100644 --- a/api/src/opentrons/protocol_engine/commands/aspirate_in_place.py +++ b/api/src/opentrons/protocol_engine/commands/aspirate_in_place.py @@ -8,7 +8,7 @@ from .pipetting_common import ( PipetteIdMixin, - VolumeMixin, + AspirateVolumeMixin, FlowRateMixin, BaseLiquidHandlingResult, ) @@ -23,7 +23,7 @@ AspirateInPlaceCommandType = Literal["aspirateInPlace"] -class AspirateInPlaceParams(PipetteIdMixin, VolumeMixin, FlowRateMixin): +class AspirateInPlaceParams(PipetteIdMixin, AspirateVolumeMixin, FlowRateMixin): """Payload required to aspirate in place.""" pass diff --git a/api/src/opentrons/protocol_engine/commands/calibration/calibrate_module.py b/api/src/opentrons/protocol_engine/commands/calibration/calibrate_module.py index bd89c931d27..a3e8da549a7 100644 --- a/api/src/opentrons/protocol_engine/commands/calibration/calibrate_module.py +++ b/api/src/opentrons/protocol_engine/commands/calibration/calibrate_module.py @@ -17,7 +17,7 @@ if TYPE_CHECKING: from ...state import StateView -from ...types import ModuleOffsetVector +from ...types import ModuleOffsetVector, DeckSlotLocation from opentrons.hardware_control import HardwareControlAPI from opentrons.hardware_control.types import OT3Mount @@ -46,6 +46,10 @@ class CalibrateModuleResult(BaseModel): ..., description="Offset of calibrated module." ) + location: DeckSlotLocation = Field( + ..., description="The deck slot this module was calibrated in." + ) + class CalibrateModuleImplementation( AbstractCommandImpl[CalibrateModuleParams, CalibrateModuleResult] @@ -67,7 +71,7 @@ async def execute(self, params: CalibrateModuleParams) -> CalibrateModuleResult: self._hardware_api, ) ot3_mount = OT3Mount.from_mount(params.mount) - slot = self._state_view.modules.get_location(params.moduleId).slotName.id + slot = self._state_view.modules.get_location(params.moduleId) module_serial = self._state_view.modules.get_serial_number(params.moduleId) # NOTE (ba, 2023-03-31): There are two wells for calibration labware definitions # well A1 represents the location calibration square center relative to the adapters bottom-left corner @@ -78,13 +82,14 @@ async def execute(self, params: CalibrateModuleParams) -> CalibrateModuleResult: # start the calibration module_offset = await calibration.calibrate_module( - ot3_api, ot3_mount, slot, module_serial, nominal_position + ot3_api, ot3_mount, slot.slotName.id, module_serial, nominal_position ) return CalibrateModuleResult( moduleOffset=ModuleOffsetVector( x=module_offset.x, y=module_offset.y, z=module_offset.z - ) + ), + location=slot, ) diff --git a/api/src/opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py b/api/src/opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py index 464b177e980..67d60eead86 100644 --- a/api/src/opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +++ b/api/src/opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py @@ -80,6 +80,9 @@ async def execute( ot3_api = ensure_ot3_hardware( self._hardware_api, ) + # the 96-channel mount is disengaged during gripper calibration and + # must be homed before the gantry position can be called + await ot3_api.prepare_for_mount_movement(Mount.LEFT) current_position_mount = await ot3_api.gantry_position( Mount.LEFT, critical_point=CriticalPoint.MOUNT ) @@ -99,6 +102,7 @@ async def execute( Point(x=_ATTACH_POINT.x, y=_ATTACH_POINT.y, z=max_height_z_mount), ] + await ot3_api.prepare_for_mount_movement(Mount.LEFT) for movement in movement_points: await ot3_api.move_to( mount=Mount.LEFT, diff --git a/api/src/opentrons/protocol_engine/commands/command_unions.py b/api/src/opentrons/protocol_engine/commands/command_unions.py index 12f6675e28c..dc4cc18c35a 100644 --- a/api/src/opentrons/protocol_engine/commands/command_unions.py +++ b/api/src/opentrons/protocol_engine/commands/command_unions.py @@ -1,6 +1,9 @@ """Union types of concrete command definitions.""" -from typing import Union +from typing import Union, TypeVar +from typing_extensions import Annotated + +from pydantic import Field from . import heater_shaker from . import magnetic_module @@ -154,6 +157,22 @@ MoveToWellCommandType, ) +from .move_to_addressable_area import ( + MoveToAddressableArea, + MoveToAddressableAreaParams, + MoveToAddressableAreaCreate, + MoveToAddressableAreaResult, + MoveToAddressableAreaCommandType, +) + +from .move_to_addressable_area_for_drop_tip import ( + MoveToAddressableAreaForDropTip, + MoveToAddressableAreaForDropTipParams, + MoveToAddressableAreaForDropTipCreate, + MoveToAddressableAreaForDropTipResult, + MoveToAddressableAreaForDropTipCommandType, +) + from .wait_for_resume import ( WaitForResume, WaitForResumeParams, @@ -235,60 +254,102 @@ ConfigureForVolumePrivateResult, ) -Command = Union[ - Aspirate, - AspirateInPlace, - Comment, - Custom, - Dispense, - DispenseInPlace, - BlowOut, - BlowOutInPlace, - ConfigureForVolume, - DropTip, - DropTipInPlace, - Home, - RetractAxis, - LoadLabware, - LoadLiquid, - LoadModule, - LoadPipette, - MoveLabware, - MoveRelative, - MoveToCoordinates, - MoveToWell, - WaitForResume, - WaitForDuration, - PickUpTip, - SavePosition, - SetRailLights, - TouchTip, - SetStatusBar, - heater_shaker.WaitForTemperature, - heater_shaker.SetTargetTemperature, - heater_shaker.DeactivateHeater, - heater_shaker.SetAndWaitForShakeSpeed, - heater_shaker.DeactivateShaker, - heater_shaker.OpenLabwareLatch, - heater_shaker.CloseLabwareLatch, - magnetic_module.Disengage, - magnetic_module.Engage, - temperature_module.SetTargetTemperature, - temperature_module.WaitForTemperature, - temperature_module.DeactivateTemperature, - thermocycler.SetTargetBlockTemperature, - thermocycler.WaitForBlockTemperature, - thermocycler.SetTargetLidTemperature, - thermocycler.WaitForLidTemperature, - thermocycler.DeactivateBlock, - thermocycler.DeactivateLid, - thermocycler.OpenLid, - thermocycler.CloseLid, - thermocycler.RunProfile, - calibration.CalibrateGripper, - calibration.CalibratePipette, - calibration.CalibrateModule, - calibration.MoveToMaintenancePosition, +from .prepare_to_aspirate import ( + PrepareToAspirate, + PrepareToAspirateParams, + PrepareToAspirateCreate, + PrepareToAspirateResult, + PrepareToAspirateCommandType, +) + +from .configure_nozzle_layout import ( + ConfigureNozzleLayout, + ConfigureNozzleLayoutCreate, + ConfigureNozzleLayoutParams, + ConfigureNozzleLayoutResult, + ConfigureNozzleLayoutCommandType, + ConfigureNozzleLayoutPrivateResult, +) + +from .verify_tip_presence import ( + VerifyTipPresence, + VerifyTipPresenceCreate, + VerifyTipPresenceParams, + VerifyTipPresenceResult, + VerifyTipPresenceCommandType, +) + +from .get_tip_presence import ( + GetTipPresence, + GetTipPresenceCreate, + GetTipPresenceParams, + GetTipPresenceResult, + GetTipPresenceCommandType, +) + +Command = Annotated[ + Union[ + Aspirate, + AspirateInPlace, + Comment, + Custom, + Dispense, + DispenseInPlace, + BlowOut, + BlowOutInPlace, + ConfigureForVolume, + ConfigureNozzleLayout, + DropTip, + DropTipInPlace, + Home, + RetractAxis, + LoadLabware, + LoadLiquid, + LoadModule, + LoadPipette, + MoveLabware, + MoveRelative, + MoveToCoordinates, + MoveToWell, + MoveToAddressableArea, + MoveToAddressableAreaForDropTip, + PrepareToAspirate, + WaitForResume, + WaitForDuration, + PickUpTip, + SavePosition, + SetRailLights, + TouchTip, + SetStatusBar, + VerifyTipPresence, + GetTipPresence, + heater_shaker.WaitForTemperature, + heater_shaker.SetTargetTemperature, + heater_shaker.DeactivateHeater, + heater_shaker.SetAndWaitForShakeSpeed, + heater_shaker.DeactivateShaker, + heater_shaker.OpenLabwareLatch, + heater_shaker.CloseLabwareLatch, + magnetic_module.Disengage, + magnetic_module.Engage, + temperature_module.SetTargetTemperature, + temperature_module.WaitForTemperature, + temperature_module.DeactivateTemperature, + thermocycler.SetTargetBlockTemperature, + thermocycler.WaitForBlockTemperature, + thermocycler.SetTargetLidTemperature, + thermocycler.WaitForLidTemperature, + thermocycler.DeactivateBlock, + thermocycler.DeactivateLid, + thermocycler.OpenLid, + thermocycler.CloseLid, + thermocycler.RunProfile, + calibration.CalibrateGripper, + calibration.CalibratePipette, + calibration.CalibrateModule, + calibration.MoveToMaintenancePosition, + ], + Field(discriminator="commandType"), ] CommandParams = Union[ @@ -296,6 +357,7 @@ AspirateInPlaceParams, CommentParams, ConfigureForVolumeParams, + ConfigureNozzleLayoutParams, CustomParams, DispenseParams, DispenseInPlaceParams, @@ -313,6 +375,9 @@ MoveRelativeParams, MoveToCoordinatesParams, MoveToWellParams, + MoveToAddressableAreaParams, + MoveToAddressableAreaForDropTipParams, + PrepareToAspirateParams, WaitForResumeParams, WaitForDurationParams, PickUpTipParams, @@ -320,6 +385,8 @@ SetRailLightsParams, TouchTipParams, SetStatusBarParams, + VerifyTipPresenceParams, + GetTipPresenceParams, heater_shaker.WaitForTemperatureParams, heater_shaker.SetTargetTemperatureParams, heater_shaker.DeactivateHeaterParams, @@ -353,6 +420,7 @@ AspirateInPlaceCommandType, CommentCommandType, ConfigureForVolumeCommandType, + ConfigureNozzleLayoutCommandType, CustomCommandType, DispenseCommandType, DispenseInPlaceCommandType, @@ -370,6 +438,9 @@ MoveRelativeCommandType, MoveToCoordinatesCommandType, MoveToWellCommandType, + MoveToAddressableAreaCommandType, + MoveToAddressableAreaForDropTipCommandType, + PrepareToAspirateCommandType, WaitForResumeCommandType, WaitForDurationCommandType, PickUpTipCommandType, @@ -377,6 +448,8 @@ SetRailLightsCommandType, TouchTipCommandType, SetStatusBarCommandType, + VerifyTipPresenceCommandType, + GetTipPresenceCommandType, heater_shaker.WaitForTemperatureCommandType, heater_shaker.SetTargetTemperatureCommandType, heater_shaker.DeactivateHeaterCommandType, @@ -404,60 +477,69 @@ calibration.MoveToMaintenancePositionCommandType, ] -CommandCreate = Union[ - AspirateCreate, - AspirateInPlaceCreate, - CommentCreate, - ConfigureForVolumeCreate, - CustomCreate, - DispenseCreate, - DispenseInPlaceCreate, - BlowOutCreate, - BlowOutInPlaceCreate, - DropTipCreate, - DropTipInPlaceCreate, - HomeCreate, - RetractAxisCreate, - LoadLabwareCreate, - LoadLiquidCreate, - LoadModuleCreate, - LoadPipetteCreate, - MoveLabwareCreate, - MoveRelativeCreate, - MoveToCoordinatesCreate, - MoveToWellCreate, - WaitForResumeCreate, - WaitForDurationCreate, - PickUpTipCreate, - SavePositionCreate, - SetRailLightsCreate, - TouchTipCreate, - SetStatusBarCreate, - heater_shaker.WaitForTemperatureCreate, - heater_shaker.SetTargetTemperatureCreate, - heater_shaker.DeactivateHeaterCreate, - heater_shaker.SetAndWaitForShakeSpeedCreate, - heater_shaker.DeactivateShakerCreate, - heater_shaker.OpenLabwareLatchCreate, - heater_shaker.CloseLabwareLatchCreate, - magnetic_module.DisengageCreate, - magnetic_module.EngageCreate, - temperature_module.SetTargetTemperatureCreate, - temperature_module.WaitForTemperatureCreate, - temperature_module.DeactivateTemperatureCreate, - thermocycler.SetTargetBlockTemperatureCreate, - thermocycler.WaitForBlockTemperatureCreate, - thermocycler.SetTargetLidTemperatureCreate, - thermocycler.WaitForLidTemperatureCreate, - thermocycler.DeactivateBlockCreate, - thermocycler.DeactivateLidCreate, - thermocycler.OpenLidCreate, - thermocycler.CloseLidCreate, - thermocycler.RunProfileCreate, - calibration.CalibrateGripperCreate, - calibration.CalibratePipetteCreate, - calibration.CalibrateModuleCreate, - calibration.MoveToMaintenancePositionCreate, +CommandCreate = Annotated[ + Union[ + AspirateCreate, + AspirateInPlaceCreate, + CommentCreate, + ConfigureForVolumeCreate, + ConfigureNozzleLayoutCreate, + CustomCreate, + DispenseCreate, + DispenseInPlaceCreate, + BlowOutCreate, + BlowOutInPlaceCreate, + DropTipCreate, + DropTipInPlaceCreate, + HomeCreate, + RetractAxisCreate, + LoadLabwareCreate, + LoadLiquidCreate, + LoadModuleCreate, + LoadPipetteCreate, + MoveLabwareCreate, + MoveRelativeCreate, + MoveToCoordinatesCreate, + MoveToWellCreate, + MoveToAddressableAreaCreate, + MoveToAddressableAreaForDropTipCreate, + PrepareToAspirateCreate, + WaitForResumeCreate, + WaitForDurationCreate, + PickUpTipCreate, + SavePositionCreate, + SetRailLightsCreate, + TouchTipCreate, + SetStatusBarCreate, + VerifyTipPresenceCreate, + GetTipPresenceCreate, + heater_shaker.WaitForTemperatureCreate, + heater_shaker.SetTargetTemperatureCreate, + heater_shaker.DeactivateHeaterCreate, + heater_shaker.SetAndWaitForShakeSpeedCreate, + heater_shaker.DeactivateShakerCreate, + heater_shaker.OpenLabwareLatchCreate, + heater_shaker.CloseLabwareLatchCreate, + magnetic_module.DisengageCreate, + magnetic_module.EngageCreate, + temperature_module.SetTargetTemperatureCreate, + temperature_module.WaitForTemperatureCreate, + temperature_module.DeactivateTemperatureCreate, + thermocycler.SetTargetBlockTemperatureCreate, + thermocycler.WaitForBlockTemperatureCreate, + thermocycler.SetTargetLidTemperatureCreate, + thermocycler.WaitForLidTemperatureCreate, + thermocycler.DeactivateBlockCreate, + thermocycler.DeactivateLidCreate, + thermocycler.OpenLidCreate, + thermocycler.CloseLidCreate, + thermocycler.RunProfileCreate, + calibration.CalibrateGripperCreate, + calibration.CalibratePipetteCreate, + calibration.CalibrateModuleCreate, + calibration.MoveToMaintenancePositionCreate, + ], + Field(discriminator="commandType"), ] CommandResult = Union[ @@ -465,6 +547,7 @@ AspirateInPlaceResult, CommentResult, ConfigureForVolumeResult, + ConfigureNozzleLayoutResult, CustomResult, DispenseResult, DispenseInPlaceResult, @@ -482,6 +565,9 @@ MoveRelativeResult, MoveToCoordinatesResult, MoveToWellResult, + MoveToAddressableAreaResult, + MoveToAddressableAreaForDropTipResult, + PrepareToAspirateResult, WaitForResumeResult, WaitForDurationResult, PickUpTipResult, @@ -489,6 +575,8 @@ SetRailLightsResult, TouchTipResult, SetStatusBarResult, + VerifyTipPresenceResult, + GetTipPresenceResult, heater_shaker.WaitForTemperatureResult, heater_shaker.SetTargetTemperatureResult, heater_shaker.DeactivateHeaterResult, @@ -517,5 +605,10 @@ ] CommandPrivateResult = Union[ - None, LoadPipettePrivateResult, ConfigureForVolumePrivateResult + None, + LoadPipettePrivateResult, + ConfigureForVolumePrivateResult, + ConfigureNozzleLayoutPrivateResult, ] + +CommandT = TypeVar("CommandT", bound=Command) diff --git a/api/src/opentrons/protocol_engine/commands/configure_for_volume.py b/api/src/opentrons/protocol_engine/commands/configure_for_volume.py index 9aa2f6ee0d3..f1f59c35bcb 100644 --- a/api/src/opentrons/protocol_engine/commands/configure_for_volume.py +++ b/api/src/opentrons/protocol_engine/commands/configure_for_volume.py @@ -1,13 +1,10 @@ """Configure for volume command request, result, and implementation models.""" from __future__ import annotations -from pydantic import BaseModel +from pydantic import BaseModel, Field from typing import TYPE_CHECKING, Optional, Type, Tuple from typing_extensions import Literal -from .pipetting_common import ( - PipetteIdMixin, - VolumeMixin, -) +from .pipetting_common import PipetteIdMixin from .command import ( AbstractCommandWithPrivateResultImpl, BaseCommand, @@ -22,10 +19,15 @@ ConfigureForVolumeCommandType = Literal["configureForVolume"] -class ConfigureForVolumeParams(PipetteIdMixin, VolumeMixin): +class ConfigureForVolumeParams(PipetteIdMixin): """Parameters required to configure volume for a specific pipette.""" - pass + volume: float = Field( + ..., + description="Amount of liquid in uL. Must be at least 0 and no greater " + "than a pipette-specific maximum volume.", + ge=0, + ) class ConfigureForVolumePrivateResult(PipetteConfigUpdateResultMixin): diff --git a/api/src/opentrons/protocol_engine/commands/configure_nozzle_layout.py b/api/src/opentrons/protocol_engine/commands/configure_nozzle_layout.py new file mode 100644 index 00000000000..49b90ec7432 --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/configure_nozzle_layout.py @@ -0,0 +1,116 @@ +"""Configure nozzle layout command request, result, and implementation models.""" +from __future__ import annotations +from pydantic import BaseModel +from typing import TYPE_CHECKING, Optional, Type, Tuple, Union +from typing_extensions import Literal + +from .pipetting_common import ( + PipetteIdMixin, +) +from .command import ( + AbstractCommandWithPrivateResultImpl, + BaseCommand, + BaseCommandCreate, +) +from .configuring_common import ( + PipetteNozzleLayoutResultMixin, +) +from ..types import ( + AllNozzleLayoutConfiguration, + SingleNozzleLayoutConfiguration, + RowNozzleLayoutConfiguration, + ColumnNozzleLayoutConfiguration, + QuadrantNozzleLayoutConfiguration, +) + +if TYPE_CHECKING: + from ..execution import EquipmentHandler, TipHandler + + +ConfigureNozzleLayoutCommandType = Literal["configureNozzleLayout"] + + +class ConfigureNozzleLayoutParams(PipetteIdMixin): + """Parameters required to configure the nozzle layout for a specific pipette.""" + + configurationParams: Union[ + AllNozzleLayoutConfiguration, + SingleNozzleLayoutConfiguration, + RowNozzleLayoutConfiguration, + ColumnNozzleLayoutConfiguration, + QuadrantNozzleLayoutConfiguration, + ] + + +class ConfigureNozzleLayoutPrivateResult(PipetteNozzleLayoutResultMixin): + """Result sent to the store but not serialized.""" + + pass + + +class ConfigureNozzleLayoutResult(BaseModel): + """Result data from execution of an configureNozzleLayout command.""" + + pass + + +class ConfigureNozzleLayoutImplementation( + AbstractCommandWithPrivateResultImpl[ + ConfigureNozzleLayoutParams, + ConfigureNozzleLayoutResult, + ConfigureNozzleLayoutPrivateResult, + ] +): + """Configure nozzle layout command implementation.""" + + def __init__( + self, equipment: EquipmentHandler, tip_handler: TipHandler, **kwargs: object + ) -> None: + self._equipment = equipment + self._tip_handler = tip_handler + + async def execute( + self, params: ConfigureNozzleLayoutParams + ) -> Tuple[ConfigureNozzleLayoutResult, ConfigureNozzleLayoutPrivateResult]: + """Check that requested pipette can support the requested nozzle layout.""" + primary_nozzle = params.configurationParams.dict().get("primaryNozzle") + front_right_nozzle = params.configurationParams.dict().get("frontRightNozzle") + nozzle_params = await self._tip_handler.available_for_nozzle_layout( + pipette_id=params.pipetteId, + style=params.configurationParams.style, + primary_nozzle=primary_nozzle, + front_right_nozzle=front_right_nozzle, + ) + + nozzle_map = await self._equipment.configure_nozzle_layout( + pipette_id=params.pipetteId, + **nozzle_params, + ) + + return ConfigureNozzleLayoutResult(), ConfigureNozzleLayoutPrivateResult( + pipette_id=params.pipetteId, + nozzle_map=nozzle_map, + ) + + +class ConfigureNozzleLayout( + BaseCommand[ConfigureNozzleLayoutParams, ConfigureNozzleLayoutResult] +): + """Configure nozzle layout command model.""" + + commandType: ConfigureNozzleLayoutCommandType = "configureNozzleLayout" + params: ConfigureNozzleLayoutParams + result: Optional[ConfigureNozzleLayoutResult] + + _ImplementationCls: Type[ + ConfigureNozzleLayoutImplementation + ] = ConfigureNozzleLayoutImplementation + + +class ConfigureNozzleLayoutCreate(BaseCommandCreate[ConfigureNozzleLayoutParams]): + """Configure nozzle layout creation request model.""" + + commandType: ConfigureNozzleLayoutCommandType = "configureNozzleLayout" + params: ConfigureNozzleLayoutParams + + _CommandCls: Type[ConfigureNozzleLayout] = ConfigureNozzleLayout diff --git a/api/src/opentrons/protocol_engine/commands/configuring_common.py b/api/src/opentrons/protocol_engine/commands/configuring_common.py index a4ff8917310..ec5917d9931 100644 --- a/api/src/opentrons/protocol_engine/commands/configuring_common.py +++ b/api/src/opentrons/protocol_engine/commands/configuring_common.py @@ -1,6 +1,11 @@ """Common configuration command base models.""" +from pydantic import BaseModel, Field +from typing import Optional from dataclasses import dataclass +from opentrons.hardware_control.nozzle_manager import ( + NozzleMap, +) from ..resources import pipette_data_provider @@ -11,3 +16,13 @@ class PipetteConfigUpdateResultMixin: pipette_id: str serial_number: str config: pipette_data_provider.LoadedStaticPipetteData + + +class PipetteNozzleLayoutResultMixin(BaseModel): + """A nozzle layout result for updating the pipette state.""" + + pipette_id: str + nozzle_map: Optional[NozzleMap] = Field( + default=None, + description="A dataclass object holding information about the current nozzle configuration.", + ) diff --git a/api/src/opentrons/protocol_engine/commands/dispense.py b/api/src/opentrons/protocol_engine/commands/dispense.py index 361b6d2cdda..aa5017ed670 100644 --- a/api/src/opentrons/protocol_engine/commands/dispense.py +++ b/api/src/opentrons/protocol_engine/commands/dispense.py @@ -8,7 +8,7 @@ from ..types import DeckPoint from .pipetting_common import ( PipetteIdMixin, - VolumeMixin, + DispenseVolumeMixin, FlowRateMixin, WellLocationMixin, BaseLiquidHandlingResult, @@ -23,7 +23,9 @@ DispenseCommandType = Literal["dispense"] -class DispenseParams(PipetteIdMixin, VolumeMixin, FlowRateMixin, WellLocationMixin): +class DispenseParams( + PipetteIdMixin, DispenseVolumeMixin, FlowRateMixin, WellLocationMixin +): """Payload required to dispense to a specific well.""" pushOut: Optional[float] = Field( diff --git a/api/src/opentrons/protocol_engine/commands/dispense_in_place.py b/api/src/opentrons/protocol_engine/commands/dispense_in_place.py index bda6a953f45..9f0aee8df03 100644 --- a/api/src/opentrons/protocol_engine/commands/dispense_in_place.py +++ b/api/src/opentrons/protocol_engine/commands/dispense_in_place.py @@ -7,7 +7,7 @@ from .pipetting_common import ( PipetteIdMixin, - VolumeMixin, + DispenseVolumeMixin, FlowRateMixin, BaseLiquidHandlingResult, ) @@ -20,7 +20,7 @@ DispenseInPlaceCommandType = Literal["dispenseInPlace"] -class DispenseInPlaceParams(PipetteIdMixin, VolumeMixin, FlowRateMixin): +class DispenseInPlaceParams(PipetteIdMixin, DispenseVolumeMixin, FlowRateMixin): """Payload required to dispense in place.""" pushOut: Optional[float] = Field( diff --git a/api/src/opentrons/protocol_engine/commands/drop_tip.py b/api/src/opentrons/protocol_engine/commands/drop_tip.py index 90b0c04484b..923c384e630 100644 --- a/api/src/opentrons/protocol_engine/commands/drop_tip.py +++ b/api/src/opentrons/protocol_engine/commands/drop_tip.py @@ -82,8 +82,14 @@ async def execute(self, params: DropTipParams) -> DropTipResult: else: well_location = params.wellLocation + is_partially_configured = self._state_view.pipettes.get_is_partially_configured( + pipette_id=pipette_id + ) tip_drop_location = self._state_view.geometry.get_checked_tip_drop_location( - pipette_id=pipette_id, labware_id=labware_id, well_location=well_location + pipette_id=pipette_id, + labware_id=labware_id, + well_location=well_location, + partially_configured=is_partially_configured, ) position = await self._movement_handler.move_to_well( diff --git a/api/src/opentrons/protocol_engine/commands/get_tip_presence.py b/api/src/opentrons/protocol_engine/commands/get_tip_presence.py new file mode 100644 index 00000000000..0a878418a6b --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/get_tip_presence.py @@ -0,0 +1,80 @@ +"""Get tip presence command request, result and implementation models.""" +from __future__ import annotations + +from pydantic import Field, BaseModel +from typing import TYPE_CHECKING, Optional, Type +from typing_extensions import Literal + +from .pipetting_common import PipetteIdMixin +from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate + +from ..types import TipPresenceStatus + +if TYPE_CHECKING: + from ..execution import TipHandler + + +GetTipPresenceCommandType = Literal["getTipPresence"] + + +class GetTipPresenceParams(PipetteIdMixin): + """Payload required for a GetTipPresence command.""" + + pass + + +class GetTipPresenceResult(BaseModel): + """Result data from the execution of a GetTipPresence command.""" + + status: TipPresenceStatus = Field( + ..., + description=( + "Whether or not a tip is attached on the pipette. This only works on" + " on FLEX because OT-2 pipettes do not possess tip presence sensors," + " hence, will always return TipPresenceStatus.UNKNOWN." + ), + ) + + +class GetTipPresenceImplementation( + AbstractCommandImpl[GetTipPresenceParams, GetTipPresenceResult] +): + """GetTipPresence command implementation.""" + + def __init__( + self, + tip_handler: TipHandler, + **kwargs: object, + ) -> None: + self._tip_handler = tip_handler + + async def execute(self, params: GetTipPresenceParams) -> GetTipPresenceResult: + """Verify if tip presence is as expected for the requested pipette.""" + pipette_id = params.pipetteId + + result = await self._tip_handler.get_tip_presence( + pipette_id=pipette_id, + ) + + return GetTipPresenceResult(status=result) + + +class GetTipPresence(BaseCommand[GetTipPresenceParams, GetTipPresenceResult]): + """GetTipPresence command model.""" + + commandType: GetTipPresenceCommandType = "getTipPresence" + params: GetTipPresenceParams + result: Optional[GetTipPresenceResult] + + _ImplementationCls: Type[ + GetTipPresenceImplementation + ] = GetTipPresenceImplementation + + +class GetTipPresenceCreate(BaseCommandCreate[GetTipPresenceParams]): + """GetTipPresence command creation request model.""" + + commandType: GetTipPresenceCommandType = "getTipPresence" + params: GetTipPresenceParams + + _CommandCls: Type[GetTipPresence] = GetTipPresence diff --git a/api/src/opentrons/protocol_engine/commands/load_labware.py b/api/src/opentrons/protocol_engine/commands/load_labware.py index 614c702df51..64ed68b47ba 100644 --- a/api/src/opentrons/protocol_engine/commands/load_labware.py +++ b/api/src/opentrons/protocol_engine/commands/load_labware.py @@ -7,8 +7,13 @@ from opentrons_shared_data.labware.labware_definition import LabwareDefinition from ..errors import LabwareIsNotAllowedInLocationError -from ..resources import labware_validation -from ..types import LabwareLocation, OnLabwareLocation, DeckSlotLocation +from ..resources import labware_validation, fixture_validation +from ..types import ( + LabwareLocation, + OnLabwareLocation, + DeckSlotLocation, + AddressableAreaLocation, +) from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate @@ -105,21 +110,38 @@ async def execute(self, params: LoadLabwareParams) -> LoadLabwareResult: f"{params.loadName} is not allowed in slot {params.location.slotName}" ) + if isinstance(params.location, AddressableAreaLocation): + area_name = params.location.addressableAreaName + if not fixture_validation.is_deck_slot(params.location.addressableAreaName): + raise LabwareIsNotAllowedInLocationError( + f"Cannot load {params.loadName} onto addressable area {area_name}" + ) + self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration( + area_name + ) + elif isinstance(params.location, DeckSlotLocation): + self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration( + params.location.slotName.id + ) + + verified_location = self._state_view.geometry.ensure_location_not_occupied( + params.location + ) loaded_labware = await self._equipment.load_labware( load_name=params.loadName, namespace=params.namespace, version=params.version, - location=params.location, + location=verified_location, labware_id=params.labwareId, ) # TODO(jbl 2023-06-23) these validation checks happen after the labware is loaded, because they rely on # on the definition. In practice this will not cause any issues since they will raise protocol ending # exception, but for correctness should be refactored to do this check beforehand. - if isinstance(params.location, OnLabwareLocation): + if isinstance(verified_location, OnLabwareLocation): self._state_view.labware.raise_if_labware_cannot_be_stacked( top_labware_definition=loaded_labware.definition, - bottom_labware_id=params.location.labwareId, + bottom_labware_id=verified_location.labwareId, ) return LoadLabwareResult( diff --git a/api/src/opentrons/protocol_engine/commands/load_module.py b/api/src/opentrons/protocol_engine/commands/load_module.py index 407db1dc93a..082b88814cf 100644 --- a/api/src/opentrons/protocol_engine/commands/load_module.py +++ b/api/src/opentrons/protocol_engine/commands/load_module.py @@ -8,6 +8,7 @@ from ..types import DeckSlotLocation, ModuleModel, ModuleDefinition if TYPE_CHECKING: + from ..state import StateView from ..execution import EquipmentHandler @@ -95,21 +96,32 @@ class LoadModuleResult(BaseModel): class LoadModuleImplementation(AbstractCommandImpl[LoadModuleParams, LoadModuleResult]): """The implementation of the load module command.""" - def __init__(self, equipment: EquipmentHandler, **kwargs: object) -> None: + def __init__( + self, equipment: EquipmentHandler, state_view: StateView, **kwargs: object + ) -> None: self._equipment = equipment + self._state_view = state_view async def execute(self, params: LoadModuleParams) -> LoadModuleResult: """Check that the requested module is attached and assign its identifier.""" + self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration( + params.location.slotName.id + ) + + verified_location = self._state_view.geometry.ensure_location_not_occupied( + params.location + ) + if params.model == ModuleModel.MAGNETIC_BLOCK_V1: loaded_module = await self._equipment.load_magnetic_block( model=params.model, - location=params.location, + location=verified_location, module_id=params.moduleId, ) else: loaded_module = await self._equipment.load_module( model=params.model, - location=params.location, + location=verified_location, module_id=params.moduleId, ) diff --git a/api/src/opentrons/protocol_engine/commands/load_pipette.py b/api/src/opentrons/protocol_engine/commands/load_pipette.py index 66f32e99edc..5b6be4dea76 100644 --- a/api/src/opentrons/protocol_engine/commands/load_pipette.py +++ b/api/src/opentrons/protocol_engine/commands/load_pipette.py @@ -1,5 +1,12 @@ """Load pipette command request, result, and implementation models.""" from __future__ import annotations + +from opentrons_shared_data.pipette.pipette_load_name_conversions import ( + convert_to_pipette_name_type, +) +from opentrons_shared_data.pipette.types import PipetteGenerationType +from opentrons_shared_data.robot import user_facing_robot_type +from opentrons_shared_data.robot.dev_types import RobotTypeEnum from pydantic import BaseModel, Field from typing import TYPE_CHECKING, Optional, Type, Tuple from typing_extensions import Literal @@ -13,9 +20,11 @@ BaseCommandCreate, ) from .configuring_common import PipetteConfigUpdateResultMixin +from ..errors import InvalidSpecificationForRobotTypeError, InvalidLoadPipetteSpecsError if TYPE_CHECKING: from ..execution import EquipmentHandler + from ..state import StateView LoadPipetteCommandType = Literal["loadPipette"] @@ -61,13 +70,44 @@ class LoadPipetteImplementation( ): """Load pipette command implementation.""" - def __init__(self, equipment: EquipmentHandler, **kwargs: object) -> None: + def __init__( + self, equipment: EquipmentHandler, state_view: StateView, **kwargs: object + ) -> None: self._equipment = equipment + self._state_view = state_view async def execute( self, params: LoadPipetteParams ) -> Tuple[LoadPipetteResult, LoadPipettePrivateResult]: """Check that requested pipette is attached and assign its identifier.""" + pipette_generation = convert_to_pipette_name_type( + params.pipetteName.value + ).pipette_generation + robot_type = RobotTypeEnum.robot_literal_to_enum( + self._state_view.config.robot_type + ) + if ( + ( + robot_type == RobotTypeEnum.FLEX + and pipette_generation != PipetteGenerationType.FLEX + ) + ) or ( + ( + robot_type == RobotTypeEnum.OT2 + and pipette_generation + not in [PipetteGenerationType.GEN1, PipetteGenerationType.GEN2] + ) + ): + raise InvalidSpecificationForRobotTypeError( + f"Cannot load a {pipette_generation.value.capitalize()} pipette on " + f"{user_facing_robot_type(robot_type=self._state_view.config.robot_type, include_article=True)}." + ) + + if params.mount == MountType.EXTENSION: + raise InvalidLoadPipetteSpecsError( + "Cannot load a pipette on the EXTENSION mount. Use mount LEFT or RIGHT." + ) + loaded_pipette = await self._equipment.load_pipette( pipette_name=params.pipetteName, mount=params.mount, diff --git a/api/src/opentrons/protocol_engine/commands/move_labware.py b/api/src/opentrons/protocol_engine/commands/move_labware.py index 682f2a58a22..653c390c64b 100644 --- a/api/src/opentrons/protocol_engine/commands/move_labware.py +++ b/api/src/opentrons/protocol_engine/commands/move_labware.py @@ -5,16 +5,20 @@ from typing import TYPE_CHECKING, Optional, Type from typing_extensions import Literal +from opentrons.types import Point from ..types import ( LabwareLocation, + DeckSlotLocation, OnLabwareLocation, + AddressableAreaLocation, LabwareMovementStrategy, LabwareOffsetVector, LabwareMovementOffsetData, ) from ..errors import LabwareMovementNotAllowedError, NotSupportedOnRobotType -from ..resources import labware_validation +from ..resources import labware_validation, fixture_validation from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate +from opentrons_shared_data.gripper.constants import GRIPPER_PADDLE_WIDTH if TYPE_CHECKING: from ..execution import EquipmentHandler, RunControlHandler, LabwareMovementHandler @@ -24,6 +28,10 @@ MoveLabwareCommandType = Literal["moveLabware"] +# Extra buffer on top of minimum distance to move to the right +_TRASH_CHUTE_DROP_BUFFER_MM = 8 + + # TODO (spp, 2022-12-14): https://opentrons.atlassian.net/browse/RLAB-237 class MoveLabwareParams(BaseModel): """Input parameters for a ``moveLabware`` command.""" @@ -83,7 +91,9 @@ def __init__( self._labware_movement = labware_movement self._run_control = run_control - async def execute(self, params: MoveLabwareParams) -> MoveLabwareResult: + async def execute( # noqa: C901 + self, params: MoveLabwareParams + ) -> MoveLabwareResult: """Move a loaded labware to a new location.""" # Allow propagation of LabwareNotLoadedError. current_labware = self._state_view.labware.get(labware_id=params.labwareId) @@ -91,12 +101,44 @@ async def execute(self, params: MoveLabwareParams) -> MoveLabwareResult: labware_id=params.labwareId ) definition_uri = current_labware.definitionUri + post_drop_slide_offset: Optional[Point] = None if self._state_view.labware.is_fixed_trash(params.labwareId): raise LabwareMovementNotAllowedError( f"Cannot move fixed trash labware '{current_labware_definition.parameters.loadName}'." ) + if isinstance(params.newLocation, AddressableAreaLocation): + area_name = params.newLocation.addressableAreaName + if not fixture_validation.is_gripper_waste_chute( + area_name + ) and not fixture_validation.is_deck_slot(area_name): + raise LabwareMovementNotAllowedError( + f"Cannot move {current_labware.loadName} to addressable area {area_name}" + ) + self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration( + area_name + ) + + if fixture_validation.is_gripper_waste_chute(area_name): + # When dropping off labware in the waste chute, some bigger pieces + # of labware (namely tipracks) can get stuck between a gripper + # paddle and the bottom of the waste chute, even after the gripper + # has homed all the way to the top of its travel. We add a "post-drop + # slide" to dropoffs in the waste chute in order to guarantee that the + # labware can drop fully through the chute before the gripper jaws close. + post_drop_slide_offset = Point( + x=(current_labware_definition.dimensions.xDimension / 2.0) + + (GRIPPER_PADDLE_WIDTH / 2.0) + + _TRASH_CHUTE_DROP_BUFFER_MM, + y=0, + z=0, + ) + elif isinstance(params.newLocation, DeckSlotLocation): + self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration( + params.newLocation.slotName.id + ) + available_new_location = self._state_view.geometry.ensure_location_not_occupied( location=params.newLocation ) @@ -157,12 +199,14 @@ async def execute(self, params: MoveLabwareParams) -> MoveLabwareResult: pickUpOffset=params.pickUpOffset or LabwareOffsetVector(x=0, y=0, z=0), dropOffset=params.dropOffset or LabwareOffsetVector(x=0, y=0, z=0), ) + # Skips gripper moves when using virtual gripper await self._labware_movement.move_labware_with_gripper( labware_id=params.labwareId, current_location=validated_current_loc, new_location=validated_new_loc, user_offset_data=user_offset_data, + post_drop_slide_offset=post_drop_slide_offset, ) elif params.strategy == LabwareMovementStrategy.MANUAL_MOVE_WITH_PAUSE: # Pause to allow for manual labware movement diff --git a/api/src/opentrons/protocol_engine/commands/move_to_addressable_area.py b/api/src/opentrons/protocol_engine/commands/move_to_addressable_area.py new file mode 100644 index 00000000000..7dfc0b53895 --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/move_to_addressable_area.py @@ -0,0 +1,130 @@ +"""Move to addressable area command request, result, and implementation models.""" +from __future__ import annotations +from pydantic import Field +from typing import TYPE_CHECKING, Optional, Type +from typing_extensions import Literal + +from ..errors import LocationNotAccessibleByPipetteError +from ..types import DeckPoint, AddressableOffsetVector +from ..resources import fixture_validation +from .pipetting_common import ( + PipetteIdMixin, + MovementMixin, + DestinationPositionResult, +) +from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate + +if TYPE_CHECKING: + from ..execution import MovementHandler + from ..state import StateView + +MoveToAddressableAreaCommandType = Literal["moveToAddressableArea"] + + +class MoveToAddressableAreaParams(PipetteIdMixin, MovementMixin): + """Payload required to move a pipette to a specific addressable area. + + An *addressable area* is a space in the robot that may or may not be usable depending on how + the robot's deck is configured. For example, if a Flex is configured with a waste chute, it will + have additional addressable areas representing the opening of the waste chute, where tips and + labware can be dropped. + + This moves the pipette so all of its nozzles are centered over the addressable area. + If the pipette is currently configured with a partial tip layout, this centering is over all + the pipette's physical nozzles, not just the nozzles that are active. + + The z-position will be chosen to put the bottom of the tips---or the bottom of the nozzles, + if there are no tips---level with the top of the addressable area. + + When this command is executed, Protocol Engine will make sure the robot's deck is configured + such that the requested addressable area actually exists. For example, if you request + the addressable area B4, it will make sure the robot is set up with a B3/B4 staging area slot. + If that's not the case, the command will fail. + """ + + addressableAreaName: str = Field( + ..., + description=( + "The name of the addressable area that you want to use." + " Valid values are the `id`s of `addressableArea`s in the" + " [deck definition](https://github.com/Opentrons/opentrons/tree/edge/shared-data/deck)." + ), + ) + offset: AddressableOffsetVector = Field( + AddressableOffsetVector(x=0, y=0, z=0), + description="Relative offset of addressable area to move pipette's critical point.", + ) + stayAtHighestPossibleZ: bool = Field( + False, + description=( + "If `true`, the pipette will retract to its highest possible height" + " and stay there instead of descending to the destination." + " `minimumZHeight` will be ignored." + ), + ) + + +class MoveToAddressableAreaResult(DestinationPositionResult): + """Result data from the execution of a MoveToAddressableArea command.""" + + pass + + +class MoveToAddressableAreaImplementation( + AbstractCommandImpl[MoveToAddressableAreaParams, MoveToAddressableAreaResult] +): + """Move to addressable area command implementation.""" + + def __init__( + self, movement: MovementHandler, state_view: StateView, **kwargs: object + ) -> None: + self._movement = movement + self._state_view = state_view + + async def execute( + self, params: MoveToAddressableAreaParams + ) -> MoveToAddressableAreaResult: + """Move the requested pipette to the requested addressable area.""" + self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration( + params.addressableAreaName + ) + + if fixture_validation.is_staging_slot(params.addressableAreaName): + raise LocationNotAccessibleByPipetteError( + f"Cannot move pipette to staging slot {params.addressableAreaName}" + ) + + x, y, z = await self._movement.move_to_addressable_area( + pipette_id=params.pipetteId, + addressable_area_name=params.addressableAreaName, + offset=params.offset, + force_direct=params.forceDirect, + minimum_z_height=params.minimumZHeight, + speed=params.speed, + stay_at_highest_possible_z=params.stayAtHighestPossibleZ, + ) + + return MoveToAddressableAreaResult(position=DeckPoint(x=x, y=y, z=z)) + + +class MoveToAddressableArea( + BaseCommand[MoveToAddressableAreaParams, MoveToAddressableAreaResult] +): + """Move to addressable area command model.""" + + commandType: MoveToAddressableAreaCommandType = "moveToAddressableArea" + params: MoveToAddressableAreaParams + result: Optional[MoveToAddressableAreaResult] + + _ImplementationCls: Type[ + MoveToAddressableAreaImplementation + ] = MoveToAddressableAreaImplementation + + +class MoveToAddressableAreaCreate(BaseCommandCreate[MoveToAddressableAreaParams]): + """Move to addressable area command creation request model.""" + + commandType: MoveToAddressableAreaCommandType = "moveToAddressableArea" + params: MoveToAddressableAreaParams + + _CommandCls: Type[MoveToAddressableArea] = MoveToAddressableArea diff --git a/api/src/opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py b/api/src/opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py new file mode 100644 index 00000000000..dc79714c829 --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py @@ -0,0 +1,159 @@ +"""Move to addressable area for drop tip command request, result, and implementation models.""" +from __future__ import annotations +from pydantic import Field +from typing import TYPE_CHECKING, Optional, Type +from typing_extensions import Literal + +from ..errors import LocationNotAccessibleByPipetteError +from ..types import DeckPoint, AddressableOffsetVector +from ..resources import fixture_validation +from .pipetting_common import ( + PipetteIdMixin, + MovementMixin, + DestinationPositionResult, +) +from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate + +if TYPE_CHECKING: + from ..execution import MovementHandler + from ..state import StateView + +MoveToAddressableAreaForDropTipCommandType = Literal["moveToAddressableAreaForDropTip"] + + +class MoveToAddressableAreaForDropTipParams(PipetteIdMixin, MovementMixin): + """Payload required to move a pipette to a specific addressable area. + + An *addressable area* is a space in the robot that may or may not be usable depending on how + the robot's deck is configured. For example, if a Flex is configured with a waste chute, it will + have additional addressable areas representing the opening of the waste chute, where tips and + labware can be dropped. + + This moves the pipette so all of its nozzles are centered over the addressable area. + If the pipette is currently configured with a partial tip layout, this centering is over all + the pipette's physical nozzles, not just the nozzles that are active. + + The z-position will be chosen to put the bottom of the tips---or the bottom of the nozzles, + if there are no tips---level with the top of the addressable area. + + When this command is executed, Protocol Engine will make sure the robot's deck is configured + such that the requested addressable area actually exists. For example, if you request + the addressable area B4, it will make sure the robot is set up with a B3/B4 staging area slot. + If that's not the case, the command will fail. + """ + + addressableAreaName: str = Field( + ..., + description=( + "The name of the addressable area that you want to use." + " Valid values are the `id`s of `addressableArea`s in the" + " [deck definition](https://github.com/Opentrons/opentrons/tree/edge/shared-data/deck)." + ), + ) + offset: AddressableOffsetVector = Field( + AddressableOffsetVector(x=0, y=0, z=0), + description="Relative offset of addressable area to move pipette's critical point.", + ) + alternateDropLocation: Optional[bool] = Field( + False, + description=( + "Whether to alternate location where tip is dropped within the addressable area." + " If True, this command will ignore the offset provided and alternate" + " between dropping tips at two predetermined locations inside the specified" + " labware well." + " If False, the tip will be dropped at the top center of the area." + ), + ) + ignoreTipConfiguration: Optional[bool] = Field( + True, + description=( + "Whether to utilize the critical point of the tip configuraiton when moving to an addressable area." + " If True, this command will ignore the tip configuration and use the center of the entire instrument" + " as the critical point for movement." + " If False, this command will use the critical point provided by the current tip configuration." + ), + ) + + +class MoveToAddressableAreaForDropTipResult(DestinationPositionResult): + """Result data from the execution of a MoveToAddressableAreaForDropTip command.""" + + pass + + +class MoveToAddressableAreaForDropTipImplementation( + AbstractCommandImpl[ + MoveToAddressableAreaForDropTipParams, MoveToAddressableAreaForDropTipResult + ] +): + """Move to addressable area for drop tip command implementation.""" + + def __init__( + self, movement: MovementHandler, state_view: StateView, **kwargs: object + ) -> None: + self._movement = movement + self._state_view = state_view + + async def execute( + self, params: MoveToAddressableAreaForDropTipParams + ) -> MoveToAddressableAreaForDropTipResult: + """Move the requested pipette to the requested addressable area in preperation of a drop tip.""" + self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration( + params.addressableAreaName + ) + + if fixture_validation.is_staging_slot(params.addressableAreaName): + raise LocationNotAccessibleByPipetteError( + f"Cannot move pipette to staging slot {params.addressableAreaName}" + ) + + if params.alternateDropLocation: + offset = self._state_view.geometry.get_next_tip_drop_location_for_addressable_area( + addressable_area_name=params.addressableAreaName, + pipette_id=params.pipetteId, + ) + else: + offset = params.offset + + x, y, z = await self._movement.move_to_addressable_area( + pipette_id=params.pipetteId, + addressable_area_name=params.addressableAreaName, + offset=offset, + force_direct=params.forceDirect, + minimum_z_height=params.minimumZHeight, + speed=params.speed, + ignore_tip_configuration=params.ignoreTipConfiguration, + ) + + return MoveToAddressableAreaForDropTipResult(position=DeckPoint(x=x, y=y, z=z)) + + +class MoveToAddressableAreaForDropTip( + BaseCommand[ + MoveToAddressableAreaForDropTipParams, MoveToAddressableAreaForDropTipResult + ] +): + """Move to addressable area for drop tip command model.""" + + commandType: MoveToAddressableAreaForDropTipCommandType = ( + "moveToAddressableAreaForDropTip" + ) + params: MoveToAddressableAreaForDropTipParams + result: Optional[MoveToAddressableAreaForDropTipResult] + + _ImplementationCls: Type[ + MoveToAddressableAreaForDropTipImplementation + ] = MoveToAddressableAreaForDropTipImplementation + + +class MoveToAddressableAreaForDropTipCreate( + BaseCommandCreate[MoveToAddressableAreaForDropTipParams] +): + """Move to addressable area for drop tip command creation request model.""" + + commandType: MoveToAddressableAreaForDropTipCommandType = ( + "moveToAddressableAreaForDropTip" + ) + params: MoveToAddressableAreaForDropTipParams + + _CommandCls: Type[MoveToAddressableAreaForDropTip] = MoveToAddressableAreaForDropTip diff --git a/api/src/opentrons/protocol_engine/commands/pipetting_common.py b/api/src/opentrons/protocol_engine/commands/pipetting_common.py index a2dc1c8e5cd..2d165e4894a 100644 --- a/api/src/opentrons/protocol_engine/commands/pipetting_common.py +++ b/api/src/opentrons/protocol_engine/commands/pipetting_common.py @@ -14,14 +14,29 @@ class PipetteIdMixin(BaseModel): ) -class VolumeMixin(BaseModel): - """Mixin for command requests that take a volume of liquid.""" +class AspirateVolumeMixin(BaseModel): + """Mixin for the `volume` field of aspirate commands.""" volume: float = Field( ..., - description="Amount of liquid in uL. Must be greater than 0 and less " - "than a pipette-specific maximum volume.", - gt=0, + description="The amount of liquid to aspirate, in µL." + " Must not be greater than the remaining available amount, which depends on" + " the pipette (see `loadPipette`), its configuration (see `configureForVolume`)," + " the tip (see `pickUpTip`), and the amount you've aspirated so far." + " There is some tolerance for floating point rounding errors.", + ge=0, + ) + + +class DispenseVolumeMixin(BaseModel): + """Mixin for the `volume` field of dispense commands.""" + + volume: float = Field( + ..., + description="The amount of liquid to dispense, in µL." + " Must not be greater than the currently aspirated volume." + " There is some tolerance for floating point rounding errors.", + ge=0, ) @@ -88,7 +103,7 @@ class BaseLiquidHandlingResult(BaseModel): volume: float = Field( ..., description="Amount of liquid in uL handled in the operation.", - gt=0, + ge=0, ) diff --git a/api/src/opentrons/protocol_engine/commands/prepare_to_aspirate.py b/api/src/opentrons/protocol_engine/commands/prepare_to_aspirate.py new file mode 100644 index 00000000000..57fa679bb09 --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/prepare_to_aspirate.py @@ -0,0 +1,73 @@ +"""Prepare to aspirate command request, result, and implementation models.""" + +from __future__ import annotations +from pydantic import BaseModel +from typing import TYPE_CHECKING, Optional, Type +from typing_extensions import Literal + +from .pipetting_common import ( + PipetteIdMixin, +) +from .command import ( + AbstractCommandImpl, + BaseCommand, + BaseCommandCreate, +) + +if TYPE_CHECKING: + from ..execution.pipetting import PipettingHandler + +PrepareToAspirateCommandType = Literal["prepareToAspirate"] + + +class PrepareToAspirateParams(PipetteIdMixin): + """Parameters required to prepare a specific pipette for aspiration.""" + + pass + + +class PrepareToAspirateResult(BaseModel): + """Result data from execution of an PrepareToAspirate command.""" + + pass + + +class PrepareToAspirateImplementation( + AbstractCommandImpl[ + PrepareToAspirateParams, + PrepareToAspirateResult, + ] +): + """Prepare for aspirate command implementation.""" + + def __init__(self, pipetting: PipettingHandler, **kwargs: object) -> None: + self._pipetting_handler = pipetting + + async def execute(self, params: PrepareToAspirateParams) -> PrepareToAspirateResult: + """Prepare the pipette to aspirate.""" + await self._pipetting_handler.prepare_for_aspirate( + pipette_id=params.pipetteId, + ) + + return PrepareToAspirateResult() + + +class PrepareToAspirate(BaseCommand[PrepareToAspirateParams, PrepareToAspirateResult]): + """Prepare for aspirate command model.""" + + commandType: PrepareToAspirateCommandType = "prepareToAspirate" + params: PrepareToAspirateParams + result: Optional[PrepareToAspirateResult] + + _ImplementationCls: Type[ + PrepareToAspirateImplementation + ] = PrepareToAspirateImplementation + + +class PrepareToAspirateCreate(BaseCommandCreate[PrepareToAspirateParams]): + """Prepare for aspirate command creation request model.""" + + commandType: PrepareToAspirateCommandType = "prepareToAspirate" + params: PrepareToAspirateParams + + _CommandCls: Type[PrepareToAspirate] = PrepareToAspirate diff --git a/api/src/opentrons/protocol_engine/commands/save_position.py b/api/src/opentrons/protocol_engine/commands/save_position.py index 5e38b902058..a45937a73e8 100644 --- a/api/src/opentrons/protocol_engine/commands/save_position.py +++ b/api/src/opentrons/protocol_engine/commands/save_position.py @@ -26,6 +26,9 @@ class SavePositionParams(BaseModel): description="An optional ID to assign to this command instance. " "Auto-assigned if not defined.", ) + failOnNotHomed: Optional[bool] = Field( + True, descrption="Require all axes to be homed before saving position." + ) class SavePositionResult(BaseModel): @@ -58,8 +61,11 @@ def __init__( async def execute(self, params: SavePositionParams) -> SavePositionResult: """Check the requested pipette's current position.""" position_id = self._model_utils.ensure_id(params.positionId) + fail_on_not_homed = ( + params.failOnNotHomed if params.failOnNotHomed is not None else True + ) x, y, z = await self._gantry_mover.get_position( - pipette_id=params.pipetteId, fail_on_not_homed=True + pipette_id=params.pipetteId, fail_on_not_homed=fail_on_not_homed ) return SavePositionResult( diff --git a/api/src/opentrons/protocol_engine/commands/verify_tip_presence.py b/api/src/opentrons/protocol_engine/commands/verify_tip_presence.py new file mode 100644 index 00000000000..1d56c8e66bf --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/verify_tip_presence.py @@ -0,0 +1,77 @@ +"""Verify tip presence command request, result and implementation models.""" +from __future__ import annotations + +from pydantic import Field, BaseModel +from typing import TYPE_CHECKING, Optional, Type +from typing_extensions import Literal + +from .pipetting_common import PipetteIdMixin +from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate + +from ..types import TipPresenceStatus + +if TYPE_CHECKING: + from ..execution import TipHandler + + +VerifyTipPresenceCommandType = Literal["verifyTipPresence"] + + +class VerifyTipPresenceParams(PipetteIdMixin): + """Payload required for a VerifyTipPresence command.""" + + expectedState: TipPresenceStatus = Field( + ..., description="The expected tip presence status on the pipette." + ) + + +class VerifyTipPresenceResult(BaseModel): + """Result data from the execution of a VerifyTipPresence command.""" + + pass + + +class VerifyTipPresenceImplementation( + AbstractCommandImpl[VerifyTipPresenceParams, VerifyTipPresenceResult] +): + """VerifyTipPresence command implementation.""" + + def __init__( + self, + tip_handler: TipHandler, + **kwargs: object, + ) -> None: + self._tip_handler = tip_handler + + async def execute(self, params: VerifyTipPresenceParams) -> VerifyTipPresenceResult: + """Verify if tip presence is as expected for the requested pipette.""" + pipette_id = params.pipetteId + expected_state = params.expectedState + + await self._tip_handler.verify_tip_presence( + pipette_id=pipette_id, + expected=expected_state, + ) + + return VerifyTipPresenceResult() + + +class VerifyTipPresence(BaseCommand[VerifyTipPresenceParams, VerifyTipPresenceResult]): + """VerifyTipPresence command model.""" + + commandType: VerifyTipPresenceCommandType = "verifyTipPresence" + params: VerifyTipPresenceParams + result: Optional[VerifyTipPresenceResult] + + _ImplementationCls: Type[ + VerifyTipPresenceImplementation + ] = VerifyTipPresenceImplementation + + +class VerifyTipPresenceCreate(BaseCommandCreate[VerifyTipPresenceParams]): + """VerifyTipPresence command creation request model.""" + + commandType: VerifyTipPresenceCommandType = "verifyTipPresence" + params: VerifyTipPresenceParams + + _CommandCls: Type[VerifyTipPresence] = VerifyTipPresence diff --git a/api/src/opentrons/protocol_engine/create_protocol_engine.py b/api/src/opentrons/protocol_engine/create_protocol_engine.py index 5139b9b5eba..39268f28bc7 100644 --- a/api/src/opentrons/protocol_engine/create_protocol_engine.py +++ b/api/src/opentrons/protocol_engine/create_protocol_engine.py @@ -10,7 +10,7 @@ from .protocol_engine import ProtocolEngine from .resources import DeckDataProvider, ModuleDataProvider from .state import Config, StateStore -from .types import PostRunHardwareState +from .types import PostRunHardwareState, DeckConfigurationType # TODO(mm, 2023-06-16): Arguably, this not being a context manager makes us prone to forgetting to @@ -18,16 +18,24 @@ async def create_protocol_engine( hardware_api: HardwareControlAPI, config: Config, + load_fixed_trash: bool = False, + deck_configuration: typing.Optional[DeckConfigurationType] = None, ) -> ProtocolEngine: """Create a ProtocolEngine instance. Arguments: hardware_api: Hardware control API to pass down to dependencies. config: ProtocolEngine configuration. + load_fixed_trash: Automatically load fixed trash labware in engine. + deck_configuration: The initial deck configuration the engine will be instantiated with. """ deck_data = DeckDataProvider(config.deck_type) deck_definition = await deck_data.get_deck_definition() - deck_fixed_labware = await deck_data.get_deck_fixed_labware(deck_definition) + deck_fixed_labware = ( + await deck_data.get_deck_fixed_labware(deck_definition) + if load_fixed_trash + else [] + ) module_calibration_offsets = ModuleDataProvider.load_module_calibrations() state_store = StateStore( @@ -36,6 +44,7 @@ async def create_protocol_engine( deck_fixed_labware=deck_fixed_labware, is_door_open=hardware_api.door_state is DoorState.OPEN, module_calibration_offsets=module_calibration_offsets, + deck_configuration=deck_configuration, ) return ProtocolEngine(state_store=state_store, hardware_api=hardware_api) @@ -47,6 +56,7 @@ def create_protocol_engine_in_thread( config: Config, drop_tips_after_run: bool, post_run_hardware_state: PostRunHardwareState, + load_fixed_trash: bool = False, ) -> typing.Generator[ typing.Tuple[ProtocolEngine, asyncio.AbstractEventLoop], None, None ]: @@ -69,7 +79,11 @@ def create_protocol_engine_in_thread( """ with async_context_manager_in_thread( _protocol_engine( - hardware_api, config, drop_tips_after_run, post_run_hardware_state + hardware_api, + config, + drop_tips_after_run, + post_run_hardware_state, + load_fixed_trash, ) ) as ( protocol_engine, @@ -84,12 +98,17 @@ async def _protocol_engine( config: Config, drop_tips_after_run: bool, post_run_hardware_state: PostRunHardwareState, + load_fixed_trash: bool = False, ) -> typing.AsyncGenerator[ProtocolEngine, None]: protocol_engine = await create_protocol_engine( hardware_api=hardware_api, config=config, + load_fixed_trash=load_fixed_trash, ) try: + # TODO(mm, 2023-11-21): Callers like opentrons.execute need to be able to pass in + # the deck_configuration argument to ProtocolEngine.play(). + # https://opentrons.atlassian.net/browse/RSS-400 protocol_engine.play() yield protocol_engine finally: diff --git a/api/src/opentrons/protocol_engine/errors/__init__.py b/api/src/opentrons/protocol_engine/errors/__init__.py index 0cea7ce7943..d3c3bb6d79e 100644 --- a/api/src/opentrons/protocol_engine/errors/__init__.py +++ b/api/src/opentrons/protocol_engine/errors/__init__.py @@ -5,6 +5,8 @@ UnexpectedProtocolError, FailedToLoadPipetteError, PipetteNotAttachedError, + InvalidSpecificationForRobotTypeError, + InvalidLoadPipetteSpecsError, TipNotAttachedError, TipAttachedError, CommandDoesNotExistError, @@ -27,6 +29,12 @@ ModuleNotOnDeckError, ModuleNotConnectedError, SlotDoesNotExistError, + CutoutDoesNotExistError, + FixtureDoesNotExistError, + AddressableAreaDoesNotExistError, + FixtureDoesNotProvideAreasError, + AreaNotInDeckConfigurationError, + IncompatibleAddressableAreaError, FailedToPlanMoveError, MustHomeError, RunStoppedError, @@ -53,6 +61,8 @@ LabwareMovementNotAllowedError, LabwareIsNotAllowedInLocationError, LocationIsOccupiedError, + LocationNotAccessibleByPipetteError, + LocationIsStagingSlotError, InvalidAxisForRobotType, NotSupportedOnRobotType, ) @@ -65,6 +75,8 @@ "UnexpectedProtocolError", "FailedToLoadPipetteError", "PipetteNotAttachedError", + "InvalidSpecificationForRobotTypeError", + "InvalidLoadPipetteSpecsError", "TipNotAttachedError", "TipAttachedError", "CommandDoesNotExistError", @@ -87,6 +99,12 @@ "ModuleNotOnDeckError", "ModuleNotConnectedError", "SlotDoesNotExistError", + "CutoutDoesNotExistError", + "FixtureDoesNotExistError", + "AddressableAreaDoesNotExistError", + "FixtureDoesNotProvideAreasError", + "AreaNotInDeckConfigurationError", + "IncompatibleAddressableAreaError", "FailedToPlanMoveError", "MustHomeError", "RunStoppedError", @@ -114,8 +132,11 @@ "LabwareMovementNotAllowedError", "LabwareIsNotAllowedInLocationError", "LocationIsOccupiedError", + "LocationNotAccessibleByPipetteError", + "LocationIsStagingSlotError", "InvalidAxisForRobotType", "NotSupportedOnRobotType", # error occurrence models "ErrorOccurrence", + "FailedGripperPickupError", ] diff --git a/api/src/opentrons/protocol_engine/errors/error_occurrence.py b/api/src/opentrons/protocol_engine/errors/error_occurrence.py index 12f1289f4f0..570948943ee 100644 --- a/api/src/opentrons/protocol_engine/errors/error_occurrence.py +++ b/api/src/opentrons/protocol_engine/errors/error_occurrence.py @@ -24,6 +24,12 @@ def from_failed( error: Union[ProtocolEngineError, EnumeratedError], ) -> "ErrorOccurrence": """Build an ErrorOccurrence from the details available from a FailedAction or FinishAction.""" + if isinstance(error, ProtocolCommandFailedError) and error.original_error: + wrappedErrors = [error.original_error] + else: + wrappedErrors = [ + cls.from_failed(id, createdAt, err) for err in error.wrapping + ] return cls.construct( id=id, createdAt=createdAt, @@ -31,9 +37,7 @@ def from_failed( detail=error.message or str(error), errorInfo=error.detail, errorCode=error.code.value.code, - wrappedErrors=[ - cls.from_failed(id, createdAt, err) for err in error.wrapping - ], + wrappedErrors=wrappedErrors, ) id: str = Field(..., description="Unique identifier of this error occurrence.") diff --git a/api/src/opentrons/protocol_engine/errors/exceptions.py b/api/src/opentrons/protocol_engine/errors/exceptions.py index 3464e0b6960..9d9ff99b33e 100644 --- a/api/src/opentrons/protocol_engine/errors/exceptions.py +++ b/api/src/opentrons/protocol_engine/errors/exceptions.py @@ -93,6 +93,32 @@ def __init__( super().__init__(ErrorCodes.PIPETTE_NOT_PRESENT, message, details, wrapping) +class InvalidLoadPipetteSpecsError(ProtocolEngineError): + """Raised when a loadPipette uses invalid specifications.""" + + def __init__( + self, + message: Optional[str] = None, + details: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build an InvalidLoadPipetteSpecsError.""" + super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + + +class InvalidSpecificationForRobotTypeError(ProtocolEngineError): + """Raised when a command provides invalid specs for the given robot type.""" + + def __init__( + self, + message: Optional[str] = None, + details: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build an InvalidSpecificationForRobotTypeError.""" + super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + + class TipNotAttachedError(ProtocolEngineError): """Raised when an operation's required pipette tip is not attached.""" @@ -373,6 +399,84 @@ def __init__( super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) +class CutoutDoesNotExistError(ProtocolEngineError): + """Raised when referencing a cutout that does not exist.""" + + def __init__( + self, + message: Optional[str] = None, + details: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build a CutoutDoesNotExistError.""" + super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + + +class FixtureDoesNotExistError(ProtocolEngineError): + """Raised when referencing a cutout fixture that does not exist.""" + + def __init__( + self, + message: Optional[str] = None, + details: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build a FixtureDoesNotExist.""" + super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + + +class AddressableAreaDoesNotExistError(ProtocolEngineError): + """Raised when referencing an addressable area that does not exist.""" + + def __init__( + self, + message: Optional[str] = None, + details: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build a AddressableAreaDoesNotExistError.""" + super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + + +class FixtureDoesNotProvideAreasError(ProtocolEngineError): + """Raised when a cutout fixture does not provide any addressable areas for a requested cutout.""" + + def __init__( + self, + message: Optional[str] = None, + details: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build a FixtureDoesNotProvideAreasError.""" + super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + + +class AreaNotInDeckConfigurationError(ProtocolEngineError): + """Raised when an addressable area is referenced that is not provided by a deck configuration.""" + + def __init__( + self, + message: Optional[str] = None, + details: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build a AreaNotInDeckConfigurationError.""" + super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + + +class IncompatibleAddressableAreaError(ProtocolEngineError): + """Raised when two non-compatible addressable areas are referenced during analysis.""" + + def __init__( + self, + message: Optional[str] = None, + details: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build a IncompatibleAddressableAreaError.""" + super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + + # TODO(mc, 2020-11-06): flesh out with structured data to replicate # existing LabwareHeightError class FailedToPlanMoveError(ProtocolEngineError): @@ -398,7 +502,7 @@ def __init__( wrapping: Optional[Sequence[EnumeratedError]] = None, ) -> None: """Build a MustHomeError.""" - super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + super().__init__(ErrorCodes.POSITION_UNKNOWN, message, details, wrapping) class SetupCommandNotAllowedError(ProtocolEngineError): @@ -728,6 +832,32 @@ def __init__( super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) +class LocationNotAccessibleByPipetteError(ProtocolEngineError): + """Raised when attempting to move pipette to an inaccessible location.""" + + def __init__( + self, + message: Optional[str] = None, + details: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build a LocationNotAccessibleByPipetteError.""" + super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + + +class LocationIsStagingSlotError(ProtocolEngineError): + """Raised when referencing a labware on a staging slot when trying to get standard deck slot.""" + + def __init__( + self, + message: Optional[str] = None, + details: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build a LocationIsStagingSlotError.""" + super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + + class FirmwareUpdateRequired(ProtocolEngineError): """Raised when the firmware needs to be updated.""" @@ -738,7 +868,9 @@ def __init__( wrapping: Optional[Sequence[EnumeratedError]] = None, ) -> None: """Build a LocationIsOccupiedError.""" - super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + super().__init__( + ErrorCodes.FIRMWARE_UPDATE_REQUIRED, message, details, wrapping + ) class PipetteNotReadyToAspirateError(ProtocolEngineError): @@ -754,21 +886,33 @@ def __init__( super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) -class InvalidPipettingVolumeError(ProtocolEngineError): +class InvalidAspirateVolumeError(ProtocolEngineError): """Raised when pipetting a volume larger than the pipette volume.""" def __init__( self, - message: Optional[str] = None, - details: Optional[Dict[str, Any]] = None, + attempted_aspirate_volume: float, + available_volume: float, + max_pipette_volume: float, + max_tip_volume: Optional[float], # None if there's no tip. wrapping: Optional[Sequence[EnumeratedError]] = None, ) -> None: """Build a InvalidPipettingVolumeError.""" + message = ( + f"Cannot aspirate {attempted_aspirate_volume} µL when only" + f" {available_volume} is available." + ) + details = { + "attempted_aspirate_volume": attempted_aspirate_volume, + "available_volume": available_volume, + "max_pipette_volume": max_pipette_volume, + "max_tip_volume": max_tip_volume, + } super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) -class InvalidPushOutVolumeError(ProtocolEngineError): - """Raised when attempting to use an invalid volume for dispense push_out.""" +class InvalidDispenseVolumeError(ProtocolEngineError): + """Raised when attempting to dispense a volume that was not aspirated.""" def __init__( self, @@ -776,12 +920,12 @@ def __init__( details: Optional[Dict[str, Any]] = None, wrapping: Optional[Sequence[EnumeratedError]] = None, ) -> None: - """Build a InvalidPushOutVolumeError.""" + """Build a InvalidDispenseVolumeError.""" super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) -class InvalidDispenseVolumeError(ProtocolEngineError): - """Raised when attempting to dispense a volume that was not aspirated.""" +class InvalidPushOutVolumeError(ProtocolEngineError): + """Raised when attempting to use an invalid volume for dispense push_out.""" def __init__( self, @@ -789,7 +933,7 @@ def __init__( details: Optional[Dict[str, Any]] = None, wrapping: Optional[Sequence[EnumeratedError]] = None, ) -> None: - """Build a InvalidDispenseVolumeError.""" + """Build a InvalidPushOutVolumeError.""" super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) diff --git a/api/src/opentrons/protocol_engine/execution/command_executor.py b/api/src/opentrons/protocol_engine/execution/command_executor.py index 828d060b9d3..7334d96e170 100644 --- a/api/src/opentrons/protocol_engine/execution/command_executor.py +++ b/api/src/opentrons/protocol_engine/execution/command_executor.py @@ -13,7 +13,12 @@ from ..state import StateStore from ..resources import ModelUtils -from ..commands import CommandStatus, AbstractCommandImpl +from ..commands import ( + CommandStatus, + AbstractCommandImpl, + CommandResult, + CommandPrivateResult, +) from ..actions import ActionDispatcher, UpdateCommandAction, FailCommandAction from ..errors import RunStoppedError from ..errors.exceptions import EStopActivatedError as PE_EStopActivatedError @@ -108,8 +113,8 @@ async def execute(self, command_id: str) -> None: f"Executing {command.id}, {command.commandType}, {command.params}" ) if isinstance(command_impl, AbstractCommandImpl): - result = await command_impl.execute(command.params) # type: ignore[arg-type] - private_result = None + result: CommandResult = await command_impl.execute(command.params) # type: ignore[arg-type] + private_result: Optional[CommandPrivateResult] = None else: result, private_result = await command_impl.execute(command.params) # type: ignore[arg-type] diff --git a/api/src/opentrons/protocol_engine/execution/equipment.py b/api/src/opentrons/protocol_engine/execution/equipment.py index d15e2ec7e17..c1ac272a64d 100644 --- a/api/src/opentrons/protocol_engine/execution/equipment.py +++ b/api/src/opentrons/protocol_engine/execution/equipment.py @@ -15,6 +15,7 @@ TempDeck, Thermocycler, ) +from opentrons.hardware_control.nozzle_manager import NozzleMap from opentrons.protocol_engine.state.module_substates import ( MagneticModuleId, HeaterShakerModuleId, @@ -275,10 +276,6 @@ async def load_magnetic_block( model ), f"Expected Magnetic block and got {model.name}" definition = self._module_data_provider.get_definition(model) - # when loading a hardware module select_hardware_module_to_load - # will ensure a module of a different type is not loaded at the same slot. - # this is for non-connected modules. - self._state_store.modules.raise_if_module_in_location(location=location) return LoadedModuleData( module_id=self._model_utils.ensure_id(module_id), serial_number=None, @@ -387,6 +384,55 @@ async def configure_for_volume( static_config=static_pipette_config, ) + async def configure_nozzle_layout( + self, + pipette_id: str, + primary_nozzle: Optional[str] = None, + front_right_nozzle: Optional[str] = None, + back_left_nozzle: Optional[str] = None, + ) -> Optional[NozzleMap]: + """Ensure the requested nozzle layout is compatible with the current pipette. + + Args: + pipette_id: The identifier for the pipette. + primary_nozzle: The nozzle which will be used as the + front_right_nozzle + back_left_nozzle + + Returns: + A NozzleMap object or None. + """ + use_virtual_pipettes = self._state_store.config.use_virtual_pipettes + + if not use_virtual_pipettes: + mount = self._state_store.pipettes.get_mount(pipette_id).to_hw_mount() + + await self._hardware_api.update_nozzle_configuration_for_mount( + mount, + back_left_nozzle if back_left_nozzle else primary_nozzle, + front_right_nozzle if front_right_nozzle else primary_nozzle, + primary_nozzle if back_left_nozzle else None, + ) + pipette_dict = self._hardware_api.get_attached_instrument(mount) + nozzle_map = pipette_dict["current_nozzle_map"] + + else: + model = self._state_store.pipettes.get_model_name(pipette_id) + self._virtual_pipette_data_provider.configure_virtual_pipette_nozzle_layout( + pipette_id, + model, + back_left_nozzle if back_left_nozzle else primary_nozzle, + front_right_nozzle if front_right_nozzle else primary_nozzle, + primary_nozzle if back_left_nozzle else None, + ) + nozzle_map = ( + self._virtual_pipette_data_provider.get_nozzle_layout_for_pipette( + pipette_id + ) + ) + + return nozzle_map + @overload def get_module_hardware_api( self, diff --git a/api/src/opentrons/protocol_engine/execution/gantry_mover.py b/api/src/opentrons/protocol_engine/execution/gantry_mover.py index cca93b8be63..7e05c8db247 100644 --- a/api/src/opentrons/protocol_engine/execution/gantry_mover.py +++ b/api/src/opentrons/protocol_engine/execution/gantry_mover.py @@ -6,7 +6,7 @@ from opentrons.hardware_control import HardwareControlAPI from opentrons.hardware_control.types import Axis as HardwareAxis -from opentrons.hardware_control.errors import MustHomeError as HardwareMustHomeError +from opentrons_shared_data.errors.exceptions import PositionUnknownError from opentrons.motion_planning import Waypoint @@ -75,6 +75,11 @@ async def home(self, axes: Optional[List[MotorAxis]]) -> None: async def retract_axis(self, axis: MotorAxis) -> None: """Retract the specified axis to its home position.""" + ... + + async def prepare_for_mount_movement(self, mount: Mount) -> None: + """Retract the 'idle' mount if necessary.""" + ... class HardwareGantryMover(GantryMover): @@ -95,11 +100,11 @@ async def get_position( Args: pipette_id: Pipette ID to get location data for. current_well: Optional parameter for getting pipette location data, effects critical point. - fail_on_not_homed: Raise HardwareMustHomeError if gantry position is not known. + fail_on_not_homed: Raise PositionUnknownError if gantry position is not known. """ pipette_location = self._state_view.motion.get_pipette_location( pipette_id=pipette_id, - current_well=current_well, + current_location=current_well, ) try: return await self._hardware_api.gantry_position( @@ -107,8 +112,8 @@ async def get_position( critical_point=pipette_location.critical_point, fail_on_not_homed=fail_on_not_homed, ) - except HardwareMustHomeError as e: - raise MustHomeError(str(e)) from e + except PositionUnknownError as e: + raise MustHomeError(message=str(e), wrapping=[e]) def get_max_travel_z(self, pipette_id: str) -> float: """Get the maximum allowed z-height for pipette movement. @@ -167,8 +172,8 @@ async def move_relative( critical_point=critical_point, fail_on_not_homed=True, ) - except HardwareMustHomeError as e: - raise MustHomeError(str(e)) from e + except PositionUnknownError as e: + raise MustHomeError(message=str(e), wrapping=[e]) return point @@ -211,6 +216,10 @@ async def retract_axis(self, axis: MotorAxis) -> None: ) await self._hardware_api.retract_axis(axis=hardware_axis) + async def prepare_for_mount_movement(self, mount: Mount) -> None: + """Retract the 'idle' mount if necessary.""" + await self._hardware_api.prepare_for_mount_movement(mount) + class VirtualGantryMover(GantryMover): """State store based gantry movement handler for simulation/analysis.""" @@ -286,6 +295,10 @@ async def retract_axis(self, axis: MotorAxis) -> None: """Retract the specified axis. No-op in virtual implementation.""" pass + async def prepare_for_mount_movement(self, mount: Mount) -> None: + """Retract the 'idle' mount if necessary.""" + pass + def create_gantry_mover( state_view: StateView, hardware_api: HardwareControlAPI diff --git a/api/src/opentrons/protocol_engine/execution/hardware_stopper.py b/api/src/opentrons/protocol_engine/execution/hardware_stopper.py index 11f753b0ee4..28eacd7525b 100644 --- a/api/src/opentrons/protocol_engine/execution/hardware_stopper.py +++ b/api/src/opentrons/protocol_engine/execution/hardware_stopper.py @@ -15,6 +15,8 @@ from .tip_handler import TipHandler, HardwareTipHandler from ...hardware_control.types import OT3Mount +from opentrons.protocol_engine.types import AddressableOffsetVector + log = logging.getLogger(__name__) # TODO(mc, 2022-03-07): this constant dup'd from opentrons.protocols.geometry.deck @@ -48,44 +50,68 @@ def __init__( state_view=state_store, ) + async def _home_everything_except_plungers(self) -> None: + # TODO: Update this once gripper MotorAxis is available in engine. + try: + ot3api = ensure_ot3_hardware(hardware_api=self._hardware_api) + if ( + not self._state_store.config.use_virtual_gripper + and ot3api.has_gripper() + ): + await ot3api.home_z(mount=OT3Mount.GRIPPER) + except HardwareNotSupportedError: + pass + await self._movement_handler.home( + axes=[MotorAxis.X, MotorAxis.Y, MotorAxis.LEFT_Z, MotorAxis.RIGHT_Z] + ) + async def _drop_tip(self) -> None: """Drop currently attached tip, if any, into trash after a run cancel.""" attached_tips = self._state_store.pipettes.get_all_attached_tips() if attached_tips: await self._hardware_api.stop(home_after=False) - # TODO: Update this once gripper MotorAxis is available in engine. - try: - ot3api = ensure_ot3_hardware(hardware_api=self._hardware_api) - if ( - not self._state_store.config.use_virtual_gripper - and ot3api.has_gripper() - ): - await ot3api.home_z(mount=OT3Mount.GRIPPER) - except HardwareNotSupportedError: - pass - await self._movement_handler.home( - axes=[MotorAxis.X, MotorAxis.Y, MotorAxis.LEFT_Z, MotorAxis.RIGHT_Z] - ) - - for pipette_id, tip in attached_tips: - try: - await self._tip_handler.add_tip(pipette_id=pipette_id, tip=tip) - # TODO: Add ability to drop tip onto custom trash as well. - await self._movement_handler.move_to_well( - pipette_id=pipette_id, - labware_id=FIXED_TRASH_ID, - well_name="A1", - ) - await self._tip_handler.drop_tip( - pipette_id=pipette_id, - home_after=False, - ) - - except HwPipetteNotAttachedError: - # this will happen normally during protocol analysis, but - # should not happen during an actual run - log.debug(f"Pipette ID {pipette_id} no longer attached.") + + await self._home_everything_except_plungers() + + for pipette_id, tip in attached_tips: + try: + if self._state_store.labware.get_fixed_trash_id() == FIXED_TRASH_ID: + # OT-2 and Flex 2.15 protocols will default to the Fixed Trash Labware + await self._tip_handler.add_tip(pipette_id=pipette_id, tip=tip) + await self._movement_handler.move_to_well( + pipette_id=pipette_id, + labware_id=FIXED_TRASH_ID, + well_name="A1", + ) + await self._tip_handler.drop_tip( + pipette_id=pipette_id, + home_after=False, + ) + elif self._state_store.config.robot_type == "OT-2 Standard": + # API 2.16 and above OT2 protocols use addressable areas + await self._tip_handler.add_tip(pipette_id=pipette_id, tip=tip) + await self._movement_handler.move_to_addressable_area( + pipette_id=pipette_id, + addressable_area_name="fixedTrash", + offset=AddressableOffsetVector(x=0, y=0, z=0), + force_direct=False, + speed=None, + minimum_z_height=None, + ) + await self._tip_handler.drop_tip( + pipette_id=pipette_id, + home_after=False, + ) + else: + log.debug( + "Flex Protocols API Version 2.16 and beyond do not support automatic tip dropping at this time." + ) + + except HwPipetteNotAttachedError: + # this will happen normally during protocol analysis, but + # should not happen during an actual run + log.debug(f"Pipette ID {pipette_id} no longer attached.") async def do_halt(self, disengage_before_stopping: bool = False) -> None: """Issue a halt signal to the hardware API. @@ -102,12 +128,15 @@ async def do_stop_and_recover( post_run_hardware_state: PostRunHardwareState, drop_tips_after_run: bool = False, ) -> None: - """Stop and reset the HardwareAPI, optionally dropping tips and homing.""" - if drop_tips_after_run: - await self._drop_tip() - + """Stop and reset the HardwareAPI, homing and dropping tips independently if specified.""" home_after_stop = post_run_hardware_state in ( PostRunHardwareState.HOME_AND_STAY_ENGAGED, PostRunHardwareState.HOME_THEN_DISENGAGE, ) - await self._hardware_api.stop(home_after=home_after_stop) + if drop_tips_after_run: + await self._drop_tip() + await self._hardware_api.stop(home_after=home_after_stop) + else: + await self._hardware_api.stop(home_after=False) + if home_after_stop: + await self._home_everything_except_plungers() diff --git a/api/src/opentrons/protocol_engine/execution/labware_movement.py b/api/src/opentrons/protocol_engine/execution/labware_movement.py index d3c4fb3619c..3cdd78b8808 100644 --- a/api/src/opentrons/protocol_engine/execution/labware_movement.py +++ b/api/src/opentrons/protocol_engine/execution/labware_movement.py @@ -3,6 +3,8 @@ from typing import Optional, TYPE_CHECKING +from opentrons.types import Point + from opentrons.hardware_control import HardwareControlAPI from opentrons.hardware_control.types import OT3Mount, Axis from opentrons.motion_planning import get_gripper_labware_movement_waypoints @@ -32,6 +34,8 @@ if TYPE_CHECKING: from opentrons.protocol_engine.execution import EquipmentHandler, MovementHandler +_GRIPPER_HOMED_POSITION_Z = 166.125 # Height of the center of the gripper critical point from the deck when homed + # TODO (spp, 2022-10-20): name this GripperMovementHandler if it doesn't handle # any non-gripper implementations @@ -83,11 +87,20 @@ async def move_labware_with_gripper( current_location: OnDeckLabwareLocation, new_location: OnDeckLabwareLocation, user_offset_data: LabwareMovementOffsetData, + post_drop_slide_offset: Optional[Point], ) -> None: """Move a loaded labware from one location to another using gripper.""" use_virtual_gripper = self._state_store.config.use_virtual_gripper + if use_virtual_gripper: + # During Analysis we will pass in hard coded estimates for certain positions only accessible during execution + self._state_store.geometry.check_gripper_labware_tip_collision( + gripper_homed_position_z=_GRIPPER_HOMED_POSITION_Z, + labware_id=labware_id, + current_location=current_location, + ) return + ot3api = ensure_ot3_hardware( hardware_api=self._hardware_api, error_msg="Gripper is only available on Opentrons Flex", @@ -97,7 +110,7 @@ async def move_labware_with_gripper( raise GripperNotAttachedError( "No gripper found for performing labware movements." ) - if not ot3api._gripper_handler.is_ready_for_jaw_home(): + if not ot3api.gripper_jaw_can_home(): raise CannotPerformGripperAction( "Cannot pick up labware when gripper is already gripping." ) @@ -108,6 +121,13 @@ async def move_labware_with_gripper( await ot3api.home(axes=[Axis.Z_L, Axis.Z_R, Axis.Z_G]) gripper_homed_position = await ot3api.gantry_position(mount=gripper_mount) + # Verify that no tip collisions will occur during the move + self._state_store.geometry.check_gripper_labware_tip_collision( + gripper_homed_position_z=gripper_homed_position.z, + labware_id=labware_id, + current_location=current_location, + ) + async with self._thermocycler_plate_lifter.lift_plate_for_labware_movement( labware_location=current_location ): @@ -129,14 +149,43 @@ async def move_labware_with_gripper( to_labware_center=to_labware_center, gripper_home_z=gripper_homed_position.z, offset_data=final_offsets, + post_drop_slide_offset=post_drop_slide_offset, ) labware_grip_force = self._state_store.labware.get_grip_force(labware_id) - + holding_labware = False for waypoint_data in movement_waypoints: if waypoint_data.jaw_open: + if waypoint_data.dropping: + # This `disengage_axes` step is important in order to engage + # the electronic brake on the Z axis of the gripper. The brake + # has a stronger holding force on the axis than the hold current, + # and prevents the axis from spuriously dropping when e.g. the notch + # on the side of a falling tiprack catches the jaw. + await ot3api.disengage_axes([Axis.Z_G]) await ot3api.ungrip() + holding_labware = True + if waypoint_data.dropping: + # We lost the position estimation after disengaging the axis, so + # it is necessary to home it next + await ot3api.home_z(OT3Mount.GRIPPER) else: await ot3api.grip(force_newtons=labware_grip_force) + # we only want to check position after the gripper has opened and + # should be holding labware + if holding_labware: + labware_bbox = self._state_store.labware.get_dimensions( + labware_id + ) + well_bbox = self._state_store.labware.get_well_bbox(labware_id) + ot3api.raise_error_if_gripper_pickup_failed( + expected_grip_width=labware_bbox.y, + grip_width_uncertainty_wider=abs( + max(well_bbox.y - labware_bbox.y, 0) + ), + grip_width_uncertainty_narrower=abs( + min(well_bbox.y - labware_bbox.y, 0) + ), + ) await ot3api.move_to( mount=gripper_mount, abs_position=waypoint_data.position ) diff --git a/api/src/opentrons/protocol_engine/execution/movement.py b/api/src/opentrons/protocol_engine/execution/movement.py index b24e6eece64..451f482ad0d 100644 --- a/api/src/opentrons/protocol_engine/execution/movement.py +++ b/api/src/opentrons/protocol_engine/execution/movement.py @@ -6,7 +6,7 @@ from opentrons.types import Point, MountType from opentrons.hardware_control import HardwareControlAPI -from opentrons.hardware_control.errors import MustHomeError +from opentrons_shared_data.errors.exceptions import PositionUnknownError from ..types import ( WellLocation, @@ -14,6 +14,7 @@ MovementAxis, MotorAxis, CurrentWell, + AddressableOffsetVector, ) from ..state import StateStore from ..resources import ModelUtils @@ -72,6 +73,10 @@ async def move_to_well( speed: Optional[float] = None, ) -> Point: """Move to a specific well.""" + self._state_store.labware.raise_if_labware_inaccessible_by_pipette( + labware_id=labware_id + ) + self._state_store.labware.raise_if_labware_has_labware_on_top( labware_id=labware_id ) @@ -102,10 +107,13 @@ async def move_to_well( # get the pipette's mount and current critical point, if applicable pipette_location = self._state_store.motion.get_pipette_location( pipette_id=pipette_id, - current_well=current_well, + current_location=current_well, ) origin_cp = pipette_location.critical_point + await self._gantry_mover.prepare_for_mount_movement( + pipette_location.mount.to_hw_mount() + ) origin = await self._gantry_mover.get_position(pipette_id=pipette_id) max_travel_z = self._gantry_mover.get_max_travel_z(pipette_id=pipette_id) @@ -133,6 +141,78 @@ async def move_to_well( return final_point + async def move_to_addressable_area( + self, + pipette_id: str, + addressable_area_name: str, + offset: AddressableOffsetVector, + force_direct: bool = False, + minimum_z_height: Optional[float] = None, + speed: Optional[float] = None, + stay_at_highest_possible_z: bool = False, + ignore_tip_configuration: Optional[bool] = True, + ) -> Point: + """Move to a specific addressable area.""" + # Check for presence of heater shakers on deck, and if planned + # pipette movement is allowed + hs_movement_restrictors = ( + self._state_store.modules.get_heater_shaker_movement_restrictors() + ) + + dest_slot_int = ( + self._state_store.addressable_areas.get_addressable_area_base_slot( + addressable_area_name + ).as_int() + ) + + self._hs_movement_flagger.raise_if_movement_restricted( + hs_movement_restrictors=hs_movement_restrictors, + destination_slot=dest_slot_int, + is_multi_channel=( + self._state_store.tips.get_pipette_channels(pipette_id) > 1 + ), + destination_is_tip_rack=False, + ) + + # TODO(jbl 11-28-2023) check if addressable area is a deck slot, and if it is check if there are no labware + # or modules on top. + + # get the pipette's mount and current critical point, if applicable + pipette_location = self._state_store.motion.get_pipette_location( + pipette_id=pipette_id, + current_location=None, + ) + origin_cp = pipette_location.critical_point + + await self._gantry_mover.prepare_for_mount_movement( + pipette_location.mount.to_hw_mount() + ) + origin = await self._gantry_mover.get_position(pipette_id=pipette_id) + max_travel_z = self._gantry_mover.get_max_travel_z(pipette_id=pipette_id) + + # calculate the movement's waypoints + waypoints = self._state_store.motion.get_movement_waypoints_to_addressable_area( + addressable_area_name=addressable_area_name, + offset=offset, + origin=origin, + origin_cp=origin_cp, + max_travel_z=max_travel_z, + force_direct=force_direct, + minimum_z_height=minimum_z_height, + stay_at_max_travel_z=stay_at_highest_possible_z, + ignore_tip_configuration=ignore_tip_configuration, + ) + + speed = self._state_store.pipettes.get_movement_speed( + pipette_id=pipette_id, requested_speed=speed + ) + + final_point = await self._gantry_mover.move_to( + pipette_id=pipette_id, waypoints=waypoints, speed=speed + ) + + return final_point + async def move_relative( self, pipette_id: str, @@ -165,6 +245,13 @@ async def move_to_coordinates( speed: Optional[float] = None, ) -> Point: """Move pipette to a given deck coordinate.""" + # get the pipette's mount, if applicable + pipette_location = self._state_store.motion.get_pipette_location( + pipette_id=pipette_id + ) + await self._gantry_mover.prepare_for_mount_movement( + pipette_location.mount.to_hw_mount() + ) origin = await self._gantry_mover.get_position(pipette_id=pipette_id) max_travel_z = self._gantry_mover.get_max_travel_z(pipette_id=pipette_id) @@ -217,6 +304,6 @@ async def check_for_valid_position(self, mount: MountType) -> bool: await self._hardware_api.gantry_position( mount=mount.to_hw_mount(), fail_on_not_homed=True ) - except MustHomeError: + except PositionUnknownError: return False return True diff --git a/api/src/opentrons/protocol_engine/execution/pipetting.py b/api/src/opentrons/protocol_engine/execution/pipetting.py index 7b552de316e..7305a4c09da 100644 --- a/api/src/opentrons/protocol_engine/execution/pipetting.py +++ b/api/src/opentrons/protocol_engine/execution/pipetting.py @@ -8,12 +8,23 @@ from ..state import StateView, HardwarePipette from ..errors.exceptions import ( TipNotAttachedError, - InvalidPipettingVolumeError, + InvalidAspirateVolumeError, InvalidPushOutVolumeError, InvalidDispenseVolumeError, ) +# 1e-9 µL (1 femtoliter!) is a good value because: +# * It's large relative to rounding errors that occur in practice in protocols. For +# example, https://opentrons.atlassian.net/browse/RESC-182 shows a rounding error +# on the order of 1e-15 µL. +# * It's small relative to volumes that our users might actually care about and +# expect the robot to execute faithfully. +# * It's the default absolute tolerance for math.isclose(), where it apparently works +# well in general. +_VOLUME_ROUNDING_ERROR_TOLERANCE = 1e-9 + + class PipettingHandler(TypingProtocol): """Liquid handling commands.""" @@ -80,14 +91,19 @@ async def aspirate_in_place( ) -> float: """Set flow-rate and aspirate.""" # get mount and config data from state and hardware controller + adjusted_volume = _validate_aspirate_volume( + state_view=self._state_view, pipette_id=pipette_id, aspirate_volume=volume + ) hw_pipette = self._state_view.pipettes.get_hardware_pipette( pipette_id=pipette_id, attached_pipettes=self._hardware_api.attached_instruments, ) with self._set_flow_rate(pipette=hw_pipette, aspirate_flow_rate=flow_rate): - await self._hardware_api.aspirate(mount=hw_pipette.mount, volume=volume) + await self._hardware_api.aspirate( + mount=hw_pipette.mount, volume=adjusted_volume + ) - return volume + return adjusted_volume async def dispense_in_place( self, @@ -97,6 +113,9 @@ async def dispense_in_place( push_out: Optional[float], ) -> float: """Dispense liquid without moving the pipette.""" + adjusted_volume = _validate_dispense_volume( + state_view=self._state_view, pipette_id=pipette_id, dispense_volume=volume + ) hw_pipette = self._state_view.pipettes.get_hardware_pipette( pipette_id=pipette_id, attached_pipettes=self._hardware_api.attached_instruments, @@ -108,10 +127,10 @@ async def dispense_in_place( ) with self._set_flow_rate(pipette=hw_pipette, dispense_flow_rate=flow_rate): await self._hardware_api.dispense( - mount=hw_pipette.mount, volume=volume, push_out=push_out + mount=hw_pipette.mount, volume=adjusted_volume, push_out=push_out ) - return volume + return adjusted_volume async def blow_out_in_place( self, @@ -172,23 +191,6 @@ def get_is_ready_to_aspirate(self, pipette_id: str) -> bool: """Get whether a pipette is ready to aspirate.""" return self._state_view.pipettes.get_aspirated_volume(pipette_id) is not None - def _validate_aspirated_volume(self, pipette_id: str, volume: float) -> None: - """Get whether the aspirated volume is valid to aspirate.""" - working_volume = self._state_view.pipettes.get_working_volume( - pipette_id=pipette_id - ) - - current_volume = ( - self._state_view.pipettes.get_aspirated_volume(pipette_id=pipette_id) or 0 - ) - - new_volume = current_volume + volume - - if new_volume > working_volume: - raise InvalidPipettingVolumeError( - "Cannot aspirate more than pipette max volume" - ) - async def prepare_for_aspirate(self, pipette_id: str) -> None: """Virtually prepare to aspirate (no-op).""" @@ -200,8 +202,9 @@ async def aspirate_in_place( ) -> float: """Virtually aspirate (no-op).""" self._validate_tip_attached(pipette_id=pipette_id, command_name="aspirate") - self._validate_aspirated_volume(pipette_id=pipette_id, volume=volume) - return volume + return _validate_aspirate_volume( + state_view=self._state_view, pipette_id=pipette_id, aspirate_volume=volume + ) async def dispense_in_place( self, @@ -217,8 +220,9 @@ async def dispense_in_place( "push out value cannot have a negative value." ) self._validate_tip_attached(pipette_id=pipette_id, command_name="dispense") - self._validate_dispense_volume(pipette_id=pipette_id, dispense_volume=volume) - return volume + return _validate_dispense_volume( + state_view=self._state_view, pipette_id=pipette_id, dispense_volume=volume + ) async def blow_out_in_place( self, @@ -226,7 +230,6 @@ async def blow_out_in_place( flow_rate: float, ) -> None: """Virtually blow out (no-op).""" - self._validate_tip_attached(pipette_id=pipette_id, command_name="blow-out") def _validate_tip_attached(self, pipette_id: str, command_name: str) -> None: """Validate if there is a tip attached.""" @@ -236,20 +239,6 @@ def _validate_tip_attached(self, pipette_id: str, command_name: str) -> None: f"Cannot perform {command_name} without a tip attached" ) - def _validate_dispense_volume( - self, pipette_id: str, dispense_volume: float - ) -> None: - """Validate dispense volume.""" - aspirate_volume = self._state_view.pipettes.get_aspirated_volume(pipette_id) - if aspirate_volume is None: - raise InvalidDispenseVolumeError( - "Cannot perform a dispense if there is no volume in attached tip." - ) - elif dispense_volume > aspirate_volume: - raise InvalidDispenseVolumeError( - f"Cannot dispense {dispense_volume} µL when only {aspirate_volume} µL has been aspirated." - ) - def create_pipetting_handler( state_view: StateView, hardware_api: HardwareControlAPI @@ -260,3 +249,68 @@ def create_pipetting_handler( if state_view.config.use_virtual_pipettes is False else VirtualPipettingHandler(state_view=state_view) ) + + +def _validate_aspirate_volume( + state_view: StateView, pipette_id: str, aspirate_volume: float +) -> float: + """Get whether the given volume is valid to aspirate right now. + + Return the volume to aspirate, possibly clamped, or raise an + InvalidAspirateVolumeError. + """ + working_volume = state_view.pipettes.get_working_volume(pipette_id=pipette_id) + + current_volume = ( + state_view.pipettes.get_aspirated_volume(pipette_id=pipette_id) or 0 + ) + + # TODO(mm, 2024-01-11): We should probably just use + # state_view.pipettes.get_available_volume()? Its whole `None` return vs. exception + # raising thing is confusing me. + available_volume = working_volume - current_volume + available_volume_with_tolerance = ( + available_volume + _VOLUME_ROUNDING_ERROR_TOLERANCE + ) + + if aspirate_volume > available_volume_with_tolerance: + raise InvalidAspirateVolumeError( + attempted_aspirate_volume=aspirate_volume, + available_volume=available_volume, + max_pipette_volume=state_view.pipettes.get_maximum_volume( + pipette_id=pipette_id + ), + max_tip_volume=_get_max_tip_volume( + state_view=state_view, pipette_id=pipette_id + ), + ) + else: + return min(aspirate_volume, available_volume) + + +def _validate_dispense_volume( + state_view: StateView, pipette_id: str, dispense_volume: float +) -> float: + """Get whether the given volume is valid to dispense right now. + + Return the volume to dispense, possibly clamped, or raise an + InvalidDispenseVolumeError. + """ + aspirated_volume = state_view.pipettes.get_aspirated_volume(pipette_id) + if aspirated_volume is None: + raise InvalidDispenseVolumeError( + "Cannot perform a dispense if there is no volume in attached tip." + ) + else: + remaining = aspirated_volume - dispense_volume + if remaining < -_VOLUME_ROUNDING_ERROR_TOLERANCE: + raise InvalidDispenseVolumeError( + f"Cannot dispense {dispense_volume} µL when only {aspirated_volume} µL has been aspirated." + ) + else: + return min(dispense_volume, aspirated_volume) + + +def _get_max_tip_volume(state_view: StateView, pipette_id: str) -> Optional[float]: + attached_tip = state_view.pipettes.get_attached_tip(pipette_id=pipette_id) + return None if attached_tip is None else attached_tip.volume diff --git a/api/src/opentrons/protocol_engine/execution/tip_handler.py b/api/src/opentrons/protocol_engine/execution/tip_handler.py index b007545edd2..51cf4708377 100644 --- a/api/src/opentrons/protocol_engine/execution/tip_handler.py +++ b/api/src/opentrons/protocol_engine/execution/tip_handler.py @@ -1,17 +1,51 @@ """Tip pickup and drop procedures.""" -from typing import Optional +from typing import Optional, Dict from typing_extensions import Protocol as TypingProtocol from opentrons.hardware_control import HardwareControlAPI - -from ..resources import LabwareDataProvider +from opentrons.hardware_control.types import FailedTipStateCheck +from opentrons_shared_data.errors.exceptions import ( + CommandPreconditionViolated, + CommandParameterLimitViolated, + PythonException, +) + +from ..resources import LabwareDataProvider, ensure_ot3_hardware from ..state import StateView -from ..types import TipGeometry +from ..types import TipGeometry, TipPresenceStatus +from ..errors import ( + HardwareNotSupportedError, + TipNotAttachedError, + TipAttachedError, + ProtocolEngineError, +) + + +PRIMARY_NOZZLE_TO_ENDING_NOZZLE_MAP = { + "A1": {"COLUMN": "H1", "ROW": "A12"}, + "H1": {"COLUMN": "A1", "ROW": "H12"}, + "A12": {"COLUMN": "H12", "ROW": "A1"}, + "H12": {"COLUMN": "A12", "ROW": "H1"}, +} class TipHandler(TypingProtocol): """Pick up and drop tips.""" + async def available_for_nozzle_layout( + self, + pipette_id: str, + style: str, + primary_nozzle: Optional[str] = None, + front_right_nozzle: Optional[str] = None, + ) -> Dict[str, str]: + """Check nozzle layout is compatible with the pipette. + + Returns: + A dict of nozzles used to configure the pipette. + """ + ... + async def pick_up_tip( self, pipette_id: str, @@ -36,6 +70,55 @@ async def drop_tip(self, pipette_id: str, home_after: Optional[bool]) -> None: async def add_tip(self, pipette_id: str, tip: TipGeometry) -> None: """Tell the Hardware API that a tip is attached.""" + async def get_tip_presence(self, pipette_id: str) -> TipPresenceStatus: + """Get tip presence status on the pipette.""" + + async def verify_tip_presence( + self, pipette_id: str, expected: TipPresenceStatus + ) -> None: + """Verify the expected tip presence status.""" + + +async def _available_for_nozzle_layout( + channels: int, + style: str, + primary_nozzle: Optional[str], + front_right_nozzle: Optional[str], +) -> Dict[str, str]: + """Check nozzle layout is compatible with the pipette. + + Returns: + A dict of nozzles used to configure the pipette. + """ + if channels == 1: + raise CommandPreconditionViolated( + message=f"Cannot configure nozzle layout with a {channels} channel pipette." + ) + if style == "ALL": + return {} + if style == "ROW" and channels == 8: + raise CommandParameterLimitViolated( + command_name="configure_nozzle_layout", + parameter_name="RowNozzleLayout", + limit_statement="RowNozzleLayout is incompatible with {channels} channel pipettes.", + actual_value=str(primary_nozzle), + ) + if not primary_nozzle: + return {"primary_nozzle": "A1"} + if style == "SINGLE": + return {"primary_nozzle": primary_nozzle} + if not front_right_nozzle: + return { + "primary_nozzle": primary_nozzle, + "front_right_nozzle": PRIMARY_NOZZLE_TO_ENDING_NOZZLE_MAP[primary_nozzle][ + style + ], + } + return { + "primary_nozzle": primary_nozzle, + "front_right_nozzle": front_right_nozzle, + } + class HardwareTipHandler(TipHandler): """Pick up and drop tips, using the Hardware API.""" @@ -46,9 +129,26 @@ def __init__( hardware_api: HardwareControlAPI, labware_data_provider: Optional[LabwareDataProvider] = None, ) -> None: - self._state_view = state_view self._hardware_api = hardware_api self._labware_data_provider = labware_data_provider or LabwareDataProvider() + self._state_view = state_view + + async def available_for_nozzle_layout( + self, + pipette_id: str, + style: str, + primary_nozzle: Optional[str] = None, + front_right_nozzle: Optional[str] = None, + ) -> Dict[str, str]: + """Returns configuration for nozzle layout to pass to configure_nozzle_layout.""" + if self._state_view.pipettes.get_attached_tip(pipette_id): + raise CommandPreconditionViolated( + message=f"Cannot configure nozzle layout of {str(self)} while it has tips attached." + ) + channels = self._state_view.pipettes.get_channels(pipette_id) + return await _available_for_nozzle_layout( + channels, style, primary_nozzle, front_right_nozzle + ) async def pick_up_tip( self, @@ -75,6 +175,7 @@ async def pick_up_tip( presses=None, increment=None, ) + await self.verify_tip_presence(pipette_id, TipPresenceStatus.PRESENT) self._hardware_api.set_current_tiprack_diameter( mount=hw_mount, @@ -104,6 +205,7 @@ async def drop_tip(self, pipette_id: str, home_after: Optional[bool]) -> None: kwargs = {} await self._hardware_api.drop_tip(mount=hw_mount, **kwargs) + await self.verify_tip_presence(pipette_id, TipPresenceStatus.ABSENT) async def add_tip(self, pipette_id: str, tip: TipGeometry) -> None: """Tell the Hardware API that a tip is attached.""" @@ -121,6 +223,45 @@ async def add_tip(self, pipette_id: str, tip: TipGeometry) -> None: tip_volume=tip.volume, ) + async def get_tip_presence(self, pipette_id: str) -> TipPresenceStatus: + """Get the tip presence status of the pipette.""" + try: + ot3api = ensure_ot3_hardware(hardware_api=self._hardware_api) + + hw_mount = self._state_view.pipettes.get_mount(pipette_id).to_hw_mount() + + status = await ot3api.get_tip_presence_status(hw_mount) + return TipPresenceStatus.from_hw_state(status) + except HardwareNotSupportedError: + # Tip presence sensing is not supported on the OT2 + return TipPresenceStatus.UNKNOWN + + async def verify_tip_presence( + self, pipette_id: str, expected: TipPresenceStatus + ) -> None: + """Verify the expecterd tip presence status of the pipette. + + This function will raise an exception if the specified tip presence status + isn't matched. + """ + try: + ot3api = ensure_ot3_hardware(hardware_api=self._hardware_api) + hw_mount = self._state_view.pipettes.get_mount(pipette_id).to_hw_mount() + await ot3api.verify_tip_presence(hw_mount, expected.to_hw_state()) + except HardwareNotSupportedError: + # Tip presence sensing is not supported on the OT2 + pass + except FailedTipStateCheck as e: + if expected == TipPresenceStatus.ABSENT: + raise TipAttachedError(wrapping=[PythonException(e)]) + elif expected == TipPresenceStatus.PRESENT: + raise TipNotAttachedError(wrapping=[PythonException(e)]) + else: + raise ProtocolEngineError( + message="Unknown tip status in tip status check", + wrapping=[PythonException(e)], + ) + class VirtualTipHandler(TipHandler): """Pick up and drop tips, using a virtual pipette.""" @@ -152,6 +293,23 @@ async def pick_up_tip( return nominal_tip_geometry + async def available_for_nozzle_layout( + self, + pipette_id: str, + style: str, + primary_nozzle: Optional[str] = None, + front_right_nozzle: Optional[str] = None, + ) -> Dict[str, str]: + """Returns configuration for nozzle layout to pass to configure_nozzle_layout.""" + if self._state_view.pipettes.get_attached_tip(pipette_id): + raise CommandPreconditionViolated( + message=f"Cannot configure nozzle layout of {str(self)} while it has tips attached." + ) + channels = self._state_view.pipettes.get_channels(pipette_id) + return await _available_for_nozzle_layout( + channels, style, primary_nozzle, front_right_nozzle + ) + async def drop_tip( self, pipette_id: str, @@ -173,6 +331,22 @@ async def add_tip(self, pipette_id: str, tip: TipGeometry) -> None: """ assert False, "TipHandler.add_tip should not be used with virtual pipettes" + async def verify_tip_presence( + self, pipette_id: str, expected: TipPresenceStatus + ) -> None: + """Verify tip presence. + + This should not be called when using virtual pipettes. + """ + + async def get_tip_presence(self, pipette_id: str) -> TipPresenceStatus: + """Get tip presence. + + This is a check to the physical machine's sensors and should not be + called on a virtual pipette. + """ + raise RuntimeError("Do not call VirtualTipHandler.get_tip_presence") + def create_tip_handler( state_view: StateView, hardware_api: HardwareControlAPI diff --git a/api/src/opentrons/protocol_engine/protocol_engine.py b/api/src/opentrons/protocol_engine/protocol_engine.py index 207ebddd9d8..3c408828337 100644 --- a/api/src/opentrons/protocol_engine/protocol_engine.py +++ b/api/src/opentrons/protocol_engine/protocol_engine.py @@ -24,6 +24,8 @@ Liquid, HexColor, PostRunHardwareState, + DeckConfigurationType, + AddressableAreaLocation, ) from .execution import ( QueueWorker, @@ -45,6 +47,7 @@ AddLabwareOffsetAction, AddLabwareDefinitionAction, AddLiquidAction, + AddAddressableAreaAction, AddModuleAction, HardwareStoppedAction, ResetTipsAction, @@ -133,13 +136,13 @@ def add_plugin(self, plugin: AbstractPlugin) -> None: """Add a plugin to the engine to customize behavior.""" self._plugin_starter.start(plugin) - def play(self) -> None: + def play(self, deck_configuration: Optional[DeckConfigurationType] = None) -> None: """Start or resume executing commands in the queue.""" requested_at = self._model_utils.get_timestamp() # TODO(mc, 2021-08-05): if starting, ensure plungers motors are # homed if necessary action = self._state_store.commands.validate_action_allowed( - PlayAction(requested_at=requested_at) + PlayAction(requested_at=requested_at, deck_configuration=deck_configuration) ) self._action_dispatcher.dispatch(action) @@ -292,6 +295,15 @@ async def stop(self) -> None: action = self._state_store.commands.validate_action_allowed(StopAction()) self._action_dispatcher.dispatch(action) self._queue_worker.cancel() + if self._hardware_api.is_movement_execution_taskified(): + # We 'taskify' hardware controller movement functions when running protocols + # that are not backed by the engine. Such runs cannot be stopped by cancelling + # the queue worker and hence need to be stopped via the execution manager. + # `cancel_execution_and_running_tasks()` sets the execution manager in a CANCELLED state + # and cancels the running tasks, which raises an error and gets us out of the + # run function execution, just like `_queue_worker.cancel()` does for + # engine-backed runs. + await self._hardware_api.cancel_execution_and_running_tasks() async def wait_until_complete(self) -> None: """Wait until there are no more commands to execute. @@ -380,7 +392,6 @@ async def finish( # order will be backwards because the stack is first-in-last-out. exit_stack = AsyncExitStack() exit_stack.push_async_callback(self._plugin_starter.stop) # Last step. - exit_stack.push_async_callback( # Cleanup after hardware halt and reset the hardware controller self._hardware_stopper.do_stop_and_recover, @@ -400,7 +411,6 @@ async def finish( disengage_before_stopping=disengage_before_stopping, ) exit_stack.push_async_callback(self._queue_worker.join) # First step. - try: # If any teardown steps failed, this will raise something. await exit_stack.aclose() @@ -473,6 +483,13 @@ def add_liquid( self._action_dispatcher.dispatch(AddLiquidAction(liquid=liquid)) return liquid + def add_addressable_area(self, addressable_area_name: str) -> None: + """Add an addressable area to state.""" + area = AddressableAreaLocation(addressableAreaName=addressable_area_name) + self._action_dispatcher.dispatch( + AddAddressableAreaAction(addressable_area=area) + ) + def reset_tips(self, labware_id: str) -> None: """Reset the tip state of a given labware.""" # TODO(mm, 2023-03-10): Safely raise an error if the given labware isn't a diff --git a/api/src/opentrons/protocol_engine/resources/deck_configuration_provider.py b/api/src/opentrons/protocol_engine/resources/deck_configuration_provider.py new file mode 100644 index 00000000000..112be3663cd --- /dev/null +++ b/api/src/opentrons/protocol_engine/resources/deck_configuration_provider.py @@ -0,0 +1,135 @@ +"""Deck configuration resource provider.""" +from typing import List, Set, Tuple + +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4, CutoutFixture + +from opentrons.types import DeckSlotName + +from ..types import ( + AddressableArea, + AreaType, + PotentialCutoutFixture, + DeckPoint, + Dimensions, + AddressableOffsetVector, +) +from ..errors import ( + CutoutDoesNotExistError, + FixtureDoesNotExistError, + AddressableAreaDoesNotExistError, + FixtureDoesNotProvideAreasError, +) + + +def get_cutout_position(cutout_id: str, deck_definition: DeckDefinitionV4) -> DeckPoint: + """Get the base position of a cutout on the deck.""" + for cutout in deck_definition["locations"]["cutouts"]: + if cutout_id == cutout["id"]: + position = cutout["position"] + return DeckPoint(x=position[0], y=position[1], z=position[2]) + else: + raise CutoutDoesNotExistError(f"Could not find cutout with name {cutout_id}") + + +def get_cutout_fixture( + cutout_fixture_id: str, deck_definition: DeckDefinitionV4 +) -> CutoutFixture: + """Gets cutout fixture from deck that matches the cutout fixture ID provided.""" + for cutout_fixture in deck_definition["cutoutFixtures"]: + if cutout_fixture["id"] == cutout_fixture_id: + return cutout_fixture + raise FixtureDoesNotExistError( + f"Could not find cutout fixture with name {cutout_fixture_id}" + ) + + +def get_provided_addressable_area_names( + cutout_fixture_id: str, cutout_id: str, deck_definition: DeckDefinitionV4 +) -> List[str]: + """Gets a list of the addressable areas provided by the cutout fixture on the cutout.""" + cutout_fixture = get_cutout_fixture(cutout_fixture_id, deck_definition) + try: + return cutout_fixture["providesAddressableAreas"][cutout_id] + except KeyError as exception: + raise FixtureDoesNotProvideAreasError( + f"Cutout fixture {cutout_fixture['id']} does not provide addressable areas for {cutout_id}" + ) from exception + + +def get_addressable_area_display_name( + addressable_area_name: str, deck_definition: DeckDefinitionV4 +) -> str: + """Get the display name for an addressable area name.""" + for addressable_area in deck_definition["locations"]["addressableAreas"]: + if addressable_area["id"] == addressable_area_name: + return addressable_area["displayName"] + raise AddressableAreaDoesNotExistError( + f"Could not find addressable area with name {addressable_area_name}" + ) + + +def get_potential_cutout_fixtures( + addressable_area_name: str, deck_definition: DeckDefinitionV4 +) -> Tuple[str, Set[PotentialCutoutFixture]]: + """Given an addressable area name, gets the cutout ID associated with it and a set of potential fixtures.""" + potential_fixtures = [] + for cutout_fixture in deck_definition["cutoutFixtures"]: + for cutout_id, provided_areas in cutout_fixture[ + "providesAddressableAreas" + ].items(): + if addressable_area_name in provided_areas: + potential_fixtures.append( + PotentialCutoutFixture( + cutout_id=cutout_id, + cutout_fixture_id=cutout_fixture["id"], + provided_addressable_areas=frozenset(provided_areas), + ) + ) + # This following logic is making the assumption that every addressable area can only go on one cutout, though + # it may have multiple cutout fixtures that supply it on that cutout. If this assumption changes, some of the + # following logic will have to be readjusted + if not potential_fixtures: + raise AddressableAreaDoesNotExistError( + f"{addressable_area_name} is not provided by any cutout fixtures" + f" in deck definition {deck_definition['otId']}" + ) + cutout_id = potential_fixtures[0].cutout_id + assert all(cutout_id == fixture.cutout_id for fixture in potential_fixtures) + return cutout_id, set(potential_fixtures) + + +def get_addressable_area_from_name( + addressable_area_name: str, + cutout_position: DeckPoint, + base_slot: DeckSlotName, + deck_definition: DeckDefinitionV4, +) -> AddressableArea: + """Given a name and a cutout position, get an addressable area on the deck.""" + for addressable_area in deck_definition["locations"]["addressableAreas"]: + if addressable_area["id"] == addressable_area_name: + area_offset = addressable_area["offsetFromCutoutFixture"] + position = AddressableOffsetVector( + x=area_offset[0] + cutout_position.x, + y=area_offset[1] + cutout_position.y, + z=area_offset[2] + cutout_position.z, + ) + bounding_box = Dimensions( + x=addressable_area["boundingBox"]["xDimension"], + y=addressable_area["boundingBox"]["yDimension"], + z=addressable_area["boundingBox"]["zDimension"], + ) + + return AddressableArea( + area_name=addressable_area["id"], + area_type=AreaType(addressable_area["areaType"]), + base_slot=base_slot, + display_name=addressable_area["displayName"], + bounding_box=bounding_box, + position=position, + compatible_module_types=addressable_area.get( + "compatibleModuleTypes", [] + ), + ) + raise AddressableAreaDoesNotExistError( + f"Could not find addressable area with name {addressable_area_name}" + ) diff --git a/api/src/opentrons/protocol_engine/resources/deck_data_provider.py b/api/src/opentrons/protocol_engine/resources/deck_data_provider.py index 8ddc46a4725..6098c2f4301 100644 --- a/api/src/opentrons/protocol_engine/resources/deck_data_provider.py +++ b/api/src/opentrons/protocol_engine/resources/deck_data_provider.py @@ -9,7 +9,7 @@ load as load_deck, DEFAULT_DECK_DEFINITION_VERSION, ) -from opentrons_shared_data.deck.dev_types import DeckDefinitionV3 +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4 from opentrons.protocols.models import LabwareDefinition from opentrons.types import DeckSlotName @@ -39,10 +39,10 @@ def __init__( self._deck_type = deck_type self._labware_data = labware_data or LabwareDataProvider() - async def get_deck_definition(self) -> DeckDefinitionV3: + async def get_deck_definition(self) -> DeckDefinitionV4: """Get a labware definition given the labware's identification.""" - def sync() -> DeckDefinitionV3: + def sync() -> DeckDefinitionV4: return load_deck( name=self._deck_type.value, version=DEFAULT_DECK_DEFINITION_VERSION ) @@ -51,12 +51,12 @@ def sync() -> DeckDefinitionV3: async def get_deck_fixed_labware( self, - deck_definition: DeckDefinitionV3, + deck_definition: DeckDefinitionV4, ) -> List[DeckFixedLabware]: """Get a list of all labware fixtures from a given deck definition.""" labware: List[DeckFixedLabware] = [] - for fixture in deck_definition["locations"]["fixtures"]: + for fixture in deck_definition["locations"]["legacyFixtures"]: labware_id = fixture["id"] load_name = cast(Optional[str], fixture.get("labware")) slot = cast(Optional[str], fixture.get("slot")) diff --git a/api/src/opentrons/protocol_engine/resources/fixture_validation.py b/api/src/opentrons/protocol_engine/resources/fixture_validation.py new file mode 100644 index 00000000000..9807cc6beaa --- /dev/null +++ b/api/src/opentrons/protocol_engine/resources/fixture_validation.py @@ -0,0 +1,48 @@ +"""Validation file for addressable area reference checking functions.""" + +from opentrons.types import DeckSlotName + + +def is_waste_chute(addressable_area_name: str) -> bool: + """Check if an addressable area is a Waste Chute.""" + return addressable_area_name in { + "1ChannelWasteChute", + "8ChannelWasteChute", + "96ChannelWasteChute", + "gripperWasteChute", + } + + +def is_gripper_waste_chute(addressable_area_name: str) -> bool: + """Check if an addressable area is a gripper-movement-compatible Waste Chute.""" + return addressable_area_name == "gripperWasteChute" + + +def is_drop_tip_waste_chute(addressable_area_name: str) -> bool: + """Check if an addressable area is a Waste Chute compatible for dropping tips.""" + return addressable_area_name in { + "1ChannelWasteChute", + "8ChannelWasteChute", + "96ChannelWasteChute", + } + + +def is_trash(addressable_area_name: str) -> bool: + """Check if an addressable area is a trash bin.""" + return addressable_area_name in {"movableTrash", "fixedTrash", "shortFixedTrash"} + + +def is_staging_slot(addressable_area_name: str) -> bool: + """Check if an addressable area is a staging area slot.""" + return addressable_area_name in {"A4", "B4", "C4", "D4"} + + +def is_deck_slot(addressable_area_name: str) -> bool: + """Check if an addressable area is a deck slot (including staging area slots).""" + if is_staging_slot(addressable_area_name): + return True + try: + DeckSlotName.from_primitive(addressable_area_name) + except ValueError: + return False + return True diff --git a/api/src/opentrons/protocol_engine/resources/module_data_provider.py b/api/src/opentrons/protocol_engine/resources/module_data_provider.py index 634104cbedc..a12b85ee5b3 100644 --- a/api/src/opentrons/protocol_engine/resources/module_data_provider.py +++ b/api/src/opentrons/protocol_engine/resources/module_data_provider.py @@ -5,7 +5,14 @@ ) from opentrons_shared_data.module import load_definition -from ..types import ModuleModel, ModuleDefinition, ModuleOffsetVector +from opentrons.types import DeckSlotName +from ..types import ( + ModuleModel, + ModuleDefinition, + ModuleOffsetVector, + ModuleOffsetData, + DeckSlotLocation, +) class ModuleDataProvider: @@ -18,15 +25,20 @@ def get_definition(model: ModuleModel) -> ModuleDefinition: return ModuleDefinition.parse_obj(data) @staticmethod - def load_module_calibrations() -> Dict[str, ModuleOffsetVector]: + def load_module_calibrations() -> Dict[str, ModuleOffsetData]: """Load the module calibration offsets.""" - module_calibrations: Dict[str, ModuleOffsetVector] = dict() + module_calibrations: Dict[str, ModuleOffsetData] = dict() calibration_data = load_all_module_calibrations() for calibration in calibration_data: # NOTE module_id is really the module serial number, change this - module_calibrations[calibration.module_id] = ModuleOffsetVector( - x=calibration.offset.x, - y=calibration.offset.y, - z=calibration.offset.z, + module_calibrations[calibration.module_id] = ModuleOffsetData( + moduleOffsetVector=ModuleOffsetVector( + x=calibration.offset.x, + y=calibration.offset.y, + z=calibration.offset.z, + ), + location=DeckSlotLocation( + slotName=DeckSlotName.from_primitive(calibration.slot), + ), ) return module_calibrations diff --git a/api/src/opentrons/protocol_engine/resources/ot3_validation.py b/api/src/opentrons/protocol_engine/resources/ot3_validation.py index 8a555dd5f47..7b25bc35430 100644 --- a/api/src/opentrons/protocol_engine/resources/ot3_validation.py +++ b/api/src/opentrons/protocol_engine/resources/ot3_validation.py @@ -1,28 +1,21 @@ """Validation file for protocol engine commandsot.""" from __future__ import annotations -from typing import TYPE_CHECKING, Optional +from typing import Optional from opentrons.protocol_engine.errors import HardwareNotSupportedError +from opentrons.hardware_control.protocols.types import FlexRobotType -if TYPE_CHECKING: - from opentrons.hardware_control.ot3api import OT3API - from opentrons.hardware_control import HardwareControlAPI +from opentrons.hardware_control import HardwareControlAPI, OT3HardwareControlAPI def ensure_ot3_hardware( - hardware_api: HardwareControlAPI, error_msg: Optional[str] = None -) -> OT3API: + hardware_api: HardwareControlAPI, + error_msg: Optional[str] = None, +) -> OT3HardwareControlAPI: """Validate that the HardwareControlAPI is of OT-3 instance.""" - try: - from opentrons.hardware_control.ot3api import OT3API - except ImportError as exception: - raise HardwareNotSupportedError( - error_msg or "This command is supported by OT-3 only." - ) from exception + if hardware_api.get_robot_type() == FlexRobotType: + return hardware_api # type: ignore - if not isinstance(hardware_api, OT3API): - raise HardwareNotSupportedError( - error_msg or "This command is supported by OT-3 only." - ) - - return hardware_api + raise HardwareNotSupportedError( + error_msg or "This command is supported by OT-3 only." + ) diff --git a/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py b/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py index 086c670fb5d..940440826e7 100644 --- a/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py +++ b/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py @@ -1,6 +1,6 @@ """Pipette config data providers.""" from dataclasses import dataclass -from typing import Dict +from typing import Dict, Optional from opentrons_shared_data.pipette.dev_types import PipetteName, PipetteModel from opentrons_shared_data.pipette import ( @@ -12,8 +12,13 @@ from opentrons.hardware_control.dev_types import PipetteDict +from opentrons.hardware_control.nozzle_manager import ( + NozzleConfigurationManager, + NozzleMap, +) from ..types import FlowRates +from ...types import Point @dataclass(frozen=True) @@ -32,6 +37,8 @@ class LoadedStaticPipetteData: float, pipette_definition.SupportedTipsDefinition ] nominal_tip_overlap: Dict[str, float] + back_left_nozzle_offset: Point + front_right_nozzle_offset: Point class VirtualPipetteDataProvider: @@ -40,6 +47,36 @@ class VirtualPipetteDataProvider: def __init__(self) -> None: """Build a VirtualPipetteDataProvider.""" self._liquid_class_by_id: Dict[str, pip_types.LiquidClasses] = {} + self._nozzle_manager_layout_by_id: Dict[str, NozzleConfigurationManager] = {} + + def configure_virtual_pipette_nozzle_layout( + self, + pipette_id: str, + pipette_model_string: str, + back_left_nozzle: Optional[str] = None, + front_right_nozzle: Optional[str] = None, + starting_nozzle: Optional[str] = None, + ) -> None: + """Emulate update_nozzle_configuration_for_mount.""" + if pipette_id not in self._nozzle_manager_layout_by_id: + config = self._get_virtual_pipette_full_config_by_model_string( + pipette_model_string + ) + new_nozzle_manager = NozzleConfigurationManager.build_from_config(config) + if back_left_nozzle and front_right_nozzle: + new_nozzle_manager.update_nozzle_configuration( + back_left_nozzle, front_right_nozzle, starting_nozzle + ) + self._nozzle_manager_layout_by_id[pipette_id] = new_nozzle_manager + elif back_left_nozzle and front_right_nozzle: + # Need to make sure that we pass all the right nozzles here. + self._nozzle_manager_layout_by_id[pipette_id].update_nozzle_configuration( + back_left_nozzle, front_right_nozzle, starting_nozzle + ) + else: + self._nozzle_manager_layout_by_id[ + pipette_id + ].reset_to_default_configuration() def configure_virtual_pipette_for_volume( self, pipette_id: str, volume: float, pipette_model_string: str @@ -61,6 +98,10 @@ def configure_virtual_pipette_for_volume( ) self._liquid_class_by_id[pipette_id] = liquid_class + def get_nozzle_layout_for_pipette(self, pipette_id: str) -> NozzleMap: + """Get the current nozzle layout stored for a virtual pipette.""" + return self._nozzle_manager_layout_by_id[pipette_id].current_configuration + def get_virtual_pipette_static_config_by_model_string( self, pipette_model_string: str, pipette_id: str ) -> LoadedStaticPipetteData: @@ -72,6 +113,19 @@ def get_virtual_pipette_static_config_by_model_string( pipette_model, pipette_id ) + def _get_virtual_pipette_full_config_by_model_string( + self, pipette_model_string: str + ) -> pipette_definition.PipetteConfigurations: + """Get the full pipette config from a model string.""" + pipette_model = pipette_load_name.convert_pipette_model( + PipetteModel(pipette_model_string) + ) + return load_pipette_data.load_definition( + pipette_model.pipette_type, + pipette_model.pipette_channels, + pipette_model.pipette_version, + ) + def _get_virtual_pipette_static_config_by_model( self, pipette_model: pipette_definition.PipetteModelVersionType, pipette_id: str ) -> LoadedStaticPipetteData: @@ -96,6 +150,7 @@ def _get_virtual_pipette_static_config_by_model( tip_type ] + nozzle_manager = NozzleConfigurationManager.build_from_config(config) return LoadedStaticPipetteData( model=str(pipette_model), display_name=config.display_name, @@ -118,6 +173,8 @@ def _get_virtual_pipette_static_config_by_model( nominal_tip_overlap=config.liquid_properties[ liquid_class ].tip_overlap_dictionary, + back_left_nozzle_offset=nozzle_manager.current_configuration.back_left_nozzle_offset, + front_right_nozzle_offset=nozzle_manager.current_configuration.front_right_nozzle_offset, ) def get_virtual_pipette_static_config( @@ -151,4 +208,11 @@ def get_pipette_static_config(pipette_dict: PipetteDict) -> LoadedStaticPipetteD # https://opentrons.atlassian.net/browse/RCORE-655 home_position=0, nozzle_offset_z=0, + # TODO (spp): Confirm that the nozzle map is populated by the hardware api by default + back_left_nozzle_offset=pipette_dict[ + "current_nozzle_map" + ].back_left_nozzle_offset, + front_right_nozzle_offset=pipette_dict[ + "current_nozzle_map" + ].front_right_nozzle_offset, ) diff --git a/api/src/opentrons/protocol_engine/slot_standardization.py b/api/src/opentrons/protocol_engine/slot_standardization.py index 9b2e352393a..c4e733b3ca6 100644 --- a/api/src/opentrons/protocol_engine/slot_standardization.py +++ b/api/src/opentrons/protocol_engine/slot_standardization.py @@ -24,7 +24,7 @@ OFF_DECK_LOCATION, DeckSlotLocation, LabwareLocation, - NonStackedLocation, + AddressableAreaLocation, LabwareOffsetCreate, ModuleLocation, OnLabwareLocation, @@ -124,21 +124,14 @@ def _standardize_labware_location( if isinstance(original, DeckSlotLocation): return _standardize_deck_slot_location(original, robot_type) elif ( - isinstance(original, (ModuleLocation, OnLabwareLocation)) + isinstance( + original, (ModuleLocation, OnLabwareLocation, AddressableAreaLocation) + ) or original == OFF_DECK_LOCATION ): return original -def _standardize_adapter_location( - original: NonStackedLocation, robot_type: RobotType -) -> NonStackedLocation: - if isinstance(original, DeckSlotLocation): - return _standardize_deck_slot_location(original, robot_type) - elif isinstance(original, ModuleLocation) or original == OFF_DECK_LOCATION: - return original - - def _standardize_deck_slot_location( original: DeckSlotLocation, robot_type: RobotType ) -> DeckSlotLocation: diff --git a/api/src/opentrons/protocol_engine/state/addressable_areas.py b/api/src/opentrons/protocol_engine/state/addressable_areas.py new file mode 100644 index 00000000000..add8fa35dc1 --- /dev/null +++ b/api/src/opentrons/protocol_engine/state/addressable_areas.py @@ -0,0 +1,610 @@ +"""Basic addressable area data state and store.""" +from dataclasses import dataclass +from typing import Dict, List, Optional, Set, Union + +from opentrons_shared_data.robot.dev_types import RobotType +from opentrons_shared_data.deck.dev_types import ( + DeckDefinitionV4, + SlotDefV3, + CutoutFixture, +) + +from opentrons.types import Point, DeckSlotName + +from ..commands import ( + Command, + LoadLabwareResult, + LoadModuleResult, + MoveLabwareResult, + MoveToAddressableAreaResult, + MoveToAddressableAreaForDropTipResult, +) +from ..errors import ( + IncompatibleAddressableAreaError, + AreaNotInDeckConfigurationError, + SlotDoesNotExistError, + AddressableAreaDoesNotExistError, + CutoutDoesNotExistError, +) +from ..resources import deck_configuration_provider +from ..types import ( + DeckSlotLocation, + AddressableAreaLocation, + AddressableArea, + PotentialCutoutFixture, + DeckConfigurationType, + Dimensions, +) +from ..actions import Action, UpdateCommandAction, PlayAction, AddAddressableAreaAction +from .config import Config +from .abstract_store import HasState, HandlesActions + + +@dataclass +class AddressableAreaState: + """State of all loaded addressable area resources.""" + + loaded_addressable_areas_by_name: Dict[str, AddressableArea] + """The addressable areas that have been loaded so far. + + When `use_simulated_deck_config` is `False`, these are the addressable areas that the + deck configuration provided. + + When `use_simulated_deck_config` is `True`, these are the addressable areas that have been + referenced by the protocol so far. + """ + + potential_cutout_fixtures_by_cutout_id: Dict[str, Set[PotentialCutoutFixture]] + + deck_definition: DeckDefinitionV4 + + deck_configuration: Optional[DeckConfigurationType] + """The host robot's full deck configuration. + + If `use_simulated_deck_config` is `True`, this is meaningless and this value is undefined. + In practice it will probably be `None` or `[]`. + + If `use_simulated_deck_config` is `False`, this will be non-`None`. + """ + + robot_type: RobotType + + use_simulated_deck_config: bool + """See `Config.use_simulated_deck_config`.""" + + +_OT2_ORDERED_SLOTS = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"] +_FLEX_ORDERED_SLOTS = [ + "D1", + "D2", + "D3", + "C1", + "C2", + "C3", + "B1", + "B2", + "B3", + "A1", + "A2", + "A3", +] +_FLEX_ORDERED_STAGING_SLOTS = ["D4", "C4", "B4", "A4"] + + +def _get_conflicting_addressable_areas_error_string( + potential_cutout_fixtures: Set[PotentialCutoutFixture], + loaded_addressable_areas: Dict[str, AddressableArea], + deck_definition: DeckDefinitionV4, +) -> str: + loaded_areas_on_cutout = set() + for fixture in potential_cutout_fixtures: + loaded_areas_on_cutout.update( + deck_configuration_provider.get_provided_addressable_area_names( + fixture.cutout_fixture_id, + fixture.cutout_id, + deck_definition, + ) + ) + loaded_areas_on_cutout.intersection_update(loaded_addressable_areas) + display_names = { + loaded_addressable_areas[area].display_name for area in loaded_areas_on_cutout + } + return ", ".join(display_names) + + +# This is a temporary shim while Protocol Engine's conflict-checking code +# can only take deck slots as input. +# Long-term solution: Check for conflicts based on bounding boxes, not slot adjacencies. +# Shorter-term: Change the conflict-checking code to take cutouts instead of deck slots. +CUTOUT_TO_DECK_SLOT_MAP: Dict[str, DeckSlotName] = { + # OT-2 + "cutout1": DeckSlotName.SLOT_1, + "cutout2": DeckSlotName.SLOT_2, + "cutout3": DeckSlotName.SLOT_3, + "cutout4": DeckSlotName.SLOT_4, + "cutout5": DeckSlotName.SLOT_5, + "cutout6": DeckSlotName.SLOT_6, + "cutout7": DeckSlotName.SLOT_7, + "cutout8": DeckSlotName.SLOT_8, + "cutout9": DeckSlotName.SLOT_9, + "cutout10": DeckSlotName.SLOT_10, + "cutout11": DeckSlotName.SLOT_11, + "cutout12": DeckSlotName.FIXED_TRASH, + # Flex + "cutoutA1": DeckSlotName.SLOT_A1, + "cutoutA2": DeckSlotName.SLOT_A2, + "cutoutA3": DeckSlotName.SLOT_A3, + "cutoutB1": DeckSlotName.SLOT_B1, + "cutoutB2": DeckSlotName.SLOT_B2, + "cutoutB3": DeckSlotName.SLOT_B3, + "cutoutC1": DeckSlotName.SLOT_C1, + "cutoutC2": DeckSlotName.SLOT_C2, + "cutoutC3": DeckSlotName.SLOT_C3, + "cutoutD1": DeckSlotName.SLOT_D1, + "cutoutD2": DeckSlotName.SLOT_D2, + "cutoutD3": DeckSlotName.SLOT_D3, +} +DECK_SLOT_TO_CUTOUT_MAP = { + deck_slot: cutout for cutout, deck_slot in CUTOUT_TO_DECK_SLOT_MAP.items() +} + + +class AddressableAreaStore(HasState[AddressableAreaState], HandlesActions): + """Addressable area state container.""" + + _state: AddressableAreaState + + def __init__( + self, + deck_configuration: DeckConfigurationType, + config: Config, + deck_definition: DeckDefinitionV4, + ) -> None: + """Initialize an addressable area store and its state.""" + if config.use_simulated_deck_config: + loaded_addressable_areas_by_name = {} + else: + loaded_addressable_areas_by_name = ( + self._get_addressable_areas_from_deck_configuration( + deck_configuration, + deck_definition, + ) + ) + + self._state = AddressableAreaState( + deck_configuration=deck_configuration, + loaded_addressable_areas_by_name=loaded_addressable_areas_by_name, + potential_cutout_fixtures_by_cutout_id={}, + deck_definition=deck_definition, + robot_type=config.robot_type, + use_simulated_deck_config=config.use_simulated_deck_config, + ) + + def handle_action(self, action: Action) -> None: + """Modify state in reaction to an action.""" + if isinstance(action, UpdateCommandAction): + self._handle_command(action.command) + elif isinstance(action, AddAddressableAreaAction): + self._check_location_is_addressable_area(action.addressable_area) + elif isinstance(action, PlayAction): + current_state = self._state + if ( + action.deck_configuration is not None + and not self._state.use_simulated_deck_config + ): + self._state.deck_configuration = action.deck_configuration + self._state.loaded_addressable_areas_by_name = ( + self._get_addressable_areas_from_deck_configuration( + deck_config=action.deck_configuration, + deck_definition=current_state.deck_definition, + ) + ) + + def _handle_command(self, command: Command) -> None: + """Modify state in reaction to a command.""" + if isinstance(command.result, LoadLabwareResult): + location = command.params.location + if isinstance(location, (DeckSlotLocation, AddressableAreaLocation)): + self._check_location_is_addressable_area(location) + + elif isinstance(command.result, MoveLabwareResult): + location = command.params.newLocation + if isinstance(location, (DeckSlotLocation, AddressableAreaLocation)): + self._check_location_is_addressable_area(location) + + elif isinstance(command.result, LoadModuleResult): + self._check_location_is_addressable_area(command.params.location) + + elif isinstance( + command.result, + (MoveToAddressableAreaResult, MoveToAddressableAreaForDropTipResult), + ): + addressable_area_name = command.params.addressableAreaName + self._check_location_is_addressable_area(addressable_area_name) + + @staticmethod + def _get_addressable_areas_from_deck_configuration( + deck_config: DeckConfigurationType, deck_definition: DeckDefinitionV4 + ) -> Dict[str, AddressableArea]: + """Return all addressable areas provided by the given deck configuration.""" + addressable_areas = [] + for cutout_id, cutout_fixture_id in deck_config: + provided_addressable_areas = ( + deck_configuration_provider.get_provided_addressable_area_names( + cutout_fixture_id, cutout_id, deck_definition + ) + ) + cutout_position = deck_configuration_provider.get_cutout_position( + cutout_id, deck_definition + ) + base_slot = CUTOUT_TO_DECK_SLOT_MAP[cutout_id] + for addressable_area_name in provided_addressable_areas: + addressable_areas.append( + deck_configuration_provider.get_addressable_area_from_name( + addressable_area_name=addressable_area_name, + cutout_position=cutout_position, + base_slot=base_slot, + deck_definition=deck_definition, + ) + ) + return {area.area_name: area for area in addressable_areas} + + def _check_location_is_addressable_area( + self, location: Union[DeckSlotLocation, AddressableAreaLocation, str] + ) -> None: + if isinstance(location, DeckSlotLocation): + addressable_area_name = location.slotName.id + elif isinstance(location, AddressableAreaLocation): + addressable_area_name = location.addressableAreaName + else: + addressable_area_name = location + + if addressable_area_name not in self._state.loaded_addressable_areas_by_name: + cutout_id = self._validate_addressable_area_for_simulation( + addressable_area_name + ) + + cutout_position = deck_configuration_provider.get_cutout_position( + cutout_id, self._state.deck_definition + ) + base_slot = CUTOUT_TO_DECK_SLOT_MAP[cutout_id] + addressable_area = ( + deck_configuration_provider.get_addressable_area_from_name( + addressable_area_name=addressable_area_name, + cutout_position=cutout_position, + base_slot=base_slot, + deck_definition=self._state.deck_definition, + ) + ) + self._state.loaded_addressable_areas_by_name[ + addressable_area.area_name + ] = addressable_area + + def _validate_addressable_area_for_simulation( + self, addressable_area_name: str + ) -> str: + """Given an addressable area name, validate it can exist on the deck and return cutout id associated with it.""" + ( + cutout_id, + potential_fixtures, + ) = deck_configuration_provider.get_potential_cutout_fixtures( + addressable_area_name, self._state.deck_definition + ) + + if cutout_id in self._state.potential_cutout_fixtures_by_cutout_id: + # Get the existing potential cutout fixtures for the addressable area already loaded on this cutout + existing_potential_fixtures = ( + self._state.potential_cutout_fixtures_by_cutout_id[cutout_id] + ) + # Get common cutout fixture that supplies existing addressable areas and the one being loaded + remaining_fixtures = existing_potential_fixtures.intersection( + set(potential_fixtures) + ) + + self._state.potential_cutout_fixtures_by_cutout_id[ + cutout_id + ] = remaining_fixtures + else: + self._state.potential_cutout_fixtures_by_cutout_id[cutout_id] = set( + potential_fixtures + ) + + return cutout_id + + +class AddressableAreaView(HasState[AddressableAreaState]): + """Read-only addressable area state view.""" + + _state: AddressableAreaState + + def __init__(self, state: AddressableAreaState) -> None: + """Initialize the computed view of addressable area state. + + Arguments: + state: Addressable area state dataclass used for all calculations. + """ + self._state = state + + def get_addressable_area(self, addressable_area_name: str) -> AddressableArea: + """Get addressable area.""" + if not self._state.use_simulated_deck_config: + return self._get_loaded_addressable_area(addressable_area_name) + else: + return self._get_addressable_area_from_deck_data( + addressable_area_name=addressable_area_name, + do_compatibility_check=True, + ) + + def get_all(self) -> List[str]: + """Get a list of all loaded addressable area names.""" + return list(self._state.loaded_addressable_areas_by_name) + + def get_all_cutout_fixtures(self) -> Optional[List[str]]: + """Get the names of all fixtures present in the host robot's deck configuration. + + If `use_simulated_deck_config` is `True` (see `Config`), we don't have a + meaningful concrete layout of fixtures, so this will return `None`. + """ + if self._state.use_simulated_deck_config: + return None + else: + assert self._state.deck_configuration is not None + return [ + cutout_fixture_id + for _, cutout_fixture_id in self._state.deck_configuration + ] + + def _get_loaded_addressable_area( + self, addressable_area_name: str + ) -> AddressableArea: + """Get an addressable area that has been loaded into state. Will raise error if it does not exist.""" + try: + return self._state.loaded_addressable_areas_by_name[addressable_area_name] + except KeyError: + raise AreaNotInDeckConfigurationError( + f"{addressable_area_name} not provided by deck configuration." + ) + + def _check_if_area_is_compatible_with_potential_fixtures( + self, + area_name: str, + cutout_id: str, + potential_fixtures: Set[PotentialCutoutFixture], + ) -> None: + if cutout_id in self._state.potential_cutout_fixtures_by_cutout_id: + if not self._state.potential_cutout_fixtures_by_cutout_id[ + cutout_id + ].intersection(potential_fixtures): + loaded_areas_on_cutout = ( + _get_conflicting_addressable_areas_error_string( + self._state.potential_cutout_fixtures_by_cutout_id[cutout_id], + self._state.loaded_addressable_areas_by_name, + self.state.deck_definition, + ) + ) + area_display_name = ( + deck_configuration_provider.get_addressable_area_display_name( + area_name, self.state.deck_definition + ) + ) + raise IncompatibleAddressableAreaError( + f"Cannot use {area_display_name}, not compatible with one or more of" + f" the following fixtures: {loaded_areas_on_cutout}" + ) + + def _get_addressable_area_from_deck_data( + self, + addressable_area_name: str, + do_compatibility_check: bool, + ) -> AddressableArea: + """Get an addressable area that may not have been already loaded for a simulated run. + + Since this may be the first time this addressable area has been called, and it might not exist in the store + yet (and if not won't until the result completes), we have to check if it is theoretically possible and then + get the area data from the deck configuration provider. + """ + if addressable_area_name in self._state.loaded_addressable_areas_by_name: + return self._state.loaded_addressable_areas_by_name[addressable_area_name] + + ( + cutout_id, + potential_fixtures, + ) = deck_configuration_provider.get_potential_cutout_fixtures( + addressable_area_name, self._state.deck_definition + ) + + if do_compatibility_check: + self._check_if_area_is_compatible_with_potential_fixtures( + addressable_area_name, cutout_id, potential_fixtures + ) + + cutout_position = deck_configuration_provider.get_cutout_position( + cutout_id, self._state.deck_definition + ) + base_slot = CUTOUT_TO_DECK_SLOT_MAP[cutout_id] + return deck_configuration_provider.get_addressable_area_from_name( + addressable_area_name=addressable_area_name, + cutout_position=cutout_position, + base_slot=base_slot, + deck_definition=self._state.deck_definition, + ) + + def get_addressable_area_base_slot( + self, addressable_area_name: str + ) -> DeckSlotName: + """Get the base slot the addressable area is associated with.""" + addressable_area = self.get_addressable_area(addressable_area_name) + return addressable_area.base_slot + + def get_addressable_area_position( + self, + addressable_area_name: str, + do_compatibility_check: bool = True, + ) -> Point: + """Get the position of an addressable area. + + This does not require the addressable area to be in the deck configuration. + This is primarily used to support legacy fixed trash labware without + modifying the deck layout to remove the similar, but functionally different, + trashBinAdapter cutout fixture. + + Besides that instance, for movement purposes, this should only be called for + areas that have been pre-validated, otherwise there could be the risk of collision. + """ + addressable_area = self._get_addressable_area_from_deck_data( + addressable_area_name=addressable_area_name, + do_compatibility_check=do_compatibility_check, + ) + position = addressable_area.position + return Point(x=position.x, y=position.y, z=position.z) + + def get_addressable_area_bounding_box( + self, + addressable_area_name: str, + do_compatibility_check: bool = True, + ) -> Dimensions: + """Get the bounding box of an addressable area. + + This does not require the addressable area to be in the deck configuration. + For movement purposes, this should only be called for + areas that have been pre-validated, otherwise there could be the risk of collision. + """ + addressable_area = self._get_addressable_area_from_deck_data( + addressable_area_name=addressable_area_name, + do_compatibility_check=do_compatibility_check, + ) + return addressable_area.bounding_box + + def get_addressable_area_move_to_location( + self, addressable_area_name: str + ) -> Point: + """Get the move-to position (top center) for an addressable area.""" + addressable_area = self.get_addressable_area(addressable_area_name) + position = addressable_area.position + bounding_box = addressable_area.bounding_box + return Point( + x=position.x + bounding_box.x / 2, + y=position.y + bounding_box.y / 2, + z=position.z + bounding_box.z, + ) + + def get_addressable_area_center(self, addressable_area_name: str) -> Point: + """Get the (x, y, z) position of the center of the area.""" + addressable_area = self.get_addressable_area(addressable_area_name) + position = addressable_area.position + bounding_box = addressable_area.bounding_box + return Point( + x=position.x + bounding_box.x / 2, + y=position.y + bounding_box.y / 2, + z=position.z, + ) + + def get_fixture_by_deck_slot_name( + self, slot_name: DeckSlotName + ) -> Optional[CutoutFixture]: + """Get the Cutout Fixture currently loaded where a specific Deck Slot would be.""" + deck_config = self.state.deck_configuration + if deck_config: + slot_cutout_id = DECK_SLOT_TO_CUTOUT_MAP[slot_name] + slot_cutout_fixture = None + # This will only ever be one under current assumptions + for cutout_id, cutout_fixture_id in deck_config: + if cutout_id == slot_cutout_id: + slot_cutout_fixture = ( + deck_configuration_provider.get_cutout_fixture( + cutout_fixture_id, self.state.deck_definition + ) + ) + return slot_cutout_fixture + if slot_cutout_fixture is None: + # If this happens, it's a bug. Either DECK_SLOT_TO_CUTOUT_MAP + # is missing an entry for the slot, or the deck configuration is missing + # an entry for the cutout. + raise CutoutDoesNotExistError( + f"No Cutout was found in the Deck that matched provided slot {slot_name}." + ) + return None + + def get_fixture_height(self, cutout_fixture_name: str) -> float: + """Get the z height of a cutout fixture.""" + cutout_fixture = deck_configuration_provider.get_cutout_fixture( + cutout_fixture_name, self._state.deck_definition + ) + return cutout_fixture["height"] + + def get_slot_definition(self, slot_id: str) -> SlotDefV3: + """Get the definition of a slot in the deck. + + This does not require that the slot exist in deck configuration. + """ + try: + addressable_area = self._get_addressable_area_from_deck_data( + addressable_area_name=slot_id, + do_compatibility_check=True, # From the description of get_slot_definition, this might have to be False. + ) + except AddressableAreaDoesNotExistError: + raise SlotDoesNotExistError( + f"Slot ID {slot_id} does not exist in deck {self._state.deck_definition['otId']}" + ) + position = addressable_area.position + bounding_box = addressable_area.bounding_box + return { + "id": addressable_area.area_name, + "position": [position.x, position.y, position.z], + "boundingBox": { + "xDimension": bounding_box.x, + "yDimension": bounding_box.y, + "zDimension": bounding_box.z, + }, + "displayName": addressable_area.display_name, + "compatibleModuleTypes": addressable_area.compatible_module_types, + } + + def get_deck_slot_definitions(self) -> Dict[str, SlotDefV3]: + """Get all standard slot definitions available in the deck definition.""" + if self._state.robot_type == "OT-2 Standard": + slots = _OT2_ORDERED_SLOTS + else: + slots = _FLEX_ORDERED_SLOTS + return {slot_name: self.get_slot_definition(slot_name) for slot_name in slots} + + def get_staging_slot_definitions(self) -> Dict[str, SlotDefV3]: + """Get all staging slot definitions available in the deck definition.""" + if self._state.robot_type == "OT-3 Standard": + return { + slot_name: self.get_slot_definition(slot_name) + for slot_name in _FLEX_ORDERED_STAGING_SLOTS + } + else: + return {} + + def raise_if_area_not_in_deck_configuration( + self, addressable_area_name: str + ) -> None: + """Raise error if an addressable area is not compatible with or in the deck configuration. + + For simulated runs/analysis, this will raise if the given addressable area is not compatible with other + previously referenced addressable areas, for example if a movable trash in A1 is in state, referencing the + deck slot A1 will raise since those two can't exist in any deck configuration combination. + + For an on robot run, it will check if it is in the robot's deck configuration, if not it will raise an error. + """ + if self._state.use_simulated_deck_config: + ( + cutout_id, + potential_fixtures, + ) = deck_configuration_provider.get_potential_cutout_fixtures( + addressable_area_name, self._state.deck_definition + ) + + self._check_if_area_is_compatible_with_potential_fixtures( + addressable_area_name, cutout_id, potential_fixtures + ) + else: + if ( + addressable_area_name + not in self._state.loaded_addressable_areas_by_name + ): + raise AreaNotInDeckConfigurationError( + f"{addressable_area_name} not provided by deck configuration." + ) diff --git a/api/src/opentrons/protocol_engine/state/commands.py b/api/src/opentrons/protocol_engine/state/commands.py index b4301c22920..97c15345721 100644 --- a/api/src/opentrons/protocol_engine/state/commands.py +++ b/api/src/opentrons/protocol_engine/state/commands.py @@ -4,7 +4,7 @@ from enum import Enum from dataclasses import dataclass from datetime import datetime -from typing import Dict, List, Mapping, Optional, Union +from typing import Dict, List, Optional, Union from opentrons_shared_data.errors import EnumeratedError, ErrorCodes, PythonException @@ -197,8 +197,6 @@ def __init__( def handle_action(self, action: Action) -> None: # noqa: C901 """Modify state in reaction to an action.""" - errors_by_id: Mapping[str, ErrorOccurrence] - if isinstance(action, QueueCommandAction): assert action.command_id not in self._state.commands_by_id @@ -642,6 +640,10 @@ def has_been_played(self) -> bool: """Get whether engine has started.""" return self._state.run_started_at is not None + def get_is_terminal(self) -> bool: + """Get whether engine is in a terminal state.""" + return self._state.run_result is not None + def validate_action_allowed( self, action: Union[PlayAction, PauseAction, StopAction, QueueCommandAction], diff --git a/api/src/opentrons/protocol_engine/state/config.py b/api/src/opentrons/protocol_engine/state/config.py index f1ba812bb8f..c5ba5fb07db 100644 --- a/api/src/opentrons/protocol_engine/state/config.py +++ b/api/src/opentrons/protocol_engine/state/config.py @@ -17,10 +17,14 @@ class Config: or pretending to control. ignore_pause: The engine should no-op instead of waiting for pauses and delays to complete. + use_virtual_pipettes: The engine should no-op instead of calling + instruments' hardware control API use_virtual_modules: The engine should no-op instead of calling modules' hardware control API. use_virtual_gripper: The engine should no-op instead of calling gripper hardware control API. + use_simulated_deck_config: The engine should lazily populate the deck + configuration instead of loading a provided configuration block_on_door_open: Protocol execution should pause if the front door is opened. """ @@ -31,4 +35,5 @@ class Config: use_virtual_pipettes: bool = False use_virtual_modules: bool = False use_virtual_gripper: bool = False + use_simulated_deck_config: bool = False block_on_door_open: bool = False diff --git a/api/src/opentrons/protocol_engine/state/geometry.py b/api/src/opentrons/protocol_engine/state/geometry.py index 6c90a9c670d..adfa5474d18 100644 --- a/api/src/opentrons/protocol_engine/state/geometry.py +++ b/api/src/opentrons/protocol_engine/state/geometry.py @@ -1,11 +1,23 @@ """Geometry state getters.""" import enum -from typing import Optional, List, Set, Tuple, Union, cast +from numpy import array, dot, double as npdouble +from numpy.typing import NDArray +from typing import Optional, List, Tuple, Union, cast, TypeVar, Dict + +from opentrons.types import Point, DeckSlotName, StagingSlotName, MountType -from opentrons.types import Point, DeckSlotName, MountType from opentrons_shared_data.labware.constants import WELL_NAME_PATTERN +from opentrons_shared_data.deck.dev_types import CutoutFixture +from opentrons_shared_data.pipette import PIPETTE_X_SPAN +from opentrons_shared_data.pipette.dev_types import ChannelCount from .. import errors +from ..errors import ( + LabwareNotLoadedOnLabwareError, + LabwareNotLoadedOnModuleError, + LabwareMovementNotAllowedError, +) +from ..resources import fixture_validation from ..types import ( OFF_DECK_LOCATION, LoadedLabware, @@ -18,25 +30,31 @@ DeckSlotLocation, ModuleLocation, OnLabwareLocation, - ModuleOffsetVector, LabwareLocation, LabwareOffsetVector, + ModuleOffsetVector, + ModuleOffsetData, DeckType, CurrentWell, + CurrentPipetteLocation, TipGeometry, LabwareMovementOffsetData, OnDeckLabwareLocation, + AddressableAreaLocation, + AddressableOffsetVector, + StagingSlotLocation, ) from .config import Config from .labware import LabwareView from .modules import ModuleView from .pipettes import PipetteView - -from opentrons_shared_data.pipette import PIPETTE_X_SPAN -from opentrons_shared_data.pipette.dev_types import ChannelCount +from .addressable_areas import AddressableAreaView SLOT_WIDTH = 128 +_PIPETTE_HOMED_POSITION_Z = ( + 248.0 # Height of the bottom of the nozzle without the tip attached when homed +) class _TipDropSection(enum.Enum): @@ -53,6 +71,9 @@ class _GripperMoveType(enum.Enum): DROP_LABWARE = enum.auto() +_LabwareLocation = TypeVar("_LabwareLocation", bound=LabwareLocation) + + # TODO(mc, 2021-06-03): continue evaluation of which selectors should go here # vs which selectors should be in LabwareView class GeometryView: @@ -64,13 +85,15 @@ def __init__( labware_view: LabwareView, module_view: ModuleView, pipette_view: PipetteView, + addressable_area_view: AddressableAreaView, ) -> None: """Initialize a GeometryView instance.""" self._config = config self._labware = labware_view self._modules = module_view self._pipettes = pipette_view - self._last_drop_tip_location_spot: Optional[_TipDropSection] = None + self._addressable_areas = addressable_area_view + self._last_drop_tip_location_spot: Dict[str, _TipDropSection] = {} def get_labware_highest_z(self, labware_id: str) -> float: """Get the highest Z-point of a labware.""" @@ -78,9 +101,8 @@ def get_labware_highest_z(self, labware_id: str) -> float: return self._get_highest_z_from_labware_data(labware_data) - # TODO(mc, 2022-06-24): rename this method - def get_all_labware_highest_z(self) -> float: - """Get the highest Z-point across all labware.""" + def get_all_obstacle_highest_z(self) -> float: + """Get the highest Z-point across all obstacles that the instruments need to fly over.""" highest_labware_z = max( ( self._get_highest_z_from_labware_data(lw_data) @@ -90,6 +112,8 @@ def get_all_labware_highest_z(self) -> float: default=0.0, ) + # Fixme (spp, 2023-12-04): the overall height is not the true highest z of modules + # on a Flex. highest_module_z = max( ( self._modules.get_overall_height(module.id) @@ -98,32 +122,99 @@ def get_all_labware_highest_z(self) -> float: default=0.0, ) - return max(highest_labware_z, highest_module_z) + cutout_fixture_names = self._addressable_areas.get_all_cutout_fixtures() + if cutout_fixture_names is None: + # We're using a simulated deck config (see `Config.use_simulated_deck_config`). + # We only know the addressable areas referenced by the protocol, not the fixtures + # providing them. And there is more than one possible configuration of fixtures + # to provide them. So, we can't know what the highest fixture is. Default to 0. + # + # Defaulting to 0 may not be the right thing to do here. + # For example, suppose a protocol references an addressable area that implies a tall + # fixture must be on the deck, and then it uses long tips that wouldn't be able to + # clear the top of that fixture. We should perhaps raise an analysis error for that, + # but defaulting to 0 here means we won't. + highest_fixture_z = 0.0 + else: + highest_fixture_z = max( + ( + self._addressable_areas.get_fixture_height(cutout_fixture_name) + for cutout_fixture_name in cutout_fixture_names + ), + default=0.0, + ) + + return max( + highest_labware_z, + highest_module_z, + highest_fixture_z, + ) + + def get_highest_z_in_slot( + self, slot: Union[DeckSlotLocation, StagingSlotLocation] + ) -> float: + """Get the highest Z-point of all items stacked in the given deck slot.""" + slot_item = self.get_slot_item(slot.slotName) + if isinstance(slot_item, LoadedModule): + # get height of module + all labware on it + module_id = slot_item.id + try: + labware_id = self._labware.get_id_by_module(module_id=module_id) + except LabwareNotLoadedOnModuleError: + deck_type = DeckType(self._labware.get_deck_definition()["otId"]) + return self._modules.get_module_highest_z( + module_id=module_id, deck_type=deck_type + ) + else: + return self.get_highest_z_of_labware_stack(labware_id) + elif isinstance(slot_item, LoadedLabware): + # get stacked heights of all labware in the slot + return self.get_highest_z_of_labware_stack(slot_item.id) + elif type(slot_item) is dict: + # TODO (cb, 2024-02-05): Eventually this logic should become the responsibility of bounding box + # conflict checking, as fixtures may not always be considered as items from slots. + return self._addressable_areas.get_fixture_height(slot_item["id"]) + else: + return 0 + + def get_highest_z_of_labware_stack(self, labware_id: str) -> float: + """Get the highest Z-point of the topmost labware in the stack of labware on the given labware. + + If there is no labware on the given labware, returns highest z of the given labware. + """ + try: + stacked_labware_id = self._labware.get_id_by_labware(labware_id) + except LabwareNotLoadedOnLabwareError: + return self.get_labware_highest_z(labware_id) + return self.get_highest_z_of_labware_stack(stacked_labware_id) def get_min_travel_z( self, pipette_id: str, labware_id: str, - location: Optional[CurrentWell], + location: Optional[CurrentPipetteLocation], minimum_z_height: Optional[float], ) -> float: """Get the minimum allowed travel height of an arc move.""" if ( - location is not None + isinstance(location, CurrentWell) and pipette_id == location.pipette_id and labware_id == location.labware_id ): min_travel_z = self.get_labware_highest_z(labware_id) else: - min_travel_z = self.get_all_labware_highest_z() + min_travel_z = self.get_all_obstacle_highest_z() if minimum_z_height: min_travel_z = max(min_travel_z, minimum_z_height) return min_travel_z def get_labware_parent_nominal_position(self, labware_id: str) -> Point: """Get the position of the labware's uncalibrated parent slot (deck, module, or another labware).""" - slot_name = self.get_ancestor_slot_name(labware_id) - slot_pos = self._labware.get_slot_position(slot_name) + try: + slot_name = self.get_ancestor_slot_name(labware_id).id + except errors.LocationIsStagingSlotError: + slot_name = self._get_staging_slot_name(labware_id) + slot_pos = self._addressable_areas.get_addressable_area_position(slot_name) labware_data = self._labware.get(labware_id) offset = self._get_labware_position_offset(labware_id, labware_data.location) @@ -149,7 +240,7 @@ def _get_labware_position_offset( on modules as well as stacking overlaps. Does not include module calibration offset or LPC offset. """ - if isinstance(labware_location, DeckSlotLocation): + if isinstance(labware_location, (AddressableAreaLocation, DeckSlotLocation)): return LabwareOffsetVector(x=0, y=0, z=0) elif isinstance(labware_location, ModuleLocation): module_id = labware_location.moduleId @@ -186,14 +277,50 @@ def _get_labware_position_offset( f"Either it has been loaded off-deck or its been moved off-deck." ) + def _normalize_module_calibration_offset( + self, + module_location: DeckSlotLocation, + offset_data: Optional[ModuleOffsetData], + ) -> ModuleOffsetVector: + """Normalize the module calibration offset depending on the module location.""" + if not offset_data: + return ModuleOffsetVector(x=0, y=0, z=0) + offset = offset_data.moduleOffsetVector + calibrated_slot = offset_data.location.slotName + calibrated_slot_column = self.get_slot_column(calibrated_slot) + current_slot_column = self.get_slot_column(module_location.slotName) + # make sure that we have valid colums since we cant have modules in the middle of the deck + assert set([calibrated_slot_column, current_slot_column]).issubset( + {1, 3} + ), f"Module calibration offset is an invalid slot {calibrated_slot}" + + # Check if the module has moved from one side of the deck to the other + if calibrated_slot_column != current_slot_column: + # Since the module was rotated, the calibration offset vector needs to be rotated by 180 degrees along the z axis + saved_offset: NDArray[npdouble] = array([offset.x, offset.y, offset.z]) + rotation_matrix: NDArray[npdouble] = array( + [[-1, 0, 0], [0, -1, 0], [0, 0, 1]] + ) + new_offset = dot(saved_offset, rotation_matrix) + offset = ModuleOffsetVector( + x=new_offset[0], y=new_offset[1], z=new_offset[2] + ) + return offset + def _get_calibrated_module_offset( self, location: LabwareLocation ) -> ModuleOffsetVector: """Get a labware location's underlying calibrated module offset, if it is on a module.""" if isinstance(location, ModuleLocation): module_id = location.moduleId - return self._modules.get_module_calibration_offset(module_id) - elif isinstance(location, DeckSlotLocation): + module_location = self._modules.get_location(module_id) + offset_data = self._modules.get_module_calibration_offset(module_id) + return self._normalize_module_calibration_offset( + module_location, offset_data + ) + elif isinstance(location, (DeckSlotLocation, AddressableAreaLocation)): + # TODO we might want to do a check here to make sure addressable area location is a standard deck slot + # and raise if its not (or maybe we don't actually care since modules will never be loaded elsewhere) return ModuleOffsetVector(x=0, y=0, z=0) elif isinstance(location, OnLabwareLocation): labware_data = self._labware.get(location.labwareId) @@ -305,6 +432,13 @@ def _get_highest_z_from_labware_data(self, lw_data: LoadedLabware) -> float: z_dim = definition.dimensions.zDimension height_over_labware: float = 0 if isinstance(lw_data.location, ModuleLocation): + # Note: when calculating highest z of stacked labware, height-over-labware + # gets accounted for only if the top labware is directly on the module. + # So if there's a labware on an adapter on a module, then this + # over-module-height gets ignored. We currently do not have any modules + # that use an adapter and has height over labware so this doesn't cause + # any issues yet. But if we add one in the future then this calculation + # should be updated. module_id = lw_data.location.moduleId height_over_labware = self._modules.get_height_over_labware(module_id) return labware_pos.z + z_dim + height_over_labware @@ -367,12 +501,20 @@ def get_checked_tip_drop_location( pipette_id: str, labware_id: str, well_location: DropTipWellLocation, + partially_configured: bool = False, ) -> WellLocation: """Get tip drop location given labware and hardware pipette. This makes sure that the well location has an appropriate origin & offset if one is not already set previously. """ + if ( + self._labware.get_definition(labware_id).parameters.isTiprack + and partially_configured + ): + raise errors.UnexpectedProtocolError( + "Cannot return tip to a tiprack while the pipette is configured for partial tip." + ) if well_location.origin != DropTipWellOrigin.DEFAULT: return WellLocation( origin=WellOrigin(well_location.origin.value), @@ -398,6 +540,22 @@ def get_checked_tip_drop_location( ), ) + # TODO(jbl 11-30-2023) fold this function into get_ancestor_slot_name see RSS-411 + def _get_staging_slot_name(self, labware_id: str) -> str: + """Get the staging slot name that the labware is on.""" + labware_location = self._labware.get(labware_id).location + if isinstance(labware_location, OnLabwareLocation): + below_labware_id = labware_location.labwareId + return self._get_staging_slot_name(below_labware_id) + elif isinstance( + labware_location, AddressableAreaLocation + ) and fixture_validation.is_staging_slot(labware_location.addressableAreaName): + return labware_location.addressableAreaName + else: + raise ValueError( + "Cannot get staging slot name for labware not on staging slot." + ) + def get_ancestor_slot_name(self, labware_id: str) -> DeckSlotName: """Get the slot name of the labware or the module that the labware is on.""" labware = self._labware.get(labware_id) @@ -411,6 +569,15 @@ def get_ancestor_slot_name(self, labware_id: str) -> DeckSlotName: elif isinstance(labware.location, OnLabwareLocation): below_labware_id = labware.location.labwareId slot_name = self.get_ancestor_slot_name(below_labware_id) + elif isinstance(labware.location, AddressableAreaLocation): + area_name = labware.location.addressableAreaName + # TODO we might want to eventually return some sort of staging slot name when we're ready to work through + # the linting nightmare it will create + if fixture_validation.is_staging_slot(area_name): + raise errors.LocationIsStagingSlotError( + "Cannot get ancestor slot name for labware on staging slot." + ) + slot_name = DeckSlotName.from_primitive(area_name) elif labware.location == OFF_DECK_LOCATION: raise errors.LabwareNotOnDeckError( f"Labware {labware_id} does not have a slot associated with it" @@ -420,18 +587,33 @@ def get_ancestor_slot_name(self, labware_id: str) -> DeckSlotName: return slot_name def ensure_location_not_occupied( - self, location: LabwareLocation - ) -> LabwareLocation: - """Ensure that the location does not already have equipment in it.""" - if isinstance(location, (DeckSlotLocation, ModuleLocation)): + self, location: _LabwareLocation + ) -> _LabwareLocation: + """Ensure that the location does not already have either Labware or a Module in it.""" + # TODO (spp, 2023-11-27): Slot locations can also be addressable areas + # so we will need to cross-check against items loaded in both location types. + # Something like 'check if an item is in lists of both- labware on addressable areas + # as well as labware on slots'. Same for modules. + if isinstance( + location, + ( + DeckSlotLocation, + ModuleLocation, + OnLabwareLocation, + AddressableAreaLocation, + ), + ): self._labware.raise_if_labware_in_location(location) + if isinstance(location, DeckSlotLocation): self._modules.raise_if_module_in_location(location) return location def get_labware_grip_point( self, labware_id: str, - location: Union[DeckSlotLocation, ModuleLocation, OnLabwareLocation], + location: Union[ + DeckSlotLocation, ModuleLocation, OnLabwareLocation, AddressableAreaLocation + ], ) -> Point: """Get the grip point of the labware as placed on the given location. @@ -446,16 +628,30 @@ def get_labware_grip_point( grip_height_from_labware_bottom = ( self._labware.get_grip_height_from_labware_bottom(labware_id) ) - location_slot: DeckSlotName + location_name: str if isinstance(location, DeckSlotLocation): - location_slot = location.slotName + location_name = location.slotName.id offset = LabwareOffsetVector(x=0, y=0, z=0) + elif isinstance(location, AddressableAreaLocation): + location_name = location.addressableAreaName + if fixture_validation.is_gripper_waste_chute(location_name): + drop_labware_location = ( + self._addressable_areas.get_addressable_area_move_to_location( + location_name + ) + ) + return drop_labware_location + Point(z=grip_height_from_labware_bottom) + # Location should have been pre-validated so this will be a deck/staging area slot + else: + offset = LabwareOffsetVector(x=0, y=0, z=0) else: if isinstance(location, ModuleLocation): - location_slot = self._modules.get_location(location.moduleId).slotName + location_name = self._modules.get_location( + location.moduleId + ).slotName.id else: # OnLabwareLocation - location_slot = self.get_ancestor_slot_name(location.labwareId) + location_name = self.get_ancestor_slot_name(location.labwareId).id labware_offset = self._get_labware_position_offset(labware_id, location) # Get the calibrated offset if the on labware location is on top of a module, otherwise return empty one cal_offset = self._get_calibrated_module_offset(location) @@ -465,50 +661,69 @@ def get_labware_grip_point( z=labware_offset.z + cal_offset.z, ) - slot_center = self._labware.get_slot_center_position(location_slot) + location_center = self._addressable_areas.get_addressable_area_center( + location_name + ) return Point( - slot_center.x + offset.x, - slot_center.y + offset.y, - slot_center.z + offset.z + grip_height_from_labware_bottom, + location_center.x + offset.x, + location_center.y + offset.y, + location_center.z + offset.z + grip_height_from_labware_bottom, ) def get_extra_waypoints( - self, labware_id: str, location: Optional[CurrentWell] + self, location: Optional[CurrentPipetteLocation], to_slot: DeckSlotName ) -> List[Tuple[float, float]]: """Get extra waypoints for movement if thermocycler needs to be dodged.""" - if location is not None and self._modules.should_dodge_thermocycler( - from_slot=self.get_ancestor_slot_name(location.labware_id), - to_slot=self.get_ancestor_slot_name(labware_id), - ): - middle_slot = DeckSlotName.SLOT_5.to_equivalent_for_robot_type( - self._config.robot_type - ) - middle_slot_center = self._labware.get_slot_center_position( - slot=middle_slot, - ) - return [(middle_slot_center.x, middle_slot_center.y)] + if location is not None: + if isinstance(location, CurrentWell): + from_slot = self.get_ancestor_slot_name(location.labware_id) + else: + from_slot = self._addressable_areas.get_addressable_area_base_slot( + location.addressable_area_name + ) + if self._modules.should_dodge_thermocycler( + from_slot=from_slot, to_slot=to_slot + ): + middle_slot = DeckSlotName.SLOT_5.to_equivalent_for_robot_type( + self._config.robot_type + ) + middle_slot_center = ( + self._addressable_areas.get_addressable_area_center( + addressable_area_name=middle_slot.id, + ) + ) + return [(middle_slot_center.x, middle_slot_center.y)] return [] - # TODO(mc, 2022-12-09): enforce data integrity (e.g. one module per slot) - # rather than shunting this work to callers via `allowed_ids`. - # This has larger implications and is tied up in splitting LPC out of the protocol run def get_slot_item( - self, - slot_name: DeckSlotName, - allowed_labware_ids: Set[str], - allowed_module_ids: Set[str], - ) -> Union[LoadedLabware, LoadedModule, None]: + self, slot_name: Union[DeckSlotName, StagingSlotName] + ) -> Union[LoadedLabware, LoadedModule, CutoutFixture, None]: """Get the item present in a deck slot, if any.""" maybe_labware = self._labware.get_by_slot( slot_name=slot_name, - allowed_ids=allowed_labware_ids, - ) - maybe_module = self._modules.get_by_slot( - slot_name=slot_name, - allowed_ids=allowed_module_ids, ) - return maybe_labware or maybe_module or None + if isinstance(slot_name, DeckSlotName): + maybe_fixture = self._addressable_areas.get_fixture_by_deck_slot_name( + slot_name + ) + # Ignore generic single slot fixtures + if maybe_fixture and maybe_fixture["id"] in { + "singleLeftSlot", + "singleCenterSlot", + "singleRightSlot", + }: + maybe_fixture = None + + maybe_module = self._modules.get_by_slot( + slot_name=slot_name, + ) + else: + # Modules and fixtures can't be loaded on staging slots + maybe_fixture = None + maybe_module = None + + return maybe_labware or maybe_module or maybe_fixture or None @staticmethod def get_slot_column(slot_name: DeckSlotName) -> int: @@ -569,7 +784,7 @@ def get_next_tip_drop_location( slot_name=self.get_ancestor_slot_name(labware_id) ) - if self._last_drop_tip_location_spot == _TipDropSection.RIGHT: + if self._last_drop_tip_location_spot.get(labware_id) == _TipDropSection.RIGHT: # Drop tip in LEFT section x_offset = self._get_drop_tip_well_x_offset( tip_drop_section=_TipDropSection.LEFT, @@ -578,7 +793,7 @@ def get_next_tip_drop_location( pipette_mount=pipette_mount, labware_slot_column=labware_slot_column, ) - self._last_drop_tip_location_spot = _TipDropSection.LEFT + self._last_drop_tip_location_spot[labware_id] = _TipDropSection.LEFT else: # Drop tip in RIGHT section x_offset = self._get_drop_tip_well_x_offset( @@ -588,7 +803,7 @@ def get_next_tip_drop_location( pipette_mount=pipette_mount, labware_slot_column=labware_slot_column, ) - self._last_drop_tip_location_spot = _TipDropSection.RIGHT + self._last_drop_tip_location_spot[labware_id] = _TipDropSection.RIGHT return DropTipWellLocation( origin=DropTipWellOrigin.TOP, @@ -599,6 +814,59 @@ def get_next_tip_drop_location( ), ) + # TODO find way to combine this with above + def get_next_tip_drop_location_for_addressable_area( + self, + addressable_area_name: str, + pipette_id: str, + ) -> AddressableOffsetVector: + """Get the next location within the specified well to drop the tip into. + + See the doc-string for `get_next_tip_drop_location` for more info on execution. + """ + area_x_dim = self._addressable_areas.get_addressable_area( + addressable_area_name + ).bounding_box.x + + pipette_channels = self._pipettes.get_config(pipette_id).channels + pipette_mount = self._pipettes.get_mount(pipette_id) + + labware_slot_column = self.get_slot_column( + slot_name=self._addressable_areas.get_addressable_area_base_slot( + addressable_area_name + ) + ) + + if ( + self._last_drop_tip_location_spot.get(addressable_area_name) + == _TipDropSection.RIGHT + ): + # Drop tip in LEFT section + x_offset = self._get_drop_tip_well_x_offset( + tip_drop_section=_TipDropSection.LEFT, + well_x_dim=area_x_dim, + pipette_channels=pipette_channels, + pipette_mount=pipette_mount, + labware_slot_column=labware_slot_column, + ) + self._last_drop_tip_location_spot[ + addressable_area_name + ] = _TipDropSection.LEFT + else: + # Drop tip in RIGHT section + x_offset = self._get_drop_tip_well_x_offset( + tip_drop_section=_TipDropSection.RIGHT, + well_x_dim=area_x_dim, + pipette_channels=pipette_channels, + pipette_mount=pipette_mount, + labware_slot_column=labware_slot_column, + ) + self._last_drop_tip_location_spot[ + addressable_area_name + ] = _TipDropSection.RIGHT + + return AddressableOffsetVector(x=x_offset, y=0, z=0) + @staticmethod def _get_drop_tip_well_x_offset( tip_drop_section: _TipDropSection, @@ -620,7 +888,7 @@ def _get_drop_tip_well_x_offset( ): # Pipette might not reach the default left spot so use a different left spot x_well_offset = ( - well_x_dim / 2 - SLOT_WIDTH + drop_location_margin_from_labware_edge + -well_x_dim / 2 + drop_location_margin_from_labware_edge * 2 ) else: x_well_offset = -well_x_dim / 2 + drop_location_margin_from_labware_edge @@ -672,10 +940,18 @@ def get_final_labware_movement_offset_vectors( @staticmethod def ensure_valid_gripper_location( location: LabwareLocation, - ) -> Union[DeckSlotLocation, ModuleLocation, OnLabwareLocation]: + ) -> Union[ + DeckSlotLocation, ModuleLocation, OnLabwareLocation, AddressableAreaLocation + ]: """Ensure valid on-deck location for gripper, otherwise raise error.""" if not isinstance( - location, (DeckSlotLocation, ModuleLocation, OnLabwareLocation) + location, + ( + DeckSlotLocation, + ModuleLocation, + OnLabwareLocation, + AddressableAreaLocation, + ), ): raise errors.LabwareMovementNotAllowedError( "Off-deck labware movements are not supported using the gripper." @@ -687,7 +963,9 @@ def get_total_nominal_gripper_offset_for_move_type( ) -> LabwareOffsetVector: """Get the total of the offsets to be used to pick up labware in its current location.""" if move_type == _GripperMoveType.PICK_UP_LABWARE: - if isinstance(location, (ModuleLocation, DeckSlotLocation)): + if isinstance( + location, (ModuleLocation, DeckSlotLocation, AddressableAreaLocation) + ): return self._nominal_gripper_offsets_for_location(location).pickUpOffset else: # If it's a labware on a labware (most likely an adapter), @@ -707,7 +985,9 @@ def get_total_nominal_gripper_offset_for_move_type( ).pickUpOffset ) else: - if isinstance(location, (ModuleLocation, DeckSlotLocation)): + if isinstance( + location, (ModuleLocation, DeckSlotLocation, AddressableAreaLocation) + ): return self._nominal_gripper_offsets_for_location(location).dropOffset else: # If it's a labware on a labware (most likely an adapter), @@ -727,11 +1007,43 @@ def get_total_nominal_gripper_offset_for_move_type( ).dropOffset ) + def check_gripper_labware_tip_collision( + self, + gripper_homed_position_z: float, + labware_id: str, + current_location: OnDeckLabwareLocation, + ) -> None: + """Check for potential collision of tips against labware to be lifted.""" + # TODO(cb, 2024-01-22): Remove the 1 and 8 channel special case once we are doing X axis validation + pipettes = self._pipettes.get_all() + for pipette in pipettes: + if self._pipettes.get_channels(pipette.id) in [1, 8]: + return + + tip = self._pipettes.get_attached_tip(pipette.id) + if tip: + labware_top_z_when_gripped = gripper_homed_position_z + ( + self.get_labware_highest_z(labware_id=labware_id) + - self.get_labware_grip_point( + labware_id=labware_id, location=current_location + ).z + ) + # TODO(cb, 2024-01-18): Utilizing the nozzle map and labware X coordinates verify if collisions will occur on the X axis (analysis will use hard coded data to measure from the gripper critical point to the pipette mount) + if ( + _PIPETTE_HOMED_POSITION_Z - tip.length + ) < labware_top_z_when_gripped: + raise LabwareMovementNotAllowedError( + f"Cannot move labware '{self._labware.get(labware_id).loadName}' when {int(tip.volume)} µL tips are attached." + ) + return + def _nominal_gripper_offsets_for_location( self, location: OnDeckLabwareLocation ) -> LabwareMovementOffsetData: """Provide the default gripper offset data for the given location type.""" - if isinstance(location, DeckSlotLocation): + if isinstance(location, (DeckSlotLocation, AddressableAreaLocation)): + # TODO we might need a separate type of gripper offset for addressable areas but that also might just + # be covered by the drop labware offset/location offsets = self._labware.get_deck_default_gripper_offsets() elif isinstance(location, ModuleLocation): offsets = self._modules.get_default_gripper_offsets(location.moduleId) diff --git a/api/src/opentrons/protocol_engine/state/labware.py b/api/src/opentrons/protocol_engine/state/labware.py index 4ce477cb4cb..c8792f516b0 100644 --- a/api/src/opentrons/protocol_engine/state/labware.py +++ b/api/src/opentrons/protocol_engine/state/labware.py @@ -9,25 +9,24 @@ Mapping, Optional, Sequence, - Set, - Union, Tuple, NamedTuple, cast, + Union, ) -from opentrons_shared_data.deck.dev_types import DeckDefinitionV3, SlotDefV3 +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4 from opentrons_shared_data.gripper.constants import LABWARE_GRIP_FORCE from opentrons_shared_data.labware.labware_definition import LabwareRole from opentrons_shared_data.pipette.dev_types import LabwareUri -from opentrons.types import DeckSlotName, Point, MountType +from opentrons.types import DeckSlotName, StagingSlotName, MountType from opentrons.protocols.api_support.constants import OPENTRONS_NAMESPACE from opentrons.protocols.models import LabwareDefinition, WellDefinition from opentrons.calibration_storage.helpers import uri_from_details from .. import errors -from ..resources import DeckFixedLabware, labware_validation +from ..resources import DeckFixedLabware, labware_validation, fixture_validation from ..commands import ( Command, LoadLabwareResult, @@ -36,6 +35,7 @@ from ..types import ( DeckSlotLocation, OnLabwareLocation, + AddressableAreaLocation, NonStackedLocation, Dimensions, LabwareOffset, @@ -47,6 +47,8 @@ ModuleModel, OverlapOffset, LabwareMovementOffsetData, + OnDeckLabwareLocation, + OFF_DECK_LOCATION, ) from ..actions import ( Action, @@ -104,7 +106,7 @@ class LabwareState: labware_offsets_by_id: Dict[str, LabwareOffset] definitions_by_uri: Dict[str, LabwareDefinition] - deck_definition: DeckDefinitionV3 + deck_definition: DeckDefinitionV4 class LabwareStore(HasState[LabwareState], HandlesActions): @@ -114,7 +116,7 @@ class LabwareStore(HasState[LabwareState], HandlesActions): def __init__( self, - deck_definition: DeckDefinitionV3, + deck_definition: DeckDefinitionV4, deck_fixed_labware: Sequence[DeckFixedLabware], ) -> None: """Initialize a labware store and its state.""" @@ -203,6 +205,13 @@ def _handle_command(self, command: Command) -> None: new_offset_id = command.result.offsetId self._state.labware_by_id[labware_id].offsetId = new_offset_id + if isinstance( + new_location, AddressableAreaLocation + ) and fixture_validation.is_gripper_waste_chute( + new_location.addressableAreaName + ): + # If a labware has been moved into a waste chute it's been chuted away and is now technically off deck + new_location = OFF_DECK_LOCATION self._state.labware_by_id[labware_id].location = new_location def _add_labware_offset(self, labware_offset: LabwareOffset) -> None: @@ -275,20 +284,20 @@ def raise_if_labware_has_labware_on_top(self, labware_id: str) -> None: f"Cannot move to labware {labware_id}, labware has other labware stacked on top." ) - # TODO(mc, 2022-12-09): enforce data integrity (e.g. one labware per slot) - # rather than shunting this work to callers via `allowed_ids`. - # This has larger implications and is tied up in splitting LPC out of the protocol run def get_by_slot( - self, slot_name: DeckSlotName, allowed_ids: Set[str] + self, + slot_name: Union[DeckSlotName, StagingSlotName], ) -> Optional[LoadedLabware]: """Get the labware located in a given slot, if any.""" - loaded_labware = reversed(list(self._state.labware_by_id.values())) + loaded_labware = list(self._state.labware_by_id.values()) for labware in loaded_labware: if ( isinstance(labware.location, DeckSlotLocation) - and labware.location.slotName == slot_name - and labware.id in allowed_ids + and labware.location.slotName.id == slot_name.id + ) or ( + isinstance(labware.location, AddressableAreaLocation) + and labware.location.addressableAreaName == slot_name.id ): return labware @@ -300,43 +309,24 @@ def get_definition(self, labware_id: str) -> LabwareDefinition: LabwareUri(self.get(labware_id).definitionUri) ) - def get_display_name(self, labware_id: str) -> Optional[str]: + def get_user_specified_display_name(self, labware_id: str) -> Optional[str]: """Get the labware's user-specified display name, if set.""" return self.get(labware_id).displayName - def get_deck_definition(self) -> DeckDefinitionV3: - """Get the current deck definition.""" - return self._state.deck_definition + def get_display_name(self, labware_id: str) -> str: + """Get the labware's display name. - def get_slot_definition(self, slot: DeckSlotName) -> SlotDefV3: - """Get the definition of a slot in the deck.""" - deck_def = self.get_deck_definition() - - for slot_def in deck_def["locations"]["orderedSlots"]: - if slot_def["id"] == slot.id: - return slot_def - - raise errors.SlotDoesNotExistError( - f"Slot ID {slot.id} does not exist in deck {deck_def['otId']}" + If a user-specified display name exists, will return that, else will return + display name from the definition. + """ + return ( + self.get_user_specified_display_name(labware_id) + or self.get_definition(labware_id).metadata.displayName ) - def get_slot_position(self, slot: DeckSlotName) -> Point: - """Get the position of a deck slot.""" - slot_def = self.get_slot_definition(slot) - position = slot_def["position"] - - return Point(x=position[0], y=position[1], z=position[2]) - - def get_slot_center_position(self, slot: DeckSlotName) -> Point: - """Get the (x, y, z) position of the center of the slot.""" - slot_def = self.get_slot_definition(slot) - position = slot_def["position"] - - return Point( - x=position[0] + slot_def["boundingBox"]["xDimension"] / 2, - y=position[1] + slot_def["boundingBox"]["yDimension"] / 2, - z=position[2] + slot_def["boundingBox"]["zDimension"] / 2, - ) + def get_deck_definition(self) -> DeckDefinitionV4: + """Get the current deck definition.""" + return self._state.deck_definition def get_definition_by_uri(self, uri: LabwareUri) -> LabwareDefinition: """Get the labware definition matching loadName namespace and version.""" @@ -391,6 +381,28 @@ def get_quirks(self, labware_id: str) -> List[str]: definition = self.get_definition(labware_id) return definition.parameters.quirks or [] + def get_should_center_column_on_target_well(self, labware_id: str) -> bool: + """True if a pipette moving to this labware should center its active column on the target. + + This is true for labware that have wells spanning entire columns. + """ + has_quirk = self.get_has_quirk(labware_id, "centerMultichannelOnWells") + return has_quirk and ( + len(self.get_definition(labware_id).wells) > 1 + and len(self.get_definition(labware_id).wells) < 96 + ) + + def get_should_center_pipette_on_target_well(self, labware_id: str) -> bool: + """True if a pipette moving to a well of this labware should center its body on the target. + + This is true for 1-well reservoirs no matter the pipette, and for large plates. + """ + has_quirk = self.get_has_quirk(labware_id, "centerMultichannelOnWells") + return has_quirk and ( + len(self.get_definition(labware_id).wells) == 1 + or len(self.get_definition(labware_id).wells) >= 96 + ) + def get_well_definition( self, labware_id: str, @@ -560,12 +572,27 @@ def get_module_overlap_offsets( """Get the labware's overlap with requested module model.""" definition = self.get_definition(labware_id) stacking_overlap = definition.stackingOffsetWithModule.get( - str(module_model.value), OverlapOffset(x=0, y=0, z=0) + str(module_model.value) ) + if not stacking_overlap: + if self._is_thermocycler_on_ot2(module_model): + return OverlapOffset(x=0, y=0, z=10.7) + else: + return OverlapOffset(x=0, y=0, z=0) + return OverlapOffset( x=stacking_overlap.x, y=stacking_overlap.y, z=stacking_overlap.z ) + def _is_thermocycler_on_ot2(self, module_model: ModuleModel) -> bool: + """Whether the given module is a thermocycler with the current deck being an OT2 deck.""" + robot_model = self.get_deck_definition()["robot"]["model"] + return ( + module_model + in [ModuleModel.THERMOCYCLER_MODULE_V1, ModuleModel.THERMOCYCLER_MODULE_V2] + and robot_model == "OT-2 Standard" + ) + def get_default_magnet_height(self, module_id: str, offset: float) -> float: """Return a labware's default Magnetic Module engage height with added offset, if supplied. @@ -646,7 +673,7 @@ def find_applicable_labware_offset( return None - def get_fixed_trash_id(self) -> str: + def get_fixed_trash_id(self) -> Optional[str]: """Get the identifier of labware loaded into the fixed trash location. Raises: @@ -661,17 +688,34 @@ def get_fixed_trash_id(self) -> str: DeckSlotName.SLOT_A3, }: return labware.id - - raise errors.LabwareNotLoadedError( - "No labware loaded into fixed trash location by this deck type." - ) + return None def is_fixed_trash(self, labware_id: str) -> bool: """Check if labware is fixed trash.""" - return self.get_fixed_trash_id() == labware_id + return self.get_has_quirk(labware_id, "fixedTrash") + + def raise_if_labware_inaccessible_by_pipette(self, labware_id: str) -> None: + """Raise an error if the specified location cannot be reached via a pipette.""" + labware = self.get(labware_id) + labware_location = labware.location + if isinstance(labware_location, OnLabwareLocation): + return self.raise_if_labware_inaccessible_by_pipette( + labware_location.labwareId + ) + elif isinstance(labware_location, AddressableAreaLocation): + if fixture_validation.is_staging_slot(labware_location.addressableAreaName): + raise errors.LocationNotAccessibleByPipetteError( + f"Cannot move pipette to {labware.loadName}," + f" labware is on staging slot {labware_location.addressableAreaName}" + ) + elif labware_location == OFF_DECK_LOCATION: + raise errors.LocationNotAccessibleByPipetteError( + f"Cannot move pipette to {labware.loadName}, labware is off-deck." + ) def raise_if_labware_in_location( - self, location: Union[DeckSlotLocation, ModuleLocation] + self, + location: OnDeckLabwareLocation, ) -> None: """Raise an error if the specified location has labware in it.""" for labware in self.get_all(): @@ -748,7 +792,16 @@ def get_labware_gripper_offsets( labware_id: str, slot_name: Optional[DeckSlotName], ) -> Optional[LabwareMovementOffsetData]: - """Get the labware's gripper offsets of the specified type.""" + """Get the labware's gripper offsets of the specified type. + + Returns: + If `slot_name` is provided, returns the gripper offsets that the labware definition + specifies just for that slot, or `None` if the labware definition doesn't have an + exact match. + + If `slot_name` is `None`, returns the gripper offsets that the labware + definition designates as "default," or `None` if it doesn't designate any as such. + """ parsed_offsets = self.get_definition(labware_id).gripperOffsets offset_key = slot_name.id if slot_name else "default" @@ -779,3 +832,87 @@ def get_grip_height_from_labware_bottom(self, labware_id: str) -> float: if recommended_height is not None else self.get_dimensions(labware_id).z / 2 ) + + @staticmethod + def _max_x_of_well(well_defn: WellDefinition) -> float: + if well_defn.shape == "rectangular": + return well_defn.x + (well_defn.xDimension or 0) / 2 + elif well_defn.shape == "circular": + return well_defn.x + (well_defn.diameter or 0) / 2 + else: + return well_defn.x + + @staticmethod + def _min_x_of_well(well_defn: WellDefinition) -> float: + if well_defn.shape == "rectangular": + return well_defn.x - (well_defn.xDimension or 0) / 2 + elif well_defn.shape == "circular": + return well_defn.x - (well_defn.diameter or 0) / 2 + else: + return 0 + + @staticmethod + def _max_y_of_well(well_defn: WellDefinition) -> float: + if well_defn.shape == "rectangular": + return well_defn.y + (well_defn.yDimension or 0) / 2 + elif well_defn.shape == "circular": + return well_defn.y + (well_defn.diameter or 0) / 2 + else: + return 0 + + @staticmethod + def _min_y_of_well(well_defn: WellDefinition) -> float: + if well_defn.shape == "rectangular": + return well_defn.y - (well_defn.yDimension or 0) / 2 + elif well_defn.shape == "circular": + return well_defn.y - (well_defn.diameter or 0) / 2 + else: + return 0 + + @staticmethod + def _max_z_of_well(well_defn: WellDefinition) -> float: + return well_defn.z + well_defn.depth + + def get_well_bbox(self, labware_id: str) -> Dimensions: + """Get the bounding box implied by the wells. + + The bounding box of the labware that is implied by the wells is that required + to contain the bounds of the wells - the y-span from the min-y bound of the min-y + well to the max-y bound of the max-y well, x ditto, z from labware 0 to the max-z + well top. + + This is used for the specific purpose of finding the reasonable uncertainty bounds of + where and how a gripper will interact with a labware. + """ + defn = self.get_definition(labware_id) + max_x: Optional[float] = None + min_x: Optional[float] = None + max_y: Optional[float] = None + min_y: Optional[float] = None + max_z: Optional[float] = None + + for well in defn.wells.values(): + well_max_x = self._max_x_of_well(well) + well_min_x = self._min_x_of_well(well) + well_max_y = self._max_y_of_well(well) + well_min_y = self._min_y_of_well(well) + well_max_z = self._max_z_of_well(well) + if (max_x is None) or (well_max_x > max_x): + max_x = well_max_x + if (max_y is None) or (well_max_y > max_y): + max_y = well_max_y + if (min_x is None) or (well_min_x < min_x): + min_x = well_min_x + if (min_y is None) or (well_min_y < min_y): + min_y = well_min_y + if (max_z is None) or (well_max_z > max_z): + max_z = well_max_z + if ( + max_x is None + or max_y is None + or min_x is None + or min_y is None + or max_z is None + ): + return Dimensions(0, 0, 0) + return Dimensions(max_x - min_x, max_y - min_y, max_z) diff --git a/api/src/opentrons/protocol_engine/state/modules.py b/api/src/opentrons/protocol_engine/state/modules.py index 438fba9aaa0..124915baeeb 100644 --- a/api/src/opentrons/protocol_engine/state/modules.py +++ b/api/src/opentrons/protocol_engine/state/modules.py @@ -9,13 +9,13 @@ NamedTuple, Optional, Sequence, - Set, Type, TypeVar, Union, overload, ) -from numpy import array, dot +from numpy import array, dot, double as npdouble +from numpy.typing import NDArray from opentrons.hardware_control.modules.magdeck import ( OFFSET_TO_LABWARE_BOTTOM as MAGNETIC_MODULE_OFFSET_TO_LABWARE_BOTTOM, @@ -35,6 +35,7 @@ LoadedModule, ModuleModel, ModuleOffsetVector, + ModuleOffsetData, ModuleType, ModuleDefinition, DeckSlotLocation, @@ -42,7 +43,6 @@ LabwareOffsetVector, HeaterShakerLatchStatus, HeaterShakerMovementRestrictors, - ModuleLocation, DeckType, LabwareMovementOffsetData, ) @@ -144,7 +144,7 @@ class ModuleState: substate_by_module_id: Dict[str, ModuleSubStateType] """Information about each module that's specific to the module type.""" - module_offset_by_serial: Dict[str, ModuleOffsetVector] + module_offset_by_serial: Dict[str, ModuleOffsetData] """Information about each modules offsets.""" @@ -154,7 +154,7 @@ class ModuleStore(HasState[ModuleState], HandlesActions): _state: ModuleState def __init__( - self, module_calibration_offsets: Optional[Dict[str, ModuleOffsetVector]] = None + self, module_calibration_offsets: Optional[Dict[str, ModuleOffsetData]] = None ) -> None: """Initialize a ModuleStore and its state.""" self._state = ModuleState( @@ -195,6 +195,7 @@ def _handle_command(self, command: Command) -> None: self._update_module_calibration( module_id=command.params.moduleId, module_offset=command.result.moduleOffset, + location=command.result.location, ) if isinstance( @@ -289,7 +290,10 @@ def _add_module_substate( ) def _update_module_calibration( - self, module_id: str, module_offset: ModuleOffsetVector + self, + module_id: str, + module_offset: ModuleOffsetVector, + location: DeckSlotLocation, ) -> None: module = self._state.hardware_by_module_id.get(module_id) if module: @@ -297,7 +301,10 @@ def _update_module_calibration( assert ( module_serial is not None ), "Expected a module SN and got None instead." - self._state.module_offset_by_serial[module_serial] = module_offset + self._state.module_offset_by_serial[module_serial] = ModuleOffsetData( + moduleOffsetVector=module_offset, + location=location, + ) def _handle_heater_shaker_commands( self, @@ -485,17 +492,15 @@ def get_all(self) -> List[LoadedModule]: """Get a list of all module entries in state.""" return [self.get(mod_id) for mod_id in self._state.slot_by_module_id.keys()] - # TODO(mc, 2022-12-09): enforce data integrity (e.g. one module per slot) - # rather than shunting this work to callers via `allowed_ids`. - # This has larger implications and is tied up in splitting LPC out of the protocol run def get_by_slot( - self, slot_name: DeckSlotName, allowed_ids: Set[str] + self, + slot_name: DeckSlotName, ) -> Optional[LoadedModule]: """Get the module located in a given slot, if any.""" slots_by_id = reversed(list(self._state.slot_by_module_id.items())) for module_id, module_slot in slots_by_id: - if module_slot == slot_name and module_id in allowed_ids: + if module_slot == slot_name: return self.get(module_id) return None @@ -650,23 +655,14 @@ def get_dimensions(self, module_id: str) -> ModuleDimensions: """Get the specified module's dimensions.""" return self.get_definition(module_id).dimensions - def get_module_calibration_offset(self, module_id: str) -> ModuleOffsetVector: - """Get the stored module calibration offset.""" - module_serial = self.get(module_id).serialNumber - if module_serial is not None: - offset = self._state.module_offset_by_serial.get(module_serial) - if offset: - return offset - return ModuleOffsetVector(x=0, y=0, z=0) - def get_nominal_module_offset( self, module_id: str, deck_type: DeckType ) -> LabwareOffsetVector: - """Get the module's offset vector computed with slot transform.""" + """Get the module's nominal offset vector computed with slot transform.""" definition = self.get_definition(module_id) slot = self.get_location(module_id).slotName.id - pre_transform = array( + pre_transform: NDArray[npdouble] = array( ( definition.labwareOffset.x, definition.labwareOffset.y, @@ -681,27 +677,22 @@ def get_nominal_module_offset( xforms_ser_offset = xforms_ser["labwareOffset"] # Apply the slot transform, if any - xform = array(xforms_ser_offset) - xformed = dot(xform, pre_transform) # type: ignore[no-untyped-call] + xform: NDArray[npdouble] = array(xforms_ser_offset) + xformed = dot(xform, pre_transform) return LabwareOffsetVector( x=xformed[0], y=xformed[1], z=xformed[2], ) - def get_module_offset( - self, module_id: str, deck_type: DeckType - ) -> LabwareOffsetVector: - """Get the module's offset vector computed with slot transform and calibrated module offsets.""" - offset_vector = self.get_nominal_module_offset(module_id, deck_type) - - # add the calibrated module offset if there is one - cal_offset = self.get_module_calibration_offset(module_id) - return LabwareOffsetVector( - x=offset_vector.x + cal_offset.x, - y=offset_vector.y + cal_offset.y, - z=offset_vector.z + cal_offset.z, - ) + def get_module_calibration_offset( + self, module_id: str + ) -> Optional[ModuleOffsetData]: + """Get the calibration module offset.""" + module_serial = self.get(module_id).serialNumber + if module_serial: + return self._state.module_offset_by_serial.get(module_serial) + return None def get_overall_height(self, module_id: str) -> float: """Get the height of the module, excluding any labware loaded atop it.""" @@ -712,6 +703,41 @@ def get_height_over_labware(self, module_id: str) -> float: """Get the height of module parts above module labware base.""" return self.get_dimensions(module_id).overLabwareHeight + def get_module_highest_z(self, module_id: str, deck_type: DeckType) -> float: + """Get the highest z point of the module, as placed on the robot. + + The highest Z of a module, unlike the bare overall height, depends on + the robot it is on. We will calculate this value using the info we already have + about the transformation of the module's placement, based on the deck it is on. + + This value is calculated as: + highest_z = ( nominal_robot_transformed_labware_offset_z + + z_difference_between_default_labware_offset_point_and_overall_height + + module_calibration_offset_z + ) + + For OT2, the default_labware_offset point is the same as nominal_robot_transformed_labware_offset_z + and hence the highest z will equal to the overall height of the module. + + For Flex, since those two offsets are not the same, the final highest z will be + transformed the same amount as the labware offset point is. + + Note: For thermocycler, the lid height is not taken into account. + """ + module_height = self.get_overall_height(module_id) + default_lw_offset_point = self.get_definition(module_id).labwareOffset.z + z_difference = module_height - default_lw_offset_point + + nominal_transformed_lw_offset_z = self.get_nominal_module_offset( + module_id=module_id, deck_type=deck_type + ).z + calibration_offset = self.get_module_calibration_offset(module_id) + return ( + nominal_transformed_lw_offset_z + + z_difference + + (calibration_offset.moduleOffsetVector.z if calibration_offset else 0) + ) + # TODO(mc, 2022-01-19): this method is missing unit test coverage and # is also unused. Remove or add tests. def get_lid_height(self, module_id: str) -> float: @@ -938,7 +964,8 @@ def get_heater_shaker_movement_restrictors( return hs_restrictors def raise_if_module_in_location( - self, location: Union[DeckSlotLocation, ModuleLocation] + self, + location: DeckSlotLocation, ) -> None: """Raise if the given location has a module in it.""" for module in self.get_all(): diff --git a/api/src/opentrons/protocol_engine/state/motion.py b/api/src/opentrons/protocol_engine/state/motion.py index 08195901af6..e8eff73447b 100644 --- a/api/src/opentrons/protocol_engine/state/motion.py +++ b/api/src/opentrons/protocol_engine/state/motion.py @@ -12,10 +12,17 @@ from . import move_types from .. import errors -from ..types import WellLocation, CurrentWell, MotorAxis +from ..types import ( + MotorAxis, + WellLocation, + CurrentWell, + CurrentPipetteLocation, + AddressableOffsetVector, +) from .config import Config from .labware import LabwareView from .pipettes import PipetteView +from .addressable_areas import AddressableAreaView from .geometry import GeometryView from .modules import ModuleView from .module_substates import HeaterShakerModuleId @@ -37,6 +44,7 @@ def __init__( config: Config, labware_view: LabwareView, pipette_view: PipetteView, + addressable_area_view: AddressableAreaView, geometry_view: GeometryView, module_view: ModuleView, ) -> None: @@ -44,32 +52,36 @@ def __init__( self._config = config self._labware = labware_view self._pipettes = pipette_view + self._addressable_areas = addressable_area_view self._geometry = geometry_view self._modules = module_view def get_pipette_location( self, pipette_id: str, - current_well: Optional[CurrentWell] = None, + current_location: Optional[CurrentPipetteLocation] = None, ) -> PipetteLocationData: """Get the critical point of a pipette given the current location.""" - current_well = current_well or self._pipettes.get_current_well() + current_location = current_location or self._pipettes.get_current_location() pipette_data = self._pipettes.get(pipette_id) mount = pipette_data.mount critical_point = None # if the pipette was last used to move to a labware that requires - # centering, set the critical point to XY_CENTER + # centering, set the critical point to the appropriate center if ( - current_well is not None - and current_well.pipette_id == pipette_id - and self._labware.get_has_quirk( - current_well.labware_id, - "centerMultichannelOnWells", - ) + isinstance(current_location, CurrentWell) + and current_location.pipette_id == pipette_id ): - critical_point = CriticalPoint.XY_CENTER + if self._labware.get_should_center_column_on_target_well( + current_location.labware_id + ): + critical_point = CriticalPoint.Y_CENTER + elif self._labware.get_should_center_pipette_on_target_well( + current_location.labware_id + ): + critical_point = CriticalPoint.XY_CENTER return PipetteLocationData(mount=mount, critical_point=critical_point) def get_movement_waypoints_to_well( @@ -86,18 +98,19 @@ def get_movement_waypoints_to_well( minimum_z_height: Optional[float] = None, ) -> List[motion_planning.Waypoint]: """Calculate waypoints to a destination that's specified as a well.""" - location = current_well or self._pipettes.get_current_well() - center_destination = self._labware.get_has_quirk( - labware_id, - "centerMultichannelOnWells", - ) + location = current_well or self._pipettes.get_current_location() + + destination_cp: Optional[CriticalPoint] = None + if self._labware.get_should_center_column_on_target_well(labware_id): + destination_cp = CriticalPoint.Y_CENTER + elif self._labware.get_should_center_pipette_on_target_well(labware_id): + destination_cp = CriticalPoint.XY_CENTER destination = self._geometry.get_well_position( labware_id, well_name, well_location, ) - destination_cp = CriticalPoint.XY_CENTER if center_destination else None move_type = move_types.get_move_type_to_well( pipette_id, labware_id, well_name, location, force_direct @@ -105,9 +118,90 @@ def get_movement_waypoints_to_well( min_travel_z = self._geometry.get_min_travel_z( pipette_id, labware_id, location, minimum_z_height ) + + destination_slot = self._geometry.get_ancestor_slot_name(labware_id) # TODO (spp, 11-29-2021): Should log some kind of warning that pipettes - # could crash onto the thermocycler if current well is not known. - extra_waypoints = self._geometry.get_extra_waypoints(labware_id, location) + # could crash onto the thermocycler if current well or addressable area is not known. + extra_waypoints = self._geometry.get_extra_waypoints( + location=location, to_slot=destination_slot + ) + + try: + return motion_planning.get_waypoints( + move_type=move_type, + origin=origin, + origin_cp=origin_cp, + dest=destination, + dest_cp=destination_cp, + min_travel_z=min_travel_z, + max_travel_z=max_travel_z, + xy_waypoints=extra_waypoints, + ) + except motion_planning.MotionPlanningError as error: + raise errors.FailedToPlanMoveError(str(error)) + + def get_movement_waypoints_to_addressable_area( + self, + addressable_area_name: str, + offset: AddressableOffsetVector, + origin: Point, + origin_cp: Optional[CriticalPoint], + max_travel_z: float, + force_direct: bool = False, + minimum_z_height: Optional[float] = None, + stay_at_max_travel_z: bool = False, + ignore_tip_configuration: Optional[bool] = True, + ) -> List[motion_planning.Waypoint]: + """Calculate waypoints to a destination that's specified as an addressable area.""" + location = self._pipettes.get_current_location() + + base_destination = ( + self._addressable_areas.get_addressable_area_move_to_location( + addressable_area_name + ) + ) + if stay_at_max_travel_z: + base_destination_at_max_z = Point( + base_destination.x, + base_destination.y, + # HACK(mm, 2023-12-18): We want to travel exactly at max_travel_z, but + # motion_planning.get_waypoints() won't let us--the highest we can go is this margin + # beneath max_travel_z. Investigate why motion_planning.get_waypoints() does not + # let us travel at max_travel_z, and whether it's safe to make it do that. + # Possibly related: https://github.com/Opentrons/opentrons/pull/6882#discussion_r514248062 + max_travel_z - motion_planning.waypoints.MINIMUM_Z_MARGIN, + ) + destination = base_destination_at_max_z + Point( + offset.x, offset.y, offset.z + ) + else: + destination = base_destination + Point(offset.x, offset.y, offset.z) + + # TODO(jbl 11-28-2023) This may need to change for partial tip configurations on a 96 + if ignore_tip_configuration: + destination_cp = CriticalPoint.INSTRUMENT_XY_CENTER + else: + destination_cp = CriticalPoint.XY_CENTER + + all_labware_highest_z = self._geometry.get_all_obstacle_highest_z() + if minimum_z_height is None: + minimum_z_height = float("-inf") + min_travel_z = max(all_labware_highest_z, minimum_z_height) + + move_type = ( + motion_planning.MoveType.DIRECT + if force_direct + else motion_planning.MoveType.GENERAL_ARC + ) + + destination_slot = self._addressable_areas.get_addressable_area_base_slot( + addressable_area_name + ) + # TODO (spp, 11-29-2021): Should log some kind of warning that pipettes + # could crash onto the thermocycler if current well or addressable area is not known. + extra_waypoints = self._geometry.get_extra_waypoints( + location=location, to_slot=destination_slot + ) try: return motion_planning.get_waypoints( @@ -144,7 +238,7 @@ def get_movement_waypoints_to_coords( Ignored if `direct` is True. If lower than the default height, the default is used; this can only increase the height, not decrease it. """ - all_labware_highest_z = self._geometry.get_all_labware_highest_z() + all_labware_highest_z = self._geometry.get_all_obstacle_highest_z() if additional_min_travel_z is None: additional_min_travel_z = float("-inf") min_travel_z = max(all_labware_highest_z, additional_min_travel_z) @@ -173,11 +267,18 @@ def check_pipette_blocking_hs_latch( ) -> bool: """Check if pipette would block h/s latch from opening if it is east, west or on module.""" pipette_blocking = True - current_well = self._pipettes.get_current_well() - if current_well is not None: - pipette_deck_slot = self._geometry.get_ancestor_slot_name( - current_well.labware_id - ).as_int() + current_location = self._pipettes.get_current_location() + if current_location is not None: + if isinstance(current_location, CurrentWell): + pipette_deck_slot = self._geometry.get_ancestor_slot_name( + current_location.labware_id + ).as_int() + else: + pipette_deck_slot = ( + self._addressable_areas.get_addressable_area_base_slot( + current_location.addressable_area_name + ).as_int() + ) hs_deck_slot = self._modules.get_location(hs_module_id).slotName.as_int() conflicting_slots = get_east_west_slots(hs_deck_slot) + [hs_deck_slot] pipette_blocking = pipette_deck_slot in conflicting_slots @@ -188,11 +289,18 @@ def check_pipette_blocking_hs_shaker( ) -> bool: """Check if pipette would block h/s latch from starting shake if it is adjacent or on module.""" pipette_blocking = True - current_well = self._pipettes.get_current_well() - if current_well is not None: - pipette_deck_slot = self._geometry.get_ancestor_slot_name( - current_well.labware_id - ).as_int() + current_location = self._pipettes.get_current_location() + if current_location is not None: + if isinstance(current_location, CurrentWell): + pipette_deck_slot = self._geometry.get_ancestor_slot_name( + current_location.labware_id + ).as_int() + else: + pipette_deck_slot = ( + self._addressable_areas.get_addressable_area_base_slot( + current_location.addressable_area_name + ).as_int() + ) hs_deck_slot = self._modules.get_location(hs_module_id).slotName.as_int() conflicting_slots = get_adjacent_slots(hs_deck_slot) + [hs_deck_slot] pipette_blocking = pipette_deck_slot in conflicting_slots @@ -221,12 +329,12 @@ def get_touch_tip_waypoints( positions = move_types.get_edge_point_list( center_point, x_offset, y_offset, edge_path_type ) + critical_point: Optional[CriticalPoint] = None - critical_point = ( - CriticalPoint.XY_CENTER - if self._labware.get_has_quirk(labware_id, "centerMultichannelOnWells") - else None - ) + if self._labware.get_should_center_column_on_target_well(labware_id): + critical_point = CriticalPoint.Y_CENTER + elif self._labware.get_should_center_pipette_on_target_well(labware_id): + critical_point = CriticalPoint.XY_CENTER return [ motion_planning.Waypoint(position=p, critical_point=critical_point) diff --git a/api/src/opentrons/protocol_engine/state/move_types.py b/api/src/opentrons/protocol_engine/state/move_types.py index b28c0d0be94..b8dcb28bd8d 100644 --- a/api/src/opentrons/protocol_engine/state/move_types.py +++ b/api/src/opentrons/protocol_engine/state/move_types.py @@ -6,7 +6,7 @@ from opentrons.types import Point from opentrons.motion_planning.types import MoveType -from ..types import CurrentWell +from ..types import CurrentWell, CurrentPipetteLocation @dataclass @@ -32,14 +32,14 @@ def get_move_type_to_well( pipette_id: str, labware_id: str, well_name: str, - location: Optional[CurrentWell], + location: Optional[CurrentPipetteLocation], force_direct: bool, ) -> MoveType: """Get the move type for a move to well command.""" if force_direct: return MoveType.DIRECT if ( - location is not None + isinstance(location, CurrentWell) and pipette_id == location.pipette_id and labware_id == location.labware_id ): diff --git a/api/src/opentrons/protocol_engine/state/pipettes.py b/api/src/opentrons/protocol_engine/state/pipettes.py index 729bcf47383..a1269c9a8f5 100644 --- a/api/src/opentrons/protocol_engine/state/pipettes.py +++ b/api/src/opentrons/protocol_engine/state/pipettes.py @@ -6,7 +6,11 @@ from opentrons_shared_data.pipette import pipette_definition from opentrons.config.defaults_ot2 import Z_RETRACT_DISTANCE from opentrons.hardware_control.dev_types import PipetteDict -from opentrons.types import MountType, Mount as HwMount +from opentrons.hardware_control.nozzle_manager import ( + NozzleConfigurationType, + NozzleMap, +) +from opentrons.types import MountType, Mount as HwMount, Point from .. import errors from ..types import ( @@ -15,30 +19,40 @@ FlowRates, DeckPoint, CurrentWell, + CurrentAddressableArea, + CurrentPipetteLocation, TipGeometry, ) from ..commands import ( Command, LoadPipetteResult, AspirateResult, + AspirateInPlaceResult, DispenseResult, DispenseInPlaceResult, MoveLabwareResult, MoveToCoordinatesResult, MoveToWellResult, MoveRelativeResult, + MoveToAddressableAreaResult, + MoveToAddressableAreaForDropTipResult, PickUpTipResult, DropTipResult, DropTipInPlaceResult, HomeResult, RetractAxisResult, BlowOutResult, + BlowOutInPlaceResult, TouchTipResult, thermocycler, heater_shaker, CommandPrivateResult, + PrepareToAspirateResult, +) +from ..commands.configuring_common import ( + PipetteConfigUpdateResultMixin, + PipetteNozzleLayoutResultMixin, ) -from ..commands.configuring_common import PipetteConfigUpdateResultMixin from ..actions import ( Action, SetPipetteMovementSpeedAction, @@ -63,6 +77,14 @@ class CurrentDeckPoint: deck_point: Optional[DeckPoint] +@dataclass(frozen=True) +class BoundingNozzlesOffsets: + """Offsets of the bounding nozzles of the pipette.""" + + back_left_offset: Point + front_right_offset: Point + + @dataclass(frozen=True) class StaticPipetteConfig: """Static config for a pipette.""" @@ -79,6 +101,7 @@ class StaticPipetteConfig: nominal_tip_overlap: Dict[str, float] home_position: float nozzle_offset_z: float + bounding_nozzle_offsets: BoundingNozzlesOffsets @dataclass @@ -87,12 +110,13 @@ class PipetteState: pipettes_by_id: Dict[str, LoadedPipette] aspirated_volume_by_id: Dict[str, Optional[float]] - current_well: Optional[CurrentWell] + current_location: Optional[CurrentPipetteLocation] current_deck_point: CurrentDeckPoint attached_tip_by_id: Dict[str, Optional[TipGeometry]] movement_speed_by_id: Dict[str, Optional[float]] static_config_by_id: Dict[str, StaticPipetteConfig] flow_rates_by_id: Dict[str, FlowRates] + nozzle_configuration_by_id: Dict[str, Optional[NozzleMap]] class PipetteStore(HasState[PipetteState], HandlesActions): @@ -106,11 +130,12 @@ def __init__(self) -> None: pipettes_by_id={}, aspirated_volume_by_id={}, attached_tip_by_id={}, - current_well=None, + current_location=None, current_deck_point=CurrentDeckPoint(mount=None, deck_point=None), movement_speed_by_id={}, static_config_by_id={}, flow_rates_by_id={}, + nozzle_configuration_by_id={}, ) def handle_action(self, action: Action) -> None: @@ -123,7 +148,7 @@ def handle_action(self, action: Action) -> None: def _handle_command( # noqa: C901 self, command: Command, private_result: CommandPrivateResult ) -> None: - self._update_current_well(command) + self._update_current_location(command) self._update_deck_point(command) if isinstance(private_result, PipetteConfigUpdateResultMixin): @@ -141,8 +166,16 @@ def _handle_command( # noqa: C901 nominal_tip_overlap=config.nominal_tip_overlap, home_position=config.home_position, nozzle_offset_z=config.nozzle_offset_z, + bounding_nozzle_offsets=BoundingNozzlesOffsets( + back_left_offset=config.back_left_nozzle_offset, + front_right_offset=config.front_right_nozzle_offset, + ), ) self._state.flow_rates_by_id[private_result.pipette_id] = config.flow_rates + elif isinstance(private_result, PipetteNozzleLayoutResultMixin): + self._state.nozzle_configuration_by_id[ + private_result.pipette_id + ] = private_result.nozzle_map if isinstance(command.result, LoadPipetteResult): pipette_id = command.result.pipetteId @@ -155,10 +188,13 @@ def _handle_command( # noqa: C901 self._state.aspirated_volume_by_id[pipette_id] = None self._state.movement_speed_by_id[pipette_id] = None self._state.attached_tip_by_id[pipette_id] = None + self._state.nozzle_configuration_by_id[pipette_id] = None - elif isinstance(command.result, AspirateResult): + elif isinstance(command.result, (AspirateResult, AspirateInPlaceResult)): pipette_id = command.params.pipetteId previous_volume = self._state.aspirated_volume_by_id[pipette_id] or 0 + # PipetteHandler will have clamped command.result.volume for us, so + # next_volume should always be in bounds. next_volume = previous_volume + command.result.volume self._state.aspirated_volume_by_id[pipette_id] = next_volume @@ -166,7 +202,9 @@ def _handle_command( # noqa: C901 elif isinstance(command.result, (DispenseResult, DispenseInPlaceResult)): pipette_id = command.params.pipetteId previous_volume = self._state.aspirated_volume_by_id[pipette_id] or 0 - next_volume = max(0.0, previous_volume - command.result.volume) + # PipetteHandler will have clamped command.result.volume for us, so + # next_volume should always be in bounds. + next_volume = previous_volume - command.result.volume self._state.aspirated_volume_by_id[pipette_id] = next_volume elif isinstance(command.result, PickUpTipResult): @@ -217,13 +255,17 @@ def _handle_command( # noqa: C901 default_aspirate=tip_configuration.default_aspirate_flowrate.values_by_api_level, default_dispense=tip_configuration.default_dispense_flowrate.values_by_api_level, ) - elif isinstance(command.result, BlowOutResult): + elif isinstance(command.result, (BlowOutResult, BlowOutInPlaceResult)): pipette_id = command.params.pipetteId self._state.aspirated_volume_by_id[pipette_id] = None - def _update_current_well(self, command: Command) -> None: - # These commands leave the pipette in a new well. - # Update current_well to reflect that. + elif isinstance(command.result, PrepareToAspirateResult): + pipette_id = command.params.pipetteId + self._state.aspirated_volume_by_id[pipette_id] = 0 + + def _update_current_location(self, command: Command) -> None: + # These commands leave the pipette in a new location. + # Update current_location to reflect that. if isinstance( command.result, ( @@ -236,17 +278,26 @@ def _update_current_well(self, command: Command) -> None: TouchTipResult, ), ): - self._state.current_well = CurrentWell( + self._state.current_location = CurrentWell( pipette_id=command.params.pipetteId, labware_id=command.params.labwareId, well_name=command.params.wellName, ) + elif isinstance( + command.result, + (MoveToAddressableAreaResult, MoveToAddressableAreaForDropTipResult), + ): + self._state.current_location = CurrentAddressableArea( + pipette_id=command.params.pipetteId, + addressable_area_name=command.params.addressableAreaName, + ) + # These commands leave the pipette in a place that we can't logically associate - # with a well. Clear current_well to reflect the fact that it's now unknown. + # with a well. Clear current_location to reflect the fact that it's now unknown. # - # TODO(mc, 2021-11-12): Wipe out current_well on movement failures, too. - # TODO(jbl 2023-02-14): Need to investigate whether move relative should clear current well + # TODO(mc, 2021-11-12): Wipe out current_location on movement failures, too. + # TODO(jbl 2023-02-14): Need to investigate whether move relative should clear current location elif isinstance( command.result, ( @@ -257,7 +308,7 @@ def _update_current_well(self, command: Command) -> None: thermocycler.CloseLidResult, ), ): - self._state.current_well = None + self._state.current_location = None # Heater-Shaker commands may have left the pipette in a place that we can't # associate with a logical location, depending on their result. @@ -269,10 +320,10 @@ def _update_current_well(self, command: Command) -> None: ), ): if command.result.pipetteRetracted: - self._state.current_well = None + self._state.current_location = None # A moveLabware command may have moved the labware that contains the current - # well out from under the pipette. Clear the current well to reflect the + # well out from under the pipette. Clear the current location to reflect the # fact that the pipette is no longer over any labware. # # This is necessary for safe motion planning in case the next movement @@ -281,12 +332,12 @@ def _update_current_well(self, command: Command) -> None: moved_labware_id = command.params.labwareId if command.params.strategy == "usingGripper": # All mounts will have been retracted. - self._state.current_well = None + self._state.current_location = None elif ( - self._state.current_well is not None - and self._state.current_well.labware_id == moved_labware_id + isinstance(self._state.current_location, CurrentWell) + and self._state.current_location.labware_id == moved_labware_id ): - self._state.current_well = None + self._state.current_location = None def _update_deck_point(self, command: Command) -> None: if isinstance( @@ -295,6 +346,8 @@ def _update_deck_point(self, command: Command) -> None: MoveToWellResult, MoveToCoordinatesResult, MoveRelativeResult, + MoveToAddressableAreaResult, + MoveToAddressableAreaForDropTipResult, PickUpTipResult, DropTipResult, AspirateResult, @@ -408,9 +461,9 @@ def get_hardware_pipette( return HardwarePipette(mount=hw_mount, config=hw_config) - def get_current_well(self) -> Optional[CurrentWell]: - """Get the last accessed well and which pipette accessed it.""" - return self._state.current_well + def get_current_location(self) -> Optional[CurrentPipetteLocation]: + """Get the last accessed location and which pipette accessed it.""" + return self._state.current_location def get_deck_point(self, pipette_id: str) -> Optional[DeckPoint]: """Get the deck point of a pipette by ID, or None if it was not associated with the last move operation.""" @@ -530,6 +583,10 @@ def get_serial_number(self, pipette_id: str) -> str: """Get the serial number of the pipette.""" return self.get_config(pipette_id).serial_number + def get_channels(self, pipette_id: str) -> int: + """Return the max channels of the pipette.""" + return self.get_config(pipette_id).channels + def get_minimum_volume(self, pipette_id: str) -> float: """Return the given pipette's minimum volume.""" return self.get_config(pipette_id).min_volume @@ -592,3 +649,78 @@ def get_plunger_axis(self, pipette_id: str) -> MotorAxis: if mount == MountType.LEFT else MotorAxis.RIGHT_PLUNGER ) + + def get_nozzle_layout_type(self, pipette_id: str) -> NozzleConfigurationType: + """Get the current set nozzle layout configuration.""" + nozzle_map_for_pipette = self._state.nozzle_configuration_by_id.get(pipette_id) + if nozzle_map_for_pipette: + return nozzle_map_for_pipette.configuration + else: + return NozzleConfigurationType.FULL + + def get_is_partially_configured(self, pipette_id: str) -> bool: + """Determine if the provided pipette is partially configured.""" + return self.get_nozzle_layout_type(pipette_id) != NozzleConfigurationType.FULL + + def get_primary_nozzle(self, pipette_id: str) -> Optional[str]: + """Get the primary nozzle, if any, related to the given pipette's nozzle configuration.""" + nozzle_map = self._state.nozzle_configuration_by_id.get(pipette_id) + return nozzle_map.starting_nozzle if nozzle_map else None + + def get_primary_nozzle_offset(self, pipette_id: str) -> Point: + """Get the pipette's current primary nozzle's offset.""" + nozzle_map = self._state.nozzle_configuration_by_id.get(pipette_id) + if nozzle_map: + primary_nozzle_offset = nozzle_map.starting_nozzle_offset + else: + # When not in partial configuration, back-left nozzle is the primary + primary_nozzle_offset = self.get_config( + pipette_id + ).bounding_nozzle_offsets.back_left_offset + return primary_nozzle_offset + + def get_pipette_bounding_nozzle_offsets( + self, pipette_id: str + ) -> BoundingNozzlesOffsets: + """Get the nozzle offsets of the pipette's bounding nozzles.""" + return self.get_config(pipette_id).bounding_nozzle_offsets + + def get_nozzle_bounds_at_specified_move_to_position( + self, + pipette_id: str, + destination_position: Point, + ) -> Tuple[Point, Point, Point, Point]: + """Get the given pipette's bounding nozzles' positions when primary nozzle is at the given destination position.""" + primary_nozzle_offset = self.get_primary_nozzle_offset(pipette_id) + tip = self.get_attached_tip(pipette_id) + # Primary nozzle position at destination, in deck coordinates + primary_nozzle_position = destination_position + Point( + x=0, y=0, z=tip.length if tip else 0 + ) + + # Get the pipette bounding box based on total nozzles + bounding_nozzles_offsets = self.get_pipette_bounding_nozzle_offsets(pipette_id) + + # TODO (spp): add a margin to these bounds + pip_back_left_bound = ( + primary_nozzle_position + - primary_nozzle_offset + + bounding_nozzles_offsets.back_left_offset + ) + pip_front_right_bound = ( + primary_nozzle_position + - primary_nozzle_offset + + bounding_nozzles_offsets.front_right_offset + ) + pip_back_right_bound = Point( + pip_front_right_bound.x, pip_back_left_bound.y, pip_front_right_bound.z + ) + pip_front_left_bound = Point( + pip_back_left_bound.x, pip_front_right_bound.y, pip_back_left_bound.z + ) + return ( + pip_back_left_bound, + pip_front_right_bound, + pip_back_right_bound, + pip_front_left_bound, + ) diff --git a/api/src/opentrons/protocol_engine/state/state.py b/api/src/opentrons/protocol_engine/state/state.py index e2ffc888e85..001f79fda1f 100644 --- a/api/src/opentrons/protocol_engine/state/state.py +++ b/api/src/opentrons/protocol_engine/state/state.py @@ -4,15 +4,21 @@ from dataclasses import dataclass from functools import partial from typing import Any, Callable, Dict, List, Optional, Sequence, TypeVar -from opentrons.protocol_engine.types import ModuleOffsetVector -from opentrons_shared_data.deck.dev_types import DeckDefinitionV3 +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4 + +from opentrons.protocol_engine.types import ModuleOffsetData from ..resources import DeckFixedLabware from ..actions import Action, ActionHandler from .abstract_store import HasState, HandlesActions from .change_notifier import ChangeNotifier from .commands import CommandState, CommandStore, CommandView +from .addressable_areas import ( + AddressableAreaState, + AddressableAreaStore, + AddressableAreaView, +) from .labware import LabwareState, LabwareStore, LabwareView from .pipettes import PipetteState, PipetteStore, PipetteView from .modules import ModuleState, ModuleStore, ModuleView @@ -22,6 +28,7 @@ from .motion import MotionView from .config import Config from .state_summary import StateSummary +from ..types import DeckConfigurationType ReturnT = TypeVar("ReturnT") @@ -31,6 +38,7 @@ class State: """Underlying engine state.""" commands: CommandState + addressable_areas: AddressableAreaState labware: LabwareState pipettes: PipetteState modules: ModuleState @@ -43,6 +51,7 @@ class StateView(HasState[State]): _state: State _commands: CommandView + _addressable_areas: AddressableAreaView _labware: LabwareView _pipettes: PipetteView _modules: ModuleView @@ -57,6 +66,11 @@ def commands(self) -> CommandView: """Get state view selectors for commands state.""" return self._commands + @property + def addressable_areas(self) -> AddressableAreaView: + """Get state view selectors for addressable area state.""" + return self._addressable_areas + @property def labware(self) -> LabwareView: """Get state view selectors for labware state.""" @@ -100,6 +114,7 @@ def config(self) -> Config: def get_summary(self) -> StateSummary: """Get protocol run data.""" error = self._commands.get_error() + # TODO maybe add summary here for AA return StateSummary.construct( status=self._commands.get_status(), errors=[] if error is None else [error], @@ -125,11 +140,12 @@ def __init__( self, *, config: Config, - deck_definition: DeckDefinitionV3, + deck_definition: DeckDefinitionV4, deck_fixed_labware: Sequence[DeckFixedLabware], is_door_open: bool, change_notifier: Optional[ChangeNotifier] = None, - module_calibration_offsets: Optional[Dict[str, ModuleOffsetVector]] = None, + module_calibration_offsets: Optional[Dict[str, ModuleOffsetData]] = None, + deck_configuration: Optional[DeckConfigurationType] = None, ) -> None: """Initialize a StateStore and its substores. @@ -142,9 +158,17 @@ def __init__( is_door_open: Whether the robot's door is currently open. change_notifier: Internal state change notifier. module_calibration_offsets: Module offsets to preload. + deck_configuration: The initial deck configuration the addressable area store will be instantiated with. """ self._command_store = CommandStore(config=config, is_door_open=is_door_open) self._pipette_store = PipetteStore() + if deck_configuration is None: + deck_configuration = [] + self._addressable_area_store = AddressableAreaStore( + deck_configuration=deck_configuration, + config=config, + deck_definition=deck_definition, + ) self._labware_store = LabwareStore( deck_fixed_labware=deck_fixed_labware, deck_definition=deck_definition, @@ -158,6 +182,7 @@ def __init__( self._substores: List[HandlesActions] = [ self._command_store, self._pipette_store, + self._addressable_area_store, self._labware_store, self._module_store, self._liquid_store, @@ -242,6 +267,7 @@ def _get_next_state(self) -> State: """Get a new instance of the state value object.""" return State( commands=self._command_store.state, + addressable_areas=self._addressable_area_store.state, labware=self._labware_store.state, pipettes=self._pipette_store.state, modules=self._module_store.state, @@ -256,6 +282,7 @@ def _initialize_state(self) -> None: # Base states self._state = state self._commands = CommandView(state.commands) + self._addressable_areas = AddressableAreaView(state.addressable_areas) self._labware = LabwareView(state.labware) self._pipettes = PipetteView(state.pipettes) self._modules = ModuleView(state.modules) @@ -268,11 +295,13 @@ def _initialize_state(self) -> None: labware_view=self._labware, module_view=self._modules, pipette_view=self._pipettes, + addressable_area_view=self._addressable_areas, ) self._motion = MotionView( config=self._config, labware_view=self._labware, pipette_view=self._pipettes, + addressable_area_view=self._addressable_areas, geometry_view=self._geometry, module_view=self._modules, ) @@ -282,6 +311,7 @@ def _update_state_views(self) -> None: next_state = self._get_next_state() self._state = next_state self._commands._state = next_state.commands + self._addressable_areas._state = next_state.addressable_areas self._labware._state = next_state.labware self._pipettes._state = next_state.pipettes self._modules._state = next_state.modules diff --git a/api/src/opentrons/protocol_engine/state/tips.py b/api/src/opentrons/protocol_engine/state/tips.py index 6b70e3a19e2..0e68710ae28 100644 --- a/api/src/opentrons/protocol_engine/state/tips.py +++ b/api/src/opentrons/protocol_engine/state/tips.py @@ -16,7 +16,10 @@ DropTipResult, DropTipInPlaceResult, ) -from ..commands.configuring_common import PipetteConfigUpdateResultMixin +from ..commands.configuring_common import ( + PipetteConfigUpdateResultMixin, + PipetteNozzleLayoutResultMixin, +) class TipRackWellState(Enum): @@ -37,6 +40,7 @@ class TipState: column_by_labware_id: Dict[str, List[List[str]]] channels_by_pipette_id: Dict[str, int] length_by_pipette_id: Dict[str, float] + active_channels_by_pipette_id: Dict[str, int] class TipStore(HasState[TipState], HandlesActions): @@ -51,18 +55,31 @@ def __init__(self) -> None: column_by_labware_id={}, channels_by_pipette_id={}, length_by_pipette_id={}, + active_channels_by_pipette_id={}, ) def handle_action(self, action: Action) -> None: """Modify state in reaction to an action.""" if isinstance(action, UpdateCommandAction): if isinstance(action.private_result, PipetteConfigUpdateResultMixin): + pipette_id = action.private_result.pipette_id config = action.private_result.config - self._state.channels_by_pipette_id[ - action.private_result.pipette_id - ] = config.channels + self._state.channels_by_pipette_id[pipette_id] = config.channels + self._state.active_channels_by_pipette_id[pipette_id] = config.channels self._handle_command(action.command) + if isinstance(action.private_result, PipetteNozzleLayoutResultMixin): + pipette_id = action.private_result.pipette_id + nozzle_map = action.private_result.nozzle_map + if nozzle_map: + self._state.active_channels_by_pipette_id[ + pipette_id + ] = nozzle_map.tip_count + else: + self._state.active_channels_by_pipette_id[ + pipette_id + ] = self._state.channels_by_pipette_id[pipette_id] + elif isinstance(action, ResetTipsAction): labware_id = action.labware_id @@ -92,7 +109,6 @@ def _handle_command(self, command: Command) -> None: well_name = command.params.wellName pipette_id = command.params.pipetteId length = command.result.tipLength - self._set_used_tips( pipette_id=pipette_id, well_name=well_name, labware_id=labware_id ) @@ -103,7 +119,7 @@ def _handle_command(self, command: Command) -> None: self._state.length_by_pipette_id.pop(pipette_id, None) def _set_used_tips(self, pipette_id: str, well_name: str, labware_id: str) -> None: - pipette_channels = self._state.channels_by_pipette_id.get(pipette_id) + pipette_channels = self._state.active_channels_by_pipette_id.get(pipette_id) columns = self._state.column_by_labware_id.get(labware_id, []) wells = self._state.tips_by_labware_id.get(labware_id, {}) @@ -135,6 +151,10 @@ def __init__(self, state: TipState) -> None: """ self._state = state + # TODO (spp, 2023-12-05): update this logic once we support partial nozzle configurations + # that require the tip tracking to move right to left or front to back; + # for example when using leftmost column config of 96-channel + # or backmost single nozzle configuration of an 8-channel. def get_next_tip( # noqa: C901 self, labware_id: str, num_tips: int, starting_tip_name: Optional[str] ) -> Optional[str]: @@ -142,7 +162,7 @@ def get_next_tip( # noqa: C901 wells = self._state.tips_by_labware_id.get(labware_id, {}) columns = self._state.column_by_labware_id.get(labware_id, []) - if columns and num_tips == len(columns[0]): + if columns and num_tips == len(columns[0]): # Get next tips for 8-channel column_head = [column[0] for column in columns] starting_column_index = 0 @@ -158,7 +178,7 @@ def get_next_tip( # noqa: C901 if not any(wells[well] == TipRackWellState.USED for well in column): return column[0] - elif num_tips == len(wells.keys()): + elif num_tips == len(wells.keys()): # Get next tips for 96 channel if starting_tip_name and starting_tip_name != columns[0][0]: return None @@ -167,7 +187,7 @@ def get_next_tip( # noqa: C901 ): return next(iter(wells)) - else: + else: # Get next tips for single channel if starting_tip_name is not None: wells = _drop_wells_before_starting_tip(wells, starting_tip_name) @@ -181,6 +201,10 @@ def get_pipette_channels(self, pipette_id: str) -> int: """Return the given pipette's number of channels.""" return self._state.channels_by_pipette_id[pipette_id] + def get_pipette_active_channels(self, pipette_id: str) -> int: + """Get the number of channels being used in the given pipette's configuration.""" + return self._state.active_channels_by_pipette_id[pipette_id] + def has_clean_tip(self, labware_id: str, well_name: str) -> bool: """Get whether a well in a labware has a clean tip. diff --git a/api/src/opentrons/protocol_engine/types.py b/api/src/opentrons/protocol_engine/types.py index 746e40f6949..656f2263efc 100644 --- a/api/src/opentrons/protocol_engine/types.py +++ b/api/src/opentrons/protocol_engine/types.py @@ -5,11 +5,12 @@ from enum import Enum from dataclasses import dataclass from pydantic import BaseModel, Field, validator -from typing import Optional, Union, List, Dict, Any, NamedTuple +from typing import Optional, Union, List, Dict, Any, NamedTuple, Tuple, FrozenSet from typing_extensions import Literal, TypeGuard from opentrons_shared_data.pipette.dev_types import PipetteNameType -from opentrons.types import MountType, DeckSlotName +from opentrons.types import MountType, DeckSlotName, StagingSlotName +from opentrons.hardware_control.types import TipStateType as HwTipStateType from opentrons.hardware_control.modules import ( ModuleType as ModuleType, ) @@ -18,6 +19,7 @@ # convenience re-export of LabwareUri type LabwareUri as LabwareUri, ) +from opentrons_shared_data.module.dev_types import ModuleType as SharedDataModuleType class EngineStatus(str, Enum): @@ -54,6 +56,33 @@ class DeckSlotLocation(BaseModel): ) +class StagingSlotLocation(BaseModel): + """The location of something placed in a single staging slot.""" + + slotName: StagingSlotName = Field( + ..., + description=( + # This description should be kept in sync with LabwareOffsetLocation.slotName. + "A slot on the robot's staging area." + "\n\n" + "These apply only to the Flex. The OT-2 has no staging slots." + ), + ) + + +class AddressableAreaLocation(BaseModel): + """The location of something place in an addressable area. This is a superset of deck slots.""" + + addressableAreaName: str = Field( + ..., + description=( + "The name of the addressable area that you want to use." + " Valid values are the `id`s of `addressableArea`s in the" + " [deck definition](https://github.com/Opentrons/opentrons/tree/edge/shared-data/deck)." + ), + ) + + class ModuleLocation(BaseModel): """The location of something placed atop a hardware module.""" @@ -76,13 +105,21 @@ class OnLabwareLocation(BaseModel): OFF_DECK_LOCATION: _OffDeckLocationType = "offDeck" LabwareLocation = Union[ - DeckSlotLocation, ModuleLocation, OnLabwareLocation, _OffDeckLocationType + DeckSlotLocation, + ModuleLocation, + OnLabwareLocation, + _OffDeckLocationType, + AddressableAreaLocation, ] """Union of all locations where it's legal to keep a labware.""" -OnDeckLabwareLocation = Union[DeckSlotLocation, ModuleLocation, OnLabwareLocation] +OnDeckLabwareLocation = Union[ + DeckSlotLocation, ModuleLocation, OnLabwareLocation, AddressableAreaLocation +] -NonStackedLocation = Union[DeckSlotLocation, ModuleLocation, _OffDeckLocationType] +NonStackedLocation = Union[ + DeckSlotLocation, AddressableAreaLocation, ModuleLocation, _OffDeckLocationType +] """Union of all locations where it's legal to keep a labware that can't be stacked on another labware""" @@ -199,6 +236,17 @@ class CurrentWell: well_name: str +@dataclass(frozen=True) +class CurrentAddressableArea: + """The latest addressable area the robot has accessed.""" + + pipette_id: str + addressable_area_name: str + + +CurrentPipetteLocation = Union[CurrentWell, CurrentAddressableArea] + + @dataclass(frozen=True) class TipGeometry: """Tip geometry data. @@ -378,10 +426,22 @@ class ModuleOffsetVector(BaseModel): z: float +@dataclass +class ModuleOffsetData: + """Module calibration offset data.""" + + moduleOffsetVector: ModuleOffsetVector + location: DeckSlotLocation + + class OverlapOffset(Vec3f): """Offset representing overlap space of one labware on top of another labware or module.""" +class AddressableOffsetVector(Vec3f): + """Offset, in deck coordinates, from nominal to actual position of an addressable area.""" + + class LabwareMovementOffsetData(BaseModel): """Offsets to be used during labware movement.""" @@ -629,6 +689,38 @@ class LabwareMovementStrategy(str, Enum): MANUAL_MOVE_WITHOUT_PAUSE = "manualMoveWithoutPause" +@dataclass(frozen=True) +class PotentialCutoutFixture: + """Cutout and cutout fixture id associated with a potential cutout fixture that can be on the deck.""" + + cutout_id: str + cutout_fixture_id: str + provided_addressable_areas: FrozenSet[str] + + +class AreaType(Enum): + """The type of addressable area.""" + + SLOT = "slot" + STAGING_SLOT = "stagingSlot" + MOVABLE_TRASH = "movableTrash" + FIXED_TRASH = "fixedTrash" + WASTE_CHUTE = "wasteChute" + + +@dataclass(frozen=True) +class AddressableArea: + """Addressable area that has been loaded.""" + + area_name: str + area_type: AreaType + base_slot: DeckSlotName + display_name: str + bounding_box: Dimensions + position: AddressableOffsetVector + compatible_module_types: List[SharedDataModuleType] + + class PostRunHardwareState(Enum): """State of robot gantry & motors after a stop is performed and the hardware API is reset. @@ -654,3 +746,94 @@ class PostRunHardwareState(Enum): HOME_THEN_DISENGAGE = "homeThenDisengage" STAY_ENGAGED_IN_PLACE = "stayEngagedInPlace" DISENGAGE_IN_PLACE = "disengageInPlace" + + +NOZZLE_NAME_REGEX = "[A-Z][0-100]" +PRIMARY_NOZZLE_LITERAL = Literal["A1", "H1", "A12", "H12"] + + +class AllNozzleLayoutConfiguration(BaseModel): + """All basemodel to represent a reset to the nozzle configuration. Sending no parameters resets to default.""" + + style: Literal["ALL"] = "ALL" + + +class SingleNozzleLayoutConfiguration(BaseModel): + """Minimum information required for a new nozzle configuration.""" + + style: Literal["SINGLE"] = "SINGLE" + primaryNozzle: PRIMARY_NOZZLE_LITERAL = Field( + ..., + description="The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", + ) + + +class RowNozzleLayoutConfiguration(BaseModel): + """Minimum information required for a new nozzle configuration.""" + + style: Literal["ROW"] = "ROW" + primaryNozzle: PRIMARY_NOZZLE_LITERAL = Field( + ..., + description="The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", + ) + + +class ColumnNozzleLayoutConfiguration(BaseModel): + """Information required for nozzle configurations of type ROW and COLUMN.""" + + style: Literal["COLUMN"] = "COLUMN" + primaryNozzle: PRIMARY_NOZZLE_LITERAL = Field( + ..., + description="The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", + ) + + +class QuadrantNozzleLayoutConfiguration(BaseModel): + """Information required for nozzle configurations of type QUADRANT.""" + + style: Literal["QUADRANT"] = "QUADRANT" + primaryNozzle: PRIMARY_NOZZLE_LITERAL = Field( + ..., + description="The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", + ) + frontRightNozzle: str = Field( + ..., + regex=NOZZLE_NAME_REGEX, + description="The front right nozzle in your configuration.", + ) + + +NozzleLayoutConfigurationType = Union[ + AllNozzleLayoutConfiguration, + SingleNozzleLayoutConfiguration, + ColumnNozzleLayoutConfiguration, + RowNozzleLayoutConfiguration, + QuadrantNozzleLayoutConfiguration, +] + +# TODO make the below some sort of better type +DeckConfigurationType = List[Tuple[str, str]] # cutout_id, cutout_fixture_id + + +class TipPresenceStatus(str, Enum): + """Tip presence status reported by a pipette.""" + + PRESENT = "present" + ABSENT = "absent" + UNKNOWN = "unknown" + + def to_hw_state(self) -> HwTipStateType: + """Convert to hardware tip state.""" + assert self != TipPresenceStatus.UNKNOWN + return { + TipPresenceStatus.PRESENT: HwTipStateType.PRESENT, + TipPresenceStatus.ABSENT: HwTipStateType.ABSENT, + }[self] + + @classmethod + def from_hw_state(cls, state: HwTipStateType) -> "TipPresenceStatus": + """Convert from hardware tip state.""" + return { + HwTipStateType.PRESENT: TipPresenceStatus.PRESENT, + HwTipStateType.ABSENT: TipPresenceStatus.ABSENT, + }[state] diff --git a/api/src/opentrons/protocol_reader/file_format_validator.py b/api/src/opentrons/protocol_reader/file_format_validator.py index 7e8c6d3adf1..f13d1339041 100644 --- a/api/src/opentrons/protocol_reader/file_format_validator.py +++ b/api/src/opentrons/protocol_reader/file_format_validator.py @@ -10,7 +10,9 @@ from opentrons_shared_data.protocol.models import ( ProtocolSchemaV6 as JsonProtocolV6, ProtocolSchemaV7 as JsonProtocolV7, + ProtocolSchemaV8 as JsonProtocolV8, ) +from opentrons_shared_data.errors.exceptions import PythonException from opentrons.protocols.models import JsonProtocol as JsonProtocolUpToV5 @@ -51,7 +53,9 @@ def validate_sync() -> None: LabwareDefinition.parse_obj(info.unvalidated_json) except PydanticValidationError as e: raise FileFormatValidationError( - f"{info.original_file.name} could not be read as a labware definition." + message=f"{info.original_file.name} could not be read as a labware definition.", + detail={"kind": "bad-labware-definition"}, + wrapping=[PythonException(e)], ) from e await anyio.to_thread.run_sync(validate_sync) @@ -60,7 +64,9 @@ def validate_sync() -> None: async def _validate_json_protocol(info: IdentifiedJsonMain) -> None: def validate_sync() -> None: try: - if info.schema_version == 7: + if info.schema_version == 8: + JsonProtocolV8.parse_obj(info.unvalidated_json) + elif info.schema_version == 7: JsonProtocolV7.parse_obj(info.unvalidated_json) elif info.schema_version == 6: JsonProtocolV6.parse_obj(info.unvalidated_json) @@ -68,7 +74,9 @@ def validate_sync() -> None: JsonProtocolUpToV5.parse_obj(info.unvalidated_json) except PydanticValidationError as e: raise FileFormatValidationError( - f"{info.original_file.name} could not be read as a JSON protocol." + message=f"{info.original_file.name} could not be read as a JSON protocol.", + detail={"kind": "bad-json-protocol"}, + wrapping=[PythonException(e)], ) from e await anyio.to_thread.run_sync(validate_sync) diff --git a/api/src/opentrons/protocol_reader/file_identifier.py b/api/src/opentrons/protocol_reader/file_identifier.py index a6d5d3bd94b..2ef902b7c4c 100644 --- a/api/src/opentrons/protocol_reader/file_identifier.py +++ b/api/src/opentrons/protocol_reader/file_identifier.py @@ -2,11 +2,12 @@ import json from dataclasses import dataclass -from typing import Any, Dict, Sequence, Union +from typing import Any, Dict, Sequence, Union, Optional import anyio from opentrons_shared_data.robot.dev_types import RobotType +from opentrons_shared_data.errors.exceptions import EnumeratedError, PythonException from opentrons.protocols.api_support.definitions import MAX_SUPPORTED_VERSION from opentrons.protocols.api_support.types import APIVersion @@ -96,6 +97,23 @@ class IdentifiedData: class FileIdentificationError(ProtocolFilesInvalidError): """Raised when FileIdentifier detects an invalid file.""" + def __init__( + self, + message: str, + detail: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + only_message: bool = False, + ) -> None: + super().__init__(message=message) + self._only_message = only_message + + def __str__(self) -> str: + """Special stringifier to conform to expecations about python protocol errors.""" + if self._only_message: + return self.message + else: + return super().__str__() + class FileIdentifier: """File identifier interface.""" @@ -128,7 +146,8 @@ async def _identify( return IdentifiedData(original_file=file) else: raise FileIdentificationError( - f"{file.name} has an unrecognized file extension." + message=f"{file.name} has an unrecognized file extension.", + detail={"type": "bad-file-extension", "file": file.name}, ) @@ -139,7 +158,9 @@ async def _analyze_json( json_contents = await anyio.to_thread.run_sync(json.loads, json_file.contents) except json.JSONDecodeError as e: raise FileIdentificationError( - f"{json_file.name} is not valid JSON. {str(e)}" + message=f"{json_file.name} is not valid JSON. {str(e)}", + detail={"type": "invalid-json", "file": json_file.name}, + wrapping=[PythonException(e)], ) from e if _json_seems_like_labware(json_contents): @@ -154,7 +175,8 @@ async def _analyze_json( ) else: raise FileIdentificationError( - f"{json_file.name} is not a known Opentrons format." + message=f"{json_file.name} is not a known Opentrons format.", + detail={"type": "no-schema-match", "file": json_file.name}, ) @@ -182,19 +204,34 @@ def _analyze_json_protocol( schema_version = json_contents["schemaVersion"] robot_type = json_contents["robot"]["model"] except KeyError as e: - raise FileIdentificationError(error_message) from e + raise FileIdentificationError( + message=error_message, + detail={"kind": "missing-json-metadata", "missing-key": str(e)}, + wrapping=[PythonException(e)], + ) from e # todo(mm, 2022-12-22): A JSON protocol file's metadata is not quite just an # arbitrary dict: its fields are supposed to follow a schema. Should we validate # this metadata against that schema instead of doing this simple isinstance() check? if not isinstance(metadata, dict): - raise FileIdentificationError(error_message) + raise FileIdentificationError( + message=error_message, detail={"kind": "json-metadata-not-object"} + ) if not isinstance(schema_version, int): - raise FileIdentificationError(error_message) + raise FileIdentificationError( + message=error_message, + detail={ + "kind": "json-schema-version-not-int", + "schema-version": schema_version, + }, + ) if robot_type not in ("OT-2 Standard", "OT-3 Standard"): - raise FileIdentificationError(error_message) + raise FileIdentificationError( + message=error_message, + detail={"kind": "bad-json-protocol-robot-type", "robot-type": robot_type}, + ) return IdentifiedJsonMain( original_file=original_file, @@ -216,7 +253,12 @@ def _analyze_python_protocol( python_parse_mode=python_parse_mode, ) except MalformedPythonProtocolError as e: - raise FileIdentificationError(e.short_message) from e + raise FileIdentificationError( + message=e.short_message, + detail={"kind": "malformed-python-protocol"}, + wrapping=[PythonException(e)], + only_message=True, + ) from e # We know this should never be a JsonProtocol. Help out the type-checker. assert isinstance( @@ -225,9 +267,13 @@ def _analyze_python_protocol( if parsed.api_level > MAX_SUPPORTED_VERSION: raise FileIdentificationError( - f"API version {parsed.api_level} is not supported by this " - f"robot software. Please either reduce your requested API " - f"version or update your robot." + message=( + f"API version {parsed.api_level} is not supported by this " + f"robot software. Please either reduce your requested API " + f"version or update your robot." + ), + detail={"kind": "future-api-version", "api-version": str(parsed.api_level)}, + only_message=True, ) return IdentifiedPythonMain( diff --git a/api/src/opentrons/protocol_reader/input_file.py b/api/src/opentrons/protocol_reader/input_file.py index 86390accf83..0ab1fe1dad9 100644 --- a/api/src/opentrons/protocol_reader/input_file.py +++ b/api/src/opentrons/protocol_reader/input_file.py @@ -1,10 +1,9 @@ """Input file value objects.""" from __future__ import annotations -from typing import IO -from typing_extensions import Protocol as InterfaceShape +from typing import BinaryIO, Protocol -class AbstractInputFile(InterfaceShape): +class AbstractInputFile(Protocol): """An individual file to be read as part of a protocol. Properties: @@ -14,4 +13,4 @@ class AbstractInputFile(InterfaceShape): """ filename: str - file: IO[bytes] + file: BinaryIO diff --git a/api/src/opentrons/protocol_reader/protocol_files_invalid_error.py b/api/src/opentrons/protocol_reader/protocol_files_invalid_error.py index 0d856b2e759..537ade554db 100644 --- a/api/src/opentrons/protocol_reader/protocol_files_invalid_error.py +++ b/api/src/opentrons/protocol_reader/protocol_files_invalid_error.py @@ -1,5 +1,6 @@ # noqa: D100 +from opentrons_shared_data.errors.exceptions import InvalidProtocolData -class ProtocolFilesInvalidError(ValueError): +class ProtocolFilesInvalidError(InvalidProtocolData): """Raised when the input to a ProtocolReader is not a well-formed protocol.""" diff --git a/api/src/opentrons/protocol_reader/role_analyzer.py b/api/src/opentrons/protocol_reader/role_analyzer.py index c6538324942..5c32f53711c 100644 --- a/api/src/opentrons/protocol_reader/role_analyzer.py +++ b/api/src/opentrons/protocol_reader/role_analyzer.py @@ -40,7 +40,9 @@ def analyze(files: Sequence[IdentifiedFile]) -> RoleAnalysis: This validates that there is exactly one main protocol file. """ if len(files) == 0: - raise RoleAnalysisError("No files were provided.") + raise RoleAnalysisError( + message="No files were provided.", detail={"kind": "no-files"} + ) main_file_candidates: List[Union[IdentifiedJsonMain, IdentifiedPythonMain]] = [] labware_files: List[IdentifiedLabwareDefinition] = [] @@ -57,17 +59,22 @@ def analyze(files: Sequence[IdentifiedFile]) -> RoleAnalysis: if len(main_file_candidates) == 0: if len(files) == 1: raise RoleAnalysisError( - f'"{files[0].original_file.name}" is not a valid protocol file.' + message=f'"{files[0].original_file.name}" is not a valid protocol file.', + detail={"kind": "protocol-does-not-have-main"}, ) else: file_list = ", ".join(f'"{f.original_file.name}"' for f in files) - raise RoleAnalysisError(f"No valid protocol file found in {file_list}.") + raise RoleAnalysisError( + message=f"No valid protocol file found in {file_list}.", + detail={"kind": "protocol-does-not-have-main"}, + ) elif len(main_file_candidates) > 1: file_list = ", ".join( f'"{f.original_file.name}"' for f in main_file_candidates ) raise RoleAnalysisError( - f"Could not pick single main file from {file_list}." + message=f"Could not pick single main file from {file_list}.", + detail={"kind": "multiple-main-candidates"}, ) else: main_file = main_file_candidates[0] diff --git a/api/src/opentrons/protocol_runner/create_simulating_runner.py b/api/src/opentrons/protocol_runner/create_simulating_runner.py index 9673db4408a..0c60af3a45c 100644 --- a/api/src/opentrons/protocol_runner/create_simulating_runner.py +++ b/api/src/opentrons/protocol_runner/create_simulating_runner.py @@ -3,6 +3,7 @@ from opentrons.config import feature_flags from opentrons.hardware_control import API as OT2API, HardwareControlAPI from opentrons.protocols.api_support import deck_type +from opentrons.protocols.api_support.deck_type import should_load_fixed_trash from opentrons.protocol_engine import ( Config as ProtocolEngineConfig, DeckType, @@ -56,8 +57,10 @@ async def create_simulating_runner( ignore_pause=True, use_virtual_modules=True, use_virtual_gripper=True, + use_simulated_deck_config=True, use_virtual_pipettes=(not feature_flags.disable_fast_protocol_upload()), ), + load_fixed_trash=should_load_fixed_trash(protocol_config), ) simulating_legacy_context_creator = LegacySimulatingContextCreator( diff --git a/api/src/opentrons/protocol_runner/json_file_reader.py b/api/src/opentrons/protocol_runner/json_file_reader.py index 41db89f5cbf..488c28d273b 100644 --- a/api/src/opentrons/protocol_runner/json_file_reader.py +++ b/api/src/opentrons/protocol_runner/json_file_reader.py @@ -3,7 +3,12 @@ from opentrons_shared_data.protocol.models.protocol_schema_v6 import ProtocolSchemaV6 from opentrons_shared_data.protocol.models.protocol_schema_v7 import ProtocolSchemaV7 -from opentrons.protocol_reader import ProtocolSource, JsonProtocolConfig +from opentrons_shared_data.protocol.models.protocol_schema_v8 import ProtocolSchemaV8 +from opentrons.protocol_reader import ( + ProtocolSource, + JsonProtocolConfig, + ProtocolFilesInvalidError, +) class JsonFileReader: @@ -12,12 +17,33 @@ class JsonFileReader: @staticmethod def read( protocol_source: ProtocolSource, - ) -> Union[ProtocolSchemaV6, ProtocolSchemaV7]: + ) -> Union[ProtocolSchemaV6, ProtocolSchemaV7, ProtocolSchemaV8]: """Read and parse file into a JsonProtocol model.""" - if ( - isinstance(protocol_source.config, JsonProtocolConfig) - and protocol_source.config.schema_version == 6 - ): + name = protocol_source.metadata.get("name", protocol_source.main_file.name) + if not isinstance(protocol_source.config, JsonProtocolConfig): + raise ProtocolFilesInvalidError( + message=f"Cannot execute {name} as a JSON protocol", + detail={ + "kind": "non-json-file-in-json-file-reader", + "metadata-name": str(protocol_source.metadata.get("name")), + "file-name": protocol_source.main_file.name, + }, + ) + if protocol_source.config.schema_version == 6: return ProtocolSchemaV6.parse_file(protocol_source.main_file) - else: + elif protocol_source.config.schema_version == 7: return ProtocolSchemaV7.parse_file(protocol_source.main_file) + elif protocol_source.config.schema_version == 8: + return ProtocolSchemaV8.parse_file(protocol_source.main_file) + else: + raise ProtocolFilesInvalidError( + message=f"{name} is a JSON protocol v{protocol_source.config.schema_version} which this robot cannot execute", + detail={ + "kind": "schema-version-unknown", + "requested-schema-version": str( + protocol_source.config.schema_version + ), + "minimum-handled-schema-version": "6", + "maximum-handled-shcema-version": "8", + }, + ) diff --git a/api/src/opentrons/protocol_runner/json_translator.py b/api/src/opentrons/protocol_runner/json_translator.py index 88cabc13149..c210d51ec77 100644 --- a/api/src/opentrons/protocol_runner/json_translator.py +++ b/api/src/opentrons/protocol_runner/json_translator.py @@ -8,7 +8,10 @@ protocol_schema_v6, ProtocolSchemaV7, protocol_schema_v7, + ProtocolSchemaV8, + protocol_schema_v8, ) +from opentrons_shared_data import command as command_schema from opentrons.types import MountType from opentrons.protocol_engine import ( @@ -163,7 +166,11 @@ def _translate_v7_pipette_command( def _translate_simple_command( - command: Union[protocol_schema_v6.Command, protocol_schema_v7.Command] + command: Union[ + protocol_schema_v6.Command, + protocol_schema_v7.Command, + protocol_schema_v8.Command, + ] ) -> pe_commands.CommandCreate: dict_command = command.dict(exclude_none=True) @@ -208,13 +215,15 @@ def translate_liquids( def translate_commands( self, - protocol: Union[ProtocolSchemaV7, ProtocolSchemaV6], + protocol: Union[ProtocolSchemaV8, ProtocolSchemaV7, ProtocolSchemaV6], ) -> List[pe_commands.CommandCreate]: """Takes json protocol and translates commands->protocol engine commands.""" if isinstance(protocol, ProtocolSchemaV6): return self._translate_v6_commands(protocol) - else: + elif isinstance(protocol, ProtocolSchemaV7): return self._translate_v7_commands(protocol) + else: + return self._translate_v8_commands(protocol) def _translate_v6_commands( self, @@ -244,3 +253,18 @@ def _translate_v7_commands( translated_obj = _translate_simple_command(command) commands_list.append(translated_obj) return commands_list + + def _translate_v8_commands( + self, protocol: ProtocolSchemaV8 + ) -> List[pe_commands.CommandCreate]: + """Translate commands in json protocol schema v8, which might be of different command schemas.""" + command_schema_ref = protocol.commandSchemaId + # these calls will raise if the command schema version is invalid or unknown + command_schema_version = command_schema.schema_version_from_ref( + command_schema_ref + ) + command_schema_string = command_schema.load_schema_string( # noqa: F841 + command_schema_version + ) + + return [_translate_simple_command(command) for command in protocol.commands] diff --git a/api/src/opentrons/protocol_runner/legacy_context_plugin.py b/api/src/opentrons/protocol_runner/legacy_context_plugin.py index 8d1e9a9b1c4..41ba0c62268 100644 --- a/api/src/opentrons/protocol_runner/legacy_context_plugin.py +++ b/api/src/opentrons/protocol_runner/legacy_context_plugin.py @@ -5,10 +5,10 @@ from contextlib import ExitStack from typing import Optional -from opentrons.broker import Broker -from opentrons.equipment_broker import EquipmentBroker from opentrons.commands.types import CommandMessage as LegacyCommand +from opentrons.legacy_broker import LegacyBroker from opentrons.protocol_engine import AbstractPlugin, actions as pe_actions +from opentrons.util.broker import ReadOnlyBroker from .legacy_wrappers import LegacyLoadInfo from .legacy_command_mapper import LegacyCommandMapper @@ -36,8 +36,8 @@ class LegacyContextPlugin(AbstractPlugin): def __init__( self, - broker: Broker, - equipment_broker: EquipmentBroker[LegacyLoadInfo], + broker: LegacyBroker, + equipment_broker: ReadOnlyBroker[LegacyLoadInfo], legacy_command_mapper: Optional[LegacyCommandMapper] = None, ) -> None: """Initialize the plugin with its dependencies.""" @@ -78,10 +78,11 @@ def setup(self) -> None: ) exit_stack.callback(command_broker_unsubscribe) - equipment_broker_unsubscribe = self._equipment_broker.subscribe( - callback=self._handle_equipment_loaded + exit_stack.enter_context( + self._equipment_broker.subscribed( + callback=self._handle_equipment_loaded + ) ) - exit_stack.callback(equipment_broker_unsubscribe) # All subscriptions succeeded. # Save the exit stack so our teardown method can use it later diff --git a/api/src/opentrons/protocol_runner/legacy_wrappers.py b/api/src/opentrons/protocol_runner/legacy_wrappers.py index 297bdbf3869..6a816f5e9a1 100644 --- a/api/src/opentrons/protocol_runner/legacy_wrappers.py +++ b/api/src/opentrons/protocol_runner/legacy_wrappers.py @@ -9,8 +9,6 @@ ) from opentrons_shared_data.labware.labware_definition import LabwareDefinition -from opentrons.broker import Broker -from opentrons.equipment_broker import EquipmentBroker from opentrons.calibration_storage.helpers import uri_from_details from opentrons.hardware_control import HardwareControlAPI from opentrons.hardware_control.modules.types import ( @@ -20,8 +18,10 @@ ThermocyclerModuleModel as LegacyThermocyclerModuleModel, HeaterShakerModuleModel as LegacyHeaterShakerModuleModel, ) +from opentrons.legacy_broker import LegacyBroker from opentrons.protocol_engine import ProtocolEngine from opentrons.protocol_reader import ProtocolSource, ProtocolFileRole +from opentrons.util.broker import Broker from opentrons.protocol_api import ( ProtocolContext as LegacyProtocolContext, @@ -124,8 +124,8 @@ def __init__( def create( self, protocol: LegacyProtocol, - broker: Optional[Broker], - equipment_broker: Optional[EquipmentBroker[LegacyLoadInfo]], + broker: Optional[LegacyBroker], + equipment_broker: Optional[Broker[LegacyLoadInfo]], ) -> LegacyProtocolContext: """Create a Protocol API v2 context.""" extra_labware = ( diff --git a/api/src/opentrons/protocol_runner/protocol_runner.py b/api/src/opentrons/protocol_runner/protocol_runner.py index f5b317bf1ee..ec0b576b442 100644 --- a/api/src/opentrons/protocol_runner/protocol_runner.py +++ b/api/src/opentrons/protocol_runner/protocol_runner.py @@ -6,10 +6,9 @@ import anyio -from opentrons.broker import Broker -from opentrons.equipment_broker import EquipmentBroker from opentrons.hardware_control import HardwareControlAPI from opentrons import protocol_reader +from opentrons.legacy_broker import LegacyBroker from opentrons.protocol_reader import ( ProtocolSource, JsonProtocolConfig, @@ -22,6 +21,7 @@ commands as pe_commands, ) from opentrons.protocols.parse import PythonParseMode +from opentrons.util.broker import Broker from .task_queue import TaskQueue from .json_file_reader import JsonFileReader @@ -35,7 +35,7 @@ LegacyExecutor, LegacyLoadInfo, ) -from ..protocol_engine.types import PostRunHardwareState +from ..protocol_engine.types import PostRunHardwareState, DeckConfigurationType class RunResult(NamedTuple): @@ -59,6 +59,21 @@ class AbstractRunner(ABC): def __init__(self, protocol_engine: ProtocolEngine) -> None: self._protocol_engine = protocol_engine + self._broker = LegacyBroker() + + # TODO(mm, 2023-10-03): `LegacyBroker` is specific to Python protocols and JSON protocols ≤v5. + # We'll need to extend this in order to report progress from newer JSON protocols. + # + # TODO(mm, 2023-10-04): When we switch this to return a new `Broker` instead of a + # `LegacyBroker`, we should annotate the return type as a `ReadOnlyBroker`. + @property + def broker(self) -> LegacyBroker: + """Return a broker that you can subscribe to in order to monitor protocol progress. + + Currently, this only returns messages for `PythonAndLegacyRunner`. + Otherwise, it's a no-op. + """ + return self._broker def was_started(self) -> bool: """Whether the run has been started. @@ -67,9 +82,9 @@ def was_started(self) -> bool: """ return self._protocol_engine.state_view.commands.has_been_played() - def play(self) -> None: + def play(self, deck_configuration: Optional[DeckConfigurationType] = None) -> None: """Start or resume the run.""" - self._protocol_engine.play() + self._protocol_engine.play(deck_configuration=deck_configuration) def pause(self) -> None: """Pause the run.""" @@ -89,6 +104,7 @@ async def stop(self) -> None: @abstractmethod async def run( self, + deck_configuration: DeckConfigurationType, protocol_source: Optional[ProtocolSource] = None, ) -> RunResult: """Run a given protocol to completion.""" @@ -105,6 +121,8 @@ def __init__( legacy_file_reader: Optional[LegacyFileReader] = None, legacy_context_creator: Optional[LegacyContextCreator] = None, legacy_executor: Optional[LegacyExecutor] = None, + post_run_hardware_state: PostRunHardwareState = PostRunHardwareState.HOME_AND_STAY_ENGAGED, + drop_tips_after_run: bool = True, ) -> None: """Initialize the PythonAndLegacyRunner with its dependencies.""" super().__init__(protocol_engine) @@ -117,7 +135,14 @@ def __init__( self._legacy_executor = legacy_executor or LegacyExecutor() # TODO(mc, 2022-01-11): replace task queue with specific implementations # of runner interface - self._task_queue = task_queue or TaskQueue(cleanup_func=protocol_engine.finish) + self._task_queue = ( + task_queue or TaskQueue() + ) # cleanup_func=protocol_engine.finish)) + self._task_queue.set_cleanup_func( + func=protocol_engine.finish, + drop_tips_after_run=drop_tips_after_run, + post_run_hardware_state=post_run_hardware_state, + ) async def load( self, protocol_source: ProtocolSource, python_parse_mode: PythonParseMode @@ -136,20 +161,22 @@ async def load( protocol = self._legacy_file_reader.read( protocol_source, labware_definitions, python_parse_mode ) - broker = None equipment_broker = None if protocol.api_level < LEGACY_PYTHON_API_VERSION_CUTOFF: - broker = Broker() - equipment_broker = EquipmentBroker[LegacyLoadInfo]() - + equipment_broker = Broker[LegacyLoadInfo]() self._protocol_engine.add_plugin( - LegacyContextPlugin(broker=broker, equipment_broker=equipment_broker) + LegacyContextPlugin( + broker=self._broker, equipment_broker=equipment_broker + ) ) + self._hardware_api.should_taskify_movement_execution(taskify=True) + else: + self._hardware_api.should_taskify_movement_execution(taskify=False) context = self._legacy_context_creator.create( protocol=protocol, - broker=broker, + broker=self._broker, equipment_broker=equipment_broker, ) initial_home_command = pe_commands.HomeCreate( @@ -166,6 +193,7 @@ async def load( async def run( # noqa: D102 self, + deck_configuration: DeckConfigurationType, protocol_source: Optional[ProtocolSource] = None, python_parse_mode: PythonParseMode = PythonParseMode.NORMAL, ) -> RunResult: @@ -176,7 +204,7 @@ async def run( # noqa: D102 protocol_source=protocol_source, python_parse_mode=python_parse_mode ) - self.play() + self.play(deck_configuration=deck_configuration) self._task_queue.start() await self._task_queue.join() @@ -195,6 +223,8 @@ def __init__( task_queue: Optional[TaskQueue] = None, json_file_reader: Optional[JsonFileReader] = None, json_translator: Optional[JsonTranslator] = None, + post_run_hardware_state: PostRunHardwareState = PostRunHardwareState.HOME_AND_STAY_ENGAGED, + drop_tips_after_run: bool = True, ) -> None: """Initialize the JsonRunner with its dependencies.""" super().__init__(protocol_engine) @@ -204,7 +234,16 @@ def __init__( self._json_translator = json_translator or JsonTranslator() # TODO(mc, 2022-01-11): replace task queue with specific implementations # of runner interface - self._task_queue = task_queue or TaskQueue(cleanup_func=protocol_engine.finish) + self._task_queue = ( + task_queue or TaskQueue() + ) # cleanup_func=protocol_engine.finish)) + self._task_queue.set_cleanup_func( + func=protocol_engine.finish, + drop_tips_after_run=drop_tips_after_run, + post_run_hardware_state=post_run_hardware_state, + ) + + self._hardware_api.should_taskify_movement_execution(taskify=False) async def load(self, protocol_source: ProtocolSource) -> None: """Load a JSONv6+ ProtocolSource into managed ProtocolEngine.""" @@ -260,6 +299,7 @@ async def load(self, protocol_source: ProtocolSource) -> None: async def run( # noqa: D102 self, + deck_configuration: DeckConfigurationType, protocol_source: Optional[ProtocolSource] = None, ) -> RunResult: # TODO(mc, 2022-01-11): move load to runner creation, remove from `run` @@ -267,7 +307,7 @@ async def run( # noqa: D102 if protocol_source: await self.load(protocol_source) - self.play() + self.play(deck_configuration=deck_configuration) self._task_queue.start() await self._task_queue.join() @@ -291,7 +331,10 @@ def __init__( # TODO(mc, 2022-01-11): replace task queue with specific implementations # of runner interface self._hardware_api = hardware_api - self._task_queue = task_queue or TaskQueue(cleanup_func=protocol_engine.finish) + self._task_queue = task_queue or TaskQueue() + self._task_queue.set_cleanup_func(func=protocol_engine.finish) + + self._hardware_api.should_taskify_movement_execution(taskify=False) def prepare(self) -> None: """Set the task queue to wait until all commands are executed.""" @@ -299,11 +342,12 @@ def prepare(self) -> None: async def run( # noqa: D102 self, + deck_configuration: DeckConfigurationType, protocol_source: Optional[ProtocolSource] = None, ) -> RunResult: assert protocol_source is None await self._hardware_api.home() - self.play() + self.play(deck_configuration=deck_configuration) self._task_queue.start() await self._task_queue.join() @@ -325,6 +369,8 @@ def create_protocol_runner( legacy_file_reader: Optional[LegacyFileReader] = None, legacy_context_creator: Optional[LegacyContextCreator] = None, legacy_executor: Optional[LegacyExecutor] = None, + post_run_hardware_state: PostRunHardwareState = PostRunHardwareState.HOME_AND_STAY_ENGAGED, + drop_tips_after_run: bool = True, ) -> AnyRunner: """Create a protocol runner.""" if protocol_config: @@ -338,6 +384,8 @@ def create_protocol_runner( json_file_reader=json_file_reader, json_translator=json_translator, task_queue=task_queue, + post_run_hardware_state=post_run_hardware_state, + drop_tips_after_run=drop_tips_after_run, ) else: return PythonAndLegacyRunner( @@ -347,6 +395,8 @@ def create_protocol_runner( legacy_file_reader=legacy_file_reader, legacy_context_creator=legacy_context_creator, legacy_executor=legacy_executor, + post_run_hardware_state=post_run_hardware_state, + drop_tips_after_run=drop_tips_after_run, ) return LiveRunner( diff --git a/api/src/opentrons/protocol_runner/task_queue.py b/api/src/opentrons/protocol_runner/task_queue.py index e79dc097aa1..a24fb0c7c64 100644 --- a/api/src/opentrons/protocol_runner/task_queue.py +++ b/api/src/opentrons/protocol_runner/task_queue.py @@ -5,14 +5,16 @@ from typing import Any, Awaitable, Callable, Optional from typing_extensions import Protocol as Callback - log = logging.getLogger(__name__) class CleanupFunc(Callback): """Expected cleanup function signature.""" - def __call__(self, error: Optional[Exception]) -> Any: + def __call__( + self, + error: Optional[Exception], + ) -> Any: """Cleanup, optionally taking an error thrown. Return value will not be used. @@ -26,19 +28,35 @@ class TaskQueue: Once started, a TaskQueue may not be re-used. """ - def __init__(self, cleanup_func: CleanupFunc) -> None: + def __init__( + self, + # cleanup_func: CleanupFunc, + ) -> None: """Initialize the TaskQueue. Args: cleanup_func: A function to call at run function completion with any error raised by the run function. """ - self._cleanup_func: CleanupFunc = cleanup_func + self._cleanup_func: Optional[ + Callable[[Optional[Exception]], Any] + ] = None # CleanupFunc = cleanup_func self._run_func: Optional[Callable[[], Any]] = None self._run_task: Optional["asyncio.Task[None]"] = None self._ok_to_join_event: asyncio.Event = asyncio.Event() + def set_cleanup_func( + self, + func: Callable[..., Awaitable[Any]], + **kwargs: Any, + ) -> None: + """Add the protocol cleanup task to the queue. + + The "cleanup" task will be run after the "run" task. + """ + self._cleanup_func = partial(func, **kwargs) + def set_run_func( self, func: Callable[..., Awaitable[Any]], @@ -74,4 +92,5 @@ async def _run(self) -> None: log.exception("Exception raised by protocol") error = e - await self._cleanup_func(error=error) + if self._cleanup_func is not None: + await self._cleanup_func(error) diff --git a/api/src/opentrons/protocols/advanced_control/transfers.py b/api/src/opentrons/protocols/advanced_control/transfers.py index 00f4a1ae02e..df1c6961be6 100644 --- a/api/src/opentrons/protocols/advanced_control/transfers.py +++ b/api/src/opentrons/protocols/advanced_control/transfers.py @@ -13,10 +13,11 @@ TYPE_CHECKING, TypeVar, ) -from opentrons.protocol_api.labware import Well +from opentrons.protocol_api.labware import Labware, Well from opentrons import types from opentrons.protocols.api_support.types import APIVersion + if TYPE_CHECKING: from opentrons.protocol_api import InstrumentContext from opentrons.protocols.execution.dev_types import Dictable @@ -485,6 +486,11 @@ def _plan_transfer(self): """ # reform source target lists sources, dests = self._extend_source_target_lists(self._sources, self._dests) + self._check_valid_volume_parameters( + disposal_volume=self._strategy.disposal_volume, + air_gap=self._strategy.air_gap, + max_volume=self._instr.max_volume, + ) plan_iter = self._expand_for_volume_constraints( self._volumes, zip(sources, dests), @@ -571,6 +577,13 @@ def _plan_distribute(self): .. Dispense air gap -> ...* """ + + self._check_valid_volume_parameters( + disposal_volume=self._strategy.disposal_volume, + air_gap=self._strategy.air_gap, + max_volume=self._instr.max_volume, + ) + # TODO: decide whether default disposal vol for distribute should be # pipette min_vol or should we leave it to being 0 by default and # recommend users to specify a disposal vol when using distribute. @@ -633,6 +646,10 @@ def _expand_for_volume_constraints( """Split a sequence of proposed transfers if necessary to keep each transfer under the given max volume. """ + # A final defense against an infinite loop. + # Raising a proper exception with a helpful message is left to calling code, + # because it has more context about what the user is trying to do. + assert max_volume > 0 for volume, target in zip(volumes, targets): while volume > max_volume * 2: yield max_volume, target @@ -680,6 +697,12 @@ def _plan_consolidate(self): *.. Aspirate -> Air gap -> Touch tip ->.. .. Aspirate -> .....* """ + # TODO: verify if _check_valid_volume_parameters should be re-enabled here + # self._check_valid_volume_parameters( + # disposal_volume=self._strategy.disposal_volume, + # air_gap=self._strategy.air_gap, + # max_volume=self._instr.max_volume, + # ) plan_iter = self._expand_for_volume_constraints( # todo(mm, 2021-03-09): Is it right to use _instr.max_volume here? # Why don't we account for tip max volume, disposal volume, or air @@ -778,9 +801,13 @@ def _after_dispense(self, dest, src, is_disp_next=False): # noqa: C901 self._strategy.blow_out_strategy == BlowOutStrategy.TRASH or self._strategy.disposal_volume ): - yield self._format_dict( - "blow_out", [self._instr.trash_container.wells()[0]] - ) + if isinstance(self._instr.trash_container, Labware): + yield self._format_dict( + "blow_out", [self._instr.trash_container.wells()[0]] + ) + else: + yield self._format_dict("blow_out", [self._instr.trash_container]) + else: # Used by distribute if self._strategy.air_gap: @@ -843,6 +870,22 @@ def _map_volume(i): return [_map_volume(i) for i in range(total)] + def _check_valid_volume_parameters( + self, disposal_volume: float, air_gap: float, max_volume: float + ): + if air_gap >= max_volume: + raise ValueError( + "The air gap must be less than the maximum volume of the pipette" + ) + elif disposal_volume >= max_volume: + raise ValueError( + "The disposal volume must be less than the maximum volume of the pipette" + ) + elif disposal_volume + air_gap >= max_volume: + raise ValueError( + "The sum of the air gap and disposal volume must be less than the maximum volume of the pipette" + ) + def _check_valid_well_list(self, well_list, id, old_well_list): if self._api_version >= APIVersion(2, 2) and len(well_list) < 1: raise RuntimeError( diff --git a/api/src/opentrons/protocols/api_support/deck_type.py b/api/src/opentrons/protocols/api_support/deck_type.py index e23599d29bc..f0cadebce43 100644 --- a/api/src/opentrons/protocols/api_support/deck_type.py +++ b/api/src/opentrons/protocols/api_support/deck_type.py @@ -1,7 +1,18 @@ +from typing import Sequence, Dict, Optional, Any + from opentrons_shared_data.robot.dev_types import RobotType +from opentrons_shared_data.errors import ErrorCodes +from opentrons_shared_data.errors.exceptions import EnumeratedError from opentrons.config import feature_flags +from opentrons.protocol_reader.protocol_source import ( + ProtocolConfig, + PythonProtocolConfig, + JsonProtocolConfig, +) +from opentrons.protocols.api_support.types import APIVersion + # TODO(mm, 2023-05-10): Deduplicate these constants with # opentrons.protocol_engine.types.DeckType and consider moving to shared-data. @@ -10,6 +21,48 @@ STANDARD_OT3_DECK = "ot3_standard" +LOAD_FIXED_TRASH_GATE_VERSION_PYTHON = APIVersion(2, 15) +LOAD_FIXED_TRASH_GATE_VERSION_JSON = 7 + + +class NoTrashDefinedError(EnumeratedError): + """ + Error raised when a protocol attempts to automatically access a trash bin without one being loaded. + """ + + def __init__( + self, + message: Optional[str] = None, + detail: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build a ProtocolEngineError.""" + super().__init__( + code=ErrorCodes.GENERAL_ERROR, + message=message, + detail=detail, + wrapping=wrapping, + ) + + +def should_load_fixed_trash_for_python_protocol(api_version: APIVersion) -> bool: + return api_version <= LOAD_FIXED_TRASH_GATE_VERSION_PYTHON + + +def should_load_fixed_trash(protocol_config: ProtocolConfig) -> bool: + """Decide whether to automatically load fixed trash on the deck based on version.""" + load_fixed_trash = False + if isinstance(protocol_config, PythonProtocolConfig): + return should_load_fixed_trash_for_python_protocol(protocol_config.api_version) + # TODO(jbl 2023-10-27), when schema v8 is out, use a new deck version field to support fixed trash protocols + elif isinstance(protocol_config, JsonProtocolConfig): + load_fixed_trash = ( + protocol_config.schema_version <= LOAD_FIXED_TRASH_GATE_VERSION_JSON + ) + + return load_fixed_trash + + def guess_from_global_config() -> str: """Return the deck type that the host device physically has. diff --git a/api/src/opentrons/protocols/api_support/definitions.py b/api/src/opentrons/protocols/api_support/definitions.py index 0911979892d..e1a7f38f326 100644 --- a/api/src/opentrons/protocols/api_support/definitions.py +++ b/api/src/opentrons/protocols/api_support/definitions.py @@ -1,6 +1,6 @@ from .types import APIVersion -MAX_SUPPORTED_VERSION = APIVersion(2, 15) +MAX_SUPPORTED_VERSION = APIVersion(2, 17) """The maximum supported protocol API version in this release.""" MIN_SUPPORTED_VERSION = APIVersion(2, 0) diff --git a/api/src/opentrons/protocols/execution/execute_python.py b/api/src/opentrons/protocols/execution/execute_python.py index 1d01a7120cd..cf5f3303cbe 100644 --- a/api/src/opentrons/protocols/execution/execute_python.py +++ b/api/src/opentrons/protocols/execution/execute_python.py @@ -9,7 +9,7 @@ from opentrons.protocol_api import ProtocolContext from opentrons.protocols.execution.errors import ExceptionInProtocolError from opentrons.protocols.types import PythonProtocol, MalformedPythonProtocolError -from opentrons.hardware_control import ExecutionCancelledError +from opentrons_shared_data.errors.exceptions import ExecutionCancelledError MODULE_LOG = logging.getLogger(__name__) @@ -47,10 +47,19 @@ def run_python(proto: PythonProtocol, context: ProtocolContext): # If the protocol is written correctly, it will have defined a function # like run(context: ProtocolContext). If so, that function is now in the # current scope. + + # TODO(mm, 2023-10-11): This coupling to opentrons.protocols.parse is fragile. + # Can we get the correct filename directly from proto.contents? if proto.filename and proto.filename.endswith("zip"): + # The ".zip" extension needs to match what opentrons.protocols.parse recognizes as a bundle, + # and the "protocol.ot2.py" fallback needs to match what opentrons.protocol.py sets as the + # AST filename. filename = "protocol.ot2.py" else: + # "" needs to match what opentrons.protocols.parse sets as the fallback + # AST filename. filename = proto.filename or "" + try: _runfunc_ok(new_globs.get("run")) except SyntaxError as se: diff --git a/api/src/opentrons/protocols/models/json_protocol.py b/api/src/opentrons/protocols/models/json_protocol.py index c600f03ca8c..6cd7c32aa2d 100644 --- a/api/src/opentrons/protocols/models/json_protocol.py +++ b/api/src/opentrons/protocols/models/json_protocol.py @@ -673,7 +673,7 @@ class Model(BaseModel): None, description="All modules used in this protocol" ) commands: List[AllCommands] = Field( - None, + ..., description="An array of command objects representing steps to be executed " "on the robot", ) diff --git a/api/src/opentrons/protocols/parse.py b/api/src/opentrons/protocols/parse.py index c757ab6d26d..ee868912ed7 100644 --- a/api/src/opentrons/protocols/parse.py +++ b/api/src/opentrons/protocols/parse.py @@ -217,11 +217,16 @@ def _parse_python( extra_labware: Optional[Dict[str, "LabwareDefinition"]] = None, ) -> PythonProtocol: """Parse a protocol known or at least suspected to be python""" - filename_checked = filename or "" - if filename_checked.endswith(".zip"): + if filename is None: + # The fallback "" needs to match what opentrons.protocols.execution.execute_python + # looks for when it extracts tracebacks. + ast_filename = "" + elif filename.endswith(".zip"): + # The extension ".zip" and the fallback "protocol.ot2.py" need to match what + # opentrons.protocols.execution.execute_python looks for when it extracts tracebacks. ast_filename = "protocol.ot2.py" else: - ast_filename = filename_checked + ast_filename = filename # todo(mm, 2021-09-13): By default, ast.parse will inherit compiler options # and future features from this module. This may not be appropriate. @@ -244,7 +249,7 @@ def _parse_python( static_info = _extract_static_python_info(parsed) protocol = compile(parsed, filename=ast_filename, mode="exec") - version = _get_version(static_info, parsed, filename_checked) + version = _get_version(static_info, parsed, ast_filename) robot_type = _robot_type_from_static_python_info(static_info) if version >= APIVersion(2, 0): @@ -257,7 +262,7 @@ def _parse_python( result = PythonProtocol( text=protocol_contents, - filename=getattr(protocol, "co_filename", ""), + filename=filename, contents=protocol, metadata=static_info.metadata, api_level=version, diff --git a/api/src/opentrons/protocols/types.py b/api/src/opentrons/protocols/types.py index 45b60c8f4ab..792951efbfa 100644 --- a/api/src/opentrons/protocols/types.py +++ b/api/src/opentrons/protocols/types.py @@ -32,11 +32,22 @@ class StaticPythonInfo: @dataclass(frozen=True) class _ProtocolCommon: text: str + filename: Optional[str] + """The original name of the main protocol file, if it had a name. + + For JSON protocols, this will be the name of the .json file. + For Python protocols, this will be the name of the .py file. + For bundled protocols, this will be the name of the .zip file. + + This can be `None` if, for example, we've parsed the protocol from an in-memory text stream. + """ + # TODO(mm, 2023-06-22): Move api_level out of _ProtocolCommon and into PythonProtocol. # JSON protocols do not have an intrinsic api_level, especially since JSONv6, # where they are no longer executed via the Python Protocol API. api_level: "APIVersion" + robot_type: RobotType diff --git a/api/src/opentrons/simulate.py b/api/src/opentrons/simulate.py index 46f5ef37f3a..5e8433debba 100644 --- a/api/src/opentrons/simulate.py +++ b/api/src/opentrons/simulate.py @@ -4,13 +4,17 @@ a protocol from the command line. """ import argparse +import asyncio +import atexit +from contextlib import ExitStack, contextmanager import sys import logging import os import pathlib import queue from typing import ( - cast, + TYPE_CHECKING, + Generator, Any, Dict, List, @@ -21,6 +25,9 @@ Optional, Union, ) +from typing_extensions import Literal + +from opentrons_shared_data.robot.dev_types import RobotType import opentrons from opentrons import should_use_ot3 @@ -29,38 +36,50 @@ ThreadManager, ThreadManagedHardware, ) -from opentrons.hardware_control.types import MachineType +from opentrons.hardware_control.types import HardwareFeatureFlags from opentrons.hardware_control.simulator_setup import load_simulator -from opentrons.protocol_api import MAX_SUPPORTED_VERSION +from opentrons.protocol_api.core.engine import ENGINE_CORE_API_VERSION +from opentrons.protocol_api.protocol_context import ProtocolContext +from opentrons.protocol_engine import create_protocol_engine +from opentrons.protocol_engine.create_protocol_engine import ( + create_protocol_engine_in_thread, +) +from opentrons.protocol_engine.state.config import Config +from opentrons.protocol_engine.types import DeckType, EngineStatus, PostRunHardwareState +from opentrons.protocol_reader.protocol_source import ProtocolSource +from opentrons.protocol_runner.protocol_runner import create_protocol_runner from opentrons.protocols.duration import DurationEstimator from opentrons.protocols.execution import execute -import opentrons.broker -from opentrons.config import IS_ROBOT, JUPYTER_NOTEBOOK_LABWARE_DIR +from opentrons.legacy_broker import LegacyBroker +from opentrons.config import IS_ROBOT from opentrons import protocol_api from opentrons.commands import types as command_types from opentrons.protocols import parse, bundle -from opentrons.protocols.types import PythonProtocol, BundleContents +from opentrons.protocols.types import ( + ApiDeprecationError, + Protocol, + PythonProtocol, + BundleContents, +) from opentrons.protocols.api_support.deck_type import ( - guess_from_global_config as guess_deck_type_from_global_config, + for_simulation as deck_type_for_simulation, + should_load_fixed_trash, + should_load_fixed_trash_for_python_protocol, ) from opentrons.protocols.api_support.types import APIVersion -from opentrons_shared_data.labware.dev_types import LabwareDefinition +from opentrons_shared_data.labware.labware_definition import LabwareDefinition -from .util.entrypoint_util import labware_from_paths, datafiles_from_paths +from .util import entrypoint_util + +if TYPE_CHECKING: + from opentrons_shared_data.labware.dev_types import ( + LabwareDefinition as LabwareDefinitionDict, + ) # See Jira RCORE-535. -_PYTHON_TOO_NEW_MESSAGE = ( - "Python protocols with apiLevels higher than 2.13" - " cannot currently be simulated with" - " the opentrons_simulate command-line tool," - " the opentrons.simulate.simulate() function," - " or the opentrons.simulate.get_protocol_api() function." - " Use a lower apiLevel" - " or use the Opentrons App instead." -) _JSON_TOO_NEW_MESSAGE = ( "Protocols created by recent versions of Protocol Designer" " cannot currently be simulated with" @@ -70,11 +89,41 @@ ) -class AccumulatingHandler(logging.Handler): +# When a ProtocolContext is using a ProtocolEngine to control the robot, +# it requires some long-lived resources. There's a background thread, +# an asyncio event loop in that thread, and some ProtocolEngine-controlled background tasks in that +# event loop. +# +# When we're executing a protocol file beginning-to-end, we can clean up those resources after it +# completes. However, when someone gets a live ProtocolContext through get_protocol_api(), we have +# no way of knowing when they're done with it. So, as a hack, we keep these resources open +# indefinitely, letting them leak. +# +# We keep this at module scope so that the contained context managers aren't garbage-collected. +# If they're garbage collected, they can close their resources prematurely. +# https://stackoverflow.com/a/69155026/497934 +_LIVE_PROTOCOL_ENGINE_CONTEXTS = ExitStack() + + +# TODO(mm, 2023-10-05): Deduplicate this with opentrons.protocols.parse(). +_UserSpecifiedRobotType = Literal["OT-2", "Flex"] +"""The user-facing robot type specifier. + +This should match what `opentrons.protocols.parse()` accepts in a protocol's `requirements` dict. +""" + + +# TODO(mm, 2023-10-05): Type _SimulateResultRunLog more precisely by using TypedDicts from +# opentrons.commands. +_SimulateResultRunLog = List[Mapping[str, Any]] +_SimulateResult = Tuple[_SimulateResultRunLog, Optional[BundleContents]] + + +class _AccumulatingHandler(logging.Handler): def __init__( self, level: str, - command_queue: "queue.Queue[Any]", + command_queue: "queue.Queue[object]", ) -> None: """Create the handler @@ -84,86 +133,96 @@ def __init__( self._command_queue = command_queue super().__init__(level) - def emit(self, record: Any) -> None: + def emit(self, record: object) -> None: self._command_queue.put(record) -class CommandScraper: - """An object that handles scraping the broker for commands - - This should be instantiated with the logger to integrate - messages from (e.g. ``logging.getLogger('opentrons')``), the - level to scrape, and the opentrons broker object to subscribe to. - - The :py:attr:`commands` property contains the list of commands - and log messages integrated together. Each element of the list is - a dict following the pattern in the docs of :py:obj:`simulate`. - """ - +class _CommandScraper: def __init__( - self, logger: logging.Logger, level: str, broker: opentrons.broker.Broker + self, logger: logging.Logger, level: str, broker: LegacyBroker ) -> None: - """Build the scraper. + """An object that handles scraping the broker for commands and integrating log messages + with them. - :param logger: The :py:class:`logging.logger` to scrape - :param level: The log level to scrape - :param broker: Which broker to subscribe to + Params: + logger: The logger to integrate messages from, e.g. ``logging.getLogger("opentrons")``. + level: The log level to scrape. + broker: The broker to subscribe to for commands. """ self._logger = logger + self._level = level self._broker = broker - self._queue = queue.Queue() # type: ignore - if level != "none": - level = getattr(logging, level.upper(), logging.WARNING) - self._logger.setLevel(level) - self._handler: Optional[AccumulatingHandler] = AccumulatingHandler( - level, self._queue - ) - logger.addHandler(self._handler) - else: - self._handler = None - self._depth = 0 - self._commands: List[Mapping[str, Any]] = [] - self._unsub = self._broker.subscribe( - command_types.COMMAND, self._command_callback - ) + self._commands: _SimulateResultRunLog = [] @property - def commands(self) -> List[Mapping[str, Mapping[str, Any]]]: - """The list of commands. See :py:obj:`simulate`""" + def commands(self) -> _SimulateResultRunLog: + """The list of commands scraped while `.scrape()` was open, integrated with log messages. + + See :py:obj:`simulate` for the return type. + """ return self._commands - def __del__(self) -> None: - if getattr(self, "_handler", None): - try: - self._logger.removeHandler(self._handler) # type: ignore - except Exception: - pass - if hasattr(self, "_unsub"): - self._unsub() - - def _command_callback(self, message: command_types.CommandMessage) -> None: - """The callback subscribed to the broker""" - payload = message["payload"] - if message["$"] == "before": - self._commands.append( - {"level": self._depth, "payload": payload, "logs": []} + @contextmanager + def scrape(self) -> Generator[None, None, None]: + """While this context manager is open, scrape the broker for commands and integrate log + messages with them. The accumulated commands will be accessible through `.commands`. + """ + log_queue: "queue.Queue[object]" = queue.Queue() + + depth = 0 + + def handle_command(message: command_types.CommandMessage) -> None: + """The callback that we will subscribe to the broker.""" + nonlocal depth + payload = message["payload"] + if message["$"] == "before": + self._commands.append({"level": depth, "payload": payload, "logs": []}) + depth += 1 + else: + while not log_queue.empty(): + self._commands[-1]["logs"].append(log_queue.get()) + depth = max(depth - 1, 0) + + if self._level != "none": + # The simulation entry points probably leave logging unconfigured, so the level will be + # Python's default. Set it to what the user asked to make sure we see the expected + # records. + # + # TODO(mm, 2023-10-03): This is a bit too intrusive for something whose job is just to + # "scrape." The entry point function should be responsible for setting the underlying + # logger's level. Also, we should probably restore the original level when we're done. + level = getattr(logging, self._level.upper(), logging.WARNING) + self._logger.setLevel(level) + + log_handler: Optional[_AccumulatingHandler] = _AccumulatingHandler( + self._level.upper(), log_queue ) - self._depth += 1 else: - while not self._queue.empty(): - self._commands[-1]["logs"].append(self._queue.get()) - self._depth = max(self._depth - 1, 0) + log_handler = None + + with ExitStack() as exit_stack: + if log_handler is not None: + self._logger.addHandler(log_handler) + exit_stack.callback(self._logger.removeHandler, log_handler) + + unsubscribe_from_broker = self._broker.subscribe( + command_types.COMMAND, handle_command + ) + exit_stack.callback(unsubscribe_from_broker) + + yield def get_protocol_api( version: Union[str, APIVersion], - bundled_labware: Optional[Dict[str, LabwareDefinition]] = None, + bundled_labware: Optional[Dict[str, "LabwareDefinitionDict"]] = None, bundled_data: Optional[Dict[str, bytes]] = None, - extra_labware: Optional[Dict[str, LabwareDefinition]] = None, + extra_labware: Optional[Dict[str, "LabwareDefinitionDict"]] = None, hardware_simulator: Optional[ThreadManagedHardware] = None, - # TODO(mm, 2022-12-14): The name and type of this parameter should be unified with - # robotType in a standalone Python protocol's `requirements` dict. Jira RCORE-318. - machine: Optional[MachineType] = None, + # Additional arguments are kw-only to make mistakes harder in environments without + # type checking, like Jupyter Notebook. + *, + robot_type: Optional[_UserSpecifiedRobotType] = None, ) -> protocol_api.ProtocolContext: """ Build and return a ``protocol_api.ProtocolContext`` @@ -198,8 +257,9 @@ def get_protocol_api( it will look for labware in the ``labware`` subdirectory of the Jupyter data directory. :param hardware_simulator: If specified, a hardware simulator instance. - :param machine: Either `"ot2"` or `"ot3"`. If `None`, machine will be - determined from persistent settings. + :param robot_type: The type of robot to simulate: either ``"Flex"`` or ``"OT-2"``. + If you're running this function on a robot, the default is the type of that + robot. Otherwise, the default is ``"OT-2"``, for backwards compatibility. :return: The protocol context. """ if isinstance(version, str): @@ -208,72 +268,130 @@ def get_protocol_api( raise TypeError("version must be either a string or an APIVersion") else: checked_version = version - if ( - extra_labware is None - and IS_ROBOT - and JUPYTER_NOTEBOOK_LABWARE_DIR.is_dir() # type: ignore[union-attr] - ): + + current_robot_type = _get_current_robot_type() + if robot_type is None: + if current_robot_type is None: + parsed_robot_type: RobotType = "OT-2 Standard" + else: + parsed_robot_type = current_robot_type + else: + # TODO(mm, 2023-10-09): This raises a slightly wrong error message, mentioning the camelCase + # `robotType` field in Python files instead of the snake_case `robot_type` argument for this + # function. + parsed_robot_type = parse.robot_type_from_python_identifier(robot_type) + _validate_can_simulate_for_robot_type(parsed_robot_type) + deck_type = deck_type_for_simulation(parsed_robot_type) + + if extra_labware is None: extra_labware = { uri: details.definition - for uri, details in labware_from_paths( - [str(JUPYTER_NOTEBOOK_LABWARE_DIR)] - ).items() + for uri, details in (entrypoint_util.find_jupyter_labware() or {}).items() } - checked_hardware = _check_hardware_simulator(hardware_simulator, machine) - return _build_protocol_context( - version=checked_version, - hardware_simulator=checked_hardware, - bundled_labware=bundled_labware, - bundled_data=bundled_data, - extra_labware=extra_labware, + checked_hardware = _make_hardware_simulator( + override=hardware_simulator, robot_type=parsed_robot_type ) + if checked_version < ENGINE_CORE_API_VERSION: + context = _create_live_context_non_pe( + api_version=checked_version, + deck_type=deck_type, + hardware_api=checked_hardware, + bundled_labware=bundled_labware, + bundled_data=bundled_data, + extra_labware=extra_labware, + ) + else: + if bundled_labware is not None: + # Protocol Engine has a deep assumption that standard labware definitions are always + # implicitly loadable. + raise NotImplementedError( + f"The bundled_labware argument is not currently supported for Python protocols" + f" with apiLevel {ENGINE_CORE_API_VERSION} or newer." + ) + context = _create_live_context_pe( + api_version=checked_version, + robot_type=parsed_robot_type, + deck_type=deck_type, + hardware_api=checked_hardware, + bundled_data=bundled_data, + extra_labware=extra_labware, + ) -def _check_hardware_simulator( - hardware_simulator: Optional[ThreadManagedHardware], machine: Optional[MachineType] + # Intentional difference from execute.get_protocol_api(): + # For the caller's convenience, we home the virtual hardware so they don't get MustHomeErrors. + # Since this hardware is virtual, there's no harm in commanding this "movement" implicitly. + context.home() + + return context + + +def _make_hardware_simulator( + override: Optional[ThreadManagedHardware], robot_type: RobotType ) -> ThreadManagedHardware: - # TODO(mm, 2022-12-14): This should fail with a more descriptive error if someone - # runs this on a robot, and that robot doesn't have a matching robot type. - # Jira RCORE-318. - if hardware_simulator: - return hardware_simulator - elif machine == "ot3" or should_use_ot3(): + if override: + return override + elif robot_type == "OT-3 Standard": + # Local import because this isn't available on OT-2s. from opentrons.hardware_control.ot3api import OT3API - return ThreadManager(OT3API.build_hardware_simulator) + return ThreadManager( + OT3API.build_hardware_simulator, + feature_flags=HardwareFeatureFlags.build_from_ff(), + ) + elif robot_type == "OT-2 Standard": + return ThreadManager( + OT2API.build_hardware_simulator, + feature_flags=HardwareFeatureFlags.build_from_ff(), + ) + + +@contextmanager +def _make_hardware_simulator_cm( + config_file_path: Optional[pathlib.Path], robot_type: RobotType +) -> Generator[ThreadManagedHardware, None, None]: + if config_file_path is not None: + result = ThreadManager( + load_simulator, + pathlib.Path(config_file_path), + ) + try: + yield result + finally: + result.clean_up() else: - return ThreadManager(OT2API.build_hardware_simulator) + result = _make_hardware_simulator(override=None, robot_type=robot_type) + try: + yield result + finally: + result.clean_up() -def _build_protocol_context( - version: APIVersion, - hardware_simulator: ThreadManagedHardware, - bundled_labware: Optional[Dict[str, LabwareDefinition]], - bundled_data: Optional[Dict[str, bytes]], - extra_labware: Optional[Dict[str, LabwareDefinition]], -) -> protocol_api.ProtocolContext: - """Internal version of :py:meth:`get_protocol_api` that allows deferring - version specification for use with - :py:meth:`.protocol_api.execute.run_protocol` - """ - try: - context = protocol_api.create_protocol_context( - api_version=version, - hardware_api=hardware_simulator, - # FIXME(2022-12-02): Instead of guessing, - # match this to the robot type declared by the protocol. - # https://opentrons.atlassian.net/browse/RSS-156 - deck_type=guess_deck_type_from_global_config(), - bundled_labware=bundled_labware, - bundled_data=bundled_data, - extra_labware=extra_labware, - use_simulating_core=True, +def _get_current_robot_type() -> Optional[RobotType]: + """Return the type of robot that we're running on, or None if we're not on a robot.""" + if IS_ROBOT: + return "OT-3 Standard" if should_use_ot3() else "OT-2 Standard" + else: + return None + + +def _validate_can_simulate_for_robot_type(robot_type: RobotType) -> None: + """Raise if this device cannot simulate protocols written for the given robot type.""" + current_robot_type = _get_current_robot_type() + if current_robot_type is None: + # When installed locally, this package can simulate protocols for any robot type. + pass + elif robot_type != current_robot_type: + # Match robot server behavior: raise an early error if we're on a robot and the caller + # tries to simulate a protocol written for a different robot type. + + # FIXME: This exposes the internal strings "OT-2 Standard" and "OT-3 Standard". + # https://opentrons.atlassian.net/browse/RSS-370 + raise RuntimeError( + f'This robot is of type "{current_robot_type}",' + f' so it can\'t simulate protocols for robot type "{robot_type}"' ) - except protocol_api.ProtocolEngineCoreRequiredError as e: - raise NotImplementedError(_PYTHON_TOO_NEW_MESSAGE) from e # See Jira RCORE-535. - context.home() - return context def bundle_from_sim( @@ -283,7 +401,7 @@ def bundle_from_sim( From a protocol, and the context that has finished simulating that protocol, determine what needs to go in a bundle for the protocol. """ - bundled_labware: Dict[str, LabwareDefinition] = {} + bundled_labware: Dict[str, "LabwareDefinitionDict"] = {} for lw in context.loaded_labwares.values(): if ( isinstance(lw, opentrons.protocol_api.labware.Labware) @@ -299,7 +417,7 @@ def bundle_from_sim( ) -def simulate( # noqa: C901 +def simulate( protocol_file: Union[BinaryIO, TextIO], file_name: Optional[str] = None, custom_labware_paths: Optional[List[str]] = None, @@ -308,11 +426,7 @@ def simulate( # noqa: C901 hardware_simulator_file_path: Optional[str] = None, duration_estimator: Optional[DurationEstimator] = None, log_level: str = "warning", - # TODO(mm, 2022-12-14): Now that protocols declare their target robot types - # intrinsically, the `machine` param should be removed in favor of determining - # it automatically. - machine: Optional[MachineType] = None, -) -> Tuple[List[Mapping[str, Any]], Optional[BundleContents]]: +) -> _SimulateResult: """ Simulate the protocol itself. @@ -334,15 +448,23 @@ def simulate( # noqa: C901 Each dict element in the run log has the following keys: - - ``level``: The depth at which this command is nested - if this an - aspirate inside a mix inside a transfer, for instance, - it would be 3. - - ``payload``: The command, its arguments, and how to format its text. - For more specific details see - ``opentrons.commands``. To format a message from - a payload do ``payload['text'].format(**payload)``. + - ``level``: The depth at which this command is nested. If this an + aspirate inside a mix inside a transfer, for instance, it would be 3. + + - ``payload``: The command. The human-readable run log text is available at + ``payload["text"]``. The other keys of ``payload`` are command-dependent; + see ``opentrons.commands``. + + .. note:: + In older software versions, ``payload["text"]`` was a + `format string `_. + To get human-readable text, you had to do ``payload["text"].format(**payload)``. + Don't do that anymore. If ``payload["text"]`` happens to contain any + ``{`` or ``}`` characters, it can confuse ``.format()`` and cause it to raise a + ``KeyError``. + - ``logs``: Any log messages that occurred during execution of this - command, as a logging.LogRecord + command, as a standard Python :py:obj:`~logging.LogRecord`. :param protocol_file: The protocol file to simulate. :param file_name: The name of the file @@ -369,11 +491,9 @@ def simulate( # noqa: C901 occur during protocol simulation are best associated with the actions in the protocol that cause them. Default: ``False`` - :param log_level: The level of logs to capture in the runlog: + :param log_level: The level of logs to capture in the run log: ``"debug"``, ``"info"``, ``"warning"``, or ``"error"``. Defaults to ``"warning"``. - :param machine: Either `"ot2"` or `"ot3"`. If `None`, machine will be - determined from persistent settings. :returns: A tuple of a run log for user output, and possibly the required data to write to a bundle to bundle this protocol. The bundle is only emitted if bundling is allowed @@ -382,32 +502,30 @@ def simulate( # noqa: C901 """ stack_logger = logging.getLogger("opentrons") stack_logger.propagate = propagate_logs + # _CommandScraper will set the level of this logger. - contents = protocol_file.read() + # TODO(mm, 2023-10-02): Switch this truthy check to `is not None` + # to match documented behavior. + # See notes in https://github.com/Opentrons/opentrons/pull/13107 if custom_labware_paths: - extra_labware = { - uri: details.definition - for uri, details in labware_from_paths(custom_labware_paths).items() - } + extra_labware = entrypoint_util.labware_from_paths(custom_labware_paths) else: - extra_labware = {} + extra_labware = entrypoint_util.find_jupyter_labware() or {} if custom_data_paths: - extra_data = datafiles_from_paths(custom_data_paths) + extra_data = entrypoint_util.datafiles_from_paths(custom_data_paths) else: extra_data = {} - hardware_simulator = None - - if hardware_simulator_file_path: - hardware_simulator = ThreadManager( - load_simulator, - pathlib.Path(hardware_simulator_file_path), - ) - + contents = protocol_file.read() try: protocol = parse.parse( - contents, file_name, extra_labware=extra_labware, extra_data=extra_data + contents, + file_name, + extra_labware={ + uri: details.definition for uri, details in extra_labware.items() + }, + extra_data=extra_data, ) except parse.JSONSchemaVersionTooNewError as e: if e.attempted_schema_version == 6: @@ -416,42 +534,43 @@ def simulate( # noqa: C901 else: raise - bundle_contents: Optional[BundleContents] = None - - # we want a None literal rather than empty dict so get_protocol_api - # will look for custom labware if this is a robot - gpa_extras = getattr(protocol, "extra_labware", None) or None - - try: - context = get_protocol_api( - getattr(protocol, "api_level", MAX_SUPPORTED_VERSION), - bundled_labware=getattr(protocol, "bundled_labware", None), - bundled_data=getattr(protocol, "bundled_data", None), - hardware_simulator=hardware_simulator, - extra_labware=gpa_extras, - machine=machine, - ) - except protocol_api.ProtocolEngineCoreRequiredError as e: - raise NotImplementedError(_PYTHON_TOO_NEW_MESSAGE) from e # See Jira RCORE-535. - - broker = context.broker - scraper = CommandScraper(stack_logger, log_level, broker) - if duration_estimator: - broker.subscribe(command_types.COMMAND, duration_estimator.on_message) - - try: - execute.run_protocol(protocol, context) - if ( - isinstance(protocol, PythonProtocol) - and protocol.api_level >= APIVersion(2, 0) - and protocol.bundled_labware is None - and allow_bundle() - ): - bundle_contents = bundle_from_sim(protocol, context) - finally: - context.cleanup() - - return scraper.commands, bundle_contents + if protocol.api_level < APIVersion(2, 0): + raise ApiDeprecationError(version=protocol.api_level) + + _validate_can_simulate_for_robot_type(protocol.robot_type) + + with _make_hardware_simulator_cm( + config_file_path=( + None + if hardware_simulator_file_path is None + else pathlib.Path(hardware_simulator_file_path) + ), + robot_type=protocol.robot_type, + ) as hardware_simulator: + if protocol.api_level < ENGINE_CORE_API_VERSION: + return _run_file_non_pe( + protocol=protocol, + hardware_api=hardware_simulator, + logger=stack_logger, + level=log_level, + duration_estimator=duration_estimator, + ) + else: + # TODO(mm, 2023-07-06): Once these NotImplementedErrors are resolved, consider removing + # the enclosing if-else block and running everything through _run_file_pe() for simplicity. + if custom_data_paths: + raise NotImplementedError( + f"The custom_data_paths argument is not currently supported for Python protocols" + f" with apiLevel {ENGINE_CORE_API_VERSION} or newer." + ) + protocol_file.seek(0) + return _run_file_pe( + protocol=protocol, + robot_type=protocol.robot_type, + hardware_api=hardware_simulator, + stack_logger=stack_logger, + log_level=log_level, + ) def format_runlog(runlog: List[Mapping[str, Any]]) -> str: @@ -619,7 +738,6 @@ def get_arguments(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: choices=["runlog", "nothing"], default="runlog", ) - parser.add_argument("-m", "--machine", choices=["ot2", "ot3"]) return parser @@ -642,13 +760,203 @@ def _get_bundle_dest( return None +def _create_live_context_non_pe( + api_version: APIVersion, + hardware_api: ThreadManagedHardware, + deck_type: str, + extra_labware: Optional[Dict[str, "LabwareDefinitionDict"]], + bundled_labware: Optional[Dict[str, "LabwareDefinitionDict"]], + bundled_data: Optional[Dict[str, bytes]], +) -> ProtocolContext: + """Return a live ProtocolContext. + + This controls the robot through the older infrastructure, instead of through Protocol Engine. + """ + assert api_version < ENGINE_CORE_API_VERSION + return protocol_api.create_protocol_context( + api_version=api_version, + deck_type=deck_type, + hardware_api=hardware_api, + bundled_labware=bundled_labware, + bundled_data=bundled_data, + extra_labware=extra_labware, + ) + + +def _create_live_context_pe( + api_version: APIVersion, + hardware_api: ThreadManagedHardware, + robot_type: RobotType, + deck_type: str, + extra_labware: Dict[str, "LabwareDefinitionDict"], + bundled_data: Optional[Dict[str, bytes]], +) -> ProtocolContext: + """Return a live ProtocolContext that controls the robot through ProtocolEngine.""" + assert api_version >= ENGINE_CORE_API_VERSION + + global _LIVE_PROTOCOL_ENGINE_CONTEXTS + pe, loop = _LIVE_PROTOCOL_ENGINE_CONTEXTS.enter_context( + create_protocol_engine_in_thread( + hardware_api=hardware_api.wrapped(), + config=_get_protocol_engine_config(robot_type), + drop_tips_after_run=False, + post_run_hardware_state=PostRunHardwareState.STAY_ENGAGED_IN_PLACE, + load_fixed_trash=should_load_fixed_trash_for_python_protocol(api_version), + ) + ) + + # `async def` so we can use loop.run_coroutine_threadsafe() to wait for its completion. + # Non-async would use call_soon_threadsafe(), which makes the waiting harder. + async def add_all_extra_labware() -> None: + for labware_definition_dict in extra_labware.values(): + labware_definition = LabwareDefinition.parse_obj(labware_definition_dict) + pe.add_labware_definition(labware_definition) + + # Add extra_labware to ProtocolEngine, being careful not to modify ProtocolEngine from this + # thread. See concurrency notes in ProtocolEngine docstring. + future = asyncio.run_coroutine_threadsafe(add_all_extra_labware(), loop) + future.result() + + return protocol_api.create_protocol_context( + api_version=api_version, + hardware_api=hardware_api, + deck_type=deck_type, + protocol_engine=pe, + protocol_engine_loop=loop, + bundled_data=bundled_data, + ) + + +def _run_file_non_pe( + protocol: Protocol, + hardware_api: ThreadManagedHardware, + logger: logging.Logger, + level: str, + duration_estimator: Optional[DurationEstimator], +) -> _SimulateResult: + """Run a protocol file without Protocol Engine, with the older infrastructure instead.""" + if isinstance(protocol, PythonProtocol): + extra_labware = protocol.extra_labware + bundled_labware = protocol.bundled_labware + bundled_data = protocol.bundled_data + else: + # JSON protocols do have "bundled labware" embedded in them, but those aren't represented in + # the parsed Protocol object and we don't need to create the ProtocolContext with them. + # execute_apiv2.run_protocol() will pull them out of the JSON and load them into the + # ProtocolContext. + extra_labware = None + bundled_labware = None + bundled_data = None + + context = _create_live_context_non_pe( + api_version=protocol.api_level, + hardware_api=hardware_api, + deck_type=deck_type_for_simulation(protocol.robot_type), + extra_labware=extra_labware, + bundled_labware=bundled_labware, + bundled_data=bundled_data, + ) + + scraper = _CommandScraper(logger=logger, level=level, broker=context.broker) + if duration_estimator: + context.broker.subscribe(command_types.COMMAND, duration_estimator.on_message) + + context.home() + with scraper.scrape(): + try: + execute.run_protocol(protocol, context) + if ( + isinstance(protocol, PythonProtocol) + and protocol.api_level >= APIVersion(2, 0) + and protocol.bundled_labware is None + and allow_bundle() + ): + bundle_contents: Optional[BundleContents] = bundle_from_sim( + protocol, context + ) + else: + bundle_contents = None + + finally: + context.cleanup() + + return scraper.commands, bundle_contents + + +def _run_file_pe( + protocol: Protocol, + robot_type: RobotType, + hardware_api: ThreadManagedHardware, + stack_logger: logging.Logger, + log_level: str, +) -> _SimulateResult: + """Run a protocol file with Protocol Engine.""" + + async def run(protocol_source: ProtocolSource) -> _SimulateResult: + protocol_engine = await create_protocol_engine( + hardware_api=hardware_api.wrapped(), + config=_get_protocol_engine_config(robot_type), + load_fixed_trash=should_load_fixed_trash(protocol_source.config), + ) + + protocol_runner = create_protocol_runner( + protocol_config=protocol_source.config, + protocol_engine=protocol_engine, + hardware_api=hardware_api.wrapped(), + ) + + scraper = _CommandScraper(stack_logger, log_level, protocol_runner.broker) + with scraper.scrape(): + result = await protocol_runner.run( + # deck_configuration=[] is a placeholder value, ignored because + # the Protocol Engine config specifies use_simulated_deck_config=True. + deck_configuration=[], + protocol_source=protocol_source, + ) + + if result.state_summary.status != EngineStatus.SUCCEEDED: + raise entrypoint_util.ProtocolEngineExecuteError( + result.state_summary.errors + ) + + # We don't currently support returning bundle contents from protocols run through + # Protocol Engine. To get them, bundle_from_sim() requires direct access to the + # ProtocolContext, which opentrons.protocol_runner does not grant us. + bundle_contents = None + + return scraper.commands, bundle_contents + + with entrypoint_util.adapt_protocol_source(protocol) as protocol_source: + return asyncio.run(run(protocol_source)) + + +def _get_protocol_engine_config(robot_type: RobotType) -> Config: + """Return a Protocol Engine config to execute protocols on this device.""" + return Config( + robot_type=robot_type, + deck_type=DeckType(deck_type_for_simulation(robot_type)), + ignore_pause=True, + use_virtual_pipettes=True, + use_virtual_modules=True, + use_virtual_gripper=True, + use_simulated_deck_config=True, + ) + + +@atexit.register +def _clear_live_protocol_engine_contexts() -> None: + global _LIVE_PROTOCOL_ENGINE_CONTEXTS + _LIVE_PROTOCOL_ENGINE_CONTEXTS.close() + + # Note - this script is also set up as a setuptools entrypoint and thus does # an absolute minimum of work since setuptools does something odd generating # the scripts def main() -> int: """Run the simulation""" parser = argparse.ArgumentParser( - prog="opentrons_simulate", description="Simulate an OT-2 protocol" + prog="opentrons_simulate", + description="Simulate a protocol for an Opentrons robot", ) parser = get_arguments(parser) @@ -658,16 +966,21 @@ def main() -> int: # TODO(mm, 2022-12-01): Configure the DurationEstimator with the correct deck type. duration_estimator = DurationEstimator() if args.estimate_duration else None # type: ignore[no-untyped-call] - runlog, maybe_bundle = simulate( - protocol_file=args.protocol, - file_name=args.protocol.name, - custom_labware_paths=args.custom_labware_path, - custom_data_paths=(args.custom_data_path + args.custom_data_file), - duration_estimator=duration_estimator, - hardware_simulator_file_path=getattr(args, "custom_hardware_simulator_file"), - log_level=args.log_level, - machine=cast(Optional[MachineType], args.machine), - ) + try: + runlog, maybe_bundle = simulate( + protocol_file=args.protocol, + file_name=args.protocol.name, + custom_labware_paths=args.custom_labware_path, + custom_data_paths=(args.custom_data_path + args.custom_data_file), + duration_estimator=duration_estimator, + hardware_simulator_file_path=getattr( + args, "custom_hardware_simulator_file" + ), + log_level=args.log_level, + ) + except entrypoint_util.ProtocolEngineExecuteError as error: + print(error.to_stderr_string(), file=sys.stderr) + return 1 if maybe_bundle: bundle_name = getattr(args, "bundle", None) diff --git a/api/src/opentrons/system/log_control.py b/api/src/opentrons/system/log_control.py index 24f505d6b08..bd44af3c7c2 100644 --- a/api/src/opentrons/system/log_control.py +++ b/api/src/opentrons/system/log_control.py @@ -7,7 +7,7 @@ import asyncio import logging import subprocess -from typing import Tuple +from typing import List LOG = logging.getLogger(__name__) @@ -16,6 +16,12 @@ DEFAULT_RECORDS = 50000 UNIT_SELECTORS = ["opentrons-robot-server", "opentrons-robot-app"] +SERIAL_SPECIAL = "ALL_SERIAL" +SERIAL_SELECTORS = [ + "opentrons-api-serial", + "opentrons-api-serial-can", + "opentrons-api-serial-usbbin", +] async def get_records_dumb(selector: str, records: int, mode: str) -> bytes: @@ -25,13 +31,19 @@ async def get_records_dumb(selector: str, records: int, mode: str) -> bytes: :param records: The maximum number of records to print :param mode: A journalctl dump mode. Should be either "short-precise" or "json". """ - selector_flag = "-u" if selector in UNIT_SELECTORS else "-t" + selector_array: List[str] = [] + if selector == SERIAL_SPECIAL: + for serial_selector in SERIAL_SELECTORS: + selector_array.extend(["-t", serial_selector]) + elif selector in UNIT_SELECTORS: + selector_array.extend(["-u", selector]) + else: + selector_array.extend(["-t", selector]) proc = await asyncio.create_subprocess_exec( "journalctl", "--no-pager", - selector_flag, - selector, + *selector_array, "-n", str(records), "-o", @@ -41,36 +53,3 @@ async def get_records_dumb(selector: str, records: int, mode: str) -> bytes: ) stdout, _ = await proc.communicate() return stdout - - -async def set_syslog_level(level: str) -> Tuple[int, str, str]: - """ - Set the minimum level for which logs will be sent upstream via syslog-ng. - - This is the function that actually does the work for - :py:meth:`set_syslog_level_handler`. - - Similar to :py:meth:`opentrons.server.endpoints.settings.set_log_level`, - the level should be a python log level like "debug", "info", "warning", or - "error". If it is null, sets the minimum log level to emergency which we - do not log at since there's not really a matching level in python logging, - which effectively disables log upstreaming. - - :returns tuple(int, str, str): The error code, stdout, and stderr from - ``syslog-ng-ctl``. ``0`` is success, - anything else is failure - """ - with open("/var/lib/syslog-ng/min-level", "w") as ml: - ml.write(level) - proc = await asyncio.create_subprocess_exec( - "syslog-ng-ctl", - "reload", - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - ) - stdout, stderr = await proc.communicate() - if proc.returncode is None: - snc_reload_result = -1 - else: - snc_reload_result: int = proc.returncode # type: ignore - return snc_reload_result, stdout.decode(), stderr.decode() diff --git a/api/src/opentrons/system/wifi.py b/api/src/opentrons/system/wifi.py index 24880348f20..3b5ac91d5ee 100644 --- a/api/src/opentrons/system/wifi.py +++ b/api/src/opentrons/system/wifi.py @@ -2,7 +2,7 @@ import logging import os import shutil -from typing import Generator, Optional, Dict, Any +from typing import Generator, Optional, Dict, Any, TypedDict, List from dataclasses import dataclass from opentrons.config import CONFIG @@ -15,7 +15,17 @@ class ConfigureArgsError(Exception): pass -EAP_CONFIG_SHAPE = { +class EapConfigItem(TypedDict): + name: str + displayName: str + options: List[Dict[str, Any]] + + +class EapConfigShape(TypedDict): + options: List[EapConfigItem] + + +EAP_CONFIG_SHAPE: EapConfigShape = { "options": [ { "name": method.qualified_name(), @@ -186,9 +196,7 @@ def eap_check_config(eap_config: Dict[str, Any]) -> Dict[str, Any]: _eap_check_no_extra_args(eap_config, options) - for opt in options: # type: ignore - # Ignoring most types to do with EAP_CONFIG_SHAPE because of issues - # wth type inference for dict comprehensions + for opt in options: _eap_check_option_ok(opt, eap_config) if opt["type"] == "file" and opt["name"] in eap_config: # Special work for file: rewrite from key id to path diff --git a/api/src/opentrons/tools/args_handler.py b/api/src/opentrons/tools/args_handler.py index dbb89808882..e8bdf5ead05 100644 --- a/api/src/opentrons/tools/args_handler.py +++ b/api/src/opentrons/tools/args_handler.py @@ -2,6 +2,7 @@ from typing import Optional, Tuple, cast from opentrons.hardware_control import API, Controller +from opentrons.hardware_control.types import HardwareFeatureFlags from opentrons.drivers.smoothie_drivers import SmoothieDriver @@ -14,6 +15,8 @@ def root_argparser(description: Optional[str] = None) -> argparse.ArgumentParser async def build_driver(port: Optional[str] = None) -> Tuple[API, SmoothieDriver]: - hardware = await API.build_hardware_controller(port=port) + hardware = await API.build_hardware_controller( + port=port, feature_flags=HardwareFeatureFlags.build_from_ff() + ) backend: Controller = cast(Controller, hardware._backend) return hardware, backend._smoothie_driver diff --git a/api/src/opentrons/types.py b/api/src/opentrons/types.py index fbfe2dab403..44035851b35 100644 --- a/api/src/opentrons/types.py +++ b/api/src/opentrons/types.py @@ -1,7 +1,7 @@ from __future__ import annotations import enum from math import sqrt, isclose -from typing import TYPE_CHECKING, Any, NamedTuple, Iterable, Union, List +from typing import TYPE_CHECKING, Any, NamedTuple, Iterator, Union, List from opentrons_shared_data.robot.dev_types import RobotType @@ -41,12 +41,12 @@ def __sub__(self, other: Any) -> Point: return NotImplemented return Point(self.x - other.x, self.y - other.y, self.z - other.z) - def __mul__(self, other: Union[int, float]) -> Point: + def __mul__(self, other: Union[int, float]) -> Point: # type: ignore[override] if not isinstance(other, (float, int)): return NotImplemented return Point(self.x * other, self.y * other, self.z * other) - def __rmul__(self, other: Union[int, float]) -> Point: + def __rmul__(self, other: Union[int, float]) -> Point: # type: ignore[override] if not isinstance(other, (float, int)): return NotImplemented return Point(self.x * other, self.y * other, self.z * other) @@ -132,14 +132,16 @@ def point(self) -> Point: def labware(self) -> LabwareLike: return self._labware - def __iter__(self) -> Iterable[Union[Point, LabwareLike]]: - """Iterable interface to support unpacking. Like a tuple.""" - return iter( - ( - self._point, - self._labware, - ) - ) + def __iter__(self) -> Iterator[Union[Point, LabwareLike]]: + """Iterable interface to support unpacking. Like a tuple. + + .. note:: + While type annotations cannot properly support this, it will work in practice: + + point, labware = location + some_function_taking_both(*location) + """ + return iter((self._point, self._labware)) # type: ignore [arg-type] def __eq__(self, other: object) -> bool: return ( @@ -357,6 +359,38 @@ def __str__(self) -> str: _ot3_to_ot2 = {ot3: ot2 for ot2, ot3 in _slot_equivalencies} +# TODO(jbl 11-17-2023) move this away from being an Enum and make this a NewType or something similar +class StagingSlotName(enum.Enum): + """Staging slot identifiers.""" + + SLOT_A4 = "A4" + SLOT_B4 = "B4" + SLOT_C4 = "C4" + SLOT_D4 = "D4" + + @classmethod + def from_primitive(cls, value: str) -> StagingSlotName: + str_val = value.upper() + return cls(str_val) + + @property + def id(self) -> str: + """This slot's unique ID, as it appears in the deck definition. + + This can be used to look up slot details in the deck definition. + + This is preferred over `.value` or `.__str__()` for explicitness. + """ + return self.value + + def __str__(self) -> str: + """Stringify to the unique ID. + + For explicitness, prefer using `.id` instead. + """ + return self.id + + class TransferTipPolicy(enum.Enum): ONCE = enum.auto() NEVER = enum.auto() @@ -364,3 +398,4 @@ class TransferTipPolicy(enum.Enum): DeckLocation = Union[int, str] +ALLOWED_PRIMARY_NOZZLES = ["A1", "H1", "A12", "H12"] diff --git a/api/src/opentrons/util/__init__.py b/api/src/opentrons/util/__init__.py index e69de29bb2d..7a4ce85a7f6 100644 --- a/api/src/opentrons/util/__init__.py +++ b/api/src/opentrons/util/__init__.py @@ -0,0 +1 @@ +"""Things that are independent from Opentrons business logic, like data structures.""" diff --git a/api/src/opentrons/util/broker.py b/api/src/opentrons/util/broker.py new file mode 100644 index 00000000000..bbdd717ab11 --- /dev/null +++ b/api/src/opentrons/util/broker.py @@ -0,0 +1,84 @@ +"""A simple pub/sub message broker.""" + + +from abc import ABC, abstractmethod +from contextlib import contextmanager +from typing import Callable, ContextManager, Generator, Generic, Set, TypeVar + + +_MessageT = TypeVar("_MessageT") +_CallbackT = Callable[[_MessageT], None] + + +class ReadOnlyBroker(ABC, Generic[_MessageT]): + """The read-only subset of `Broker`. + + Useful for typing if you want people to be able to subscribe to your `Broker`, + but don't want them to be able to publish their own messages to it. + """ + + @abstractmethod + def subscribed(self, callback: _CallbackT[_MessageT]) -> ContextManager[None]: + """See `Broker.subscribed()`.""" # noqa: D402 + pass + + @abstractmethod + def subscribe(self, callback: _CallbackT[_MessageT]) -> Callable[[], None]: + """See `Broker.subscribe()`.""" # noqa: D402 + pass + + +class Broker(Generic[_MessageT], ReadOnlyBroker[_MessageT]): + """A simple pub/sub message broker. + + Subscribers can listen to events. Publishers can push events to all subscribers. + """ + + def __init__(self) -> None: + self._callbacks: Set[_CallbackT[_MessageT]] = set() + + @contextmanager + def subscribed( + self, callback: _CallbackT[_MessageT] + ) -> Generator[None, None, None]: + """Register a callback to be called on each message. + + The callback is subscribed when this context manager is entered, + and unsubscribed when it's exited. + + You must not subscribe the same callback again unless you first usubscribe it. + """ + unsubscribe = self.subscribe(callback) + try: + yield + finally: + unsubscribe() + + def subscribe(self, callback: _CallbackT[_MessageT]) -> Callable[[], None]: + """Register a callback to be called on each message. + + You must not subscribe the same callback again unless you first unsubscribe it. + + Returns: + A function that you can call to unsubscribe ``callback``. + You must not call it more than once. + """ + + def unsubscribe() -> None: + self._callbacks.remove(callback) + + self._callbacks.add(callback) + return unsubscribe + + def publish(self, message: _MessageT) -> None: + """Call every subscribed callback, with ``message`` as the argument. + + The order in which the callbacks are called is undefined. + + If any callback raises an exception, it's propagated, + and any remaining callbacks will be left uncalled. + """ + # Callback order is undefined because + # Python sets don't preserve insertion order. + for callback in self._callbacks: + callback(message) diff --git a/api/src/opentrons/util/entrypoint_util.py b/api/src/opentrons/util/entrypoint_util.py index 954d837c2f3..90236f568f7 100644 --- a/api/src/opentrons/util/entrypoint_util.py +++ b/api/src/opentrons/util/entrypoint_util.py @@ -1,20 +1,40 @@ """ opentrons.util.entrypoint_util: functions common to entrypoints """ +import asyncio +import contextlib from dataclasses import dataclass +import json import logging from json import JSONDecodeError import pathlib -import shutil -from typing import BinaryIO, Dict, Sequence, TextIO, Union, TYPE_CHECKING +import tempfile +from typing import ( + Dict, + Generator, + List, + Optional, + Sequence, + Union, + TYPE_CHECKING, +) from jsonschema import ValidationError # type: ignore +from opentrons.config import IS_ROBOT, JUPYTER_NOTEBOOK_LABWARE_DIR from opentrons.protocol_api import labware from opentrons.calibration_storage import helpers +from opentrons.protocol_engine.errors.error_occurrence import ( + ErrorOccurrence as ProtocolEngineErrorOccurrence, +) +from opentrons.protocol_engine.types import DeckConfigurationType +from opentrons.protocol_reader import ProtocolReader, ProtocolSource +from opentrons.protocols.types import JsonProtocol, Protocol, PythonProtocol if TYPE_CHECKING: from opentrons_shared_data.labware.dev_types import LabwareDefinition + + log = logging.getLogger(__name__) @@ -64,6 +84,24 @@ def labware_from_paths( return labware_defs +def find_jupyter_labware() -> Optional[Dict[str, FoundLabware]]: + """Return labware files in this robot's Jupyter Notebook directory. + + Returns: + If we're running on an Opentrons robot: + A dict, keyed by labware URI, where each value has the file path and the parsed def. + + Otherwise: None. + """ + if IS_ROBOT: + # JUPYTER_NOTEBOOK_LABWARE_DIR should never be None when IS_ROBOT == True. + assert JUPYTER_NOTEBOOK_LABWARE_DIR is not None + if JUPYTER_NOTEBOOK_LABWARE_DIR.is_dir(): + return labware_from_paths([JUPYTER_NOTEBOOK_LABWARE_DIR]) + + return None + + def datafiles_from_paths(paths: Sequence[Union[str, pathlib.Path]]) -> Dict[str, bytes]: datafiles: Dict[str, bytes] = {} for strpath in paths: @@ -86,35 +124,105 @@ def datafiles_from_paths(paths: Sequence[Union[str, pathlib.Path]]) -> Dict[str, return datafiles -# HACK(mm, 2023-06-29): This function is attempting to do something fundamentally wrong. -# Remove it when we fix https://opentrons.atlassian.net/browse/RSS-281. -def copy_file_like(source: Union[BinaryIO, TextIO], destination: pathlib.Path) -> None: - """Copy a file-like object to a path. +def get_deck_configuration() -> DeckConfigurationType: + """Return the host robot's current deck configuration.""" + # TODO: Search for the file where robot-server stores it. + # Flex: /var/lib/opentrons-robot-server/deck_configuration.json + # OT-2: /data/opentrons_robot_server/deck_configuration.json + # https://opentrons.atlassian.net/browse/RSS-400 + return [] - Limitations: - If `source` is text, the new file's encoding may not correctly match its original encoding. - This can matter if it's a Python file and it has an encoding declaration - (https://docs.python.org/3.7/reference/lexical_analysis.html#encoding-declarations). - Also, its newlines may get translated. - """ - # When we read from the source stream, will it give us bytes, or text? - try: - # Experimentally, this is present (but possibly None) on text-mode streams, - # and not present on binary-mode streams. - getattr(source, "encoding") - except AttributeError: - source_is_text = False - else: - source_is_text = True - if source_is_text: - destination_mode = "wt" +@contextlib.contextmanager +def adapt_protocol_source(protocol: Protocol) -> Generator[ProtocolSource, None, None]: + """Convert a `Protocol` to a `ProtocolSource`. + + `Protocol` and `ProtocolSource` do basically the same thing. `Protocol` is the traditional + interface. `ProtocolSource` is the newer, but not necessarily better, interface that's required + to run stuff through Protocol Engine. Ideally, the two would be unified. Until then, we have + this shim. + + This is a context manager because it needs to keep some temp files around. + """ + # ProtocolReader needs to know the filename of the main protocol file so it can infer from its + # extension whether it's a JSON or Python protocol. But that filename doesn't necessarily exist, + # like when a user passes a text stream to opentrons.simulate.simulate(). As a hack, work + # backwards and synthesize a dummy filename with the correct extension. + if protocol.filename is not None: + # We were given a filename, so no need to guess. + # + # It's not well-defined in our customer-facing interfaces whether the supplied protocol_name + # should be just the filename part, or a path with separators. In case it contains stuff + # like "../", sanitize it to just the filename part so we don't save files somewhere bad. + main_file_name = pathlib.Path(protocol.filename).name + elif isinstance(protocol, JsonProtocol): + main_file_name = "protocol.json" else: - destination_mode = "wb" - - with open( - destination, - mode=destination_mode, - ) as destination_file: - # Use copyfileobj() to limit memory usage. - shutil.copyfileobj(fsrc=source, fdst=destination_file) + main_file_name = "protocol.py" + + with tempfile.TemporaryDirectory() as temporary_directory: + # FIXME(mm, 2023-06-26): Copying these files is pure overhead, and it introduces encoding + # hazards. Remove this when we can parse JSONv6+ and PAPIv2.14+ protocols without going + # through the filesystem. https://opentrons.atlassian.net/browse/RSS-281 + + main_file = pathlib.Path(temporary_directory) / main_file_name + main_file.write_text(protocol.text, encoding="utf-8") + + labware_files: List[pathlib.Path] = [] + if isinstance(protocol, PythonProtocol) and protocol.extra_labware is not None: + for labware_index, labware_definition in enumerate( + protocol.extra_labware.values() + ): + new_labware_file = ( + pathlib.Path(temporary_directory) / f"{labware_index}.json" + ) + new_labware_file.write_text( + json.dumps(labware_definition), encoding="utf-8" + ) + labware_files.append(new_labware_file) + + protocol_source = asyncio.run( + ProtocolReader().read_saved( + files=[main_file] + labware_files, + directory=None, + files_are_prevalidated=False, + ) + ) + + yield protocol_source + + +class ProtocolEngineExecuteError(Exception): + def __init__(self, errors: List[ProtocolEngineErrorOccurrence]) -> None: + """Raised when there was any fatal error running a protocol through Protocol Engine. + + Protocol Engine reports errors as data, not as exceptions. + But the only way for `opentrons.execute.execute()` and `opentrons.simulate.simulate()` + to signal problems to their callers is to raise something. + So we need this class to wrap them. + + Params: + errors: The errors that Protocol Engine reported. + """ + # Show the full error details if this is part of a traceback. Don't try to summarize. + super().__init__(errors) + + self._error_occurrences = errors + + def to_stderr_string(self) -> str: + """Return a string suitable as the stderr output of the `opentrons_execute` CLI. + + This summarizes from the full error details. + """ + # It's unclear what exactly we should extract here. + # + # First, do we print the first element, or the last, or all of them? + # + # Second, do we print the .detail? .errorCode? .errorInfo? .wrappedErrors? + # By contract, .detail seems like it would be insufficient, but experimentally, + # it includes a lot, like: + # + # ProtocolEngineError [line 3]: Error 4000 GENERAL_ERROR (ProtocolEngineError): + # UnexpectedProtocolError: Labware "fixture_12_trough" not found with version 1 + # in namespace "fixture". + return self._error_occurrences[0].detail diff --git a/api/src/opentrons/util/linal.py b/api/src/opentrons/util/linal.py index 58b293342b1..9456b2d80e1 100644 --- a/api/src/opentrons/util/linal.py +++ b/api/src/opentrons/util/linal.py @@ -3,7 +3,8 @@ import numpy as np from numpy import insert, dot from numpy.linalg import inv -from typing import TYPE_CHECKING, List, Tuple, Union +from numpy.typing import NDArray +from typing import List, Tuple, Union from opentrons.calibration_storage.types import AttitudeMatrix @@ -17,12 +18,8 @@ Tuple[float, float, float], Tuple[float, float, float], Tuple[float, float, float] ] -# TODO(mc, 2022-02-23): numpy.typing is not available on the version -# of numpy we ship on the OT-2. We should update that numpy version. -if TYPE_CHECKING: - import numpy.typing as npt - - DoubleArray = npt.NDArray[np.double] +DoubleArray = NDArray[np.double] +DoubleMatrix = NDArray[np.double] def identity_deck_transform() -> DoubleArray: @@ -31,11 +28,11 @@ def identity_deck_transform() -> DoubleArray: def solve_attitude(expected: SolvePoints, actual: SolvePoints) -> AttitudeMatrix: - ex = np.array([list(point) for point in expected]).transpose() - ac = np.array([list(point) for point in actual]).transpose() - t = np.dot(ac, inv(ex)) # type: ignore[no-untyped-call] + ex: DoubleMatrix = np.array([list(point) for point in expected]).transpose() + ac: DoubleMatrix = np.array([list(point) for point in actual]).transpose() + t = np.dot(ac, inv(ex)) - mask_transform = np.array( + mask_transform: NDArray[np.bool_] = np.array( [[True, True, False], [True, True, False], [False, False, False]] ) masked_array = np.ma.masked_array(t, ~mask_transform) # type: ignore[var-annotated, no-untyped-call] @@ -97,15 +94,15 @@ def solve( # [ (x1, y1), # (x2, y2), # (x3, y3) ] - ex = np.array([list(point) + [1] for point in expected]).transpose() + ex: DoubleMatrix = np.array([list(point) + [1] for point in expected]).transpose() - ac = np.array([list(point) + [1] for point in actual]).transpose() + ac: DoubleMatrix = np.array([list(point) + [1] for point in actual]).transpose() # Shape of `ex` and `ac`: # [ x1 x2 x3 ] # [ y1 y2 y3 ] # [ 1 1 1 ] - transform = np.dot(ac, inv(ex)) # type: ignore[no-untyped-call] + transform = np.dot(ac, inv(ex)) # `dot` in numpy is a misnomer. When both arguments are square, N- # dimensional arrays, the return type is the result of performing matrix # multiplication, rather than the dot-product (so the return here will be @@ -132,21 +129,21 @@ def add_z(xy: DoubleArray, z: float) -> DoubleArray: [ 0 0 0 1 ] """ # First, insert a column of zeros as into the input matrix - interm = insert(xy, 2, [0, 0, 0], axis=1) # type: ignore[no-untyped-call] + interm = insert(xy, 2, [0, 0, 0], axis=1) # Result: # [ 1 0 0 x ] # [ 0 1 0 y ] # [ 0 0 0 1 ] # Then, insert the z row to create a properly formed 3-D transform matrix: - xyz = insert(interm, 2, [0, 0, 1, z], axis=0) # type: ignore[no-untyped-call] + xyz: DoubleMatrix = insert(interm, 2, [0, 0, 1, z], axis=0) # Result: # [ 1 0 0 x ] # [ 0 1 0 y ] # [ 0 0 1 z ] # [ 0 0 0 1 ] - return xyz.round(11) # type: ignore[no-any-return] + return xyz.round(11) def add_matrices( @@ -155,7 +152,7 @@ def add_matrices( """ Simple method to convert tuples to numpy arrays and add them. """ - return tuple(np.asarray(t1) + np.asarray(t2)) # type: ignore + return tuple(np.asarray(t1) + np.asarray(t2)) def apply_transform( @@ -170,7 +167,7 @@ def apply_transform( :param pos: XYZ point in space A :return: corresponding XYZ point in space B """ - return tuple(dot(t, list(pos))[:3]) # type: ignore + return tuple(dot(t, list(pos))[:3]) def apply_reverse( @@ -178,4 +175,4 @@ def apply_reverse( pos: AxisPosition, ) -> Tuple[float, float, float]: """Like apply_transform but inverts the transform first""" - return apply_transform(inv(t), pos) # type: ignore[no-untyped-call] + return apply_transform(inv(t), pos) diff --git a/api/src/opentrons/util/logging_config.py b/api/src/opentrons/util/logging_config.py index d57e762899a..e9a4d2042a2 100644 --- a/api/src/opentrons/util/logging_config.py +++ b/api/src/opentrons/util/logging_config.py @@ -94,6 +94,18 @@ def _buildroot_config(level_value: int) -> Dict[str, Any]: "formatter": "message_only", "SYSLOG_IDENTIFIER": "opentrons-api-serial", }, + "can_serial": { + "class": "systemd.journal.JournalHandler", + "level": logging.DEBUG, + "formatter": "message_only", + "SYSLOG_IDENTIFIER": "opentrons-api-serial-can", + }, + "usbbin_serial": { + "class": "systemd.journal.JournalHandler", + "level": logging.DEBUG, + "formatter": "message_only", + "SYSLOG_IDENTIFIER": "opentrons-api-serial-usbbin", + }, }, "loggers": { "opentrons.drivers.asyncio.communication.serial_connection": { @@ -110,12 +122,12 @@ def _buildroot_config(level_value: int) -> Dict[str, Any]: "level": level_value, }, "opentrons_hardware.drivers.can_bus.can_messenger": { - "handlers": ["serial"], + "handlers": ["can_serial"], "level": logging.DEBUG, "propagate": False, }, "opentrons_hardware.drivers.binary_usb.bin_serial": { - "handlers": ["serial"], + "handlers": ["usbbin_serial"], "level": logging.DEBUG, "propagate": False, }, diff --git a/api/tests/opentrons/calibration_storage/test_deck_configuration.py b/api/tests/opentrons/calibration_storage/test_deck_configuration.py new file mode 100644 index 00000000000..3cb8d59535f --- /dev/null +++ b/api/tests/opentrons/calibration_storage/test_deck_configuration.py @@ -0,0 +1,34 @@ +from datetime import datetime, timezone + +import pytest + +from opentrons.calibration_storage import deck_configuration as subject +from opentrons.calibration_storage.types import CutoutFixturePlacement + + +def test_deck_configuration_serdes() -> None: + """Test that deck configuration serialization/deserialization survives a round trip.""" + + dummy_cutout_fixture_placements = [ + CutoutFixturePlacement(cutout_fixture_id="a", cutout_id="b"), + CutoutFixturePlacement(cutout_fixture_id="c", cutout_id="d"), + ] + dummy_datetime = datetime(year=1961, month=5, day=6, tzinfo=timezone.utc) + + serialized = subject.serialize_deck_configuration( + dummy_cutout_fixture_placements, dummy_datetime + ) + deserialized = subject.deserialize_deck_configuration(serialized) + assert deserialized == (dummy_cutout_fixture_placements, dummy_datetime) + + +@pytest.mark.parametrize( + "input", + [ + b'{"hello": "world"}', # Valid JSON, but not valid for the model. + "😾".encode("utf-8"), # Not valid JSON. + ], +) +def test_deserialize_deck_configuration_error_handling(input: bytes) -> None: + """Test that deserialization handles errors gracefully.""" + assert subject.deserialize_deck_configuration(input) is None diff --git a/api/tests/opentrons/calibration_storage/test_file_operators.py b/api/tests/opentrons/calibration_storage/test_file_operators.py index c608b7619f1..5a95f225fe3 100644 --- a/api/tests/opentrons/calibration_storage/test_file_operators.py +++ b/api/tests/opentrons/calibration_storage/test_file_operators.py @@ -1,10 +1,18 @@ -import pytest import json import typing from pathlib import Path + +import pydantic +import pytest + from opentrons.calibration_storage import file_operators as io +class DummyModel(pydantic.BaseModel): + integer_field: int + aliased_field: str = pydantic.Field(alias="! aliased field !") + + @pytest.fixture def calibration() -> typing.Dict[str, typing.Any]: return { @@ -70,3 +78,26 @@ def test_malformed_calibration( ) with pytest.raises(AssertionError): io.read_cal_file(malformed_calibration_path) + + +def test_deserialize_pydantic_model_valid() -> None: + serialized = b'{"integer_field": 123, "! aliased field !": "abc"}' + assert io.deserialize_pydantic_model( + serialized, DummyModel + ) == DummyModel.construct(integer_field=123, aliased_field="abc") + + +def test_deserialize_pydantic_model_invalid_as_json() -> None: + serialized = "😾".encode("utf-8") + assert io.deserialize_pydantic_model(serialized, DummyModel) is None + # Ideally we would assert that the subject logged a message saying "not valid JSON", + # but the opentrons.simulate and opentrons.execute tests interfere with the process's logger + # settings and prevent that message from showing up in pytest's caplog fixture. + + +def test_read_pydantic_model_from_file_invalid_model(tmp_path: Path) -> None: + serialized = b'{"integer_field": "not an integer"}' + assert io.deserialize_pydantic_model(serialized, DummyModel) is None + # Ideally we would assert that the subject logged a message saying "does not match model", + # but the opentrons.simulate and opentrons.execute tests interfere with the process's logger + # settings and prevent that message from showing up in pytest's caplog fixture. diff --git a/api/tests/opentrons/calibration_storage/test_gripper_offset.py b/api/tests/opentrons/calibration_storage/test_gripper_offset.py index f9601258305..a2958cada04 100644 --- a/api/tests/opentrons/calibration_storage/test_gripper_offset.py +++ b/api/tests/opentrons/calibration_storage/test_gripper_offset.py @@ -1,13 +1,11 @@ import pytest import typing -import opentrons -import importlib from opentrons.types import Point from opentrons.calibration_storage import ( types as cs_types, - ot3_gripper_offset as gripper, ) +from opentrons.calibration_storage.ot3 import gripper_offset as gripper, models @pytest.fixture @@ -62,9 +60,6 @@ def test_get_gripper_calibration( """ Test ability to get a gripper calibration schema. """ - importlib.reload(opentrons.calibration_storage) - from opentrons.calibration_storage import models - gripper_data = gripper.get_gripper_calibration_offset("gripper1") assert gripper_data is not None assert gripper_data == models.v1.InstrumentOffsetModel( diff --git a/api/tests/opentrons/calibration_storage/test_pipette_offset.py b/api/tests/opentrons/calibration_storage/test_pipette_offset.py deleted file mode 100644 index d4b8ef542ab..00000000000 --- a/api/tests/opentrons/calibration_storage/test_pipette_offset.py +++ /dev/null @@ -1,132 +0,0 @@ -import pytest -import importlib -import opentrons -from typing import Any, TYPE_CHECKING - -from opentrons.types import Mount, Point -from opentrons.calibration_storage import ( - types as cs_types, -) - -if TYPE_CHECKING: - from opentrons_shared_data.deck.dev_types import RobotModel - - -@pytest.fixture(autouse=True) -def reload_module(robot_model: "RobotModel") -> None: - importlib.reload(opentrons.calibration_storage) - - -@pytest.fixture -def starting_calibration_data( - robot_model: "RobotModel", ot_config_tempdir: Any -) -> None: - """ - Starting calibration data fixture. - - Adds dummy data to a temporary directory to test delete commands against. - """ - from opentrons.calibration_storage import save_pipette_calibration - - if robot_model == "OT-3 Standard": - save_pipette_calibration(Point(1, 1, 1), "pip1", Mount.LEFT) - save_pipette_calibration(Point(1, 1, 1), "pip2", Mount.RIGHT) - else: - save_pipette_calibration( - Point(1, 1, 1), "pip1", Mount.LEFT, "mytiprack", "opentrons/tip_rack/1" - ) - save_pipette_calibration( - Point(1, 1, 1), "pip2", Mount.RIGHT, "mytiprack", "opentrons/tip_rack/1" - ) - - -def test_delete_all_pipette_calibration(starting_calibration_data: Any) -> None: - """ - Test delete all pipette calibrations. - """ - from opentrons.calibration_storage import ( - get_pipette_offset, - clear_pipette_offset_calibrations, - ) - - assert get_pipette_offset("pip1", Mount.LEFT) is not None - assert get_pipette_offset("pip2", Mount.RIGHT) is not None - clear_pipette_offset_calibrations() - assert get_pipette_offset("pip1", Mount.LEFT) is None - assert get_pipette_offset("pip2", Mount.RIGHT) is None - - -def test_delete_specific_pipette_offset(starting_calibration_data: Any) -> None: - """ - Test delete a specific pipette calibration. - """ - from opentrons.calibration_storage import ( - get_pipette_offset, - delete_pipette_offset_file, - ) - - assert get_pipette_offset("pip1", Mount.LEFT) is not None - delete_pipette_offset_file("pip1", Mount.LEFT) - assert get_pipette_offset("pip1", Mount.LEFT) is None - - -def test_save_pipette_calibration( - ot_config_tempdir: Any, robot_model: "RobotModel" -) -> None: - """ - Test saving pipette calibrations. - """ - from opentrons.calibration_storage import ( - get_pipette_offset, - save_pipette_calibration, - ) - - assert get_pipette_offset("pip1", Mount.LEFT) is None - if robot_model == "OT-3 Standard": - save_pipette_calibration(Point(1, 1, 1), "pip1", Mount.LEFT) - save_pipette_calibration(Point(1, 1, 1), "pip2", Mount.RIGHT) - else: - save_pipette_calibration( - Point(1, 1, 1), "pip1", Mount.LEFT, "mytiprack", "opentrons/tip_rack/1" - ) - save_pipette_calibration( - Point(1, 1, 1), "pip2", Mount.RIGHT, "mytiprack", "opentrons/tip_rack/1" - ) - assert get_pipette_offset("pip1", Mount.LEFT) is not None - assert get_pipette_offset("pip2", Mount.RIGHT) is not None - assert get_pipette_offset("pip1", Mount.LEFT).offset == Point(1, 1, 1) - assert get_pipette_offset("pip1", Mount.LEFT).offset == Point(1, 1, 1) - - -def test_get_pipette_calibration( - starting_calibration_data: Any, robot_model: "RobotModel" -) -> None: - """ - Test ability to get a pipette calibration model. - """ - from opentrons.calibration_storage import get_pipette_offset - - # needed for proper type checking unfortunately - from opentrons.calibration_storage.ot3.models.v1 import ( - InstrumentOffsetModel as OT3InstrModel, - ) - from opentrons.calibration_storage.ot2.models.v1 import ( - InstrumentOffsetModel as OT2InstrModel, - ) - - pipette_data = get_pipette_offset("pip1", Mount.LEFT) - if robot_model == "OT-3 Standard": - assert pipette_data == OT3InstrModel( - offset=Point(1, 1, 1), - lastModified=pipette_data.lastModified, - source=cs_types.SourceType.user, - ) - else: - - assert pipette_data == OT2InstrModel( - offset=Point(1, 1, 1), - tiprack="mytiprack", - uri="opentrons/tip_rack/1", - last_modified=pipette_data.last_modified, - source=cs_types.SourceType.user, - ) diff --git a/api/tests/opentrons/calibration_storage/test_pipette_offset_ot2.py b/api/tests/opentrons/calibration_storage/test_pipette_offset_ot2.py new file mode 100644 index 00000000000..1411c7fada7 --- /dev/null +++ b/api/tests/opentrons/calibration_storage/test_pipette_offset_ot2.py @@ -0,0 +1,96 @@ +import pytest +from typing import Any, TYPE_CHECKING + +from opentrons.types import Mount, Point +from opentrons.calibration_storage import ( + types as cs_types, +) +from opentrons.calibration_storage.ot2 import ( + save_pipette_calibration, + get_pipette_offset, + clear_pipette_offset_calibrations, + delete_pipette_offset_file, +) + +if TYPE_CHECKING: + from opentrons_shared_data.deck.dev_types import RobotModel + + +@pytest.fixture +def starting_calibration_data( + robot_model: "RobotModel", ot_config_tempdir: Any +) -> None: + """ + Starting calibration data fixture. + + Adds dummy data to a temporary directory to test delete commands against. + """ + save_pipette_calibration( + Point(1, 1, 1), "pip1", Mount.LEFT, "mytiprack", "opentrons/tip_rack/1" + ) + save_pipette_calibration( + Point(1, 1, 1), "pip2", Mount.RIGHT, "mytiprack", "opentrons/tip_rack/1" + ) + + +def test_delete_all_pipette_calibration(starting_calibration_data: Any) -> None: + """ + Test delete all pipette calibrations. + """ + assert get_pipette_offset("pip1", Mount.LEFT) is not None + assert get_pipette_offset("pip2", Mount.RIGHT) is not None + clear_pipette_offset_calibrations() + assert get_pipette_offset("pip1", Mount.LEFT) is None + assert get_pipette_offset("pip2", Mount.RIGHT) is None + + +def test_delete_specific_pipette_offset(starting_calibration_data: Any) -> None: + """ + Test delete a specific pipette calibration. + """ + assert get_pipette_offset("pip1", Mount.LEFT) is not None + delete_pipette_offset_file("pip1", Mount.LEFT) + assert get_pipette_offset("pip1", Mount.LEFT) is None + + +def test_save_pipette_calibration( + ot_config_tempdir: Any, robot_model: "RobotModel" +) -> None: + """ + Test saving pipette calibrations. + """ + assert get_pipette_offset("pip1", Mount.LEFT) is None + save_pipette_calibration( + Point(1, 1, 1), "pip1", Mount.LEFT, "mytiprack", "opentrons/tip_rack/1" + ) + save_pipette_calibration( + Point(1, 1, 1), "pip2", Mount.RIGHT, "mytiprack", "opentrons/tip_rack/1" + ) + assert get_pipette_offset("pip1", Mount.LEFT) is not None + assert get_pipette_offset("pip2", Mount.RIGHT) is not None + pip1 = get_pipette_offset("pip1", Mount.LEFT) + assert pip1 is not None and pip1.offset == Point(1, 1, 1) + pip2 = get_pipette_offset("pip1", Mount.LEFT) + assert pip2 is not None and pip2.offset == Point(1, 1, 1) + + +def test_get_pipette_calibration( + starting_calibration_data: Any, robot_model: "RobotModel" +) -> None: + """ + Test ability to get a pipette calibration model. + """ + from opentrons.calibration_storage.ot2.models.v1 import ( + InstrumentOffsetModel as OT2InstrModel, + ) + + pipette_data = get_pipette_offset("pip1", Mount.LEFT) + assert pipette_data is not None + + assert pipette_data == OT2InstrModel( + offset=Point(1, 1, 1), + tiprack="mytiprack", + uri="opentrons/tip_rack/1", + last_modified=pipette_data.last_modified, + source=cs_types.SourceType.user, + ) diff --git a/api/tests/opentrons/calibration_storage/test_pipette_offset_ot3.py b/api/tests/opentrons/calibration_storage/test_pipette_offset_ot3.py new file mode 100644 index 00000000000..7ce0603083c --- /dev/null +++ b/api/tests/opentrons/calibration_storage/test_pipette_offset_ot3.py @@ -0,0 +1,84 @@ +import pytest +from typing import Any, TYPE_CHECKING + +from opentrons.types import Mount, Point +from opentrons.calibration_storage import ( + types as cs_types, +) +from opentrons.calibration_storage.ot3 import ( + save_pipette_calibration, + get_pipette_offset, + clear_pipette_offset_calibrations, + delete_pipette_offset_file, +) + +if TYPE_CHECKING: + from opentrons_shared_data.deck.dev_types import RobotModel + + +@pytest.fixture +def starting_calibration_data( + robot_model: "RobotModel", ot_config_tempdir: Any +) -> None: + """ + Starting calibration data fixture. + + Adds dummy data to a temporary directory to test delete commands against. + """ + save_pipette_calibration(Point(1, 1, 1), "pip1", Mount.LEFT) + save_pipette_calibration(Point(1, 1, 1), "pip2", Mount.RIGHT) + + +def test_delete_all_pipette_calibration(starting_calibration_data: Any) -> None: + """ + Test delete all pipette calibrations. + """ + assert get_pipette_offset("pip1", Mount.LEFT) is not None + assert get_pipette_offset("pip2", Mount.RIGHT) is not None + clear_pipette_offset_calibrations() + assert get_pipette_offset("pip1", Mount.LEFT) is None + assert get_pipette_offset("pip2", Mount.RIGHT) is None + + +def test_delete_specific_pipette_offset(starting_calibration_data: Any) -> None: + """ + Test delete a specific pipette calibration. + """ + assert get_pipette_offset("pip1", Mount.LEFT) is not None + delete_pipette_offset_file("pip1", Mount.LEFT) + assert get_pipette_offset("pip1", Mount.LEFT) is None + + +def test_save_pipette_calibration( + ot_config_tempdir: Any, robot_model: "RobotModel" +) -> None: + """ + Test saving pipette calibrations. + """ + assert get_pipette_offset("pip1", Mount.LEFT) is None + save_pipette_calibration(Point(1, 1, 1), "pip1", Mount.LEFT) + save_pipette_calibration(Point(1, 1, 1), "pip2", Mount.RIGHT) + + assert get_pipette_offset("pip1", Mount.LEFT) is not None + assert get_pipette_offset("pip2", Mount.RIGHT) is not None + assert get_pipette_offset("pip1", Mount.LEFT).offset == Point(1, 1, 1) + assert get_pipette_offset("pip1", Mount.LEFT).offset == Point(1, 1, 1) + + +def test_get_pipette_calibration( + starting_calibration_data: Any, robot_model: "RobotModel" +) -> None: + """ + Test ability to get a pipette calibration model. + """ + # needed for proper type checking unfortunately + from opentrons.calibration_storage.ot3.models.v1 import ( + InstrumentOffsetModel as OT3InstrModel, + ) + + pipette_data = get_pipette_offset("pip1", Mount.LEFT) + assert pipette_data == OT3InstrModel( + offset=Point(1, 1, 1), + lastModified=pipette_data.lastModified, + source=cs_types.SourceType.user, + ) diff --git a/api/tests/opentrons/calibration_storage/test_tip_length.py b/api/tests/opentrons/calibration_storage/test_tip_length_ot2.py similarity index 79% rename from api/tests/opentrons/calibration_storage/test_tip_length.py rename to api/tests/opentrons/calibration_storage/test_tip_length_ot2.py index 5c69f655593..93a208e0071 100644 --- a/api/tests/opentrons/calibration_storage/test_tip_length.py +++ b/api/tests/opentrons/calibration_storage/test_tip_length_ot2.py @@ -1,6 +1,4 @@ import pytest -import importlib -import opentrons from typing import cast, Any, TYPE_CHECKING from opentrons.calibration_storage import ( @@ -8,15 +6,19 @@ helpers, ) +from opentrons.calibration_storage.ot2 import ( + create_tip_length_data, + save_tip_length_calibration, + tip_lengths_for_pipette, + load_tip_length_calibration, + delete_tip_length_calibration, + clear_tip_length_calibration, + models, +) + if TYPE_CHECKING: from opentrons_shared_data.labware.dev_types import LabwareDefinition from opentrons_shared_data.pipette.dev_types import LabwareUri - from opentrons_shared_data.deck.dev_types import RobotModel - - -@pytest.fixture(autouse=True) -def reload_module(robot_model: "RobotModel") -> None: - importlib.reload(opentrons.calibration_storage) @pytest.fixture @@ -30,11 +32,6 @@ def starting_calibration_data( Adds dummy data to a temporary directory to test delete commands against. """ - from opentrons.calibration_storage import ( - create_tip_length_data, - save_tip_length_calibration, - ) - tip_length1 = create_tip_length_data(minimal_labware_def, 22.0) tip_length2 = create_tip_length_data(minimal_labware_def, 31.0) tip_length3 = create_tip_length_data(minimal_labware_def2, 31.0) @@ -49,12 +46,6 @@ def test_save_tip_length_calibration( """ Test saving tip length calibrations. """ - from opentrons.calibration_storage import ( - tip_lengths_for_pipette, - create_tip_length_data, - save_tip_length_calibration, - ) - assert tip_lengths_for_pipette("pip1") == {} assert tip_lengths_for_pipette("pip2") == {} tip_rack_hash = helpers.hash_labware_def(minimal_labware_def) @@ -72,8 +63,6 @@ def test_get_tip_length_calibration( """ Test ability to get a tip length calibration model. """ - from opentrons.calibration_storage import load_tip_length_calibration, models - tip_length_data = load_tip_length_calibration("pip1", minimal_labware_def) assert tip_length_data == models.v1.TipLengthModel( tipLength=22.0, @@ -92,11 +81,6 @@ def test_delete_specific_tip_calibration( """ Test delete a specific tip length calibration. """ - from opentrons.calibration_storage import ( - tip_lengths_for_pipette, - delete_tip_length_calibration, - ) - assert len(tip_lengths_for_pipette("pip1").keys()) == 2 assert tip_lengths_for_pipette("pip2") != {} tip_rack_hash = helpers.hash_labware_def(minimal_labware_def) @@ -109,11 +93,6 @@ def test_delete_all_tip_calibration(starting_calibration_data: Any) -> None: """ Test delete all tip length calibration. """ - from opentrons.calibration_storage import ( - tip_lengths_for_pipette, - clear_tip_length_calibration, - ) - assert tip_lengths_for_pipette("pip1") != {} assert tip_lengths_for_pipette("pip2") != {} clear_tip_length_calibration() diff --git a/api/tests/opentrons/commands/test_publisher.py b/api/tests/opentrons/commands/test_publisher.py index 2a008a404ac..a88e6c04523 100644 --- a/api/tests/opentrons/commands/test_publisher.py +++ b/api/tests/opentrons/commands/test_publisher.py @@ -4,20 +4,20 @@ import pytest from decoy import Decoy, matchers from typing import Any, Dict, cast -from opentrons.broker import Broker +from opentrons.legacy_broker import LegacyBroker from opentrons.commands.types import Command as CommandDict, CommandMessage from opentrons.commands.publisher import CommandPublisher, publish, publish_context @pytest.fixture -def broker(decoy: Decoy) -> Broker: +def broker(decoy: Decoy) -> LegacyBroker: """Return a mocked out Broker.""" - return decoy.mock(cls=Broker) + return decoy.mock(cls=LegacyBroker) -def test_publish_decorator(decoy: Decoy, broker: Broker) -> None: +def test_publish_decorator(decoy: Decoy, broker: LegacyBroker) -> None: """It should publish "before" and "after" messages for decorated methods.""" - _act = decoy.mock() + _act = decoy.mock(name="_act") def _get_command_payload(foo: str, bar: int) -> CommandDict: return cast( @@ -69,9 +69,11 @@ def act(self, foo: str, bar: int) -> None: assert before_message_id.value == after_message_id.value -def test_publish_decorator_with_arg_defaults(decoy: Decoy, broker: Broker) -> None: +def test_publish_decorator_with_arg_defaults( + decoy: Decoy, broker: LegacyBroker +) -> None: """It should pass method argument defaults to the command creator.""" - _act = decoy.mock() + _act = decoy.mock(name="_act") def _get_command_payload(foo: str, bar: int) -> CommandDict: return cast( @@ -118,7 +120,7 @@ def act(self, foo: str, bar: int = 42) -> None: ) -def test_publish_decorator_with_error(decoy: Decoy, broker: Broker) -> None: +def test_publish_decorator_with_error(decoy: Decoy, broker: LegacyBroker) -> None: """It should capture an exception and place it in the "after" message.""" def _get_command_payload(foo: str, bar: int) -> Dict[str, Any]: @@ -169,9 +171,11 @@ def act(self, foo: str, bar: int) -> None: assert before_message_id.value == after_message_id.value -def test_publish_decorator_remaps_instrument(decoy: Decoy, broker: Broker) -> None: +def test_publish_decorator_remaps_instrument( + decoy: Decoy, broker: LegacyBroker +) -> None: """It should pass "self" to command creator arguments named "instrument".""" - _act = decoy.mock() + _act = decoy.mock(name="_act") def _get_command_payload(foo: str, instrument: _Subject) -> Dict[str, Any]: return { @@ -221,8 +225,8 @@ def act(self, foo: str) -> None: ) -def test_publish_context(decoy: Decoy, broker: Broker) -> None: - _act = decoy.mock() +def test_publish_context(decoy: Decoy, broker: LegacyBroker) -> None: + _act = decoy.mock(name="_act") command = cast( CommandDict, @@ -271,7 +275,7 @@ def _published_func(foo: str, bar: int) -> None: assert before_message_id.value == after_message_id.value -def test_publish_context_with_error(decoy: Decoy, broker: Broker) -> None: +def test_publish_context_with_error(decoy: Decoy, broker: LegacyBroker) -> None: command = cast( CommandDict, {"name": "some_command", "payload": {"foo": "hello", "bar": 42}}, diff --git a/api/tests/opentrons/config/ot3_settings.py b/api/tests/opentrons/config/ot3_settings.py index 8c805f3a154..cd662858ac7 100644 --- a/api/tests/opentrons/config/ot3_settings.py +++ b/api/tests/opentrons/config/ot3_settings.py @@ -109,7 +109,6 @@ }, }, "log_level": "NADA", - "z_retract_distance": 10, "safe_home_distance": 5, "deck_transform": [[-0.5, 0, 1], [0.1, -2, 4], [0, 0, -1]], "carriage_offset": (1, 2, 3), diff --git a/api/tests/opentrons/config/test_advanced_settings.py b/api/tests/opentrons/config/test_advanced_settings.py index 21140b0f3d7..b81b9149c67 100644 --- a/api/tests/opentrons/config/test_advanced_settings.py +++ b/api/tests/opentrons/config/test_advanced_settings.py @@ -1,9 +1,9 @@ import pytest -from pytest_lazyfixture import lazy_fixture # type: ignore[import] -from typing import Any, Dict, Generator, Optional, Tuple +from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] +from typing import Dict, Generator, Optional from unittest.mock import MagicMock, patch -from opentrons.config import advanced_settings, ARCHITECTURE, CONFIG +from opentrons.config import advanced_settings, CONFIG from opentrons_shared_data.robot.dev_types import RobotTypeEnum @@ -253,47 +253,6 @@ async def test_restart_required( assert advanced_settings.is_restart_required() is True -@pytest.mark.parametrize( - argnames=["v", "expected_level"], - argvalues=[ - [True, "emerg"], - [False, "info"], - ], -) -async def test_disable_log_integration_side_effect( - v: bool, expected_level: str -) -> None: - with patch("opentrons.config.advanced_settings.log_control") as mock_log_control: - - async def set_syslog_level(level: Any) -> Tuple[int, str, str]: - return 0, "", "" - - mock_log_control.set_syslog_level.side_effect = set_syslog_level - with patch( - "opentrons.config.advanced_settings.ARCHITECTURE", - new=ARCHITECTURE.BUILDROOT, - ): - s = advanced_settings.DisableLogIntegrationSettingDefinition() - await s.on_change(v) - mock_log_control.set_syslog_level.assert_called_once_with(expected_level) - - -async def test_disable_log_integration_side_effect_error() -> None: - with patch("opentrons.config.advanced_settings.log_control") as mock_log_control: - - async def set_syslog_level(level: Any) -> Tuple[int, str, str]: - return 1, "", "" - - mock_log_control.set_syslog_level.side_effect = set_syslog_level - with patch( - "opentrons.config.advanced_settings.ARCHITECTURE", - new=ARCHITECTURE.BUILDROOT, - ): - s = advanced_settings.DisableLogIntegrationSettingDefinition() - with pytest.raises(advanced_settings.SettingException): - await s.on_change(True) - - def test_per_robot_true_defaults(mock_read_settings_file_empty: MagicMock) -> None: with patch.object(advanced_settings, "settings_by_id", new={}): assert ( diff --git a/api/tests/opentrons/config/test_advanced_settings_migration.py b/api/tests/opentrons/config/test_advanced_settings_migration.py index bcdeff2ee03..1070654e14d 100644 --- a/api/tests/opentrons/config/test_advanced_settings_migration.py +++ b/api/tests/opentrons/config/test_advanced_settings_migration.py @@ -1,13 +1,14 @@ -from typing import Any, Dict +from typing import Any, Dict, cast import pytest -from pytest_lazyfixture import lazy_fixture # type: ignore[import] +from _pytest.fixtures import SubRequest +from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] from opentrons.config.advanced_settings import _migrate, _ensure @pytest.fixture def migrated_file_version() -> int: - return 29 + return 30 # make sure to set a boolean value in default_file_settings only if @@ -27,7 +28,6 @@ def default_file_settings() -> Dict[str, Any]: "disableStallDetection": None, "disableStatusBar": None, "disableOverpressureDetection": None, - "disableTipPresenceDetection": None, "estopNotRequired": None, } @@ -359,6 +359,13 @@ def v29_config(v28_config: Dict[str, Any]) -> Dict[str, Any]: return r +@pytest.fixture +def v30_config(v29_config: Dict[str, Any]) -> Dict[str, Any]: + r = {k: v for k, v in v29_config.items() if k != "disableTipPresenceDetection"} + r["_version"] = 30 + return r + + @pytest.fixture( scope="session", params=[ @@ -393,10 +400,11 @@ def v29_config(v28_config: Dict[str, Any]) -> Dict[str, Any]: lazy_fixture("v27_config"), lazy_fixture("v28_config"), lazy_fixture("v29_config"), + lazy_fixture("v30_config"), ], ) -def old_settings(request: pytest.FixtureRequest) -> Dict[str, Any]: - return request.param # type: ignore[attr-defined, no-any-return] +def old_settings(request: SubRequest) -> Dict[str, Any]: + return cast(Dict[str, Any], request.param) def test_migrations( @@ -483,6 +491,5 @@ def test_ensures_config() -> None: "disableStallDetection": None, "disableStatusBar": None, "estopNotRequired": None, - "disableTipPresenceDetection": None, "disableOverpressureDetection": None, } diff --git a/api/tests/opentrons/config/test_defaults_ot2.py b/api/tests/opentrons/config/test_defaults_ot2.py index df2cd61ce18..77c7c0a3589 100644 --- a/api/tests/opentrons/config/test_defaults_ot2.py +++ b/api/tests/opentrons/config/test_defaults_ot2.py @@ -1,5 +1,5 @@ from opentrons.config.types import CurrentDict -from opentrons.config import robot_configs, defaults_ot2 +from opentrons.config import defaults_ot2 def test_load_currents() -> None: @@ -19,7 +19,4 @@ def test_load_currents() -> None: defaults_ot2._build_hw_versioned_current_dict(default_different_vals, default) == default_different_vals ) - assert ( - robot_configs.defaults_ot2._build_hw_versioned_current_dict(None, default) - == default - ) + assert defaults_ot2._build_hw_versioned_current_dict(None, default) == default diff --git a/api/tests/opentrons/config/test_reset.py b/api/tests/opentrons/config/test_reset.py index c0a2514efea..aacea130e1f 100644 --- a/api/tests/opentrons/config/test_reset.py +++ b/api/tests/opentrons/config/test_reset.py @@ -4,10 +4,17 @@ from opentrons.config import reset +from opentrons_shared_data.robot.dev_types import RobotTypeEnum + if TYPE_CHECKING: from opentrons_shared_data.deck.dev_types import RobotModel +@pytest.fixture +def robot_type_enum(robot_model: "RobotModel") -> RobotTypeEnum: + return RobotTypeEnum.OT2 if robot_model == "OT-2 Standard" else RobotTypeEnum.FLEX + + @pytest.fixture def mock_reset_boot_scripts() -> Generator[MagicMock, None, None]: with patch("opentrons.config.reset.reset_boot_scripts") as m: @@ -36,7 +43,10 @@ def mock_reset_tip_length_calibrations() -> Generator[MagicMock, None, None]: def mock_cal_pipette_offset( robot_model: "RobotModel", ) -> Generator[MagicMock, None, None]: - with patch("opentrons.config.reset.clear_pipette_offset_calibrations") as m: + prefix = "ot2" if robot_model == "OT-2 Standard" else "ot3" + with patch( + f"opentrons.config.reset.{prefix}.clear_pipette_offset_calibrations" + ) as m: yield m @@ -50,7 +60,7 @@ def mock_cal_gripper_offset( @pytest.fixture def mock_cal_tip_length(robot_model: "RobotModel") -> Generator[MagicMock, None, None]: - with patch("opentrons.config.reset.clear_tip_length_calibration") as m: + with patch("opentrons.config.reset.ot2.clear_tip_length_calibration") as m: yield m @@ -71,10 +81,10 @@ def mock_cal_module_offset( def test_get_options() -> None: - options = reset.reset_options("OT-2 Standard") + options = reset.reset_options(RobotTypeEnum.OT2) assert list(options.keys()) == reset._OT_2_RESET_OPTIONS - options = reset.reset_options("OT-3 Standard") + options = reset.reset_options(RobotTypeEnum.FLEX) assert list(options.keys()) == reset._FLEX_RESET_OPTIONS @@ -84,8 +94,9 @@ def test_reset_empty_set( mock_reset_deck_calibration: MagicMock, mock_reset_tip_length_calibrations: MagicMock, mock_cal_module_offset: MagicMock, + robot_type_enum: RobotTypeEnum, ) -> None: - reset.reset(set()) + reset.reset(set(), robot_type_enum) mock_reset_boot_scripts.assert_not_called() mock_reset_pipette_offset.assert_not_called() mock_reset_deck_calibration.assert_not_called() @@ -98,6 +109,7 @@ def test_reset_all_set( mock_reset_pipette_offset: MagicMock, mock_reset_deck_calibration: MagicMock, mock_reset_tip_length_calibrations: MagicMock, + robot_type_enum: RobotTypeEnum, ) -> None: reset.reset( { @@ -105,32 +117,47 @@ def test_reset_all_set( reset.ResetOptionId.deck_calibration, reset.ResetOptionId.pipette_offset, reset.ResetOptionId.tip_length_calibrations, - } + }, + robot_type_enum, ) mock_reset_boot_scripts.assert_called_once() mock_reset_pipette_offset.assert_called_once() mock_reset_deck_calibration.assert_called_once() + mock_reset_deck_calibration.assert_called_once() mock_reset_tip_length_calibrations.assert_called_once() def test_deck_calibration_reset( - mock_cal_pipette_offset: MagicMock, mock_cal_robot_attitude: MagicMock + mock_cal_pipette_offset: MagicMock, + mock_cal_robot_attitude: MagicMock, + robot_type_enum: RobotTypeEnum, ) -> None: - reset.reset_deck_calibration() + reset.reset_deck_calibration(robot_type_enum) mock_cal_robot_attitude.assert_called_once() mock_cal_pipette_offset.assert_called_once() +@pytest.mark.ot2_only def test_tip_length_calibrations_reset( - mock_cal_pipette_offset: MagicMock, mock_cal_tip_length: MagicMock + mock_cal_pipette_offset: MagicMock, + mock_cal_tip_length: MagicMock, ) -> None: - reset.reset_tip_length_calibrations() + reset.reset_tip_length_calibrations(RobotTypeEnum.OT2) mock_cal_tip_length.assert_called_once() mock_cal_pipette_offset.assert_called_once() -def test_pipette_offset_reset(mock_cal_pipette_offset: MagicMock) -> None: - reset.reset_pipette_offset() +@pytest.mark.ot3_only +def test_tip_length_calibrations_reset_ot3() -> None: + with pytest.raises(reset.UnrecognizedOption): + reset.reset_tip_length_calibrations(RobotTypeEnum.FLEX) + + +def test_pipette_offset_reset( + mock_cal_pipette_offset: MagicMock, + robot_type_enum: RobotTypeEnum, +) -> None: + reset.reset_pipette_offset(robot_type_enum) mock_cal_pipette_offset.assert_called_once() diff --git a/api/tests/opentrons/conftest.py b/api/tests/opentrons/conftest.py index b25eb9049f7..dcf6b6c4e37 100755 --- a/api/tests/opentrons/conftest.py +++ b/api/tests/opentrons/conftest.py @@ -23,19 +23,25 @@ from typing_extensions import TypedDict import pytest +from _pytest.fixtures import SubRequest from decoy import Decoy from opentrons.protocol_engine.types import PostRunHardwareState try: - import aionotify # type: ignore[import] + import aionotify # type: ignore[import-untyped] except (OSError, ModuleNotFoundError): aionotify = None +from opentrons_shared_data.robot.dev_types import RobotTypeEnum from opentrons_shared_data.protocol.dev_types import JsonProtocol from opentrons_shared_data.labware.dev_types import LabwareDefinition from opentrons_shared_data.module.dev_types import ModuleDefinitionV3 -from opentrons_shared_data.deck.dev_types import RobotModel, DeckDefinitionV3 +from opentrons_shared_data.deck.dev_types import ( + RobotModel, + DeckDefinitionV3, + DeckDefinitionV4, +) from opentrons_shared_data.deck import ( load as load_deck, DEFAULT_DECK_DEFINITION_VERSION, @@ -52,6 +58,9 @@ ) from opentrons.protocol_api import ProtocolContext, Labware, create_protocol_context from opentrons.protocol_api.core.legacy.legacy_labware_core import LegacyLabwareCore +from opentrons.protocol_api.core.legacy.deck import ( + DEFAULT_LEGACY_DECK_DEFINITION_VERSION, +) from opentrons.protocol_engine import ( create_protocol_engine_in_thread, Config as ProtocolEngineConfig, @@ -80,7 +89,7 @@ class Bundle(TypedDict): filelike: io.BytesIO binary_zipfile: bytes metadata: Dict[str, str] - bundled_data: Dict[str, str] + bundled_data: Dict[str, bytes] bundled_labware: Dict[str, LabwareDefinition] bundled_python: Dict[str, Any] @@ -104,8 +113,12 @@ def is_robot(monkeypatch: pytest.MonkeyPatch) -> None: @pytest.fixture def mock_feature_flags(decoy: Decoy, monkeypatch: pytest.MonkeyPatch) -> None: for name, func in inspect.getmembers(config.feature_flags, inspect.isfunction): + params = inspect.getfullargspec(func) mock_get_ff = decoy.mock(func=func) - decoy.when(mock_get_ff()).then_return(False) + if any("robot_type" in p for p in params.args): + decoy.when(mock_get_ff(RobotTypeEnum.FLEX)).then_return(False) + else: + decoy.when(mock_get_ff()).then_return(False) monkeypatch.setattr(config.feature_flags, name, mock_get_ff) @@ -129,16 +142,11 @@ def protocol_file() -> str: @pytest.fixture() def protocol(protocol_file: str) -> Generator[Protocol, None, None]: - root = protocol_file - filename = os.path.join(os.path.dirname(__file__), "data", root) - - file = open(filename) - text = "".join(list(file)) - file.seek(0) - - yield Protocol(text=text, filename=filename, filelike=file) - - file.close() + filename = os.path.join(os.path.dirname(__file__), "data", protocol_file) + with open(filename, encoding="utf-8") as file: + text = file.read() + file.seek(0) + yield Protocol(text=text, filename=filename, filelike=file) @pytest.fixture() @@ -149,11 +157,11 @@ def virtual_smoothie_env(monkeypatch: pytest.MonkeyPatch) -> None: @pytest.fixture(params=["ot2", "ot3"]) async def machine_variant_ffs( - request: pytest.FixtureRequest, + request: SubRequest, decoy: Decoy, mock_feature_flags: None, ) -> None: - device_param = request.param # type: ignore[attr-defined] + device_param = request.param if request.node.get_closest_marker("ot3_only") and device_param == "ot2": pytest.skip() @@ -222,7 +230,7 @@ async def robot_model( mock_feature_flags: None, virtual_smoothie_env: None, ) -> AsyncGenerator[RobotModel, None]: - which_machine = cast(RobotModel, request.param) # type: ignore[attr-defined] + which_machine = cast(RobotModel, request.param) if request.node.get_closest_marker("ot2_only") and which_machine == "OT-3 Standard": pytest.skip("test requests only ot-2") if request.node.get_closest_marker("ot3_only") and which_machine == "OT-2 Standard": @@ -248,13 +256,18 @@ def deck_definition_name(robot_model: RobotModel) -> str: @pytest.fixture -def deck_definition(deck_definition_name: str) -> DeckDefinitionV3: +def deck_definition(deck_definition_name: str) -> DeckDefinitionV4: return load_deck(deck_definition_name, DEFAULT_DECK_DEFINITION_VERSION) +@pytest.fixture +def legacy_deck_definition(deck_definition_name: str) -> DeckDefinitionV3: + return load_deck(deck_definition_name, DEFAULT_LEGACY_DECK_DEFINITION_VERSION) + + @pytest.fixture() async def hardware( - request: pytest.FixtureRequest, + request: SubRequest, decoy: Decoy, mock_feature_flags: None, virtual_smoothie_env: None, @@ -296,10 +309,15 @@ def _make_ot3_pe_ctx( use_virtual_pipettes=True, use_virtual_modules=True, use_virtual_gripper=True, + # TODO figure out if we will want to use a "real" deck config here or if we are fine with simulated + use_simulated_deck_config=True, block_on_door_open=False, ), drop_tips_after_run=False, post_run_hardware_state=PostRunHardwareState.STAY_ENGAGED_IN_PLACE, + # TODO(jbl 10-30-2023) load_fixed_trash being hardcoded to True will be refactored once we need tests to have + # this be False + load_fixed_trash=True, ) as ( engine, loop, @@ -481,7 +499,7 @@ def _get_bundle_protocol_fixture(fixture_name: str) -> Bundle: if fixture_name == "simple_bundle": with open(fixture_dir / "protocol.py", "r") as f: result["contents"] = f.read() - with open(fixture_dir / "data.txt", "rb") as f: # type: ignore[assignment] + with open(fixture_dir / "data.txt", "rb") as f: result["bundled_data"] = {"data.txt": f.read()} with open(fixture_dir / "custom_labware.json", "r") as f: custom_labware = json.load(f) diff --git a/api/tests/opentrons/drivers/asyncio/communication/test_async_serial.py b/api/tests/opentrons/drivers/asyncio/communication/test_async_serial.py index 16399ce5d5d..d75ea01592f 100644 --- a/api/tests/opentrons/drivers/asyncio/communication/test_async_serial.py +++ b/api/tests/opentrons/drivers/asyncio/communication/test_async_serial.py @@ -4,7 +4,7 @@ import pytest from mock import MagicMock, PropertyMock, call -from serial import Serial # type: ignore[import] +from serial import Serial # type: ignore[import-untyped] from opentrons.drivers.asyncio.communication import AsyncSerial diff --git a/api/tests/opentrons/drivers/asyncio/communication/test_serial_connection.py b/api/tests/opentrons/drivers/asyncio/communication/test_serial_connection.py index 7fc16241684..0acf47af3d5 100644 --- a/api/tests/opentrons/drivers/asyncio/communication/test_serial_connection.py +++ b/api/tests/opentrons/drivers/asyncio/communication/test_serial_connection.py @@ -1,6 +1,7 @@ from typing import Type, Union import pytest +from _pytest.fixtures import SubRequest from mock import AsyncMock, call import mock @@ -35,10 +36,10 @@ def ack() -> str: params=[AsyncResponseSerialConnection, SerialConnection], # type: ignore[return] ) async def subject( - request: pytest.FixtureRequest, mock_serial_port: AsyncMock, ack: str + request: SubRequest, mock_serial_port: AsyncMock, ack: str ) -> SerialKind: """Create the test subject.""" - serial_class = request.param # type: ignore[attr-defined] + serial_class = request.param serial_class.RETRY_WAIT_TIME = 0 if serial_class == AsyncResponseSerialConnection: return serial_class( # type: ignore[no-any-return] diff --git a/api/tests/opentrons/drivers/rpi_drivers/test_usb.py b/api/tests/opentrons/drivers/rpi_drivers/test_usb.py index cad9a40b9b9..1f409181a50 100644 --- a/api/tests/opentrons/drivers/rpi_drivers/test_usb.py +++ b/api/tests/opentrons/drivers/rpi_drivers/test_usb.py @@ -84,7 +84,7 @@ def test_modify_module_list(revision: BoardRevision, usb_bus: USBBus): # TODO(mc, 2022-03-01): partial patching the class under test creates # a contaminated test subject that reduces the value of these tests # https://github.com/testdouble/contributing-tests/wiki/Partial-Mock - usb_bus._read_symlink = MagicMock(return_value="ttyACM1") # type: ignore[assignment] + usb_bus._read_symlink = MagicMock(return_value="ttyACM1") # type: ignore[method-assign] mod_at_port_list = [ ModuleAtPort( name="temperature module", port="dev/ot_module_temperature_module" @@ -123,7 +123,7 @@ def test_modify_module_list(revision: BoardRevision, usb_bus: USBBus): hub_port=None, ) - usb_bus._read_symlink = MagicMock(return_value="ttyACM2") # type: ignore[assignment] + usb_bus._read_symlink = MagicMock(return_value="ttyACM2") # type: ignore[method-assign] mod_at_port_list = [ ModuleAtPort(name="magnetic module", port="dev/ot_module_magnetic_module"), ] @@ -161,7 +161,7 @@ def test_modify_module_list(revision: BoardRevision, usb_bus: USBBus): ) if revision == BoardRevision.FLEX_B2: - usb_bus._read_symlink = MagicMock(return_value="ttyACM4") # type: ignore[assignment] + usb_bus._read_symlink = MagicMock(return_value="ttyACM4") # type: ignore[method-assign] mod_at_port_list = [ ModuleAtPort( name="heater-shaker module", port="dev/ot_module_heater_shaker_module" @@ -178,7 +178,7 @@ def test_modify_module_list(revision: BoardRevision, usb_bus: USBBus): hub_port=None, ) - usb_bus._read_symlink = MagicMock(return_value="ttyACM5") # type: ignore[assignment] + usb_bus._read_symlink = MagicMock(return_value="ttyACM5") # type: ignore[method-assign] mod_at_port_list = [ ModuleAtPort( name="thermocycler module", port="dev/ot_module_thermocycler_module" diff --git a/api/tests/opentrons/drivers/smoothie_drivers/test_driver.py b/api/tests/opentrons/drivers/smoothie_drivers/test_driver.py index c94668204fe..8821c491a6d 100755 --- a/api/tests/opentrons/drivers/smoothie_drivers/test_driver.py +++ b/api/tests/opentrons/drivers/smoothie_drivers/test_driver.py @@ -272,7 +272,7 @@ async def test_home_flagged_axes( expected: str, ) -> None: """It should only home un-homed axes.""" - smoothie.home = AsyncMock() # type: ignore[assignment] + smoothie.home = AsyncMock() # type: ignore[method-assign] await smoothie.update_homed_flags(home_flags) await smoothie.home_flagged_axes(axes_string=axis_string) @@ -292,7 +292,7 @@ async def test_home_flagged_axes_no_call( smoothie: driver_3_0.SmoothieDriver, home_flags: Dict[str, bool], axis_string: str ) -> None: """It should not home homed axes.""" - smoothie.home = AsyncMock() # type: ignore[assignment] + smoothie.home = AsyncMock() # type: ignore[method-assign] await smoothie.update_homed_flags(home_flags) await smoothie.home_flagged_axes(axes_string=axis_string) diff --git a/api/tests/opentrons/hardware_control/backends/test_ot3_controller.py b/api/tests/opentrons/hardware_control/backends/test_ot3_controller.py index 0fd7c7d4253..8720b2d1b08 100644 --- a/api/tests/opentrons/hardware_control/backends/test_ot3_controller.py +++ b/api/tests/opentrons/hardware_control/backends/test_ot3_controller.py @@ -1,9 +1,14 @@ import mock import pytest from decoy import Decoy +import asyncio -from contextlib import nullcontext as does_not_raise +from contextlib import ( + nullcontext as does_not_raise, + AbstractContextManager, +) from typing import ( + cast, Dict, List, Optional, @@ -49,12 +54,10 @@ SubSystemState, UpdateStatus, UpdateState, - TipStateType, - FailedTipStateCheck, EstopState, + CurrentConfig, ) from opentrons.hardware_control.errors import ( - FirmwareUpdateRequired, InvalidPipetteName, InvalidPipetteModel, ) @@ -66,7 +69,11 @@ MoveStopCondition, MoveGroupSingleAxisStep, ) -from opentrons_hardware.hardware_control.types import PCBARevision +from opentrons_hardware.hardware_control.types import ( + PCBARevision, + MotorPositionStatus, + MoveCompleteAck, +) from opentrons_hardware.hardware_control import current_settings from opentrons_hardware.hardware_control.network import DeviceInfoCache from opentrons_hardware.hardware_control.tools.types import ( @@ -75,11 +82,13 @@ GripperInformation, ) -from opentrons.hardware_control.estop_state import EstopStateMachine +from opentrons.hardware_control.backends.estop_state import EstopStateMachine from opentrons_shared_data.errors.exceptions import ( EStopActivatedError, EStopNotPresentError, + FirmwareUpdateRequiredError, + FailedGripperPickupError, ) from opentrons_hardware.hardware_control.move_group_runner import MoveGroupRunner @@ -150,9 +159,9 @@ def controller( mock_config: OT3Config, mock_can_driver: AbstractCanDriver, mock_eeprom_driver: EEPROMDriver, -) -> Iterator[OT3Controller]: +) -> OT3Controller: with (mock.patch("opentrons.hardware_control.backends.ot3controller.OT3GPIO")): - yield OT3Controller( + return OT3Controller( mock_config, mock_can_driver, eeprom_driver=mock_eeprom_driver ) @@ -194,6 +203,25 @@ def mock_move_group_run() -> Iterator[mock.AsyncMock]: yield mock_mgr_run +@pytest.fixture +def mock_check_overpressure() -> Iterator[mock.AsyncMock]: + with mock.patch( + "opentrons.hardware_control.backends.ot3controller.check_overpressure", + autospec=True, + ) as mock_check_overpressure: + queue: asyncio.Queue[Any] = asyncio.Queue() + + class FakeOverpressure: + async def __aenter__(self) -> asyncio.Queue[Any]: + return queue + + async def __aexit__(self, *args: Any, **kwargs: Any) -> None: + pass + + mock_check_overpressure.return_value = lambda: FakeOverpressure() + yield mock_check_overpressure + + def _device_info_entry(subsystem: SubSystem) -> Tuple[SubSystem, DeviceInfoCache]: return subsystem, DeviceInfoCache( target=subsystem_to_target(subsystem), @@ -310,11 +338,11 @@ def fw_node_info() -> Dict[NodeId, DeviceInfoCache]: def move_group_run_side_effect( controller: OT3Controller, axes_to_home: List[Axis] -) -> Iterator[Dict[NodeId, Tuple[float, float, bool, bool]]]: +) -> Iterator[Dict[NodeId, MotorPositionStatus]]: """Return homed position for axis that is present and was commanded to home.""" motor_nodes = controller._motor_nodes() gantry_homes = { - axis_to_node(ax): (0.0, 0.0, True, True) + axis_to_node(ax): MotorPositionStatus(0.0, 0.0, True, True, MoveCompleteAck(1)) for ax in Axis.gantry_axes() if ax in axes_to_home and axis_to_node(ax) in motor_nodes } @@ -322,7 +350,7 @@ def move_group_run_side_effect( yield gantry_homes pipette_homes = { - axis_to_node(ax): (0.0, 0.0, True, True) + axis_to_node(ax): MotorPositionStatus(0.0, 0.0, True, True, MoveCompleteAck(1)) for ax in Axis.pipette_axes() if ax in axes_to_home and axis_to_node(ax) in motor_nodes } @@ -334,11 +362,12 @@ async def test_home_execute( controller: OT3Controller, axes: List[Axis], mock_present_devices: None, + mock_check_overpressure: None, ) -> None: config = {"run.side_effect": move_group_run_side_effect(controller, axes)} with mock.patch( # type: ignore [call-overload] "opentrons.hardware_control.backends.ot3controller.MoveGroupRunner", - spec=mock.Mock(MoveGroupRunner), + spec=MoveGroupRunner, **config ) as mock_runner: present_axes = set(ax for ax in axes if controller.axis_is_present(ax)) @@ -346,7 +375,6 @@ async def test_home_execute( # nothing has been homed assert not controller._motor_status await controller.home(axes, GantryLoad.LOW_THROUGHPUT) - all_groups = [ group for arg in mock_runner.call_args_list @@ -389,7 +417,7 @@ async def test_home_gantry_order( ) -> None: with mock.patch( "opentrons.hardware_control.backends.ot3controller.MoveGroupRunner", - spec=mock.Mock(MoveGroupRunner), + spec=MoveGroupRunner, ) as mock_runner: controller._build_home_gantry_z_runner(axes, GantryLoad.LOW_THROUGHPUT) has_mount = len(set(Axis.ot3_mount_axes()) & set(axes)) > 0 @@ -441,6 +469,7 @@ async def test_home_only_present_devices( mock_move_group_run: mock.AsyncMock, axes: List[Axis], mock_present_devices: None, + mock_check_overpressure: None, ) -> None: starting_position = { NodeId.head_l: 20.0, @@ -571,7 +600,7 @@ async def test_gripper_home_jaw( async def test_gripper_grip( controller: OT3Controller, mock_move_group_run: mock.AsyncMock ) -> None: - await controller.gripper_grip_jaw(duty_cycle=50) + await controller.gripper_grip_jaw(duty_cycle=50, expected_displacement=0) for call in mock_move_group_run.call_args_list: move_group_runner = call[0][0] for move_group in move_group_runner._move_groups: @@ -734,8 +763,10 @@ async def test_update_motor_status( ) -> None: async def fake_gmp( can_messenger: CanMessenger, nodes: Set[NodeId], timeout: float = 1.0 - ) -> Dict[NodeId, Tuple[float, float, bool, bool]]: - return {node: (0.223, 0.323, False, True) for node in nodes} + ) -> Dict[NodeId, MotorPositionStatus]: + return { + node: MotorPositionStatus(0.223, 0.323, False, True, None) for node in nodes + } with mock.patch( "opentrons.hardware_control.backends.ot3controller.get_motor_position", fake_gmp @@ -757,8 +788,10 @@ async def test_update_motor_estimation( ) -> None: async def fake_umpe( can_messenger: CanMessenger, nodes: Set[NodeId], timeout: float = 1.0 - ) -> Dict[NodeId, Tuple[float, float, bool, bool]]: - return {node: (0.223, 0.323, False, True) for node in nodes} + ) -> Dict[NodeId, MotorPositionStatus]: + return { + node: MotorPositionStatus(0.223, 0.323, False, True, None) for node in nodes + } with mock.patch( "opentrons.hardware_control.backends.ot3controller.update_motor_position_estimation", @@ -907,7 +940,7 @@ async def test_update_required_flag( axes = [Axis.X, Axis.Y] decoy.when(mock_subsystem_manager.update_required).then_return(True) controller._initialized = True - with pytest.raises(FirmwareUpdateRequired): + with pytest.raises(FirmwareUpdateRequiredError): await controller.home(axes, gantry_load=GantryLoad.LOW_THROUGHPUT) @@ -930,7 +963,7 @@ async def _mock_update() -> AsyncIterator[UpdateStatus]: pass # raise FirmwareUpdateRequired if the _update_required flag is set controller._initialized = True - with pytest.raises(FirmwareUpdateRequired): + with pytest.raises(FirmwareUpdateRequiredError): await controller.home([Axis.X], gantry_load=GantryLoad.LOW_THROUGHPUT) @@ -1052,43 +1085,6 @@ async def fake_src( await controller.set_active_current({Axis.X: 2}) -async def test_monitor_pressure( - controller: OT3Controller, - mock_move_group_run: mock.AsyncMock, - mock_present_devices: None, -) -> None: - mount = NodeId.pipette_left - mock_move_group_run.side_effect = move_group_run_side_effect(controller, [Axis.P_L]) - async with controller._monitor_overpressure([mount]): - await controller.home([Axis.P_L], GantryLoad.LOW_THROUGHPUT) - - mock_move_group_run.assert_called_once() - - -@pytest.mark.parametrize( - "tip_state_type, mocked_ejector_response, expectation", - [ - [TipStateType.PRESENT, {0: 1, 1: 1}, does_not_raise()], - [TipStateType.ABSENT, {0: 0, 1: 0}, does_not_raise()], - [TipStateType.PRESENT, {0: 0, 1: 0}, pytest.raises(FailedTipStateCheck)], - [TipStateType.ABSENT, {0: 1, 1: 1}, pytest.raises(FailedTipStateCheck)], - ], -) -async def test_get_tip_present( - controller: OT3Controller, - tip_state_type: TipStateType, - mocked_ejector_response: Dict[int, int], - expectation: ContextManager[None], -) -> None: - mount = OT3Mount.LEFT - with mock.patch( - "opentrons.hardware_control.backends.ot3controller.get_tip_ejector_state", - return_value=mocked_ejector_response, - ): - with expectation: - await controller.check_for_tip_presence(mount, tip_state_type) - - @pytest.mark.parametrize( "estop_state, expectation", [ @@ -1104,9 +1100,167 @@ async def test_requires_estop( decoy: Decoy, estop_state: EstopState, expectation: ContextManager[None], + mock_check_overpressure: None, ) -> None: """Test that the estop state machine raises properly.""" decoy.when(mock_estop_state_machine.state).then_return(estop_state) with expectation: await controller.home([Axis.X, Axis.Y], gantry_load=GantryLoad.LOW_THROUGHPUT) + + +@pytest.mark.parametrize( + "run_currents, hold_currents", + [ + [{Axis.X: 1.0}, {}], + [{}, {Axis.X: 1.0}], + [{Axis.X: 1.0}, {Axis.X: 1.0}], + [{}, {}], + ], +) +async def test_motor_current( + controller: OT3Controller, + run_currents: OT3AxisMap[float], + hold_currents: OT3AxisMap[float], +) -> None: + """Test that restore current actually works.""" + controller._current_settings = {Axis.X: CurrentConfig(0.0, 0.0)} + + with mock.patch.object(controller, "set_active_current") as mock_run_currents: + with mock.patch.object(controller, "set_hold_current") as mock_hold_currents: + with mock.patch.object(controller, "set_default_currents") as mock_default: + + async with controller.motor_current(run_currents, hold_currents): + await controller.update_position() + + if not run_currents and not hold_currents: + mock_default.assert_called_once() + mock_run_currents.assert_not_called() + mock_hold_currents.assert_not_called() + elif run_currents: + mock_run_currents.assert_has_calls( + [ + mock.call({Axis.X: 1.0}), + mock.call({Axis.X: 0.0}), + ], + ) + elif hold_currents: + mock_hold_currents.assert_has_calls( + [ + mock.call({Axis.X: 1.0}), + mock.call({Axis.X: 0.0}), + ], + ) + + +@pytest.mark.parametrize( + ["axes", "expected_tip_nodes", "expected_normal_nodes"], + [ + [ + [Axis.X, Axis.Z_L, Axis.Q], + {NodeId.pipette_left}, + {NodeId.gantry_x, NodeId.head_l}, + ], + [[Axis.X, Axis.Z_L], {}, {NodeId.gantry_x, NodeId.head_l}], + [[Axis.Q], {NodeId.pipette_left}, {}], + [ + [Axis.X, Axis.Z_L, Axis.P_L, Axis.Q], + {NodeId.pipette_left}, + {NodeId.gantry_x, NodeId.head_l, NodeId.pipette_left}, + ], + ], +) +async def test_engage_motors( + controller: OT3Controller, + axes: List[Axis], + expected_tip_nodes: Set[NodeId], + expected_normal_nodes: Set[NodeId], +) -> None: + """Test that engaging/disengaging motors works.""" + + with mock.patch( + "opentrons.hardware_control.backends.ot3controller.set_enable_motor", + autospec=True, + ) as set_normal_axes: + with mock.patch( + "opentrons.hardware_control.backends.ot3controller.set_enable_tip_motor", + autospec=True, + ) as set_tip_axes: + await controller.engage_axes(axes=axes) + + if len(expected_normal_nodes) > 0: + set_normal_axes.assert_awaited_with( + controller._messenger, expected_normal_nodes + ) + else: + set_normal_axes.assert_not_awaited() + if len(expected_tip_nodes) > 0: + set_tip_axes.assert_awaited_with( + controller._messenger, expected_tip_nodes + ) + else: + set_tip_axes.assert_not_awaited() + + with mock.patch( + "opentrons.hardware_control.backends.ot3controller.set_disable_motor", + autospec=True, + ) as set_normal_axes: + with mock.patch( + "opentrons.hardware_control.backends.ot3controller.set_disable_tip_motor", + autospec=True, + ) as set_tip_axes: + await controller.disengage_axes(axes=axes) + + if len(expected_normal_nodes) > 0: + set_normal_axes.assert_awaited_with( + controller._messenger, expected_normal_nodes + ) + else: + set_normal_axes.assert_not_awaited() + if len(expected_tip_nodes) > 0: + set_tip_axes.assert_awaited_with( + controller._messenger, expected_tip_nodes + ) + else: + set_tip_axes.assert_not_awaited() + + +@pytest.mark.parametrize( + "expected_grip_width,actual_grip_width,wider,narrower,allowed_error,hard_max,hard_min,raise_error", + [ + (80, 80, 0, 0, 0, 92, 60, False), + (80, 81, 0, 0, 0, 92, 60, True), + (80, 79, 0, 0, 0, 92, 60, True), + (80, 81, 1, 0, 0, 92, 60, False), + (80, 79, 0, 1, 0, 92, 60, False), + (80, 81, 0, 0, 1, 92, 60, False), + (80, 79, 0, 0, 1, 92, 60, False), + (80, 45, 40, 0, 1, 92, 60, True), + (80, 100, 0, 40, 0, 92, 60, True), + ], +) +def test_grip_error_detection( + controller: OT3Controller, + expected_grip_width: float, + actual_grip_width: float, + wider: float, + narrower: float, + allowed_error: float, + hard_max: float, + hard_min: float, + raise_error: bool, +) -> None: + context = cast( + AbstractContextManager[None], + pytest.raises(FailedGripperPickupError) if raise_error else does_not_raise(), + ) + with context: + controller.check_gripper_position_within_bounds( + expected_grip_width, + wider, + narrower, + actual_grip_width, + allowed_error, + hard_max, + hard_min, + ) diff --git a/api/tests/opentrons/hardware_control/test_ot3_estop_state.py b/api/tests/opentrons/hardware_control/backends/test_ot3_estop_state.py similarity index 94% rename from api/tests/opentrons/hardware_control/test_ot3_estop_state.py rename to api/tests/opentrons/hardware_control/backends/test_ot3_estop_state.py index af660606b9a..1d4a86a1343 100644 --- a/api/tests/opentrons/hardware_control/test_ot3_estop_state.py +++ b/api/tests/opentrons/hardware_control/backends/test_ot3_estop_state.py @@ -1,8 +1,8 @@ import pytest from decoy import Decoy -from typing import List, Tuple, Optional +from typing import List, Tuple, Optional, cast -from opentrons.hardware_control.estop_state import EstopStateMachine +from opentrons.hardware_control.backends.estop_state import EstopStateMachine from opentrons_hardware.hardware_control.estop.detector import ( EstopSummary, EstopDetector, @@ -59,7 +59,7 @@ async def test_estop_state_no_detector( subject.subscribe_to_detector(detector=mock_estop_detector) - assert subject.state == EstopState.PHYSICALLY_ENGAGED + assert cast(EstopState, subject.state) == EstopState.PHYSICALLY_ENGAGED assert ( subject.get_physical_status(EstopAttachLocation.LEFT) == EstopPhysicalStatus.NOT_PRESENT @@ -73,11 +73,9 @@ async def test_estop_state_no_detector( subject.subscribe_to_detector(detector=mock_estop_detector) decoy.verify( - [ - mock_estop_detector.add_listener(subject.detector_listener), - mock_estop_detector.remove_listener(subject.detector_listener), - mock_estop_detector.add_listener(subject.detector_listener), - ] + mock_estop_detector.add_listener(subject.detector_listener), + mock_estop_detector.remove_listener(subject.detector_listener), + mock_estop_detector.add_listener(subject.detector_listener), ) diff --git a/api/tests/opentrons/hardware_control/backends/test_ot3_status_bar.py b/api/tests/opentrons/hardware_control/backends/test_ot3_status_bar.py new file mode 100644 index 00000000000..9e23d545961 --- /dev/null +++ b/api/tests/opentrons/hardware_control/backends/test_ot3_status_bar.py @@ -0,0 +1,43 @@ +import pytest +from decoy import Decoy +from opentrons.hardware_control.types import StatusBarState +from opentrons.hardware_control.backends.status_bar_state import ( + StatusBarStateController, +) +from opentrons_hardware.hardware_control.status_bar import StatusBar + + +@pytest.fixture +def mock_status_bar_controller(decoy: Decoy) -> StatusBar: + return decoy.mock(cls=StatusBar) + + +@pytest.fixture +def subject(mock_status_bar_controller: StatusBar) -> StatusBarStateController: + return StatusBarStateController(mock_status_bar_controller) + + +@pytest.mark.parametrize(argnames=["enabled"], argvalues=[[True], [False]]) +async def test_status_bar_interface( + subject: StatusBarStateController, enabled: bool +) -> None: + """Test setting status bar statuses and make sure the cached status is correct.""" + await subject.set_enabled(enabled) + + settings = { + StatusBarState.IDLE: StatusBarState.IDLE, + StatusBarState.RUNNING: StatusBarState.RUNNING, + StatusBarState.PAUSED: StatusBarState.PAUSED, + StatusBarState.HARDWARE_ERROR: StatusBarState.HARDWARE_ERROR, + StatusBarState.SOFTWARE_ERROR: StatusBarState.SOFTWARE_ERROR, + StatusBarState.CONFIRMATION: StatusBarState.IDLE, + StatusBarState.RUN_COMPLETED: StatusBarState.RUN_COMPLETED, + StatusBarState.UPDATING: StatusBarState.UPDATING, + StatusBarState.ACTIVATION: StatusBarState.IDLE, + StatusBarState.DISCO: StatusBarState.IDLE, + StatusBarState.OFF: StatusBarState.OFF, + } + + for setting, response in settings.items(): + await subject.set_status_bar_state(state=setting) + assert subject.get_current_state() == response diff --git a/api/tests/opentrons/hardware_control/backends/test_ot3_tip_presence_manager.py b/api/tests/opentrons/hardware_control/backends/test_ot3_tip_presence_manager.py new file mode 100644 index 00000000000..543f7b3b400 --- /dev/null +++ b/api/tests/opentrons/hardware_control/backends/test_ot3_tip_presence_manager.py @@ -0,0 +1,129 @@ +import pytest +from typing import AsyncIterator, Dict +from decoy import Decoy + +from opentrons.hardware_control.types import OT3Mount, TipStateType +from opentrons.hardware_control.backends.tip_presence_manager import TipPresenceManager +from opentrons_hardware.hardware_control.tip_presence import ( + TipDetector, + types as tp_types, +) +from opentrons_hardware.firmware_bindings.constants import SensorId +from opentrons_hardware.drivers.can_bus import CanMessenger + +from opentrons_shared_data.errors.exceptions import UnmatchedTipPresenceStates + + +@pytest.fixture +def can_messenger(decoy: Decoy) -> CanMessenger: + """Build a decoyed can messenger.""" + return decoy.mock(cls=CanMessenger) + + +@pytest.fixture +def tip_detector(decoy: Decoy) -> TipDetector: + return decoy.mock(cls=TipDetector) + + +class TipDetectorController: + def __init__(self, tip_detector: TipDetector, decoy: Decoy) -> None: + self._tip_detector = tip_detector + self._decoy = decoy + + async def retrieve_tip_status(self, tip_presence: bool) -> None: + tip_notif = tp_types.TipNotification(sensor=SensorId.S0, presence=tip_presence) + self._decoy.when(await self._tip_detector.request_tip_status()).then_return( + [tip_notif] + ) + + async def retrieve_tip_status_highthroughput( + self, tip_presences: Dict[SensorId, bool] + ) -> None: + tip_notif = [ + tp_types.TipNotification(sensor=sensor_id, presence=presence) + for sensor_id, presence in tip_presences.items() + ] + self._decoy.when(await self._tip_detector.request_tip_status()).then_return( + tip_notif + ) + + +@pytest.fixture +def tip_detector_controller( + tip_detector: TipDetector, + decoy: Decoy, +) -> TipDetectorController: + return TipDetectorController(tip_detector, decoy) + + +@pytest.fixture +async def subject( + can_messenger: CanMessenger, + tip_detector: TipDetector, +) -> AsyncIterator[TipPresenceManager]: + """Build a test subject using decoyed can messenger and tip detector.""" + manager = TipPresenceManager(can_messenger) + manager.set_detector(OT3Mount.LEFT, tip_detector) + try: + yield manager + finally: + return + + +@pytest.mark.parametrize( + "tip_presence,expected_type", + [ + (False, TipStateType.ABSENT), + (True, TipStateType.PRESENT), + ], +) +async def test_get_tip_status_for_low_throughput( + subject: TipPresenceManager, + tip_detector_controller: TipDetectorController, + tip_presence: bool, + expected_type: TipStateType, +) -> None: + mount = OT3Mount.LEFT + await tip_detector_controller.retrieve_tip_status(tip_presence) + + result = await subject.get_tip_status(mount) + result == expected_type + + +@pytest.mark.parametrize( + "tip_presence,expected_type", + [ + ({SensorId.S0: False, SensorId.S1: False}, TipStateType.ABSENT), + ({SensorId.S0: True, SensorId.S1: True}, TipStateType.PRESENT), + ], +) +async def test_get_tip_status_for_high_throughput( + subject: TipPresenceManager, + tip_detector_controller: TipDetectorController, + tip_presence: Dict[SensorId, bool], + expected_type: TipStateType, +) -> None: + mount = OT3Mount.LEFT + await tip_detector_controller.retrieve_tip_status_highthroughput(tip_presence) + + result = await subject.get_tip_status(mount) + result == expected_type + + +@pytest.mark.parametrize( + "tip_presence", + [ + {SensorId.S0: True, SensorId.S1: False}, + {SensorId.S0: False, SensorId.S1: True}, + ], +) +async def test_unmatched_tip_responses_should_raise( + subject: TipPresenceManager, + tip_detector_controller: TipDetectorController, + tip_presence: Dict[SensorId, bool], +) -> None: + mount = OT3Mount.LEFT + await tip_detector_controller.retrieve_tip_status_highthroughput(tip_presence) + + with pytest.raises(UnmatchedTipPresenceStates): + await subject.get_tip_status(mount) diff --git a/api/tests/opentrons/hardware_control/backends/test_ot3_utils.py b/api/tests/opentrons/hardware_control/backends/test_ot3_utils.py index 800c6e72d08..efdd64392d1 100644 --- a/api/tests/opentrons/hardware_control/backends/test_ot3_utils.py +++ b/api/tests/opentrons/hardware_control/backends/test_ot3_utils.py @@ -84,7 +84,7 @@ def test_filter_zero_duration_step() -> None: moves=moves, present_nodes=present_nodes, ) - assert len(move_group) == 3 + assert len(move_group) == 2 for step in move_group: assert set(present_nodes) == set(step.keys()) diff --git a/api/tests/opentrons/hardware_control/instruments/test_instrument_calibration.py b/api/tests/opentrons/hardware_control/instruments/test_instrument_calibration.py index a98e7f5138c..b850803ba61 100644 --- a/api/tests/opentrons/hardware_control/instruments/test_instrument_calibration.py +++ b/api/tests/opentrons/hardware_control/instruments/test_instrument_calibration.py @@ -3,7 +3,7 @@ from typing import Union, cast import pytest -from pytest_lazyfixture import lazy_fixture # type: ignore[import] +from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] from decoy import Decoy from opentrons_shared_data.labware.dev_types import ( @@ -32,6 +32,10 @@ def _use_mock_calibration_storage( """Mock out the opentrons.calibration_storage module.""" for name, func in inspect.getmembers(calibration_storage, inspect.isfunction): monkeypatch.setattr(calibration_storage, name, decoy.mock(func=func)) + for name, func in inspect.getmembers(calibration_storage.ot2, inspect.isfunction): + monkeypatch.setattr(calibration_storage.ot2, name, decoy.mock(func=func)) + for name, func in inspect.getmembers(calibration_storage.ot3, inspect.isfunction): + monkeypatch.setattr(calibration_storage.ot3, name, decoy.mock(func=func)) for name, func in inspect.getmembers( calibration_storage_helpers, inspect.isfunction @@ -78,16 +82,16 @@ def test_load_tip_length( tipLength=1.23, lastModified=datetime(year=2023, month=1, day=1), uri=LabwareUri("def456"), - source=subject.types.SourceType.factory, + source=subject.SourceType.factory, status=v1_models.CalibrationStatus( markedBad=True, - source=subject.types.SourceType.user, + source=subject.SourceType.user, markedAt=datetime(year=2023, month=2, day=2), ), ) decoy.when( - calibration_storage.load_tip_length_calibration( + calibration_storage.ot2.load_tip_length_calibration( pip_id="abc123", definition=tip_rack_dict ) ).then_return(tip_length_data) @@ -102,14 +106,14 @@ def test_load_tip_length( assert result == subject.TipLengthCalibration( tip_length=1.23, - source=subject.types.SourceType.factory, + source=subject.SourceType.factory, pipette="abc123", tiprack="asdfghjk", last_modified=datetime(year=2023, month=1, day=1), uri=LabwareUri("def456"), - status=subject.types.CalibrationStatus( + status=subject.CalibrationStatus( markedBad=True, - source=subject.types.SourceType.user, + source=subject.SourceType.user, markedAt=datetime(year=2023, month=2, day=2), ), ) diff --git a/api/tests/opentrons/hardware_control/instruments/test_nozzle_manager.py b/api/tests/opentrons/hardware_control/instruments/test_nozzle_manager.py new file mode 100644 index 00000000000..dc06ce9ea62 --- /dev/null +++ b/api/tests/opentrons/hardware_control/instruments/test_nozzle_manager.py @@ -0,0 +1,919 @@ +import pytest +from typing import Dict, List, Tuple, Union, Iterator, cast + +from opentrons.hardware_control import nozzle_manager + +from opentrons.types import Point + +from opentrons_shared_data.pipette.load_data import load_definition +from opentrons_shared_data.pipette.types import ( + PipetteModelType, + PipetteChannelType, + PipetteVersionType, +) +from opentrons_shared_data.pipette.pipette_definition import PipetteConfigurations + + +@pytest.mark.parametrize( + "pipette_details", + [ + (PipetteModelType.p10, PipetteVersionType(major=1, minor=3)), + (PipetteModelType.p20, PipetteVersionType(major=2, minor=0)), + (PipetteModelType.p50, PipetteVersionType(major=3, minor=4)), + (PipetteModelType.p300, PipetteVersionType(major=2, minor=1)), + (PipetteModelType.p1000, PipetteVersionType(major=3, minor=5)), + ], +) +def test_single_pipettes_always_full( + pipette_details: Tuple[PipetteModelType, PipetteVersionType] +) -> None: + config = load_definition( + pipette_details[0], PipetteChannelType.SINGLE_CHANNEL, pipette_details[1] + ) + subject = nozzle_manager.NozzleConfigurationManager.build_from_config(config) + assert ( + subject.current_configuration.configuration + == nozzle_manager.NozzleConfigurationType.FULL + ) + + subject.update_nozzle_configuration("A1", "A1", "A1") + assert ( + subject.current_configuration.configuration + == nozzle_manager.NozzleConfigurationType.FULL + ) + + subject.reset_to_default_configuration() + assert ( + subject.current_configuration.configuration + == nozzle_manager.NozzleConfigurationType.FULL + ) + + +@pytest.mark.parametrize( + "pipette_details", + [ + (PipetteModelType.p10, PipetteVersionType(major=1, minor=3)), + (PipetteModelType.p20, PipetteVersionType(major=2, minor=0)), + (PipetteModelType.p50, PipetteVersionType(major=3, minor=4)), + (PipetteModelType.p300, PipetteVersionType(major=2, minor=1)), + (PipetteModelType.p1000, PipetteVersionType(major=3, minor=5)), + ], +) +def test_single_pipette_map_entries( + pipette_details: Tuple[PipetteModelType, PipetteVersionType] +) -> None: + config = load_definition( + pipette_details[0], PipetteChannelType.SINGLE_CHANNEL, pipette_details[1] + ) + subject = nozzle_manager.NozzleConfigurationManager.build_from_config(config) + + def test_map_entries(nozzlemap: nozzle_manager.NozzleMap) -> None: + assert nozzlemap.back_left == "A1" + assert nozzlemap.front_right == "A1" + assert list(nozzlemap.map_store.keys()) == ["A1"] + assert list(nozzlemap.rows.keys()) == ["A"] + assert list(nozzlemap.columns.keys()) == ["1"] + assert nozzlemap.rows["A"] == ["A1"] + assert nozzlemap.columns["1"] == ["A1"] + assert nozzlemap.tip_count == 1 + + test_map_entries(subject.current_configuration) + subject.update_nozzle_configuration("A1", "A1", "A1") + test_map_entries(subject.current_configuration) + subject.reset_to_default_configuration() + test_map_entries(subject.current_configuration) + + +@pytest.mark.parametrize( + "pipette_details", + [ + (PipetteModelType.p10, PipetteVersionType(major=1, minor=3)), + (PipetteModelType.p20, PipetteVersionType(major=2, minor=0)), + (PipetteModelType.p50, PipetteVersionType(major=3, minor=4)), + (PipetteModelType.p300, PipetteVersionType(major=2, minor=1)), + (PipetteModelType.p1000, PipetteVersionType(major=3, minor=5)), + ], +) +def test_single_pipette_map_geometry( + pipette_details: Tuple[PipetteModelType, PipetteVersionType] +) -> None: + config = load_definition( + pipette_details[0], PipetteChannelType.SINGLE_CHANNEL, pipette_details[1] + ) + subject = nozzle_manager.NozzleConfigurationManager.build_from_config(config) + + def test_map_geometry(nozzlemap: nozzle_manager.NozzleMap) -> None: + assert nozzlemap.xy_center_offset == Point(*config.nozzle_map["A1"]) + assert nozzlemap.y_center_offset == Point(*config.nozzle_map["A1"]) + assert nozzlemap.front_nozzle_offset == Point(*config.nozzle_map["A1"]) + assert nozzlemap.starting_nozzle_offset == Point(*config.nozzle_map["A1"]) + + test_map_geometry(subject.current_configuration) + subject.update_nozzle_configuration("A1", "A1", "A1") + test_map_geometry(subject.current_configuration) + subject.reset_to_default_configuration() + test_map_geometry(subject.current_configuration) + + +@pytest.mark.parametrize( + "pipette_details", + [ + (PipetteModelType.p10, PipetteVersionType(major=1, minor=3)), + (PipetteModelType.p20, PipetteVersionType(major=2, minor=0)), + (PipetteModelType.p50, PipetteVersionType(major=3, minor=4)), + (PipetteModelType.p300, PipetteVersionType(major=2, minor=1)), + (PipetteModelType.p1000, PipetteVersionType(major=3, minor=5)), + ], +) +def test_multi_config_identification( + pipette_details: Tuple[PipetteModelType, PipetteVersionType] +) -> None: + config = load_definition( + pipette_details[0], PipetteChannelType.EIGHT_CHANNEL, pipette_details[1] + ) + subject = nozzle_manager.NozzleConfigurationManager.build_from_config(config) + + assert ( + subject.current_configuration.configuration + == nozzle_manager.NozzleConfigurationType.FULL + ) + + subject.update_nozzle_configuration("A1", "H1", "A1") + assert ( + subject.current_configuration.configuration + == nozzle_manager.NozzleConfigurationType.FULL + ) + + subject.reset_to_default_configuration() + assert ( + subject.current_configuration.configuration + == nozzle_manager.NozzleConfigurationType.FULL + ) + + subject.update_nozzle_configuration("A1", "D1", "A1") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.COLUMN + ) + + subject.update_nozzle_configuration("A1", "A1", "A1") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.SINGLE + ) + + subject.update_nozzle_configuration("H1", "H1", "H1") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.SINGLE + ) + + subject.update_nozzle_configuration("C1", "F1", "C1") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.COLUMN + ) + + subject.reset_to_default_configuration() + assert ( + subject.current_configuration.configuration + == nozzle_manager.NozzleConfigurationType.FULL + ) + + +@pytest.mark.parametrize( + "pipette_details", + [ + (PipetteModelType.p10, PipetteVersionType(major=1, minor=3)), + (PipetteModelType.p20, PipetteVersionType(major=2, minor=0)), + (PipetteModelType.p50, PipetteVersionType(major=3, minor=4)), + (PipetteModelType.p300, PipetteVersionType(major=2, minor=1)), + (PipetteModelType.p1000, PipetteVersionType(major=3, minor=5)), + ], +) +def test_multi_config_map_entries( + pipette_details: Tuple[PipetteModelType, PipetteVersionType] +) -> None: + config = load_definition( + pipette_details[0], PipetteChannelType.EIGHT_CHANNEL, pipette_details[1] + ) + subject = nozzle_manager.NozzleConfigurationManager.build_from_config(config) + + def test_map_entries( + nozzlemap: nozzle_manager.NozzleMap, nozzles: List[str] + ) -> None: + assert nozzlemap.back_left == nozzles[0] + assert nozzlemap.front_right == nozzles[-1] + assert list(nozzlemap.map_store.keys()) == nozzles + assert list(nozzlemap.rows.keys()) == [nozzle[0] for nozzle in nozzles] + assert list(nozzlemap.columns.keys()) == ["1"] + for rowname, row_elements in nozzlemap.rows.items(): + assert row_elements == [f"{rowname}1"] + + assert nozzlemap.columns["1"] == nozzles + assert nozzlemap.tip_count == len(nozzles) + + test_map_entries( + subject.current_configuration, ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"] + ) + subject.update_nozzle_configuration("A1", "H1", "A1") + test_map_entries( + subject.current_configuration, ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"] + ) + subject.update_nozzle_configuration("A1", "D1", "A1") + test_map_entries(subject.current_configuration, ["A1", "B1", "C1", "D1"]) + subject.update_nozzle_configuration("A1", "A1", "A1") + test_map_entries(subject.current_configuration, ["A1"]) + subject.update_nozzle_configuration("H1", "H1", "H1") + test_map_entries(subject.current_configuration, ["H1"]) + subject.update_nozzle_configuration("C1", "F1", "C1") + test_map_entries(subject.current_configuration, ["C1", "D1", "E1", "F1"]) + + +def assert_offset_in_center_of( + offset: Point, between: Union[Tuple[str, str], str], config: PipetteConfigurations +) -> None: + if isinstance(between, str): + assert offset == Point(*config.nozzle_map[between]) + else: + assert ( + offset + == ( + Point(*config.nozzle_map[between[0]]) + + Point(*config.nozzle_map[between[1]]) + ) + * 0.5 + ) + + +@pytest.mark.parametrize( + "pipette_details", + [ + (PipetteModelType.p10, PipetteVersionType(major=1, minor=3)), + (PipetteModelType.p20, PipetteVersionType(major=2, minor=0)), + (PipetteModelType.p50, PipetteVersionType(major=3, minor=4)), + (PipetteModelType.p300, PipetteVersionType(major=2, minor=1)), + (PipetteModelType.p1000, PipetteVersionType(major=3, minor=5)), + ], +) +def test_multi_config_geometry( + pipette_details: Tuple[PipetteModelType, PipetteVersionType] +) -> None: + config = load_definition( + pipette_details[0], PipetteChannelType.EIGHT_CHANNEL, pipette_details[1] + ) + subject = nozzle_manager.NozzleConfigurationManager.build_from_config(config) + + def test_map_geometry( + nozzlemap: nozzle_manager.NozzleMap, + front_nozzle: str, + starting_nozzle: str, + xy_center_in_center_of: Union[Tuple[str, str], str], + y_center_in_center_of: Union[Tuple[str, str], str], + ) -> None: + assert_offset_in_center_of( + nozzlemap.xy_center_offset, xy_center_in_center_of, config + ) + assert_offset_in_center_of( + nozzlemap.y_center_offset, y_center_in_center_of, config + ) + + assert nozzlemap.front_nozzle_offset == Point(*config.nozzle_map[front_nozzle]) + assert nozzlemap.starting_nozzle_offset == Point( + *config.nozzle_map[starting_nozzle] + ) + + test_map_geometry( + subject.current_configuration, "H1", "A1", ("A1", "H1"), ("A1", "H1") + ) + + subject.update_nozzle_configuration("A1", "A1", "A1") + test_map_geometry(subject.current_configuration, "A1", "A1", "A1", "A1") + + subject.update_nozzle_configuration("D1", "D1", "D1") + test_map_geometry(subject.current_configuration, "D1", "D1", "D1", "D1") + + subject.update_nozzle_configuration("C1", "G1", "C1") + test_map_geometry(subject.current_configuration, "G1", "C1", "E1", "E1") + + subject.update_nozzle_configuration("E1", "H1", "E1") + test_map_geometry( + subject.current_configuration, "H1", "E1", ("E1", "H1"), ("E1", "H1") + ) + + subject.reset_to_default_configuration() + test_map_geometry( + subject.current_configuration, "H1", "A1", ("A1", "H1"), ("A1", "H1") + ) + + +@pytest.mark.parametrize( + "pipette_details", [(PipetteModelType.p1000, PipetteVersionType(major=3, minor=5))] +) +def test_96_config_identification( + pipette_details: Tuple[PipetteModelType, PipetteVersionType] +) -> None: + config = load_definition( + pipette_details[0], PipetteChannelType.NINETY_SIX_CHANNEL, pipette_details[1] + ) + subject = nozzle_manager.NozzleConfigurationManager.build_from_config(config) + + assert ( + subject.current_configuration.configuration + == nozzle_manager.NozzleConfigurationType.FULL + ) + subject.update_nozzle_configuration("A1", "H12") + assert ( + subject.current_configuration.configuration + == nozzle_manager.NozzleConfigurationType.FULL + ) + subject.update_nozzle_configuration("A1", "H1") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.COLUMN + ) + subject.update_nozzle_configuration("A12", "H12") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.COLUMN + ) + subject.update_nozzle_configuration("A8", "H8") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.COLUMN + ) + + subject.update_nozzle_configuration("A1", "A12") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.ROW + ) + subject.update_nozzle_configuration("H1", "H12") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.ROW + ) + subject.update_nozzle_configuration("D1", "D12") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.ROW + ) + + subject.update_nozzle_configuration("E1", "H6") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.SUBRECT + ) + subject.update_nozzle_configuration("E7", "H12") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.SUBRECT + ) + + subject.update_nozzle_configuration("C4", "F9") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.SUBRECT + ) + subject.update_nozzle_configuration("A1", "D12") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.SUBRECT + ) + subject.update_nozzle_configuration("E1", "H12") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.SUBRECT + ) + subject.update_nozzle_configuration("A1", "H6") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.SUBRECT + ) + subject.update_nozzle_configuration("A7", "H12") + assert ( + cast( + nozzle_manager.NozzleConfigurationType, + subject.current_configuration.configuration, + ) + == nozzle_manager.NozzleConfigurationType.SUBRECT + ) + + +@pytest.mark.parametrize( + "pipette_details", [(PipetteModelType.p1000, PipetteVersionType(major=3, minor=5))] +) +def test_96_config_map_entries( + pipette_details: Tuple[PipetteModelType, PipetteVersionType] +) -> None: + config = load_definition( + pipette_details[0], PipetteChannelType.NINETY_SIX_CHANNEL, pipette_details[1] + ) + subject = nozzle_manager.NozzleConfigurationManager.build_from_config(config) + + def test_map_entries( + nozzlemap: nozzle_manager.NozzleMap, + rows: Dict[str, List[str]], + cols: Dict[str, List[str]], + ) -> None: + assert nozzlemap.back_left == next(iter(rows.values()))[0] + assert nozzlemap.front_right == next(reversed(list(rows.values())))[-1] + + def _nozzles() -> Iterator[str]: + for row in rows.values(): + for nozzle in row: + yield nozzle + + assert list(nozzlemap.map_store.keys()) == list(_nozzles()) + assert nozzlemap.rows == rows + assert nozzlemap.columns == cols + assert nozzlemap.tip_count == sum(len(row) for row in rows.values()) + + test_map_entries( + subject.current_configuration, + { + "A": [ + "A1", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "A10", + "A11", + "A12", + ], + "B": [ + "B1", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "B10", + "B11", + "B12", + ], + "C": [ + "C1", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "C10", + "C11", + "C12", + ], + "D": [ + "D1", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "D10", + "D11", + "D12", + ], + "E": [ + "E1", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "E10", + "E11", + "E12", + ], + "F": [ + "F1", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "F10", + "F11", + "F12", + ], + "G": [ + "G1", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "G10", + "G11", + "G12", + ], + "H": [ + "H1", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9", + "H10", + "H11", + "H12", + ], + }, + { + "1": ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + "2": ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], + "3": ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], + "4": ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], + "5": ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], + "6": ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], + "7": ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], + "8": ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], + "9": ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], + "10": ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"], + "11": ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], + "12": ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"], + }, + ) + + subject.update_nozzle_configuration("A1", "H1") + test_map_entries( + subject.current_configuration, + { + "A": ["A1"], + "B": ["B1"], + "C": ["C1"], + "D": ["D1"], + "E": ["E1"], + "F": ["F1"], + "G": ["G1"], + "H": ["H1"], + }, + {"1": ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"]}, + ) + + subject.update_nozzle_configuration("A12", "H12") + test_map_entries( + subject.current_configuration, + { + "A": ["A12"], + "B": ["B12"], + "C": ["C12"], + "D": ["D12"], + "E": ["E12"], + "F": ["F12"], + "G": ["G12"], + "H": ["H12"], + }, + {"12": ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"]}, + ) + + subject.update_nozzle_configuration("A8", "H8") + test_map_entries( + subject.current_configuration, + { + "A": ["A8"], + "B": ["B8"], + "C": ["C8"], + "D": ["D8"], + "E": ["E8"], + "F": ["F8"], + "G": ["G8"], + "H": ["H8"], + }, + {"8": ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"]}, + ) + + subject.update_nozzle_configuration("A1", "A12") + test_map_entries( + subject.current_configuration, + { + "A": [ + "A1", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "A10", + "A11", + "A12", + ] + }, + { + "1": ["A1"], + "2": ["A2"], + "3": ["A3"], + "4": ["A4"], + "5": ["A5"], + "6": ["A6"], + "7": ["A7"], + "8": ["A8"], + "9": ["A9"], + "10": ["A10"], + "11": ["A11"], + "12": ["A12"], + }, + ) + + subject.update_nozzle_configuration("H1", "H12") + test_map_entries( + subject.current_configuration, + { + "H": [ + "H1", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9", + "H10", + "H11", + "H12", + ] + }, + { + "1": ["H1"], + "2": ["H2"], + "3": ["H3"], + "4": ["H4"], + "5": ["H5"], + "6": ["H6"], + "7": ["H7"], + "8": ["H8"], + "9": ["H9"], + "10": ["H10"], + "11": ["H11"], + "12": ["H12"], + }, + ) + subject.update_nozzle_configuration("D1", "D12") + test_map_entries( + subject.current_configuration, + { + "D": [ + "D1", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "D10", + "D11", + "D12", + ] + }, + { + "1": ["D1"], + "2": ["D2"], + "3": ["D3"], + "4": ["D4"], + "5": ["D5"], + "6": ["D6"], + "7": ["D7"], + "8": ["D8"], + "9": ["D9"], + "10": ["D10"], + "11": ["D11"], + "12": ["D12"], + }, + ) + + subject.update_nozzle_configuration("A1", "D6") + test_map_entries( + subject.current_configuration, + { + "A": ["A1", "A2", "A3", "A4", "A5", "A6"], + "B": ["B1", "B2", "B3", "B4", "B5", "B6"], + "C": ["C1", "C2", "C3", "C4", "C5", "C6"], + "D": ["D1", "D2", "D3", "D4", "D5", "D6"], + }, + { + "1": ["A1", "B1", "C1", "D1"], + "2": ["A2", "B2", "C2", "D2"], + "3": ["A3", "B3", "C3", "D3"], + "4": ["A4", "B4", "C4", "D4"], + "5": ["A5", "B5", "C5", "D5"], + "6": ["A6", "B6", "C6", "D6"], + }, + ) + + subject.update_nozzle_configuration("A7", "D12") + test_map_entries( + subject.current_configuration, + { + "A": ["A7", "A8", "A9", "A10", "A11", "A12"], + "B": ["B7", "B8", "B9", "B10", "B11", "B12"], + "C": ["C7", "C8", "C9", "C10", "C11", "C12"], + "D": ["D7", "D8", "D9", "D10", "D11", "D12"], + }, + { + "7": ["A7", "B7", "C7", "D7"], + "8": ["A8", "B8", "C8", "D8"], + "9": ["A9", "B9", "C9", "D9"], + "10": ["A10", "B10", "C10", "D10"], + "11": ["A11", "B11", "C11", "D11"], + "12": ["A12", "B12", "C12", "D12"], + }, + ) + + subject.update_nozzle_configuration("E1", "H6") + test_map_entries( + subject.current_configuration, + { + "E": ["E1", "E2", "E3", "E4", "E5", "E6"], + "F": ["F1", "F2", "F3", "F4", "F5", "F6"], + "G": ["G1", "G2", "G3", "G4", "G5", "G6"], + "H": ["H1", "H2", "H3", "H4", "H5", "H6"], + }, + { + "1": ["E1", "F1", "G1", "H1"], + "2": ["E2", "F2", "G2", "H2"], + "3": ["E3", "F3", "G3", "H3"], + "4": ["E4", "F4", "G4", "H4"], + "5": ["E5", "F5", "G5", "H5"], + "6": ["E6", "F6", "G6", "H6"], + }, + ) + + subject.update_nozzle_configuration("E7", "H12") + test_map_entries( + subject.current_configuration, + { + "E": ["E7", "E8", "E9", "E10", "E11", "E12"], + "F": ["F7", "F8", "F9", "F10", "F11", "F12"], + "G": ["G7", "G8", "G9", "G10", "G11", "G12"], + "H": ["H7", "H8", "H9", "H10", "H11", "H12"], + }, + { + "7": ["E7", "F7", "G7", "H7"], + "8": ["E8", "F8", "G8", "H8"], + "9": ["E9", "F9", "G9", "H9"], + "10": ["E10", "F10", "G10", "H10"], + "11": ["E11", "F11", "G11", "H11"], + "12": ["E12", "F12", "G12", "H12"], + }, + ) + + subject.update_nozzle_configuration("C4", "D5") + test_map_entries( + subject.current_configuration, + {"C": ["C4", "C5"], "D": ["D4", "D5"]}, + {"4": ["C4", "D4"], "5": ["C5", "D5"]}, + ) + + +@pytest.mark.parametrize( + "pipette_details", [(PipetteModelType.p1000, PipetteVersionType(major=3, minor=5))] +) +def test_96_config_geometry( + pipette_details: Tuple[PipetteModelType, PipetteVersionType] +) -> None: + config = load_definition( + pipette_details[0], PipetteChannelType.NINETY_SIX_CHANNEL, pipette_details[1] + ) + subject = nozzle_manager.NozzleConfigurationManager.build_from_config(config) + + def test_map_geometry( + config: PipetteConfigurations, + nozzlemap: nozzle_manager.NozzleMap, + starting_nozzle: str, + front_nozzle: str, + xy_center_between: Union[str, Tuple[str, str]], + y_center_between: Union[str, Tuple[str, str]], + ) -> None: + assert_offset_in_center_of( + nozzlemap.xy_center_offset, xy_center_between, config + ) + assert_offset_in_center_of(nozzlemap.y_center_offset, y_center_between, config) + + assert nozzlemap.front_nozzle_offset == Point(*config.nozzle_map[front_nozzle]) + assert nozzlemap.starting_nozzle_offset == Point( + *config.nozzle_map[starting_nozzle] + ) + + test_map_geometry( + config, subject.current_configuration, "A1", "H1", ("A1", "H12"), ("A1", "H1") + ) + + subject.update_nozzle_configuration("A1", "H1") + test_map_geometry( + config, subject.current_configuration, "A1", "H1", ("A1", "H1"), ("A1", "H1") + ) + + subject.update_nozzle_configuration("A12", "H12") + test_map_geometry( + config, + subject.current_configuration, + "A12", + "H12", + ("A12", "H12"), + ("A12", "H12"), + ) + + subject.update_nozzle_configuration("A1", "A12") + test_map_geometry( + config, subject.current_configuration, "A1", "A1", ("A1", "A12"), "A1" + ) + + subject.update_nozzle_configuration("H1", "H12") + test_map_geometry( + config, subject.current_configuration, "H1", "H1", ("H1", "H12"), "H1" + ) + + subject.update_nozzle_configuration("A1", "D6") + test_map_geometry( + config, subject.current_configuration, "A1", "D1", ("A1", "D6"), ("A1", "D1") + ) + + subject.update_nozzle_configuration("E7", "H12") + test_map_geometry( + config, subject.current_configuration, "E7", "H7", ("E7", "H12"), ("E7", "H7") + ) + + subject.update_nozzle_configuration("C4", "D5") + test_map_geometry( + config, subject.current_configuration, "C4", "D4", ("C4", "D5"), ("C4", "D4") + ) diff --git a/api/tests/opentrons/hardware_control/test_calibration_functions.py b/api/tests/opentrons/hardware_control/test_calibration_functions.py index 1a76a7010eb..3f75bc04322 100644 --- a/api/tests/opentrons/hardware_control/test_calibration_functions.py +++ b/api/tests/opentrons/hardware_control/test_calibration_functions.py @@ -1,7 +1,5 @@ -import importlib from pathlib import Path -import pytest import numpy as np from opentrons import config, calibration_storage @@ -12,14 +10,6 @@ from opentrons.types import Mount, Point -# TODO(mc, 2023-02-17): this reload resolves test polution from repeated -# reloads of this module in tests/opentrons/calibration_storage. -# module reloads to be removed in https://github.com/Opentrons/opentrons/pull/12049 -@pytest.fixture(autouse=True, scope="module") -def reload_module() -> None: - importlib.reload(calibration_storage) - - def test_migrate_affine_xy_to_attitude(): affine = [ [1.0, 2.0, 3.0, 4.0], @@ -97,7 +87,7 @@ def test_load_pipette_offset(ot_config_tempdir): mount = Mount.LEFT offset = Point(1, 2, 3) - calibration_storage.save_pipette_calibration( + calibration_storage.ot2.save_pipette_calibration( offset, pip_id, mount, "hash", "opentrons/opentrons_96_tiprack_10ul/1" ) obj = instrument_calibration.load_pipette_offset(pip_id, mount) diff --git a/api/tests/opentrons/hardware_control/test_execution_manager.py b/api/tests/opentrons/hardware_control/test_execution_manager.py index de106c7ac8e..9775fa895c4 100644 --- a/api/tests/opentrons/hardware_control/test_execution_manager.py +++ b/api/tests/opentrons/hardware_control/test_execution_manager.py @@ -3,8 +3,8 @@ from opentrons.hardware_control import ( ExecutionManager, ExecutionState, - ExecutionCancelledError, ) +from opentrons_shared_data.errors.exceptions import ExecutionCancelledError async def test_state_machine(): diff --git a/api/tests/opentrons/hardware_control/test_gripper.py b/api/tests/opentrons/hardware_control/test_gripper.py index 02d2285bdb0..0d01b225752 100644 --- a/api/tests/opentrons/hardware_control/test_gripper.py +++ b/api/tests/opentrons/hardware_control/test_gripper.py @@ -7,6 +7,7 @@ from opentrons.hardware_control.types import CriticalPoint from opentrons.config import gripper_config from opentrons_shared_data.gripper import GripperModel +from opentrons_shared_data.errors.exceptions import MotionFailedError if TYPE_CHECKING: from opentrons.hardware_control.instruments.ot3.instrument_calibration import ( @@ -88,3 +89,24 @@ def test_reload_instrument_cal_ot3(fake_offset: "GripperCalibrationOffset") -> N assert new_gripper == old_gripper # we said upstream could skip assert skip + + +@pytest.mark.ot3_only +def test_jaw_calibration_error_checking() -> None: + subject = gripper.Gripper(fake_gripper_conf, fake_offset, "fakeid123") + with pytest.raises(MotionFailedError): + subject.update_jaw_open_position_from_closed_position(0) + + +@pytest.mark.ot3_only +def test_jaw_calibration() -> None: + subject = gripper.Gripper(fake_gripper_conf, fake_offset, "fakeid123") + subject.update_jaw_open_position_from_closed_position( + ( + fake_gripper_conf.geometry.jaw_width["max"] + - fake_gripper_conf.geometry.jaw_width["min"] + + 2 + ) + / 2 + ) + assert subject.max_jaw_width == fake_gripper_conf.geometry.jaw_width["max"] + 2 diff --git a/api/tests/opentrons/hardware_control/test_importability.py b/api/tests/opentrons/hardware_control/test_importability.py new file mode 100644 index 00000000000..c3c62424309 --- /dev/null +++ b/api/tests/opentrons/hardware_control/test_importability.py @@ -0,0 +1,8 @@ +import pytest +from opentrons.hardware_control.ot3api import OT3API + + +@pytest.mark.ot2_only +async def test_flex_simulator_always_importable() -> None: + api = await OT3API.build_hardware_simulator() + assert isinstance(api, OT3API) diff --git a/api/tests/opentrons/hardware_control/test_instruments.py b/api/tests/opentrons/hardware_control/test_instruments.py index 2c763721b33..7db8a5303ee 100644 --- a/api/tests/opentrons/hardware_control/test_instruments.py +++ b/api/tests/opentrons/hardware_control/test_instruments.py @@ -3,6 +3,7 @@ import pytest from decoy import Decoy +from typing import Iterator try: import aionotify @@ -10,9 +11,9 @@ aionotify = None # type: ignore -from opentrons import types, config +from opentrons import types from opentrons.hardware_control import API -from opentrons.hardware_control.types import Axis, OT3Mount +from opentrons.hardware_control.types import Axis, OT3Mount, HardwareFeatureFlags from opentrons_shared_data.errors.exceptions import CommandPreconditionViolated @@ -58,14 +59,27 @@ def dummy_instruments_ot3(): return dummy_instruments_attached_ot3() +@pytest.fixture +def mock_api_verify_tip_presence_ot3(request) -> Iterator[mock.AsyncMock]: + if request.config.getoption("--ot2-only"): + pytest.skip("testing ot2 only") + from opentrons.hardware_control.ot3api import OT3API + + with mock.patch.object(OT3API, "verify_tip_presence") as mock_tip_presence: + yield mock_tip_presence + + def wrap_build_ot3_sim(): from opentrons.hardware_control.ot3api import OT3API - return OT3API.build_hardware_simulator + with mock.patch.object( + OT3API, "verify_tip_presence" + ) as mock_tip_presence: # noqa: F841 + return OT3API.build_hardware_simulator @pytest.fixture -def ot3_api_obj(request): +def ot3_api_obj(request, mock_api_verify_tip_presence_ot3): if request.config.getoption("--ot2-only"): pytest.skip("testing ot2 only") from opentrons.hardware_control.ot3api import OT3API @@ -177,7 +191,10 @@ async def test_cache_instruments_hc( is_robot, cntrlr_mock_connect, ): - hw_api_cntrlr = await API.build_hardware_controller(loop=asyncio.get_running_loop()) + hw_api_cntrlr = await API.build_hardware_controller( + loop=asyncio.get_running_loop(), + feature_flags=HardwareFeatureFlags.build_from_ff(), + ) async def mock_driver_model(mount): attached_pipette = {"left": LEFT_PIPETTE_MODEL, "right": None} @@ -336,7 +353,9 @@ async def test_prep_aspirate(sim_and_instr): async def test_aspirate_new(dummy_instruments): hw_api = await API.build_hardware_simulator( - attached_instruments=dummy_instruments[0], loop=asyncio.get_running_loop() + attached_instruments=dummy_instruments[0], + loop=asyncio.get_running_loop(), + feature_flags=HardwareFeatureFlags(use_old_aspiration_functions=False), ) await hw_api.home() await hw_api.cache_instruments() @@ -353,11 +372,12 @@ async def test_aspirate_new(dummy_instruments): assert pos[Axis.B] == pytest.approx(new_plunger_pos) -async def test_aspirate_old(decoy: Decoy, mock_feature_flags: None, dummy_instruments): - decoy.when(config.feature_flags.use_old_aspiration_functions()).then_return(True) +async def test_aspirate_old(decoy: Decoy, dummy_instruments): hw_api = await API.build_hardware_simulator( - attached_instruments=dummy_instruments[0], loop=asyncio.get_running_loop() + attached_instruments=dummy_instruments[0], + loop=asyncio.get_running_loop(), + feature_flags=HardwareFeatureFlags(use_old_aspiration_functions=True), ) await hw_api.home() await hw_api.cache_instruments() diff --git a/api/tests/opentrons/hardware_control/test_module_control.py b/api/tests/opentrons/hardware_control/test_module_control.py index b683f12d590..eed809bdb55 100644 --- a/api/tests/opentrons/hardware_control/test_module_control.py +++ b/api/tests/opentrons/hardware_control/test_module_control.py @@ -34,7 +34,10 @@ def build_module(decoy: Decoy) -> Callable[..., Awaitable[AbstractModule]]: `AttachedModulesControl` is doing too much work _and_ these tests are too brittle and of questionable value. """ - return cast(Callable[..., Awaitable[AbstractModule]], decoy.mock(is_async=True)) + return cast( + Callable[..., Awaitable[AbstractModule]], + decoy.mock(name="build_module", is_async=True), + ) @pytest.fixture() diff --git a/api/tests/opentrons/hardware_control/test_moves.py b/api/tests/opentrons/hardware_control/test_moves.py index 47b25859cf5..b438ecee12c 100644 --- a/api/tests/opentrons/hardware_control/test_moves.py +++ b/api/tests/opentrons/hardware_control/test_moves.py @@ -17,8 +17,7 @@ MotionChecks, ) from opentrons.hardware_control.errors import ( - MustHomeError, - InvalidMoveError, + InvalidCriticalPoint, OutOfBoundsMove, ) from opentrons.hardware_control.robot_calibration import ( @@ -26,7 +25,10 @@ DeckCalibration, ) -from opentrons_shared_data.errors.exceptions import MoveConditionNotMetError +from opentrons_shared_data.errors.exceptions import ( + MoveConditionNotMetError, + PositionUnknownError, +) async def test_controller_must_home(hardware_api): @@ -196,7 +198,7 @@ async def test_gripper_critical_points_fail_on_pipettes( types.Mount.RIGHT: {"model": "p10_single_v1", "id": "testyness"}, } await hardware_api.cache_instruments() - with pytest.raises(InvalidMoveError): + with pytest.raises(InvalidCriticalPoint): await hardware_api.move_to( types.Mount.RIGHT, types.Point(0, 0, 0), critical_point=critical_point ) @@ -494,7 +496,7 @@ async def test_move_rel_homing_failures(hardware_api): "C": False, } # If one axis being used isn't homed, we must get an exception - with pytest.raises(MustHomeError): + with pytest.raises(PositionUnknownError): await hardware_api.move_rel( types.Mount.LEFT, types.Point(0, 0, 2000), fail_on_not_homed=True ) @@ -517,13 +519,13 @@ async def test_current_position_homing_failures(hardware_api): } # If one axis being used isn't homed, we must get an exception - with pytest.raises(MustHomeError): + with pytest.raises(PositionUnknownError): await hardware_api.current_position( mount=types.Mount.LEFT, fail_on_not_homed=True, ) - with pytest.raises(MustHomeError): + with pytest.raises(PositionUnknownError): await hardware_api.gantry_position( mount=types.Mount.LEFT, fail_on_not_homed=True, diff --git a/api/tests/opentrons/hardware_control/test_ot3_api.py b/api/tests/opentrons/hardware_control/test_ot3_api.py index 453efb89a40..03272f1c959 100644 --- a/api/tests/opentrons/hardware_control/test_ot3_api.py +++ b/api/tests/opentrons/hardware_control/test_ot3_api.py @@ -1,6 +1,18 @@ """ Tests for behaviors specific to the OT3 hardware controller. """ -from typing import Iterator, Union, Dict, Tuple, List, Any, OrderedDict, Optional +from typing import ( + AsyncIterator, + Iterator, + Union, + Dict, + Tuple, + List, + Any, + OrderedDict, + Optional, + cast, + TypedDict, +) from typing_extensions import Literal from math import copysign import pytest @@ -18,23 +30,20 @@ AttachedGripper, AttachedPipette, GripperDict, + GripperSpec, ) from opentrons.hardware_control.motion_utilities import target_position_from_plunger -from opentrons.hardware_control.instruments.ot3.gripper_handler import ( - GripError, - GripperHandler, -) +from opentrons.hardware_control.instruments.ot3.gripper_handler import GripperHandler from opentrons.hardware_control.instruments.ot3.instrument_calibration import ( GripperCalibrationOffset, PipetteOffsetByPipetteMount, ) from opentrons.hardware_control.instruments.ot3.pipette_handler import ( OT3PipetteHandler, - PickUpTipSpec, - TipMotorPickUpTipSpec, - DropTipMove, - DropTipSpec, + TipActionSpec, + TipActionMoveSpec, ) +from opentrons.hardware_control.instruments.ot3.pipette import Pipette from opentrons.hardware_control.types import ( OT3Mount, Axis, @@ -44,26 +53,27 @@ InstrumentProbeType, SubSystem, GripperJawState, - StatusBarState, EstopState, EstopStateNotification, + TipStateType, ) -from opentrons.hardware_control.errors import ( - GripperNotAttachedError, - InvalidMoveError, -) +from opentrons.hardware_control.nozzle_manager import NozzleConfigurationType +from opentrons.hardware_control.errors import InvalidCriticalPoint from opentrons.hardware_control.ot3api import OT3API from opentrons.hardware_control import ThreadManager -from opentrons.hardware_control.backends.ot3utils import ( - axis_to_node, -) + +from opentrons.hardware_control.backends.ot3simulator import OT3Simulator from opentrons_hardware.firmware_bindings.constants import NodeId from opentrons.types import Point, Mount -from opentrons_hardware.hardware_control.motion import MoveStopCondition from opentrons_hardware.hardware_control.motion_planning.types import Move from opentrons.config import gripper_config as gc +from opentrons_shared_data.errors.exceptions import ( + GripperNotPresentError, + CommandPreconditionViolated, + CommandParameterLimitViolated, +) from opentrons_shared_data.gripper.gripper_definition import GripperModel from opentrons_shared_data.pipette.types import ( PipetteModelType, @@ -74,7 +84,7 @@ from opentrons_shared_data.pipette import ( load_data as load_pipette_data, ) -from opentrons_shared_data.errors.exceptions import CommandParameterLimitViolated +from opentrons_shared_data.pipette.dev_types import PipetteModel from opentrons.hardware_control.modules import ( Thermocycler, TempDeck, @@ -83,6 +93,7 @@ SpeedStatus, ) from opentrons.hardware_control.module_control import AttachedModulesControl +from opentrons.hardware_control.backends.types import HWStopCondition # TODO (spp, 2023-08-22): write tests for ot3api.stop & ot3api.halt @@ -117,38 +128,45 @@ def fake_liquid_settings() -> LiquidProbeSettings: @pytest.fixture -def mock_move_to(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: +def managed_obj(ot3_hardware: ThreadManager[OT3API]) -> OT3API: + managed = ot3_hardware.managed_obj + assert managed + return managed + + +@pytest.fixture +def mock_move_to(managed_obj: OT3API) -> Iterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj, + managed_obj, "move_to", AsyncMock( - spec=ot3_hardware.managed_obj.move_to, - wraps=ot3_hardware.managed_obj.move_to, + spec=managed_obj.move_to, + wraps=managed_obj.move_to, ), ) as mock_move: yield mock_move @pytest.fixture -def mock_home(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: +def mock_home(managed_obj: OT3API) -> Iterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj, + managed_obj, "home", AsyncMock( - spec=ot3_hardware.managed_obj.home, - wraps=ot3_hardware.managed_obj.home, + spec=managed_obj.home, + wraps=managed_obj.home, ), ) as mock_move: yield mock_move @pytest.fixture -def mock_home_plunger(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: +def mock_home_plunger(managed_obj: OT3API) -> Iterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj, + managed_obj, "home_plunger", AsyncMock( - spec=ot3_hardware.managed_obj.home_plunger, + spec=managed_obj.home_plunger, ), ) as mock_move: yield mock_move @@ -156,254 +174,308 @@ def mock_home_plunger(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock @pytest.fixture def mock_move_to_plunger_bottom( - ot3_hardware: ThreadManager[OT3API], + managed_obj: OT3API, ) -> Iterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj, + managed_obj, "_move_to_plunger_bottom", AsyncMock( - spec=ot3_hardware.managed_obj._move_to_plunger_bottom, + spec=managed_obj._move_to_plunger_bottom, ), ) as mock_move: yield mock_move @pytest.fixture -def mock_move(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: +def mock_move(managed_obj: OT3API) -> Iterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj, + managed_obj, "_move", AsyncMock( - spec=ot3_hardware.managed_obj._move, + spec=managed_obj._move, ), ) as mock_move: yield mock_move @pytest.fixture -def mock_gantry_position(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: +def mock_gantry_position(managed_obj: OT3API) -> Iterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj, + managed_obj, "gantry_position", AsyncMock( - spec=ot3_hardware.managed_obj.gantry_position, - wraps=ot3_hardware.managed_obj.gantry_position, + spec=managed_obj.gantry_position, + wraps=managed_obj.gantry_position, ), ) as mock_gantry_pos: yield mock_gantry_pos @pytest.fixture -def mock_grip(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: +def mock_grip(managed_obj: OT3API) -> Iterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj, + managed_obj, "_grip", AsyncMock( - spec=ot3_hardware.managed_obj._grip, - wraps=ot3_hardware.managed_obj._grip, + spec=managed_obj._grip, + wraps=managed_obj._grip, ), ) as mock_move: yield mock_move @pytest.fixture -def mock_ungrip(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: +def mock_ungrip(managed_obj: OT3API) -> Iterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj, + managed_obj, "_ungrip", AsyncMock( - spec=ot3_hardware.managed_obj._ungrip, - wraps=ot3_hardware.managed_obj._ungrip, + spec=managed_obj._ungrip, + wraps=managed_obj._ungrip, ), ) as mock_move: yield mock_move @pytest.fixture -def mock_home_gear_motors(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: +def mock_home_gear_motors(managed_obj: OT3API) -> Iterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj, + managed_obj, "home_gear_motors", AsyncMock( - spec=ot3_hardware.managed_obj.home_gear_motors, - wraps=ot3_hardware.managed_obj.home_gear_motors, + spec=managed_obj.home_gear_motors, + wraps=managed_obj.home_gear_motors, ), ) as mock_home_gear: yield mock_home_gear @pytest.fixture -def mock_hold_jaw_width(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: +def mock_hold_jaw_width(managed_obj: OT3API) -> Iterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj, + managed_obj, "_hold_jaw_width", AsyncMock( - spec=ot3_hardware.managed_obj._hold_jaw_width, - wraps=ot3_hardware.managed_obj._hold_jaw_width, + spec=managed_obj._hold_jaw_width, + wraps=managed_obj._hold_jaw_width, ), ) as mock_move: yield mock_move @pytest.fixture -async def mock_backend_move(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: +async def mock_backend_move(managed_obj: OT3API) -> AsyncIterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj._backend, + managed_obj._backend, "move", - AsyncMock(spec=ot3_hardware.managed_obj._backend.move), + AsyncMock(spec=managed_obj._backend.move), ) as mock_move: yield mock_move @pytest.fixture -def mock_check_motor(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: +def mock_check_motor(managed_obj: OT3API) -> Iterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj._backend, + managed_obj._backend, "check_motor_status", - Mock(spec=ot3_hardware.managed_obj._backend.check_motor_status), + Mock(spec=managed_obj._backend.check_motor_status), ) as mock_check: yield mock_check @pytest.fixture -def mock_check_encoder(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: +def mock_check_encoder(managed_obj: OT3API) -> Iterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj._backend, + managed_obj._backend, "check_encoder_status", - Mock(spec=ot3_hardware.managed_obj._backend.check_encoder_status), + Mock(spec=managed_obj._backend.check_encoder_status), ) as mock_check: yield mock_check @pytest.fixture -async def mock_refresh(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: +async def mock_refresh(managed_obj: OT3API) -> AsyncIterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj, + managed_obj, "refresh_positions", AsyncMock( - spec=ot3_hardware.managed_obj.refresh_positions, - wraps=ot3_hardware.managed_obj.refresh_positions, + spec=managed_obj.refresh_positions, + wraps=managed_obj.refresh_positions, ), ) as mock_refresh: yield mock_refresh @pytest.fixture -async def mock_reset(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: +async def mock_reset(managed_obj: OT3API) -> AsyncIterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj, + managed_obj, "reset", AsyncMock(), ) as mock_reset: yield mock_reset +@pytest.fixture +def mock_jaw_width() -> Iterator[MagicMock]: + with patch( + "opentrons.hardware_control.instruments.ot3.gripper.Gripper.jaw_width", + new_callable=PropertyMock, + ) as jaw_width: + yield jaw_width + + +@pytest.fixture +def mock_max_grip_error() -> Iterator[MagicMock]: + with patch( + "opentrons.hardware_control.instruments.ot3.gripper.Gripper.max_allowed_grip_error", + new_callable=PropertyMock, + ) as max_error: + yield max_error + + @pytest.fixture async def mock_instrument_handlers( - ot3_hardware: ThreadManager[OT3API], -) -> Iterator[Tuple[MagicMock]]: + managed_obj: OT3API, +) -> AsyncIterator[Tuple[MagicMock, MagicMock]]: with patch.object( - ot3_hardware.managed_obj, + managed_obj, "_gripper_handler", MagicMock(spec=GripperHandler), ) as mock_gripper_handler, patch.object( - ot3_hardware.managed_obj, "_pipette_handler", MagicMock(spec=OT3PipetteHandler) + managed_obj, "_pipette_handler", MagicMock(spec=OT3PipetteHandler) ) as mock_pipette_handler: yield mock_gripper_handler, mock_pipette_handler @pytest.fixture -async def gripper_present(ot3_hardware: ThreadManager[OT3API]) -> None: +async def gripper_present( + managed_obj: OT3API, + ot3_hardware: ThreadManager[OT3API], + hardware_backend: OT3Simulator, +) -> None: # attach a gripper if we're testing the gripper mount gripper_config = gc.load(GripperModel.v1) instr_data = AttachedGripper(config=gripper_config, id="test") - ot3_hardware._backend._attached_instruments[OT3Mount.GRIPPER] = { - "model": GripperModel.v1, - "id": "test", - } - ot3_hardware._backend._present_nodes.add(NodeId.gripper) + hardware_backend._attached_instruments[OT3Mount.GRIPPER] = cast( + GripperSpec, + { + "model": GripperModel.v1, + "id": "test", + }, + ) + hardware_backend._present_axes.update((Axis.G, Axis.Z_G)) await ot3_hardware.cache_gripper(instr_data) +@pytest.fixture +def hardware_backend(managed_obj: OT3API) -> OT3Simulator: + assert isinstance( + managed_obj._backend, OT3Simulator + ), "Tests only work with simulator" + return managed_obj._backend + + +class PipetteLoadConfig(TypedDict): + channels: Literal[1, 8, 96] + version: Tuple[Literal[1, 2, 3], Literal[0, 1, 2, 3, 4, 5, 6]] + model: PipetteModel + + +class GripperLoadConfig(TypedDict): + model: GripperModel + id: str + + +LoadConfigs = List[ + Union[ + Tuple[Literal[OT3Mount.RIGHT], PipetteLoadConfig], + Tuple[Literal[OT3Mount.LEFT], PipetteLoadConfig], + Tuple[Literal[OT3Mount.GRIPPER], GripperLoadConfig], + ] +] + + @pytest.mark.parametrize( "load_configs,load", ( ( - { - OT3Mount.RIGHT: {"channels": 8, "version": (3, 3), "model": "p50"}, - OT3Mount.LEFT: {"channels": 1, "version": (3, 3), "model": "p1000"}, - }, + [ + (OT3Mount.RIGHT, {"channels": 8, "version": (3, 3), "model": "p50"}), + (OT3Mount.LEFT, {"channels": 1, "version": (3, 3), "model": "p1000"}), + ], GantryLoad.LOW_THROUGHPUT, ), - ({}, GantryLoad.LOW_THROUGHPUT), + ([], GantryLoad.LOW_THROUGHPUT), ( - {OT3Mount.GRIPPER: {"model": GripperModel.v1, "id": "g12345"}}, + [(OT3Mount.GRIPPER, {"model": GripperModel.v1, "id": "g12345"})], GantryLoad.LOW_THROUGHPUT, ), ( - {OT3Mount.LEFT: {"channels": 8, "version": (3, 3), "model": "p1000"}}, + [(OT3Mount.LEFT, {"channels": 8, "version": (3, 3), "model": "p1000"})], GantryLoad.LOW_THROUGHPUT, ), ( - {OT3Mount.RIGHT: {"channels": 8, "version": (3, 3), "model": "p1000"}}, + [(OT3Mount.RIGHT, {"channels": 8, "version": (3, 3), "model": "p1000"})], GantryLoad.LOW_THROUGHPUT, ), ( - {OT3Mount.LEFT: {"channels": 96, "model": "p1000", "version": (3, 3)}}, + [(OT3Mount.LEFT, {"channels": 96, "model": "p1000", "version": (3, 3)})], GantryLoad.HIGH_THROUGHPUT, ), ( - { - OT3Mount.LEFT: {"channels": 1, "version": (3, 3), "model": "p1000"}, - OT3Mount.GRIPPER: {"model": GripperModel.v1, "id": "g12345"}, - }, + [ + (OT3Mount.LEFT, {"channels": 1, "version": (3, 3), "model": "p1000"}), + (OT3Mount.GRIPPER, {"model": GripperModel.v1, "id": "g12345"}), + ], GantryLoad.LOW_THROUGHPUT, ), ( - { - OT3Mount.RIGHT: {"channels": 8, "version": (3, 3), "model": "p1000"}, - OT3Mount.GRIPPER: {"model": GripperModel.v1, "id": "g12345"}, - }, + [ + (OT3Mount.RIGHT, {"channels": 8, "version": (3, 3), "model": "p1000"}), + (OT3Mount.GRIPPER, {"model": GripperModel.v1, "id": "g12345"}), + ], GantryLoad.LOW_THROUGHPUT, ), ( - { - OT3Mount.LEFT: {"channels": 96, "model": "p1000", "version": (3, 3)}, - OT3Mount.GRIPPER: {"model": GripperModel.v1, "id": "g12345"}, - }, + [ + (OT3Mount.LEFT, {"channels": 96, "model": "p1000", "version": (3, 3)}), + (OT3Mount.GRIPPER, {"model": GripperModel.v1, "id": "g12345"}), + ], GantryLoad.HIGH_THROUGHPUT, ), ), ) async def test_gantry_load_transform( ot3_hardware: ThreadManager[OT3API], - load_configs: Dict[str, Union[int, str, Tuple[int, int]]], + load_configs: LoadConfigs, load: GantryLoad, ) -> None: - for mount, configs in load_configs.items(): - if mount == OT3Mount.GRIPPER: - gripper_config = gc.load(configs["model"]) - instr_data = AttachedGripper(config=gripper_config, id="2345") - await ot3_hardware.cache_gripper(instr_data) + for pair in load_configs: + if pair[0] == OT3Mount.GRIPPER: + gripper_config = gc.load(pair[1]["model"]) + gripper_data = AttachedGripper(config=gripper_config, id="2345") + await ot3_hardware.cache_gripper(gripper_data) else: pipette_config = load_pipette_data.load_definition( - PipetteModelType(configs["model"]), - PipetteChannelType(configs["channels"]), - PipetteVersionType(*configs["version"]), + PipetteModelType(pair[1]["model"]), + PipetteChannelType(pair[1]["channels"]), + PipetteVersionType(*pair[1]["version"]), ) instr_data = AttachedPipette(config=pipette_config, id="fakepip") - await ot3_hardware.cache_pipette(mount, instr_data, None) + await ot3_hardware.cache_pipette(pair[0], instr_data, None) assert ot3_hardware._gantry_load_from_instruments() == load @pytest.fixture def mock_backend_capacitive_probe( - ot3_hardware: ThreadManager[OT3API], + hardware_backend: OT3Simulator, ) -> Iterator[AsyncMock]: - backend = ot3_hardware.managed_obj._backend with patch.object( - backend, "capacitive_probe", AsyncMock(spec=backend.capacitive_probe) + hardware_backend, + "capacitive_probe", + AsyncMock(spec=hardware_backend.capacitive_probe), ) as mock_probe: def _update_position( @@ -414,7 +486,7 @@ def _update_position( threshold_pf: float, probe: InstrumentProbeType, ) -> None: - ot3_hardware._backend._position[axis_to_node(moving)] += distance_mm / 2 + hardware_backend._position[moving] += distance_mm / 2 mock_probe.side_effect = _update_position @@ -423,12 +495,12 @@ def _update_position( @pytest.fixture def mock_current_position_ot3( - ot3_hardware: ThreadManager[OT3API], + managed_obj: OT3API, ) -> Iterator[AsyncMock]: with patch.object( - ot3_hardware.managed_obj, + managed_obj, "current_position_ot3", - AsyncMock(spec=ot3_hardware.managed_obj.current_position_ot3), + AsyncMock(spec=managed_obj.current_position_ot3), ) as mock_position: mock_position.return_value = { Axis.X: 477.2, @@ -444,12 +516,11 @@ def mock_current_position_ot3( @pytest.fixture -def mock_backend_capacitive_pass( - ot3_hardware: ThreadManager[OT3API], -) -> Iterator[AsyncMock]: - backend = ot3_hardware.managed_obj._backend +def mock_backend_capacitive_pass(hardware_backend: OT3Simulator) -> Iterator[AsyncMock]: with patch.object( - backend, "capacitive_pass", AsyncMock(spec=backend.capacitive_pass) + hardware_backend, + "capacitive_pass", + AsyncMock(spec=hardware_backend.capacitive_pass), ) as mock_pass: async def _update_position( @@ -458,15 +529,33 @@ async def _update_position( distance_mm: float, speed_mm_per_s: float, probe: InstrumentProbeType, - ) -> None: - ot3_hardware._backend._position[axis_to_node(moving)] += distance_mm / 2 + ) -> List[float]: + hardware_backend._position[moving] += distance_mm / 2 return [1, 2, 3, 4, 5, 6, 8] mock_pass.side_effect = _update_position yield mock_pass -load_blowout_configs = [ +@pytest.fixture +def mock_backend_get_tip_status(hardware_backend: OT3Simulator) -> Iterator[AsyncMock]: + with patch.object( + hardware_backend, "get_tip_status", AsyncMock() + ) as mock_tip_status: + yield mock_tip_status + + +@pytest.fixture +def mock_verify_tip_presence( + managed_obj: OT3API, +) -> Iterator[AsyncMock]: + with patch.object( + managed_obj, "verify_tip_presence", AsyncMock() + ) as mock_check_tip: + yield mock_check_tip + + +load_pipette_configs = [ {OT3Mount.LEFT: {"channels": 1, "version": (3, 3), "model": "p1000"}}, {OT3Mount.RIGHT: {"channels": 8, "version": (3, 3), "model": "p50"}}, {OT3Mount.LEFT: {"channels": 96, "model": "p1000", "version": (3, 3)}}, @@ -475,6 +564,7 @@ async def _update_position( async def prepare_for_mock_blowout( ot3_hardware: ThreadManager[OT3API], + mock_backend_get_tip_status: AsyncMock, mount: OT3Mount, configs: Any, ) -> Tuple[Any, ThreadManager[OT3API]]: @@ -486,8 +576,9 @@ async def prepare_for_mock_blowout( instr_data = AttachedPipette(config=pipette_config, id="fakepip") await ot3_hardware.cache_pipette(mount, instr_data, None) await ot3_hardware.refresh_positions() + mock_backend_get_tip_status.return_value = TipStateType.PRESENT with patch.object( - ot3_hardware, "pick_up_tip", AsyncMock(spec=ot3_hardware.liquid_probe) + ot3_hardware, "pick_up_tip", AsyncMock(spec=ot3_hardware.pick_up_tip) ) as mock_tip_pickup: mock_tip_pickup.side_effect = ( ot3_hardware._pipette_handler.attached_instruments[mount]["has_tip"] @@ -497,13 +588,71 @@ async def prepare_for_mock_blowout( return instr_data, ot3_hardware -@pytest.mark.parametrize("load_configs", load_blowout_configs) +@pytest.mark.parametrize("load_configs", load_pipette_configs) +async def test_pickup_moves( + ot3_hardware: ThreadManager[OT3API], + managed_obj: OT3API, + mock_instrument_handlers: Tuple[Mock, Mock], + mock_move_to_plunger_bottom: AsyncMock, + mock_home_gear_motors: AsyncMock, + load_configs: Dict[OT3Mount, PipetteLoadConfig], +) -> None: + _, pipette_handler = mock_instrument_handlers + for mount, configs in load_configs.items(): + if configs["channels"] == 96: + gantry_load = GantryLoad.HIGH_THROUGHPUT + else: + gantry_load = GantryLoad.LOW_THROUGHPUT + + await ot3_hardware.set_gantry_load(gantry_load) + pipette_handler.get_pipette( + OT3Mount.LEFT + ).nozzle_manager.current_configuration.configuration = NozzleConfigurationType.FULL + z_tiprack_distance = 8.0 + end_z_retract_dist = 9.0 + move_plan_return_val = TipActionSpec( + shake_off_moves=[], + tip_action_moves=[ + TipActionMoveSpec( + # Move onto the posts + distance=10, + speed=0, + currents={ + Axis.of_main_tool_actuator(Mount.LEFT): 0, + Axis.Q: 0, + }, + ) + ], + z_distance_to_tiprack=z_tiprack_distance, + ending_z_retract_distance=end_z_retract_dist, + ) + pipette_handler.plan_ht_pick_up_tip.return_value = move_plan_return_val + pipette_handler.plan_lt_pick_up_tip.return_value = move_plan_return_val + + with patch.object( + managed_obj, + "move_rel", + AsyncMock(spec=managed_obj.move_rel), + ) as mock_move_rel: + await ot3_hardware.pick_up_tip(Mount.LEFT, 40.0) + move_call_list = [call.args for call in mock_move_rel.call_args_list] + if gantry_load == GantryLoad.HIGH_THROUGHPUT: + assert move_call_list == [ + (OT3Mount.LEFT, Point(z=z_tiprack_distance)), + (OT3Mount.LEFT, Point(z=end_z_retract_dist)), + ] + else: + assert move_call_list == [(OT3Mount.LEFT, Point(z=end_z_retract_dist))] + + +@pytest.mark.parametrize("load_configs", load_pipette_configs) @given(blowout_volume=strategies.floats(min_value=0, max_value=10)) @settings(suppress_health_check=[HealthCheck.function_scoped_fixture], max_examples=10) @example(blowout_volume=0.0) async def test_blow_out_position( ot3_hardware: ThreadManager[OT3API], - load_configs: List[Dict[str, Any]], + mock_backend_get_tip_status: AsyncMock, + load_configs: Dict[OT3Mount, PipetteLoadConfig], blowout_volume: float, ) -> None: liquid_class = LiquidClasses.default @@ -511,7 +660,7 @@ async def test_blow_out_position( if configs["channels"] == 96: await ot3_hardware.set_gantry_load(GantryLoad.HIGH_THROUGHPUT) instr_data, ot3_hardware = await prepare_for_mock_blowout( - ot3_hardware, mount, configs + ot3_hardware, mock_backend_get_tip_status, mount, configs ) max_allowed_input_distance = ( @@ -541,7 +690,7 @@ async def test_blow_out_position( ) -@pytest.mark.parametrize("load_configs", load_blowout_configs) +@pytest.mark.parametrize("load_configs", load_pipette_configs) @given(blowout_volume=strategies.floats(min_value=0, max_value=300)) @settings( suppress_health_check=[ @@ -552,7 +701,8 @@ async def test_blow_out_position( ) async def test_blow_out_error( ot3_hardware: ThreadManager[OT3API], - load_configs: List[Dict[str, Any]], + mock_backend_get_tip_status: AsyncMock, + load_configs: Dict[OT3Mount, PipetteLoadConfig], blowout_volume: float, ) -> None: liquid_class = LiquidClasses.default @@ -560,7 +710,7 @@ async def test_blow_out_error( if configs["channels"] == 96: await ot3_hardware.set_gantry_load(GantryLoad.HIGH_THROUGHPUT) instr_data, ot3_hardware = await prepare_for_mock_blowout( - ot3_hardware, mount, configs + ot3_hardware, mock_backend_get_tip_status, mount, configs ) max_allowed_input_distance = ( @@ -620,6 +770,7 @@ async def test_move_to_without_homing_first( async def test_liquid_probe( mock_move_to: AsyncMock, ot3_hardware: ThreadManager[OT3API], + hardware_backend: OT3Simulator, head_node: NodeId, pipette_node: Axis, mount: OT3Mount, @@ -630,13 +781,12 @@ async def test_liquid_probe( mock_move_to_plunger_bottom: AsyncMock, ) -> None: mock_ungrip.return_value = None - backend = ot3_hardware.managed_obj._backend await ot3_hardware.home() mock_move_to.return_value = None with patch.object( - backend, "liquid_probe", AsyncMock(spec=backend.liquid_probe) - ) as mock_position: + hardware_backend, "liquid_probe", AsyncMock(spec=hardware_backend.liquid_probe) + ) as mock_liquid_probe: return_dict = { head_node: 140, NodeId.gantry_x: 0, @@ -645,7 +795,7 @@ async def test_liquid_probe( } # make sure aspirate while sensing reverses direction - mock_position.return_value = return_dict + mock_liquid_probe.return_value = return_dict fake_settings_aspirate = LiquidProbeSettings( starting_mount_height=100, max_z_distance=15, @@ -662,7 +812,7 @@ async def test_liquid_probe( ) await ot3_hardware.liquid_probe(mount, fake_settings_aspirate) mock_move_to_plunger_bottom.assert_called_once() - backend.liquid_probe.assert_called_once_with( + mock_liquid_probe.assert_called_once_with( mount, fake_settings_aspirate.max_z_distance, fake_settings_aspirate.mount_speed, @@ -675,7 +825,7 @@ async def test_liquid_probe( ) return_dict[head_node], return_dict[pipette_node] = 142, 142 - mock_position.return_value = return_dict + mock_liquid_probe.return_value = return_dict await ot3_hardware.liquid_probe( mount, fake_liquid_settings ) # should raise no exceptions @@ -702,7 +852,7 @@ async def test_capacitive_probe( ) -> None: await ot3_hardware.home() here = await ot3_hardware.gantry_position(mount) - res = await ot3_hardware.capacitive_probe(mount, moving, 2, fake_settings) + res, _ = await ot3_hardware.capacitive_probe(mount, moving, 2, fake_settings) # in reality, this value would be the previous position + the value # updated in ot3controller.capacitive_probe, and it kind of is here, but that # previous position is always 0. This is a test of ot3api though and checking @@ -722,9 +872,6 @@ async def test_capacitive_probe( assert this_point == original -Direction = Union[Literal[0.0], Literal[1.0], Literal[-1.0]] - - @pytest.mark.parametrize( "target,origin,prep_direction,probe_direction", [ @@ -763,8 +910,8 @@ async def test_probe_direction( fake_settings: CapacitivePassSettings, target: float, origin: Point, - prep_direction: Direction, - probe_direction: Direction, + prep_direction: float, + probe_direction: float, ) -> None: mock_gantry_position.return_value = origin await ot3_hardware.capacitive_probe(OT3Mount.RIGHT, Axis.X, target, fake_settings) @@ -924,24 +1071,27 @@ async def test_gripper_action_fails_with_no_gripper( mock_ungrip: AsyncMock, ) -> None: with pytest.raises( - GripperNotAttachedError, match="Cannot perform action without gripper attached" + GripperNotPresentError, match="Cannot perform action without gripper attached" ): await ot3_hardware.grip(5.0) mock_grip.assert_not_called() with pytest.raises( - GripperNotAttachedError, match="Cannot perform action without gripper attached" + GripperNotPresentError, match="Cannot perform action without gripper attached" ): await ot3_hardware.ungrip() mock_ungrip.assert_not_called() +@pytest.mark.parametrize("needs_calibration", [True, False]) async def test_gripper_action_works_with_gripper( ot3_hardware: ThreadManager[OT3API], + managed_obj: OT3API, mock_grip: AsyncMock, mock_ungrip: AsyncMock, mock_hold_jaw_width: AsyncMock, gripper_present: None, + needs_calibration: bool, ) -> None: gripper_config = gc.load(GripperModel.v1) @@ -952,17 +1102,39 @@ async def test_gripper_action_works_with_gripper( } await ot3_hardware.cache_gripper(instr_data) - with pytest.raises(GripError, match="Gripper jaw must be homed before moving"): + with pytest.raises( + CommandPreconditionViolated, match="Cannot grip gripper jaw before homing" + ): await ot3_hardware.grip(5.0) + gripper = managed_obj._gripper_handler._gripper + assert gripper + calibration_offset = 5 + gripper._jaw_max_offset = None if needs_calibration else calibration_offset await ot3_hardware.home_gripper_jaw() - mock_ungrip.assert_called_once() + if needs_calibration: + assert mock_ungrip.call_count == 2 + mock_grip.assert_called_once() + else: + mock_ungrip.assert_called_once() mock_ungrip.reset_mock() + mock_grip.reset_mock() + gripper._jaw_max_offset = None if needs_calibration else 5 await ot3_hardware.home([Axis.G]) - mock_ungrip.assert_called_once() + if needs_calibration: + assert mock_ungrip.call_count == 2 + mock_grip.assert_called_once() + else: + mock_ungrip.assert_called_once() + + mock_grip.reset_mock() mock_ungrip.reset_mock() await ot3_hardware.grip(5.0) + expected_displacement = 16.0 + if not needs_calibration: + expected_displacement += calibration_offset / 2 mock_grip.assert_called_once_with( - gc.duty_cycle_by_force(5.0, gripper_config.grip_force_profile), + duty_cycle=gc.duty_cycle_by_force(5.0, gripper_config.grip_force_profile), + expected_displacement=expected_displacement, stay_engaged=True, ) @@ -981,7 +1153,7 @@ async def test_gripper_move_fails_with_no_gripper( ot3_hardware: ThreadManager[OT3API], ) -> None: assert not ot3_hardware._gripper_handler.gripper - with pytest.raises(GripperNotAttachedError): + with pytest.raises(GripperNotPresentError): await ot3_hardware.move_to(OT3Mount.GRIPPER, Point(0, 0, 0)) @@ -992,7 +1164,7 @@ async def test_gripper_mount_not_movable( instr_data = AttachedGripper(config=gripper_config, id="g12345") await ot3_hardware.cache_gripper(instr_data) assert ot3_hardware._gripper_handler.gripper - with pytest.raises(InvalidMoveError): + with pytest.raises(InvalidCriticalPoint): await ot3_hardware.move_to( OT3Mount.GRIPPER, Point(0, 0, 0), critical_point=CriticalPoint.MOUNT ) @@ -1013,14 +1185,14 @@ async def test_gripper_fails_for_pipette_cps( instr_data = AttachedGripper(config=gripper_config, id="g12345") await ot3_hardware.cache_gripper(instr_data) assert ot3_hardware._gripper_handler.gripper - with pytest.raises(InvalidMoveError): + with pytest.raises(InvalidCriticalPoint): await ot3_hardware.move_to( OT3Mount.GRIPPER, Point(0, 0, 0), critical_point=critical_point ) @pytest.mark.xfail -async def test_gripper_position(ot3_hardware: ThreadManager[OT3API]): +async def test_gripper_position(ot3_hardware: ThreadManager[OT3API]) -> None: gripper_config = gc.load(GripperModel.v1) instr_data = AttachedGripper(config=gripper_config, id="g12345") await ot3_hardware.cache_gripper(instr_data) @@ -1036,27 +1208,29 @@ async def test_gripper_position(ot3_hardware: ThreadManager[OT3API]): async def test_gripper_move_to( ot3_hardware: ThreadManager[OT3API], mock_backend_move: AsyncMock -): +) -> None: # Moving the gripper should, well, work gripper_config = gc.load(GripperModel.v1) instr_data = AttachedGripper(config=gripper_config, id="g12345") await ot3_hardware.cache_gripper(instr_data) await ot3_hardware.move_to(OT3Mount.GRIPPER, Point(0, 0, 0)) - _, moves, _ = mock_backend_move.call_args_list[0][0] - for move in moves: - assert list(sorted(move.unit_vector.keys(), key=lambda elem: elem.value)) == [ + origin, target, _, _ = mock_backend_move.call_args_list[0][0] + assert sorted(target.keys(), key=lambda elem: cast(int, elem.value)) == sorted( + [ Axis.X, Axis.Y, Axis.Z_G, - ] + ], + key=lambda elem: cast(int, elem.value), + ) async def test_home_plunger( ot3_hardware: ThreadManager[OT3API], mock_move_to_plunger_bottom: AsyncMock, mock_home: AsyncMock, -): +) -> None: mount = OT3Mount.LEFT instr_data = AttachedPipette( config=load_pipette_data.load_definition( @@ -1075,7 +1249,7 @@ async def test_home_plunger( async def test_prepare_for_aspirate( ot3_hardware: ThreadManager[OT3API], mock_move_to_plunger_bottom: AsyncMock, -): +) -> None: mount = OT3Mount.LEFT instr_data = AttachedPipette( config=load_pipette_data.load_definition( @@ -1093,10 +1267,51 @@ async def test_prepare_for_aspirate( mock_move_to_plunger_bottom.assert_called_once_with(OT3Mount.LEFT, 1.0) +@pytest.mark.parametrize( + "asp_vol,disp_vol,push_out,is_ready", + ( + [5, 1, None, True], # Partial Dispense + [5, 5, None, False], # Full dispense (default push_out) + [5, 5, 0.0, True], # explicit no push out + [5, 5, 1.0, False], # explicit push out + ), +) +async def test_plunger_ready_to_aspirate_after_dispense( + ot3_hardware: ThreadManager[OT3API], + asp_vol: float, + disp_vol: float, + push_out: Optional[float], + is_ready: bool, +) -> None: + mount = OT3Mount.LEFT + + instr_data = AttachedPipette( + config=load_pipette_data.load_definition( + PipetteModelType("p1000"), + PipetteChannelType(1), + PipetteVersionType(3, 4), + ), + id="fakepip", + ) + + await ot3_hardware.cache_pipette(mount, instr_data, None) + assert ot3_hardware.hardware_pipettes[mount.to_mount()] + + await ot3_hardware.add_tip(mount, 100) + await ot3_hardware.prepare_for_aspirate(OT3Mount.LEFT) + assert ot3_hardware.hardware_pipettes[mount.to_mount()].ready_to_aspirate + + await ot3_hardware.aspirate(OT3Mount.LEFT, asp_vol) + await ot3_hardware.dispense(OT3Mount.LEFT, disp_vol, push_out=push_out) + assert ( + ot3_hardware.hardware_pipettes[mount.to_mount()].ready_to_aspirate == is_ready + ) + + async def test_move_to_plunger_bottom( ot3_hardware: ThreadManager[OT3API], mock_move: AsyncMock, -): +) -> None: mount = OT3Mount.LEFT instr_data = AttachedPipette( config=load_pipette_data.load_definition( @@ -1194,7 +1409,7 @@ async def test_move_axes( mock_check_motor: Mock, input_position: Dict[Axis, float], expected_move_pos: OrderedDict[Axis, float], -): +) -> None: await ot3_hardware.move_axes(position=input_position) mock_check_motor.return_value = True @@ -1215,11 +1430,11 @@ async def test_move_expect_stall_flag( expect_stalls: bool, ) -> None: - expected = MoveStopCondition.stall if expect_stalls else MoveStopCondition.none + expected = HWStopCondition.stall if expect_stalls else HWStopCondition.none await ot3_hardware.move_to(Mount.LEFT, Point(0, 0, 0), _expect_stalls=expect_stalls) mock_backend_move.assert_called_once() - _, _, condition = mock_backend_move.call_args_list[0][0] + _, _, _, condition = mock_backend_move.call_args_list[0][0] assert condition == expected mock_backend_move.reset_mock() @@ -1227,7 +1442,7 @@ async def test_move_expect_stall_flag( Mount.LEFT, Point(10, 0, 0), _expect_stalls=expect_stalls ) mock_backend_move.assert_called_once() - _, _, condition = mock_backend_move.call_args_list[0][0] + _, _, _, condition = mock_backend_move.call_args_list[0][0] assert condition == expected @@ -1244,7 +1459,7 @@ async def test_move_expect_stall_flag( async def test_reset_instrument_offset( ot3_hardware: ThreadManager[OT3API], mount: Union[OT3Mount, Mount], - mock_instrument_handlers: Tuple[Mock], + mock_instrument_handlers: Tuple[Mock, Mock], ) -> None: gripper_handler, pipette_handler = mock_instrument_handlers await ot3_hardware.reset_instrument_offset(mount) @@ -1258,60 +1473,66 @@ async def test_reset_instrument_offset( @pytest.mark.parametrize( - argnames=["mount", "expected_offset"], + argnames=["mount_expected_offset"], argvalues=[ [ - OT3Mount.GRIPPER, - GripperCalibrationOffset( - offset=Point(1, 2, 3), - source=SourceType.default, - status=CalibrationStatus(), - last_modified=None, + ( + OT3Mount.GRIPPER, + GripperCalibrationOffset( + offset=Point(1, 2, 3), + source=SourceType.default, + status=CalibrationStatus(), + last_modified=None, + ), ), ], [ - OT3Mount.RIGHT, - PipetteOffsetByPipetteMount( - offset=Point(10, 20, 30), - source=SourceType.default, - status=CalibrationStatus(), - last_modified=None, + ( + OT3Mount.RIGHT, + PipetteOffsetByPipetteMount( + offset=Point(10, 20, 30), + source=SourceType.default, + status=CalibrationStatus(), + last_modified=None, + ), ), ], [ - OT3Mount.LEFT, - PipetteOffsetByPipetteMount( - offset=Point(100, 200, 300), - source=SourceType.default, - status=CalibrationStatus(), - last_modified=None, + ( + OT3Mount.LEFT, + PipetteOffsetByPipetteMount( + offset=Point(100, 200, 300), + source=SourceType.default, + status=CalibrationStatus(), + last_modified=None, + ), ), ], ], ) def test_get_instrument_offset( ot3_hardware: ThreadManager[OT3API], - mount: OT3Mount, - expected_offset: Union[GripperCalibrationOffset, PipetteOffsetByPipetteMount], - mock_instrument_handlers: Tuple[Mock], + mount_expected_offset: Union[ + Tuple[Literal[OT3Mount.GRIPPER], GripperCalibrationOffset], + Tuple[Literal[OT3Mount.RIGHT], PipetteOffsetByPipetteMount], + Tuple[Literal[OT3Mount.LEFT], PipetteOffsetByPipetteMount], + ], + mock_instrument_handlers: Tuple[Mock, Mock], ) -> None: gripper_handler, pipette_handler = mock_instrument_handlers - if mount == OT3Mount.GRIPPER: + if mount_expected_offset[0] == OT3Mount.GRIPPER: gripper_handler.get_gripper_dict.return_value = GripperDict( model=GripperModel.v1, gripper_id="abc", state=GripperJawState.UNHOMED, display_name="abc", - fw_update_required=False, - fw_current_version=100, - fw_next_version=None, - calibration_offset=expected_offset, + calibration_offset=mount_expected_offset[1], ) else: - pipette_handler.get_instrument_offset.return_value = expected_offset + pipette_handler.get_instrument_offset.return_value = mount_expected_offset[1] - found_offset = ot3_hardware.get_instrument_offset(mount=mount) - assert found_offset == expected_offset + found_offset = ot3_hardware.get_instrument_offset(mount=mount_expected_offset[0]) + assert found_offset == mount_expected_offset[1] @pytest.mark.parametrize( @@ -1327,7 +1548,7 @@ def test_get_instrument_offset( async def test_save_instrument_offset( ot3_hardware: ThreadManager[OT3API], mount: Union[OT3Mount, Mount], - mock_instrument_handlers: Tuple[Mock], + mock_instrument_handlers: Tuple[Mock, Mock], ) -> None: gripper_handler, pipette_handler = mock_instrument_handlers await ot3_hardware.save_instrument_offset(mount, Point(1, 1, 1)) @@ -1340,67 +1561,63 @@ async def test_save_instrument_offset( ) +@pytest.mark.xfail() async def test_pick_up_tip_full_tiprack( ot3_hardware: ThreadManager[OT3API], - mock_instrument_handlers: Tuple[Mock], + hardware_backend: OT3Simulator, + mock_instrument_handlers: Tuple[Mock, Mock], mock_ungrip: AsyncMock, mock_move_to_plunger_bottom: AsyncMock, mock_home_gear_motors: AsyncMock, + mock_verify_tip_presence: AsyncMock, ) -> None: mock_ungrip.return_value = None await ot3_hardware.home() _, pipette_handler = mock_instrument_handlers - backend = ot3_hardware.managed_obj._backend - - def _fake_function(): - return None - + instr_mock = AsyncMock(spec=Pipette) + instr_mock.nozzle_manager.current_configruation.configuration.return_value = ( + NozzleConfigurationType.FULL + ) with patch.object( - backend, "tip_action", AsyncMock(spec=backend.tip_action) + hardware_backend, "tip_action", AsyncMock(spec=hardware_backend.tip_action) ) as tip_action: - backend._gear_motor_position = {NodeId: 0} - pipette_handler.plan_check_pick_up_tip.return_value = ( - PickUpTipSpec( - plunger_prep_pos=0, - plunger_currents={ - Axis.of_main_tool_actuator(Mount.LEFT): 0, - }, - presses=[], - shake_off_list=[], - retract_target=0, - pick_up_motor_actions=TipMotorPickUpTipSpec( + hardware_backend._gear_motor_position = {Axis.P_L: 0} + pipette_handler.get_pipette.return_value = instr_mock + + pipette_handler.plan_ht_pick_up_tip.return_value = TipActionSpec( + shake_off_moves=[], + tip_action_moves=[ + TipActionMoveSpec( # Move onto the posts - tiprack_down=Point(0, 0, 0), - tiprack_up=Point(0, 0, 0), - pick_up_distance=10, + distance=10, speed=0, - currents={Axis.Q: 0}, - ), - ), - _fake_function, + currents={ + Axis.of_main_tool_actuator(Mount.LEFT): 0, + Axis.Q: 0, + }, + ) + ], ) def _update_gear_motor_pos( moves: Optional[List[Move[Axis]]] = None, distance: Optional[float] = None, ) -> None: - if NodeId.pipette_left not in backend._gear_motor_position: - backend._gear_motor_position = {NodeId.pipette_left: 0.0} + if Axis.P_L not in hardware_backend._gear_motor_position: + hardware_backend._gear_motor_position = {Axis.P_L: 0.0} if moves: for move in moves: for block in move.blocks: - backend._gear_motor_position[ - NodeId.pipette_left - ] += block.distance + hardware_backend._gear_motor_position[Axis.P_L] += float( + block.distance * move.unit_vector[Axis.Q] + ) elif distance: - backend._gear_motor_position[NodeId.pipette_left] += distance + hardware_backend._gear_motor_position[Axis.P_L] += distance tip_action.side_effect = _update_gear_motor_pos await ot3_hardware.set_gantry_load(GantryLoad.HIGH_THROUGHPUT) await ot3_hardware.pick_up_tip(Mount.LEFT, 40.0) - pipette_handler.plan_check_pick_up_tip.assert_called_once_with( - OT3Mount.LEFT, 40.0, None, None - ) + pipette_handler.plan_ht_pick_up_tip.assert_called_once_with() # first call should be "clamp", moving down assert tip_action.call_args_list[0][-1]["moves"][0].unit_vector == {Axis.Q: 1} # next call should be "clamp", moving back up @@ -1412,62 +1629,52 @@ def _update_gear_motor_pos( async def test_drop_tip_full_tiprack( ot3_hardware: ThreadManager[OT3API], - mock_instrument_handlers: Tuple[Mock], + hardware_backend: OT3Simulator, + mock_instrument_handlers: Tuple[Mock, Mock], + mock_backend_get_tip_status: AsyncMock, mock_home_gear_motors: AsyncMock, + mock_verify_tip_presence: AsyncMock, ) -> None: _, pipette_handler = mock_instrument_handlers - backend = ot3_hardware.managed_obj._backend - - def _fake_function(): - return None with patch.object( - backend, "tip_action", AsyncMock(spec=backend.tip_action) + hardware_backend, + "tip_action", + AsyncMock(spec=hardware_backend.tip_action, wraps=hardware_backend.tip_action), ) as tip_action: - backend._gear_motor_position = {NodeId.pipette_left: 0} - pipette_handler.plan_check_drop_tip.return_value = ( - DropTipSpec( - drop_moves=[ - DropTipMove( - target_position=10, - current={Axis.P_L: 1.0}, - speed=1, - is_ht_tip_action=True, - ) - ], - shake_moves=[], - ending_current={Axis.P_L: 1.0}, - ), - _fake_function, + hardware_backend._gear_motor_position = {Axis.Q: 0} + pipette_handler.plan_ht_drop_tip.return_value = TipActionSpec( + tip_action_moves=[ + TipActionMoveSpec( + distance=10, + speed=1, + currents={Axis.P_L: 1.0}, + ), + ], + shake_off_moves=[], ) - def _update_gear_motor_pos( - moves: Optional[List[Move[Axis]]] = None, - distance: Optional[float] = None, - velocity: Optional[float] = None, - tip_action: str = "home", - ) -> None: - if NodeId.pipette_left not in backend._gear_motor_position: - backend._gear_motor_position = {NodeId.pipette_left: 0.0} - if moves: - for move in moves: - for block in move.blocks: - backend._gear_motor_position[ - NodeId.pipette_left - ] += block.distance - elif distance: - backend._gear_motor_position[NodeId.pipette_left] += distance + def set_mock_plunger_configs() -> None: + mock_instr = pipette_handler.get_pipette(Mount.LEFT) + mock_instr.backlash_distance = 0.1 + mock_instr.config.plunger_homing_configurations.current = 1.0 + mock_instr.plunger_positions.bottom = -18.5 - tip_action.side_effect = _update_gear_motor_pos + set_mock_plunger_configs() await ot3_hardware.set_gantry_load(GantryLoad.HIGH_THROUGHPUT) + mock_backend_get_tip_status.return_value = TipStateType.ABSENT await ot3_hardware.drop_tip(Mount.LEFT, home_after=True) - pipette_handler.plan_check_drop_tip.assert_called_once_with(OT3Mount.LEFT, True) + pipette_handler.plan_ht_drop_tip.assert_called_once_with() + assert len(tip_action.call_args_list) == 2 # first call should be "clamp", moving down - assert tip_action.call_args_list[0][-1]["moves"][0].unit_vector == {Axis.Q: 1} + first_target = tip_action.call_args_list[0][-1]["targets"][0][0] + assert list(first_target.keys()) == [Axis.Q] + assert first_target[Axis.Q] == 10 # next call should be "clamp", moving back up - assert tip_action.call_args_list[1][-1]["moves"][0].unit_vector == {Axis.Q: -1} - assert len(tip_action.call_args_list) == 2 + second_target = tip_action.call_args_list[1][-1]["targets"][0][0] + assert list(second_target.keys()) == [Axis.Q] + assert second_target[Axis.Q] < 10 # home should be called after tip_action is done assert len(mock_home_gear_motors.call_args_list) == 1 @@ -1477,14 +1684,14 @@ def _update_gear_motor_pos( [[Axis.X], [Axis.X, Axis.Y], [Axis.X, Axis.Y, Axis.P_L], None], ) async def test_update_position_estimation( - ot3_hardware: ThreadManager[OT3API], axes: List[Axis] + ot3_hardware: ThreadManager[OT3API], + hardware_backend: OT3Simulator, + axes: List[Axis], ) -> None: - - backend = ot3_hardware.managed_obj._backend with patch.object( - backend, + hardware_backend, "update_motor_estimation", - AsyncMock(spec=backend.update_motor_estimation), + AsyncMock(spec=hardware_backend.update_motor_estimation), ) as mock_update: await ot3_hardware._update_position_estimation(axes) if axes is None: @@ -1492,24 +1699,25 @@ async def test_update_position_estimation( mock_update.assert_called_once_with(axes) -async def test_refresh_positions(ot3_hardware: ThreadManager[OT3API]) -> None: +async def test_refresh_positions( + ot3_hardware: ThreadManager[OT3API], hardware_backend: OT3Simulator +) -> None: - backend = ot3_hardware.managed_obj._backend ot3_hardware._current_position.clear() ot3_hardware._encoder_position.clear() with patch.object( - backend, + hardware_backend, "update_motor_status", - AsyncMock(spec=backend.update_motor_status), + AsyncMock(spec=hardware_backend.update_motor_status), ) as mock_update_status, patch.object( - backend, + hardware_backend, "update_position", - AsyncMock(spec=backend.update_position), + AsyncMock(spec=hardware_backend.update_position), ) as mock_pos, patch.object( - backend, + hardware_backend, "update_encoder_position", - AsyncMock(spec=backend.update_encoder_position), + AsyncMock(spec=hardware_backend.update_encoder_position), ) as mock_encoder: mock_pos.return_value = {ax: 100 for ax in Axis} @@ -1536,6 +1744,7 @@ async def test_refresh_positions(ot3_hardware: ThreadManager[OT3API]) -> None: ) async def test_home_axis( ot3_hardware: ThreadManager[OT3API], + hardware_backend: OT3Simulator, mock_check_motor: Mock, mock_check_encoder: Mock, axis: Axis, @@ -1551,37 +1760,34 @@ async def test_home_axis( instr_data = AttachedPipette(config=pipette_config, id="fakepip") await ot3_hardware.cache_pipette(Axis.to_ot3_mount(axis), instr_data, None) - backend = ot3_hardware.managed_obj._backend origin_pos = {ax: 100 for ax in Axis} origin_encoder = {ax: 99 for ax in Axis} - backend._position = {axis_to_node(ax): v for ax, v in origin_pos.items()} - backend._encoder_position = { - axis_to_node(ax): v for ax, v in origin_encoder.items() - } + hardware_backend._position = {ax: v for ax, v in origin_pos.items()} + hardware_backend._encoder_position = {ax: v for ax, v in origin_encoder.items()} mock_check_motor.return_value = stepper_ok mock_check_encoder.return_value = encoder_ok with patch.object( - backend, + hardware_backend, "move", AsyncMock( - spec=backend.move, - wraps=backend.move, + spec=hardware_backend.move, + wraps=hardware_backend.move, ), - ) as mock_backend_move, patch.object( - backend, + ) as mock_hardware_backend_move, patch.object( + hardware_backend, "home", AsyncMock( - spec=backend.home, - wraps=backend.home, + spec=hardware_backend.home, + wraps=hardware_backend.home, ), - ) as mock_backend_home, patch.object( - backend, + ) as mock_hardware_backend_home, patch.object( + hardware_backend, "update_motor_estimation", AsyncMock( - spec=backend.update_motor_estimation, - wraps=backend.update_motor_estimation, + spec=hardware_backend.update_motor_estimation, + wraps=hardware_backend.update_motor_estimation, ), ) as mock_estimate: @@ -1595,31 +1801,31 @@ async def test_home_axis( if stepper_ok and encoder_ok: """Copy encoder position to stepper pos""" - # for accurate axis, we just move to home pos: + # for accurate axis, we just move very close to home pos if axis in [Axis.Z_L, Axis.P_L]: # move is called - mock_backend_move.assert_awaited_once() - move = mock_backend_move.call_args_list[0][0][1][0] - assert move.distance == 95.0 + mock_hardware_backend_move.assert_awaited_once() + target = mock_hardware_backend_move.call_args_list[0][0][1][axis] + assert target == 5 # then home is called - mock_backend_home.assert_awaited_once() + mock_hardware_backend_home.assert_awaited_once() else: # we move to 20 mm away from home - mock_backend_move.assert_awaited_once() - move = mock_backend_move.call_args_list[0][0][1][0] - assert move.distance == 80.0 + mock_hardware_backend_move.assert_awaited_once() + target = mock_hardware_backend_move.call_args_list[0][0][1][axis] + assert target == 20.0 # then home is called - mock_backend_home.assert_awaited_once() + mock_hardware_backend_home.assert_awaited_once() else: # home axis - mock_backend_home.assert_awaited_once() + mock_hardware_backend_home.assert_awaited_once() # move not called - mock_backend_move.assert_not_awaited() + mock_hardware_backend_move.assert_not_awaited() # axis is at the home position - expected_pos = {axis_to_node(ax): v for ax, v in origin_pos.items()} - expected_pos.update({axis_to_node(axis): 0}) - assert backend._position == expected_pos + expected_pos = {ax: v for ax, v in origin_pos.items()} + expected_pos.update({axis: 0}) + assert hardware_backend._position == expected_pos @pytest.mark.parametrize("setting", [True, False]) @@ -1672,56 +1878,6 @@ def test_fw_version( assert ot3_hardware.get_fw_version() == version_str -@pytest.mark.parametrize(argnames=["enabled"], argvalues=[[True], [False]]) -async def test_status_bar_interface( - ot3_hardware: ThreadManager[OT3API], - enabled: bool, -) -> None: - """Test setting status bar statuses and make sure the cached status is correct.""" - await ot3_hardware.set_status_bar_enabled(enabled) - - settings = { - StatusBarState.IDLE: StatusBarState.IDLE, - StatusBarState.RUNNING: StatusBarState.RUNNING, - StatusBarState.PAUSED: StatusBarState.PAUSED, - StatusBarState.HARDWARE_ERROR: StatusBarState.HARDWARE_ERROR, - StatusBarState.SOFTWARE_ERROR: StatusBarState.SOFTWARE_ERROR, - StatusBarState.CONFIRMATION: StatusBarState.IDLE, - StatusBarState.RUN_COMPLETED: StatusBarState.RUN_COMPLETED, - StatusBarState.UPDATING: StatusBarState.UPDATING, - StatusBarState.ACTIVATION: StatusBarState.IDLE, - StatusBarState.DISCO: StatusBarState.IDLE, - StatusBarState.OFF: StatusBarState.OFF, - } - - for setting, response in settings.items(): - await ot3_hardware.set_status_bar_state(state=setting) - assert ot3_hardware.get_status_bar_state() == response - - -async def test_tip_presence_disabled_ninety_six_channel( - ot3_hardware: ThreadManager[OT3API], -) -> None: - """Test 96 channel tip presence is disabled.""" - # TODO remove this check once we enable tip presence for 96 chan. - with patch.object( - ot3_hardware.managed_obj._backend, - "check_for_tip_presence", - AsyncMock(spec=ot3_hardware.managed_obj._backend.check_for_tip_presence), - ) as tip_present: - pipette_config = load_pipette_data.load_definition( - PipetteModelType("p1000"), - PipetteChannelType(96), - PipetteVersionType(3, 3), - ) - instr_data = AttachedPipette(config=pipette_config, id="fakepip") - await ot3_hardware.cache_pipette(OT3Mount.LEFT, instr_data, None) - await ot3_hardware._configure_instruments() - await ot3_hardware.pick_up_tip(OT3Mount.LEFT, 60) - - tip_present.assert_not_called() - - @pytest.mark.parametrize( argnames=["old_state", "new_state", "should_trigger"], argvalues=[ @@ -1789,7 +1945,7 @@ async def test_stop_only_home_necessary_axes( mock_home: AsyncMock, mock_reset: AsyncMock, jaw_state: GripperJawState, -): +) -> None: gripper_config = gc.load(GripperModel.v1) instr_data = AttachedGripper(config=gripper_config, id="test") await ot3_hardware.cache_gripper(instr_data) diff --git a/api/tests/opentrons/hardware_control/test_ot3_calibration.py b/api/tests/opentrons/hardware_control/test_ot3_calibration.py index 52fe57cbe8b..f2eee2bdcca 100644 --- a/api/tests/opentrons/hardware_control/test_ot3_calibration.py +++ b/api/tests/opentrons/hardware_control/test_ot3_calibration.py @@ -4,8 +4,7 @@ import pytest import json from math import isclose -from typing import Iterator, Tuple -from typing_extensions import Literal +from typing import AsyncIterator, Iterator, Tuple, Any, Literal from mock import patch, AsyncMock, Mock, call as mock_call from opentrons.hardware_control import ThreadManager from opentrons.hardware_control.ot3api import OT3API @@ -14,7 +13,6 @@ from opentrons.hardware_control.ot3_calibration import ( find_edge_binary, find_axis_center, - EarlyCapacitiveSenseTrigger, find_calibration_structure_height, find_slot_center_binary, find_slot_center_noncontact, @@ -23,30 +21,35 @@ _edges_from_data, _probe_deck_at, _verify_edge_pos, - InaccurateNonContactSweepError, - CalibrationStructureNotFoundError, - EdgeNotFoundError, PREP_OFFSET_DEPTH, EDGES, ) from opentrons.types import Point from opentrons_shared_data.deck import get_calibration_square_position_in_slot +from opentrons_shared_data.errors.exceptions import ( + CalibrationStructureNotFoundError, + EdgeNotFoundError, + EarlyCapacitiveSenseTrigger, + InaccurateNonContactSweepError, +) @pytest.fixture(autouse=True) -def mock_save_json(): +def mock_save_json() -> Iterator[Mock]: with patch("json.dump", Mock(spec=json.dump)) as jd: yield jd @pytest.fixture def mock_move_to(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: + managed = ot3_hardware.managed_obj + assert managed with patch.object( - ot3_hardware.managed_obj, + managed, "move_to", AsyncMock( - spec=ot3_hardware.managed_obj.move_to, - wraps=ot3_hardware.managed_obj.move_to, + spec=managed.move_to, + wraps=managed.move_to, ), ) as mock_move: yield mock_move @@ -54,12 +57,14 @@ def mock_move_to(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: @pytest.fixture def mock_capacitive_probe(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: + managed = ot3_hardware.managed_obj + assert managed with patch.object( - ot3_hardware.managed_obj, + managed, "capacitive_probe", AsyncMock( - spec=ot3_hardware.managed_obj.capacitive_probe, - wraps=ot3_hardware.managed_obj.capacitive_probe, + spec=managed.capacitive_probe, + wraps=managed.capacitive_probe, ), ) as mock_probe: yield mock_probe @@ -79,12 +84,14 @@ def mock_probe_deck() -> Iterator[AsyncMock]: @pytest.fixture def mock_capacitive_sweep(ot3_hardware: ThreadManager[OT3API]) -> Iterator[AsyncMock]: + managed = ot3_hardware.managed_obj + assert managed with patch.object( - ot3_hardware.managed_obj, + managed, "capacitive_sweep", AsyncMock( - spec=ot3_hardware.managed_obj.capacitive_sweep, - wraps=ot3_hardware.managed_obj.capacitive_sweep, + spec=managed.capacitive_sweep, + wraps=managed.capacitive_sweep, ), ) as mock_sweep: yield mock_sweep @@ -111,13 +118,15 @@ def mock_data_analysis() -> Iterator[Mock]: def _update_edge_sense_config( - old: OT3CalibrationSettings, **new_edge_sense_settings + old: OT3CalibrationSettings, **new_edge_sense_settings: Any ) -> OT3CalibrationSettings: return replace(old, edge_sense=replace(old.edge_sense, **new_edge_sense_settings)) @pytest.fixture -async def override_cal_config(ot3_hardware: ThreadManager[OT3API]) -> Iterator[None]: +async def override_cal_config( + ot3_hardware: ThreadManager[OT3API], +) -> AsyncIterator[None]: old_calibration = copy.deepcopy(ot3_hardware.config.calibration) await ot3_hardware.update_config( calibration=_update_edge_sense_config( @@ -142,19 +151,24 @@ def _other_axis_val(point: Tuple[float, float, float], main_axis: Axis) -> float raise KeyError(main_axis) +# Mock Capacitive Probe Result (found_position[float], hit_deck[bool]) +_HIT = (1, True) +_MISS = (-1, False) + + @pytest.mark.parametrize( - "search_axis,direction_if_hit,probe_results,search_result", + "direction_if_hit,probe_results,search_result", [ # For each axis and direction, test # 1. hit-miss-miss # 2. miss-hit-hit # 3. miss-hit-miss - (Axis.X, -1, (1, -1, -1), -1), - (Axis.X, -1, (-1, 1, 1), 1), - (Axis.X, -1, (-1, 1, -1), 3), - (Axis.X, 1, (1, -1, -1), 1), - (Axis.X, 1, (-1, 1, 1), -1), - (Axis.X, 1, (-1, 1, -1), -3), + (-1, (_HIT, _MISS, _MISS), -1), + (-1, (_MISS, _HIT, _HIT), 1), + (-1, (_MISS, _HIT, _MISS), 3), + (1, (_HIT, _MISS, _MISS), 1), + (1, (_MISS, _HIT, _HIT), -1), + (1, (_MISS, _HIT, _MISS), -3), ], ) async def test_find_edge( @@ -163,7 +177,6 @@ async def test_find_edge( override_cal_config: None, mock_verify_edge: AsyncMock, mock_move_to: AsyncMock, - search_axis: Axis, direction_if_hit: Literal[1, -1], probe_results: Tuple[float, float, float], search_result: float, @@ -174,26 +187,26 @@ async def test_find_edge( ot3_hardware, OT3Mount.RIGHT, Point(0, 0, 0), - search_axis, + Axis.X, direction_if_hit, False, ) - assert search_axis.of_point(result) == search_result + assert Axis.X.of_point(result) == search_result # the first move is in z only to the cal height checked_calls = mock_move_to.call_args_list[1:] # all other moves should only move in the search axis for call in checked_calls: assert call[0][0] == OT3Mount.RIGHT - assert _other_axis_val(call[0][1], search_axis) == pytest.approx( - _other_axis_val(Point(0, 0, 0), search_axis) + assert _other_axis_val(call[0][1], Axis.X) == pytest.approx( + _other_axis_val(Point(0, 0, 0), Axis.X) ) @pytest.mark.parametrize( "search_axis,direction_if_hit,probe_results", [ - (Axis.X, -1, (1, 1)), - (Axis.Y, -1, (-1, -1)), + (Axis.X, -1, (_HIT, _HIT)), + (Axis.Y, -1, (_MISS, _MISS)), ], ) async def test_edge_not_found( @@ -201,7 +214,7 @@ async def test_edge_not_found( mock_capacitive_probe: AsyncMock, override_cal_config: None, mock_move_to: AsyncMock, - search_axis: Axis, + search_axis: Literal[Axis.X, Axis.Y], direction_if_hit: Literal[1, -1], probe_results: Tuple[float, float, float], ) -> None: @@ -224,7 +237,7 @@ async def test_find_edge_early_trigger( override_cal_config: None, ) -> None: await ot3_hardware.home() - mock_capacitive_probe.side_effect = (3,) + mock_capacitive_probe.side_effect = ((3, True), ()) with pytest.raises(EarlyCapacitiveSenseTrigger): await find_edge_binary( ot3_hardware, @@ -241,7 +254,7 @@ async def test_deck_not_found( override_cal_config: None, ) -> None: await ot3_hardware.home() - mock_capacitive_probe.side_effect = (-25,) + mock_capacitive_probe.side_effect = ((-25, False), ()) with pytest.raises(CalibrationStructureNotFoundError): await find_calibration_structure_height( ot3_hardware, @@ -263,7 +276,7 @@ async def test_find_deck_checks_z_only( ) -> None: await ot3_hardware.home() here = await ot3_hardware.gantry_position(mount) - mock_capacitive_probe.side_effect = (-1.8,) + mock_capacitive_probe.side_effect = ((-1.8, True),) await find_calibration_structure_height(ot3_hardware, mount, target) z_prep_loc = target + PREP_OFFSET_DEPTH @@ -290,6 +303,8 @@ async def test_method_enum( ot3_hardware: ThreadManager[OT3API], override_cal_config: None, ) -> None: + managed = ot3_hardware.managed_obj + assert managed with patch( "opentrons.hardware_control.ot3_calibration.find_slot_center_binary", AsyncMock(spec=find_slot_center_binary), @@ -303,9 +318,9 @@ async def test_method_enum( "opentrons.hardware_control.ot3_calibration.find_calibration_structure_height", AsyncMock(spec=find_calibration_structure_height), ) as find_deck, patch.object( - ot3_hardware.managed_obj, "reset_instrument_offset", AsyncMock() + managed, "reset_instrument_offset", AsyncMock() ) as reset_instrument_offset, patch.object( - ot3_hardware.managed_obj, "save_instrument_offset", AsyncMock() + managed, "save_instrument_offset", AsyncMock() ) as save_instrument_offset: find_deck.return_value = 10 calibration_target.return_value = Point(0.0, 0.0, 0.0) @@ -343,10 +358,12 @@ async def test_method_enum( async def test_calibrate_mount_errors( ot3_hardware: ThreadManager[OT3API], mock_data_analysis: Mock ) -> None: + managed = ot3_hardware.managed_obj + assert managed with patch.object( - ot3_hardware.managed_obj, "reset_instrument_offset", AsyncMock() + managed, "reset_instrument_offset", AsyncMock() ) as reset_instrument_offset, patch.object( - ot3_hardware.managed_obj, "save_instrument_offset", AsyncMock() + managed, "save_instrument_offset", AsyncMock() ) as save_instrument_offset, patch( "opentrons.hardware_control.ot3_calibration.find_calibration_structure_height", AsyncMock(spec=find_calibration_structure_height), diff --git a/api/tests/opentrons/hardware_control/test_ot3_transforms.py b/api/tests/opentrons/hardware_control/test_ot3_transforms.py index a365e1866d7..37328043e84 100644 --- a/api/tests/opentrons/hardware_control/test_ot3_transforms.py +++ b/api/tests/opentrons/hardware_control/test_ot3_transforms.py @@ -1,16 +1,18 @@ import pytest +from typing import Dict, Optional from unittest import mock from opentrons import types from opentrons.hardware_control import ot3api -from opentrons.hardware_control.types import Axis, OT3Mount +from opentrons.hardware_control.types import Axis from opentrons_shared_data.pipette import name_for_model +from opentrons_shared_data.pipette.dev_types import PipetteModel @pytest.mark.parametrize( "pipette_model", ["p1000_single_v3.3", "p1000_single_v3.3", "p50_multi_v3.3"] ) -async def test_transforms_roundtrip(pipette_model): - attached = { +async def test_transforms_roundtrip(pipette_model: PipetteModel) -> None: + attached: Dict[types.Mount, Dict[str, Optional[str]]] = { types.Mount.LEFT: { "model": pipette_model, "id": pipette_model + "_idididid_left", @@ -21,7 +23,6 @@ async def test_transforms_roundtrip(pipette_model): "id": pipette_model + "_idididid_right", "name": name_for_model(pipette_model), }, - OT3Mount.GRIPPER: None, } sim = await ot3api.OT3API.build_hardware_simulator(attached_instruments=attached) target = types.Point(20, 30, 40) @@ -32,8 +33,10 @@ async def test_transforms_roundtrip(pipette_model): @pytest.mark.parametrize( "pipette_model", ["p1000_single_v3.3", "p50_single_v3.3", "p1000_multi_v3.3"] ) -async def test_transform_values(pipette_model, enable_ot3_hardware_controller): - attached = { +async def test_transform_values( + pipette_model: PipetteModel, enable_ot3_hardware_controller: None +) -> None: + attached: Dict[types.Mount, Dict[str, Optional[str]]] = { types.Mount.LEFT: { "model": pipette_model, "id": pipette_model + "_idididid_left", @@ -48,13 +51,15 @@ async def test_transform_values(pipette_model, enable_ot3_hardware_controller): sim = await ot3api.OT3API.build_hardware_simulator(attached_instruments=attached) target = types.Point(20, 30, 40) with mock.patch.object( - sim._move_manager, - "plan_motion", - mock.MagicMock(side_effect=sim._move_manager.plan_motion), - spec=sim._move_manager.plan_motion, + sim._backend, + "move", + mock.MagicMock(side_effect=sim._backend.move), + spec=sim._backend.move, ) as mock_move: await sim.move_to(types.Mount.RIGHT, target) - right_offset = sim.hardware_instruments[types.Mount.RIGHT].critical_point() + right_pipette = sim.hardware_instruments[types.Mount.RIGHT] + assert right_pipette + right_offset = right_pipette.critical_point() point = [ (target.x - right_offset[0] - sim.config.right_mount_offset[0]) * -1 + sim.config.carriage_offset[0], @@ -63,18 +68,20 @@ async def test_transform_values(pipette_model, enable_ot3_hardware_controller): (target.z - right_offset[2] - sim.config.right_mount_offset[2]) * -1 + sim.config.carriage_offset[2], ] - assert mock_move.call_args[1]["target_list"][0].position[Axis.X] == point[0] - assert mock_move.call_args[1]["target_list"][0].position[Axis.Y] == point[1] - assert mock_move.call_args[1]["target_list"][0].position[Axis.Z_R] == point[2] + assert mock_move.call_args[0][1][Axis.X] == point[0] + assert mock_move.call_args[0][1][Axis.Y] == point[1] + assert mock_move.call_args[0][1][Axis.Z_R] == point[2] with mock.patch.object( - sim._move_manager, - "plan_motion", - mock.MagicMock(side_effect=sim._move_manager.plan_motion), - spec=sim._move_manager.plan_motion, + sim._backend, + "move", + mock.MagicMock(side_effect=sim._backend.move), + spec=sim._backend.move, ) as mock_move: await sim.move_to(types.Mount.LEFT, target) - left_offset = sim.hardware_instruments[types.Mount.LEFT].critical_point() + left_pipette = sim.hardware_instruments[types.Mount.LEFT] + assert left_pipette + left_offset = left_pipette.critical_point() point = [ (target.x - left_offset[0] - sim.config.left_mount_offset[0]) * -1 + sim.config.carriage_offset[0], @@ -83,6 +90,6 @@ async def test_transform_values(pipette_model, enable_ot3_hardware_controller): (target.z - left_offset[2] - sim.config.left_mount_offset[2]) * -1 + sim.config.carriage_offset[2], ] - assert mock_move.call_args[1]["target_list"][0].position[Axis.X] == point[0] - assert mock_move.call_args[1]["target_list"][0].position[Axis.Y] == point[1] - assert mock_move.call_args[1]["target_list"][0].position[Axis.Z_L] == point[2] + assert mock_move.call_args[0][1][Axis.X] == point[0] + assert mock_move.call_args[0][1][Axis.Y] == point[1] + assert mock_move.call_args[0][1][Axis.Z_L] == point[2] diff --git a/api/tests/opentrons/hardware_control/test_pipette.py b/api/tests/opentrons/hardware_control/test_pipette.py index 582e95b589e..b6224a4e3dd 100644 --- a/api/tests/opentrons/hardware_control/test_pipette.py +++ b/api/tests/opentrons/hardware_control/test_pipette.py @@ -85,8 +85,7 @@ def test_tip_tracking( model: Union[str, pipette_definition.PipetteModelVersionType], ) -> None: hw_pipette = pipette_builder(model) - with pytest.raises(AssertionError): - hw_pipette.remove_tip() + hw_pipette.remove_tip() assert not hw_pipette.has_tip tip_length = 25.0 hw_pipette.add_tip(tip_length) @@ -95,8 +94,7 @@ def test_tip_tracking( hw_pipette.add_tip(tip_length) hw_pipette.remove_tip() assert not hw_pipette.has_tip - with pytest.raises(AssertionError): - hw_pipette.remove_tip() + hw_pipette.remove_tip() @pytest.mark.parametrize( @@ -166,7 +164,7 @@ def test_critical_points_pipette_offset( ) -> None: hw_pipette = pipette_builder(model, calibration) # pipette offset + nozzle offset to determine critical point - offsets = calibration.offset + Point(*hw_pipette.nozzle_offset) + offsets = calibration.offset + hw_pipette.nozzle_offset assert hw_pipette.critical_point() == offsets assert hw_pipette.critical_point(types.CriticalPoint.NOZZLE) == offsets assert hw_pipette.critical_point(types.CriticalPoint.TIP) == offsets @@ -393,7 +391,7 @@ def test_reload_instrument_cal_ot3( status=cal_types.CalibrationStatus(), ) new_pip, skipped = ot3_pipette._reload_and_check_skip( - old_pip.config, old_pip, new_cal + old_pip.config, old_pip, new_cal, use_old_aspiration_functions=False ) assert skipped diff --git a/api/tests/opentrons/hardware_control/test_pipette_handler.py b/api/tests/opentrons/hardware_control/test_pipette_handler.py index a5675ffa4e2..3bd855024f6 100644 --- a/api/tests/opentrons/hardware_control/test_pipette_handler.py +++ b/api/tests/opentrons/hardware_control/test_pipette_handler.py @@ -2,10 +2,10 @@ import pytest from decoy import Decoy -from typing import Optional, Tuple, Dict +from typing import Optional, Tuple, Dict, List from opentrons import types -from opentrons.hardware_control.types import Axis, OT3Mount +from opentrons.hardware_control.types import OT3Mount, Axis from opentrons.hardware_control.instruments.ot2.pipette import Pipette from opentrons.hardware_control.instruments.ot2.pipette_handler import ( PipetteHandlerProvider, @@ -13,7 +13,12 @@ from opentrons.hardware_control.instruments.ot3.pipette import Pipette as OT3Pipette from opentrons.hardware_control.instruments.ot3.pipette_handler import ( OT3PipetteHandler, - TipMotorPickUpTipSpec, + TipActionMoveSpec, +) + +from opentrons_shared_data.pipette.pipette_definition import ( + PressFitPickUpTipConfiguration, + CamActionPickUpTipConfiguration, ) @@ -41,11 +46,53 @@ def subject(decoy: Decoy, mock_pipette: Pipette) -> PipetteHandlerProvider: @pytest.fixture def subject_ot3(decoy: Decoy, mock_pipette_ot3: OT3Pipette) -> OT3PipetteHandler: - inst_by_mount = {types.Mount.LEFT: mock_pipette_ot3, types.Mount.RIGHT: None} + inst_by_mount = {OT3Mount.LEFT: mock_pipette_ot3, OT3Mount.RIGHT: None} subject = OT3PipetteHandler(attached_instruments=inst_by_mount) return subject +@pytest.fixture +def mock_presses_list() -> List[TipActionMoveSpec]: + return [ + TipActionMoveSpec( + distance=-10.0, + speed=5.5, + currents={Axis.Z_L: 1.0}, + ), + TipActionMoveSpec( + distance=10.0, + speed=5.5, + currents=None, + ), + TipActionMoveSpec( + distance=-11.0, + speed=5.5, + currents={Axis.Z_L: 1.0}, + ), + TipActionMoveSpec( + distance=11.0, + speed=5.5, + currents=None, + ), + ] + + +@pytest.fixture +def mock_pickup_list() -> List[TipActionMoveSpec]: + return [ + TipActionMoveSpec( + distance=19.0, + speed=10, + currents={Axis.P_L: 1.0, Axis.Q: 1.0}, + ), + TipActionMoveSpec( + distance=29, + speed=5.5, + currents={Axis.P_L: 1.0, Axis.Q: 1.0}, + ), + ] + + @pytest.mark.parametrize( "presses_input, expected_array_length", [(0, 0), (None, 3), (3, 3)] ) @@ -64,13 +111,19 @@ def test_plan_check_pick_up_tip_with_presses_argument( decoy.when(mock_pipette.has_tip).then_return(False) decoy.when(mock_pipette.config.quirks).then_return([]) - decoy.when(mock_pipette.pick_up_configurations.distance).then_return(0) - decoy.when(mock_pipette.pick_up_configurations.increment).then_return(0) - - if presses_input is None: - decoy.when(mock_pipette.pick_up_configurations.presses).then_return( - expected_array_length - ) + decoy.when(mock_pipette.pick_up_configurations.press_fit.presses).then_return( + expected_array_length + ) + decoy.when(mock_pipette.pick_up_configurations.press_fit.distance).then_return(5) + decoy.when(mock_pipette.pick_up_configurations.press_fit.increment).then_return(0) + decoy.when(mock_pipette.pick_up_configurations.press_fit.speed).then_return(10) + decoy.when(mock_pipette.config.end_tip_action_retract_distance_mm).then_return(0) + decoy.when( + mock_pipette.pick_up_configurations.press_fit.current_by_tip_count + ).then_return({1: 1.0}) + decoy.when(mock_pipette.nozzle_manager.current_configuration.tip_count).then_return( + 1 + ) spec, _add_tip_to_instrs = subject.plan_check_pick_up_tip( mount, tip_length, presses, increment @@ -82,21 +135,9 @@ def test_plan_check_pick_up_tip_with_presses_argument( @pytest.mark.parametrize( "presses_input, expected_array_length, channels, expected_pick_up_motor_actions", [ - ( - 0, - 0, - 96, - TipMotorPickUpTipSpec( - tiprack_down=types.Point(0, 0, -7), - tiprack_up=types.Point(0, 0, 2), - pick_up_distance=0, - speed=10, - currents={Axis.Q: 1}, - home_buffer=10, - ), - ), - (None, 3, 8, None), - (3, 3, 1, None), + (0, 2, 96, "mock_pickup_list"), + (None, 4, 8, "mock_presses_list"), + (2, 4, 1, "mock_presses_list"), ], ) def test_plan_check_pick_up_tip_with_presses_argument_ot3( @@ -106,34 +147,50 @@ def test_plan_check_pick_up_tip_with_presses_argument_ot3( presses_input: int, expected_array_length: int, channels: int, - expected_pick_up_motor_actions: Optional[TipMotorPickUpTipSpec], + expected_pick_up_motor_actions: Optional[List[TipActionMoveSpec]], + request, ) -> None: """Should return an array with expected length.""" - tip_length = 25.0 - mount = types.Mount.LEFT + mount = OT3Mount.LEFT presses = presses_input increment = 1 decoy.when(mock_pipette_ot3.has_tip).then_return(False) - decoy.when(mock_pipette_ot3.pick_up_configurations.presses).then_return(3) - decoy.when(mock_pipette_ot3.pick_up_configurations.increment).then_return(increment) - decoy.when(mock_pipette_ot3.pick_up_configurations.speed).then_return(10) - decoy.when(mock_pipette_ot3.pick_up_configurations.distance).then_return(0) - decoy.when(mock_pipette_ot3.pick_up_configurations.current).then_return(1) + decoy.when( + mock_pipette_ot3.get_pick_up_configuration_for_tip_count(channels) + ).then_return( + CamActionPickUpTipConfiguration( + distance=10, + speed=5.5, + prep_move_distance=19.0, + prep_move_speed=10, + currentByTipCount={96: 1.0}, + connectTiprackDistanceMM=8, + ) + if channels == 96 + else PressFitPickUpTipConfiguration( + presses=2, + increment=increment, + distance=10, + speed=5.5, + currentByTipCount={channels: 1.0}, + ) + ) + decoy.when(mock_pipette_ot3.plunger_motor_current.run).then_return(1) decoy.when(mock_pipette_ot3.config.quirks).then_return([]) decoy.when(mock_pipette_ot3.channels).then_return(channels) - - if presses_input is None: - decoy.when(mock_pipette_ot3.config.pick_up_presses).then_return( - expected_array_length - ) - - spec, _add_tip_to_instrs = subject_ot3.plan_check_pick_up_tip( - mount, tip_length, presses, increment + decoy.when(mock_pipette_ot3.config.end_tip_action_retract_distance_mm).then_return( + 2 ) - assert len(spec.presses) == expected_array_length - assert spec.pick_up_motor_actions == expected_pick_up_motor_actions + if channels == 96: + spec = subject_ot3.plan_ht_pick_up_tip(96) + else: + spec = subject_ot3.plan_lt_pick_up_tip(mount, channels, presses, increment) + assert len(spec.tip_action_moves) == expected_array_length + assert spec.tip_action_moves == request.getfixturevalue( + expected_pick_up_motor_actions + ) def test_get_pipette_fails(decoy: Decoy, subject: PipetteHandlerProvider): diff --git a/api/tests/opentrons/hardware_control/test_poller.py b/api/tests/opentrons/hardware_control/test_poller.py index 07a75c1650d..6ede24dba9e 100644 --- a/api/tests/opentrons/hardware_control/test_poller.py +++ b/api/tests/opentrons/hardware_control/test_poller.py @@ -150,3 +150,32 @@ async def test_poller_wait_next_poll_error( mock_reader.on_error(matchers.ErrorMatching(RuntimeError, match="oh no")), times=1, ) + + +async def test_poller_cancelled_wait( + mock_reader_flow_control: None, + subject: Poller, + read_started_event: asyncio.Event, + ok_to_finish_read_event: asyncio.Event, +) -> None: + """If one waiter is cancelled, other waiters should still work.""" + asyncio.create_task(subject.start()) + await read_started_event.wait() + read_started_event.clear() + + # Before letting the read complete, set up new wait tasks + wait_task_1 = asyncio.create_task(subject.wait_next_poll()) + wait_task_2 = asyncio.create_task(subject.wait_next_poll()) + ok_to_finish_read_event.set() + + await read_started_event.wait() + read_started_event.clear() + wait_task_1.cancel() + ok_to_finish_read_event.set() + + assert ( + subject._poll_forever_task is not None and not subject._poll_forever_task.done() + ) + + await asyncio.sleep(2 * subject.interval) + assert wait_task_2.done() is True diff --git a/api/tests/opentrons/hardware_control/test_simulator_setup.py b/api/tests/opentrons/hardware_control/test_simulator_setup.py index 0c23412a834..422375f1bf6 100644 --- a/api/tests/opentrons/hardware_control/test_simulator_setup.py +++ b/api/tests/opentrons/hardware_control/test_simulator_setup.py @@ -61,7 +61,7 @@ async def test_with_magdeck(setup_klass: Type[simulator_setup.SimulatorSetup]) - ) simulator = await simulator_setup.create_simulator(setup) - assert type(simulator.attached_modules[0]) == MagDeck + assert isinstance(simulator.attached_modules[0], MagDeck) assert simulator.attached_modules[0].live_data == { "data": {"engaged": True, "height": 3}, "status": "engaged", @@ -89,7 +89,7 @@ async def test_with_thermocycler( ) simulator = await simulator_setup.create_simulator(setup) - assert type(simulator.attached_modules[0]) == Thermocycler + assert isinstance(simulator.attached_modules[0], Thermocycler) assert simulator.attached_modules[0].live_data == { "data": { "currentCycleIndex": None, @@ -125,7 +125,7 @@ async def test_with_tempdeck(setup_klass: Type[simulator_setup.SimulatorSetup]) ) simulator = await simulator_setup.create_simulator(setup) - assert type(simulator.attached_modules[0]) == TempDeck + assert isinstance(simulator.attached_modules[0], TempDeck) assert simulator.attached_modules[0].live_data == { "data": {"currentTemp": 23, "targetTemp": 23}, "status": "holding at target", diff --git a/api/tests/opentrons/motion_planning/test_adjacent_slots_getters.py b/api/tests/opentrons/motion_planning/test_adjacent_slots_getters.py index 6e53002d332..09805e93ca8 100644 --- a/api/tests/opentrons/motion_planning/test_adjacent_slots_getters.py +++ b/api/tests/opentrons/motion_planning/test_adjacent_slots_getters.py @@ -2,6 +2,9 @@ import pytest from typing import List, Optional +from opentrons_shared_data.robot.dev_types import RobotType + +from opentrons.types import DeckSlotName, StagingSlotName from opentrons.motion_planning.adjacent_slots_getters import ( get_east_slot, get_south_slot, @@ -10,6 +13,10 @@ get_east_west_slots, get_north_south_slots, get_adjacent_slots, + get_west_of_staging_slot, + get_adjacent_staging_slot, + _MixedTypeSlots, + get_surrounding_slots, ) @@ -91,3 +98,112 @@ def test_get_north_south_slots( def test_get_adjacent_slots(slot: int, expected_adjacent: List[int]) -> None: """It should return a list of adjacent slots.""" assert sorted(get_adjacent_slots(slot)) == sorted(expected_adjacent) + + +@pytest.mark.parametrize( + argnames=["slot", "expected_adjacent"], + argvalues=[ + (StagingSlotName.SLOT_A4, DeckSlotName.SLOT_A3), + (StagingSlotName.SLOT_B4, DeckSlotName.SLOT_B3), + (StagingSlotName.SLOT_C4, DeckSlotName.SLOT_C3), + (StagingSlotName.SLOT_D4, DeckSlotName.SLOT_D3), + ], +) +def test_get_west_of_staging_slot( + slot: StagingSlotName, expected_adjacent: DeckSlotName +) -> None: + """It should find the slot directly west of a staging slot.""" + assert get_west_of_staging_slot(slot) == expected_adjacent + + +@pytest.mark.parametrize( + argnames=["slot", "expected_adjacent"], + argvalues=[ + (DeckSlotName.SLOT_A3, StagingSlotName.SLOT_A4), + (DeckSlotName.SLOT_B3, StagingSlotName.SLOT_B4), + (DeckSlotName.SLOT_C3, StagingSlotName.SLOT_C4), + (DeckSlotName.SLOT_D3, StagingSlotName.SLOT_D4), + (DeckSlotName.SLOT_D1, None), + (DeckSlotName.SLOT_1, None), + ], +) +def test_get_adjacent_staging_slot( + slot: DeckSlotName, expected_adjacent: Optional[StagingSlotName] +) -> None: + """It should find the adjacent slot east of a staging slot if it exists.""" + assert get_adjacent_staging_slot(slot) == expected_adjacent + + +@pytest.mark.parametrize( + argnames=["slot", "robot_type", "expected_surrounding_slots"], + argvalues=[ + ( + 2, + "OT-2 Standard", + _MixedTypeSlots( + regular_slots=[ + DeckSlotName.SLOT_3, + DeckSlotName.SLOT_1, + DeckSlotName.SLOT_5, + DeckSlotName.SLOT_6, + DeckSlotName.SLOT_4, + ], + staging_slots=[], + ), + ), + ( + 6, + "OT-2 Standard", + _MixedTypeSlots( + regular_slots=[ + DeckSlotName.SLOT_5, + DeckSlotName.SLOT_9, + DeckSlotName.SLOT_3, + DeckSlotName.SLOT_8, + DeckSlotName.SLOT_2, + ], + staging_slots=[], + ), + ), + ( + 6, + "OT-3 Standard", + _MixedTypeSlots( + regular_slots=[ + DeckSlotName.SLOT_C2, + DeckSlotName.SLOT_B3, + DeckSlotName.SLOT_D3, + DeckSlotName.SLOT_B2, + DeckSlotName.SLOT_D2, + ], + staging_slots=[ + StagingSlotName.SLOT_B4, + StagingSlotName.SLOT_C4, + StagingSlotName.SLOT_D4, + ], + ), + ), + ( + 10, + "OT-3 Standard", + _MixedTypeSlots( + regular_slots=[ + DeckSlotName.SLOT_A2, + DeckSlotName.SLOT_B1, + DeckSlotName.SLOT_B2, + ], + staging_slots=[], + ), + ), + ], +) +def test_get_surrounding_slots( + slot: int, + robot_type: RobotType, + expected_surrounding_slots: _MixedTypeSlots, +) -> None: + """It should get the list of surrounding slots appropriate for the robot type.""" + assert ( + get_surrounding_slots(slot=slot, robot_type=robot_type) + == expected_surrounding_slots + ) diff --git a/api/tests/opentrons/motion_planning/test_deck_conflict.py b/api/tests/opentrons/motion_planning/test_deck_conflict.py index f0dfbe6eea7..72fc9f247c7 100644 --- a/api/tests/opentrons/motion_planning/test_deck_conflict.py +++ b/api/tests/opentrons/motion_planning/test_deck_conflict.py @@ -9,12 +9,16 @@ from opentrons.motion_planning import deck_conflict -from opentrons.types import DeckSlotName +from opentrons.types import DeckSlotName, StagingSlotName @pytest.mark.parametrize( "robot_type, slot_name", - [("OT-2 Standard", DeckSlotName.SLOT_1), ("OT-3 Standard", DeckSlotName.SLOT_A1)], + [ + ("OT-2 Standard", DeckSlotName.SLOT_1), + ("OT-3 Standard", DeckSlotName.SLOT_A1), + ("OT-3 Standard", DeckSlotName.SLOT_A3), + ], ) def test_empty_no_conflict(robot_type: RobotType, slot_name: DeckSlotName) -> None: """It should not raise on empty input.""" @@ -30,142 +34,34 @@ def test_empty_no_conflict(robot_type: RobotType, slot_name: DeckSlotName) -> No @pytest.mark.parametrize( "robot_type, slot_name", - [("OT-2 Standard", DeckSlotName.SLOT_1), ("OT-3 Standard", DeckSlotName.SLOT_A1)], -) -def test_no_multiple_locations(robot_type: RobotType, slot_name: DeckSlotName) -> None: - """It should not allow two items in the same slot.""" - item_1 = deck_conflict.OtherModule( - highest_z_including_labware=123, name_for_errors="some_item_1" - ) - item_2 = deck_conflict.OtherModule( - highest_z_including_labware=123, name_for_errors="some_item_2" - ) - - with pytest.raises( - deck_conflict.DeckConflictError, - match=f"some_item_1 in slot {slot_name} prevents some_item_2 from using slot {slot_name}", - ): - deck_conflict.check( - existing_items={slot_name: item_1}, - new_item=item_2, - new_location=slot_name, - robot_type=robot_type, - ) - - -@pytest.mark.parametrize( - "slot_name, robot_type", [ - (DeckSlotName.FIXED_TRASH, "OT-2 Standard"), - (DeckSlotName.SLOT_A3, "OT-3 Standard"), + ("OT-2 Standard", DeckSlotName.SLOT_1), + ("OT-3 Standard", DeckSlotName.SLOT_A1), + ("OT-3 Standard", StagingSlotName.SLOT_A4), ], ) -def test_only_trash_in_fixed_slot( - slot_name: DeckSlotName, robot_type: RobotType -) -> None: - """It should only allow trash labware in slot 12.""" - trash_labware = deck_conflict.Labware( - uri=LabwareUri("trash_labware_uri"), - highest_z=123, - is_fixed_trash=True, - name_for_errors="trash_labware", - ) - not_trash_labware = deck_conflict.Labware( - uri=LabwareUri("not_trash_labware_uri"), +def test_no_multiple_locations(robot_type: RobotType, slot_name: DeckSlotName) -> None: + """It should not allow two items in the same slot.""" + item_1 = deck_conflict.Labware( + uri=LabwareUri("some_labware_uri"), highest_z=123, is_fixed_trash=False, - name_for_errors="not_trash_labware", - ) - not_trash_module = deck_conflict.OtherModule( - highest_z_including_labware=123, name_for_errors="not_trash_module" - ) - - deck_conflict.check( - existing_items={}, - new_item=trash_labware, - new_location=slot_name, - robot_type=robot_type, - ) - - with pytest.raises( - deck_conflict.DeckConflictError, - match=f"Only fixed-trash is allowed in slot {slot_name}", - ): - deck_conflict.check( - existing_items={}, - new_item=not_trash_labware, - new_location=slot_name, - robot_type=robot_type, - ) - - with pytest.raises( - deck_conflict.DeckConflictError, - match=f"Only fixed-trash is allowed in slot {slot_name}", - ): - deck_conflict.check( - existing_items={}, - new_item=not_trash_module, - new_location=slot_name, - robot_type=robot_type, - ) - - -@pytest.mark.parametrize( - "slot_name, robot_type", - [ - (DeckSlotName.FIXED_TRASH, "OT-2 Standard"), - (DeckSlotName.SLOT_A3, "OT-3 Standard"), - ], -) -def test_trash_override(slot_name: DeckSlotName, robot_type: RobotType) -> None: - """It should allow the trash labware to be replaced with another trash labware.""" - trash_labware_1 = deck_conflict.Labware( - uri=LabwareUri("trash_labware_1_uri"), - highest_z=123, - is_fixed_trash=True, - name_for_errors="trash_labware_1", - ) - trash_labware_2 = deck_conflict.Labware( - uri=LabwareUri("trash_labware_2_uri"), - highest_z=123, - is_fixed_trash=True, - name_for_errors="trash_labware_2", + name_for_errors="some_item_1", ) - not_trash_labware = deck_conflict.Labware( - uri=LabwareUri("not_trash_labware_uri"), + item_2 = deck_conflict.Labware( + uri=LabwareUri("some_labware_uri"), highest_z=123, is_fixed_trash=False, - name_for_errors="not_trash_labware", - ) - not_trash_module = deck_conflict.OtherModule( - highest_z_including_labware=123, name_for_errors="not_trash_module" - ) - - deck_conflict.check( - existing_items={slot_name: trash_labware_1}, - new_item=trash_labware_2, - new_location=slot_name, - robot_type=robot_type, + name_for_errors="some_item_2", ) with pytest.raises( deck_conflict.DeckConflictError, - match=f"Only fixed-trash is allowed in slot {slot_name}", - ): - deck_conflict.check( - existing_items={slot_name: trash_labware_1}, - new_item=not_trash_labware, - new_location=slot_name, - robot_type=robot_type, - ) - - with pytest.raises( - deck_conflict.DeckConflictError, - match=f"Only fixed-trash is allowed in slot {slot_name}", + match=f"some_item_1 in slot {slot_name} prevents some_item_2 from using slot {slot_name}", ): deck_conflict.check( - existing_items={slot_name: trash_labware_1}, - new_item=not_trash_module, + existing_items={slot_name: item_1}, + new_item=item_2, new_location=slot_name, robot_type=robot_type, ) @@ -311,6 +207,41 @@ def test_flex_labware_when_thermocycler( ) +def test_flex_trash_bin_blocks_thermocycler() -> None: + """It should prevent loading a thermocycler when there is a trash in A1 and vice-versa.""" + thermocycler = deck_conflict.ThermocyclerModule( + name_for_errors="some_thermocycler", + highest_z_including_labware=123, + is_semi_configuration=False, + ) + trash = deck_conflict.TrashBin(name_for_errors="some_trash_bin") + + with pytest.raises( + deck_conflict.DeckConflictError, + match=( + "some_trash_bin in slot A1 prevents some_thermocycler from using slot B1" + ), + ): + deck_conflict.check( + existing_items={DeckSlotName.SLOT_A1: trash}, + new_item=thermocycler, + new_location=DeckSlotName.SLOT_B1, + robot_type="OT-3 Standard", + ) + with pytest.raises( + deck_conflict.DeckConflictError, + match=( + "some_thermocycler in slot B1 prevents some_trash_bin from using slot A1" + ), + ): + deck_conflict.check( + existing_items={DeckSlotName.SLOT_B1: thermocycler}, + new_item=trash, + new_location=DeckSlotName.SLOT_A1, + robot_type="OT-3 Standard", + ) + + @pytest.mark.parametrize( ("heater_shaker_location", "labware_location"), [ @@ -598,3 +529,118 @@ def test_no_heater_shaker_south_of_trash() -> None: new_location=DeckSlotName.SLOT_9, robot_type="OT-2 Standard", ) + + +def test_heater_shaker_restrictions_trash_bin_addressable_area() -> None: + """It should prevent loading a Heater-Shaker adjacent of a non-labware trash bin. + + This is for the OT-2 only and for slot 11 and slot 9 + """ + heater_shaker = deck_conflict.HeaterShakerModule( + highest_z_including_labware=123, name_for_errors="some_heater_shaker" + ) + trash = deck_conflict.TrashBin(name_for_errors="some_trash_bin") + + with pytest.raises( + deck_conflict.DeckConflictError, + match=( + "some_trash_bin in slot 12" " prevents some_heater_shaker from using slot 9" + ), + ): + deck_conflict.check( + existing_items={DeckSlotName.FIXED_TRASH: trash}, + new_item=heater_shaker, + new_location=DeckSlotName.SLOT_9, + robot_type="OT-2 Standard", + ) + with pytest.raises( + deck_conflict.DeckConflictError, + match=( + "some_trash_bin in slot 12" + " prevents some_heater_shaker from using slot 11" + ), + ): + deck_conflict.check( + existing_items={DeckSlotName.FIXED_TRASH: trash}, + new_item=heater_shaker, + new_location=DeckSlotName.SLOT_11, + robot_type="OT-2 Standard", + ) + + +@pytest.mark.parametrize( + ("deck_slot_name", "adjacent_staging_slot", "non_adjacent_staging_slot"), + [ + (DeckSlotName.SLOT_A3, StagingSlotName.SLOT_A4, StagingSlotName.SLOT_B4), + (DeckSlotName.SLOT_B3, StagingSlotName.SLOT_B4, StagingSlotName.SLOT_C4), + (DeckSlotName.SLOT_C3, StagingSlotName.SLOT_C4, StagingSlotName.SLOT_D4), + (DeckSlotName.SLOT_D3, StagingSlotName.SLOT_D4, StagingSlotName.SLOT_A4), + ], +) +def test_no_staging_slot_adjacent_to_module( + deck_slot_name: DeckSlotName, + adjacent_staging_slot: StagingSlotName, + non_adjacent_staging_slot: StagingSlotName, +) -> None: + """It should raise if certain modules are placed adjacent to labware on a staging slot.""" + staging_slot_labware = deck_conflict.Labware( + uri=LabwareUri("some_labware_uri"), + highest_z=123, + is_fixed_trash=False, + name_for_errors="some_labware", + ) + heater_shaker = deck_conflict.HeaterShakerModule( + name_for_errors="some_heater_shaker", + highest_z_including_labware=123, + ) + with pytest.raises( + deck_conflict.DeckConflictError, + match=( + f"some_labware in slot {adjacent_staging_slot}" + f" prevents some_heater_shaker from using slot {deck_slot_name}" + ), + ): + deck_conflict.check( + existing_items={adjacent_staging_slot: staging_slot_labware}, + new_item=heater_shaker, + new_location=deck_slot_name, + robot_type="OT-3 Standard", + ) + + # Non-adjacent staging slot passes + deck_conflict.check( + existing_items={non_adjacent_staging_slot: staging_slot_labware}, + new_item=heater_shaker, + new_location=deck_slot_name, + robot_type="OT-3 Standard", + ) + + other_module = deck_conflict.OtherModule( + name_for_errors="some_other_module", + highest_z_including_labware=123, + ) + with pytest.raises( + deck_conflict.DeckConflictError, + match=( + f"some_other_module in slot {deck_slot_name}" + f" prevents some_labware from using slot {adjacent_staging_slot}" + ), + ): + deck_conflict.check( + existing_items={deck_slot_name: other_module}, + new_item=staging_slot_labware, + new_location=adjacent_staging_slot, + robot_type="OT-3 Standard", + ) + + # Magnetic block is allowed + magnetic_block = deck_conflict.MagneticBlockModule( + name_for_errors="some_mag_block", + highest_z_including_labware=123, + ) + deck_conflict.check( + existing_items={adjacent_staging_slot: staging_slot_labware}, + new_item=magnetic_block, + new_location=deck_slot_name, + robot_type="OT-3 Standard", + ) diff --git a/api/tests/opentrons/motion_planning/test_waypoints.py b/api/tests/opentrons/motion_planning/test_waypoints.py index 4930d9a1e70..7f3fa2c91e6 100644 --- a/api/tests/opentrons/motion_planning/test_waypoints.py +++ b/api/tests/opentrons/motion_planning/test_waypoints.py @@ -275,18 +275,49 @@ def test_get_gripper_labware_movement_waypoints() -> None: pickUpOffset=LabwareOffsetVector(x=-1, y=-2, z=-3), dropOffset=LabwareOffsetVector(x=1, y=2, z=3), ), + post_drop_slide_offset=None, ) assert result == [ # move to above "from" slot - GripperMovementWaypointsWithJawStatus(Point(100, 100, 999), False), + GripperMovementWaypointsWithJawStatus(Point(100, 100, 999), False, False), # with jaw open, move to labware on "from" slot - GripperMovementWaypointsWithJawStatus(Point(100, 100, 116.5), True), + GripperMovementWaypointsWithJawStatus(Point(100, 100, 116.5), True, False), # grip labware and retract in place - GripperMovementWaypointsWithJawStatus(Point(100, 100, 999), False), + GripperMovementWaypointsWithJawStatus(Point(100, 100, 999), False, False), # with labware gripped, move to above "to" slot - GripperMovementWaypointsWithJawStatus(Point(202.0, 204.0, 999), False), + GripperMovementWaypointsWithJawStatus(Point(202.0, 204.0, 999), False, False), # with labware gripped, move down to labware drop height on "to" slot - GripperMovementWaypointsWithJawStatus(Point(202.0, 204.0, 222.5), False), + GripperMovementWaypointsWithJawStatus(Point(202.0, 204.0, 222.5), False, False), # ungrip labware and retract in place - GripperMovementWaypointsWithJawStatus(Point(202.0, 204.0, 999), True), + GripperMovementWaypointsWithJawStatus(Point(202.0, 204.0, 999), True, True), + ] + + +def test_get_gripper_labware_movement_waypoint_with_slide() -> None: + """It should get the correct waypoints for gripper movement.""" + result = get_gripper_labware_movement_waypoints( + from_labware_center=Point(101, 102, 119.5), + to_labware_center=Point(201, 202, 219.5), + gripper_home_z=999, + offset_data=LabwareMovementOffsetData( + pickUpOffset=LabwareOffsetVector(x=-1, y=-2, z=-3), + dropOffset=LabwareOffsetVector(x=1, y=2, z=3), + ), + post_drop_slide_offset=Point(x=10, y=10, z=1), + ) + assert result == [ + # move to above "from" slot + GripperMovementWaypointsWithJawStatus(Point(100, 100, 999), False, False), + # with jaw open, move to labware on "from" slot + GripperMovementWaypointsWithJawStatus(Point(100, 100, 116.5), True, False), + # grip labware and retract in place + GripperMovementWaypointsWithJawStatus(Point(100, 100, 999), False, False), + # with labware gripped, move to above "to" slot + GripperMovementWaypointsWithJawStatus(Point(202.0, 204.0, 999), False, False), + # with labware gripped, move down to labware drop height on "to" slot + GripperMovementWaypointsWithJawStatus(Point(202.0, 204.0, 222.5), False, False), + # ungrip labware and retract in place + GripperMovementWaypointsWithJawStatus(Point(202.0, 204.0, 999), True, True), + # slide after ungripping + GripperMovementWaypointsWithJawStatus(Point(212.0, 214.0, 1000), True, False), ] diff --git a/api/tests/opentrons/protocol_api/core/engine/test_deck_conflict.py b/api/tests/opentrons/protocol_api/core/engine/test_deck_conflict.py index 6d682b3e9a5..7d4d7c6f10e 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_deck_conflict.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_deck_conflict.py @@ -1,18 +1,59 @@ """Unit tests for the deck_conflict module.""" - -from decoy import Decoy import pytest - +from typing import ContextManager, Any, NamedTuple, List, Tuple +from decoy import Decoy +from contextlib import nullcontext as does_not_raise from opentrons_shared_data.labware.dev_types import LabwareUri from opentrons_shared_data.robot.dev_types import RobotType +from opentrons.hardware_control.nozzle_manager import NozzleConfigurationType from opentrons.motion_planning import deck_conflict as wrapped_deck_conflict +from opentrons.motion_planning import adjacent_slots_getters +from opentrons.motion_planning.adjacent_slots_getters import _MixedTypeSlots +from opentrons.protocol_api._trash_bin import TrashBin +from opentrons.protocol_api._waste_chute import WasteChute +from opentrons.protocol_api.labware import Labware from opentrons.protocol_api.core.engine import deck_conflict -from opentrons.protocol_engine import Config, DeckSlotLocation, ModuleModel, StateView +from opentrons.protocol_engine import ( + Config, + DeckSlotLocation, + ModuleModel, + StateView, +) from opentrons.protocol_engine.errors import LabwareNotLoadedOnModuleError -from opentrons.types import DeckSlotName +from opentrons.types import DeckSlotName, Point, StagingSlotName -from opentrons.protocol_engine.types import DeckType +from opentrons.protocol_engine.types import ( + DeckType, + LoadedLabware, + LoadedModule, + WellLocation, + WellOrigin, + WellOffset, + OnDeckLabwareLocation, + OnLabwareLocation, + Dimensions, + StagingSlotLocation, +) + + +@pytest.fixture(autouse=True) +def patch_slot_getters(decoy: Decoy, monkeypatch: pytest.MonkeyPatch) -> None: + """Mock out adjacent_slots_getters functions.""" + mock_get_surrounding_slots = decoy.mock( + func=adjacent_slots_getters.get_surrounding_slots + ) + mock_get_surrounding_staging_slots = decoy.mock( + func=adjacent_slots_getters.get_surrounding_staging_slots + ) + monkeypatch.setattr( + adjacent_slots_getters, "get_surrounding_slots", mock_get_surrounding_slots + ) + monkeypatch.setattr( + adjacent_slots_getters, + "get_surrounding_staging_slots", + mock_get_surrounding_staging_slots, + ) @pytest.fixture(autouse=True) @@ -70,6 +111,7 @@ def test_maps_labware_on_deck(decoy: Decoy, mock_state_view: StateView) -> None: engine_state=mock_state_view, existing_labware_ids=["labware-id"], existing_module_ids=[], + existing_disposal_locations=[], new_labware_id="labware-id", ) decoy.verify( @@ -124,6 +166,7 @@ def test_maps_module_without_labware(decoy: Decoy, mock_state_view: StateView) - engine_state=mock_state_view, existing_labware_ids=[], existing_module_ids=["module-id"], + existing_disposal_locations=[], new_module_id="module-id", ) decoy.verify( @@ -177,6 +220,7 @@ def test_maps_module_with_labware(decoy: Decoy, mock_state_view: StateView) -> N engine_state=mock_state_view, existing_labware_ids=[], existing_module_ids=["module-id"], + existing_disposal_locations=[], new_module_id="module-id", ) decoy.verify( @@ -217,6 +261,11 @@ def get_expected_mapping_result() -> wrapped_deck_conflict.DeckItem: name_for_errors=expected_name_for_errors, highest_z_including_labware=3.14159, ) + elif module_model is ModuleModel.MAGNETIC_BLOCK_V1: + return wrapped_deck_conflict.MagneticBlockModule( + name_for_errors=expected_name_for_errors, + highest_z_including_labware=3.14159, + ) elif ( module_model is ModuleModel.THERMOCYCLER_MODULE_V1 or module_model is ModuleModel.THERMOCYCLER_MODULE_V2 @@ -255,6 +304,7 @@ def get_expected_mapping_result() -> wrapped_deck_conflict.DeckItem: engine_state=mock_state_view, existing_labware_ids=[], existing_module_ids=[], + existing_disposal_locations=[], new_module_id="module-id", ) decoy.verify( @@ -265,3 +315,409 @@ def get_expected_mapping_result() -> wrapped_deck_conflict.DeckItem: robot_type=mock_state_view.config.robot_type, ) ) + + +@pytest.mark.parametrize( + ("robot_type", "deck_type"), + [ + ("OT-2 Standard", DeckType.OT2_STANDARD), + ("OT-3 Standard", DeckType.OT3_STANDARD), + ], +) +def test_maps_trash_bins(decoy: Decoy, mock_state_view: StateView) -> None: + """It should correctly map disposal locations.""" + mock_trash_lw = decoy.mock(cls=Labware) + + deck_conflict.check( + engine_state=mock_state_view, + existing_labware_ids=[], + existing_module_ids=[], + existing_disposal_locations=[ + TrashBin(location=DeckSlotName.SLOT_B1, addressable_area_name="blah"), + WasteChute(), + mock_trash_lw, + ], + new_trash_bin=TrashBin( + location=DeckSlotName.SLOT_A1, addressable_area_name="blah" + ), + ) + decoy.verify( + wrapped_deck_conflict.check( + existing_items={ + DeckSlotName.SLOT_B1: wrapped_deck_conflict.TrashBin( + name_for_errors="trash bin", + ) + }, + new_item=wrapped_deck_conflict.TrashBin( + name_for_errors="trash bin", + ), + new_location=DeckSlotName.SLOT_A1, + robot_type=mock_state_view.config.robot_type, + ) + ) + + +plate = LoadedLabware( + id="plate-id", + loadName="plate-load-name", + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_C1), + definitionUri="some-plate-uri", + offsetId=None, + displayName="Fancy Plate Name", +) + +module = LoadedModule( + id="module-id", + model=ModuleModel.TEMPERATURE_MODULE_V1, + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_C1), + serialNumber="serial-number", +) + + +@pytest.mark.parametrize( + ("robot_type", "deck_type"), + [("OT-3 Standard", DeckType.OT3_STANDARD)], +) +@pytest.mark.parametrize( + ["nozzle_bounds", "expected_raise"], + [ + ( # nozzles above highest Z + ( + Point(x=50, y=150, z=60), + Point(x=150, y=50, z=60), + Point(x=150, y=150, z=60), + Point(x=50, y=50, z=60), + ), + does_not_raise(), + ), + # X, Y, Z collisions + ( + ( + Point(x=50, y=150, z=40), + Point(x=150, y=50, z=40), + Point(x=150, y=150, z=40), + Point(x=50, y=50, z=40), + ), + pytest.raises( + deck_conflict.PartialTipMovementNotAllowedError, + match="collision with items in deck slot D1", + ), + ), + ( + ( + Point(x=101, y=150, z=40), + Point(x=150, y=50, z=40), + Point(x=150, y=150, z=40), + Point(x=101, y=50, z=40), + ), + pytest.raises( + deck_conflict.PartialTipMovementNotAllowedError, + match="collision with items in deck slot D2", + ), + ), + ( # Collision with staging slot + ( + Point(x=150, y=150, z=40), + Point(x=250, y=101, z=40), + Point(x=150, y=101, z=40), + Point(x=250, y=150, z=40), + ), + pytest.raises( + deck_conflict.PartialTipMovementNotAllowedError, + match="collision with items in deck slot C4", + ), + ), + ], +) +def test_deck_conflict_raises_for_bad_pipette_move( + decoy: Decoy, + mock_state_view: StateView, + nozzle_bounds: Tuple[Point, Point, Point, Point], + expected_raise: ContextManager[Any], +) -> None: + """It should raise errors when moving to locations with restrictions for partial pipette movement. + + Test premise: + - we are using a pipette configured for COLUMN nozzle layout with primary nozzle A12 + - there are labware of height 50mm in C1, D1 & D2 + - we are checking for conflicts when moving to a labware in C2. + For each test case, we are moving to a different point in the destination labware, + with the same pipette and tip + """ + destination_well_point = Point(x=123, y=123, z=123) + decoy.when( + mock_state_view.pipettes.get_is_partially_configured("pipette-id") + ).then_return(True) + decoy.when(mock_state_view.pipettes.get_primary_nozzle("pipette-id")).then_return( + "A12" + ) + decoy.when( + mock_state_view.geometry.get_ancestor_slot_name("destination-labware-id") + ).then_return(DeckSlotName.SLOT_C2) + + decoy.when( + mock_state_view.geometry.get_well_position( + labware_id="destination-labware-id", + well_name="A2", + well_location=WellLocation(origin=WellOrigin.TOP, offset=WellOffset(z=10)), + ) + ).then_return(destination_well_point) + decoy.when( + mock_state_view.pipettes.get_nozzle_bounds_at_specified_move_to_position( + pipette_id="pipette-id", destination_position=destination_well_point + ) + ).then_return(nozzle_bounds) + + decoy.when( + adjacent_slots_getters.get_surrounding_slots(5, robot_type="OT-3 Standard") + ).then_return( + _MixedTypeSlots( + regular_slots=[ + DeckSlotName.SLOT_D1, + DeckSlotName.SLOT_D2, + DeckSlotName.SLOT_C1, + ], + staging_slots=[StagingSlotName.SLOT_C4], + ) + ) + decoy.when( + adjacent_slots_getters.get_surrounding_staging_slots(DeckSlotName.SLOT_C2) + ).then_return([StagingSlotName.SLOT_C4]) + + decoy.when( + mock_state_view.addressable_areas.get_addressable_area_position( + addressable_area_name="C1", do_compatibility_check=False + ) + ).then_return(Point(0, 100, 0)) + decoy.when( + mock_state_view.addressable_areas.get_addressable_area_position( + addressable_area_name="D1", do_compatibility_check=False + ) + ).then_return(Point(0, 0, 0)) + decoy.when( + mock_state_view.addressable_areas.get_addressable_area_position( + addressable_area_name="D2", do_compatibility_check=False + ) + ).then_return(Point(100, 0, 0)) + decoy.when( + mock_state_view.addressable_areas.get_addressable_area_position( + addressable_area_name="C4", do_compatibility_check=False + ) + ).then_return(Point(200, 100, 0)) + decoy.when( + mock_state_view.addressable_areas.get_addressable_area_bounding_box( + addressable_area_name="C4", do_compatibility_check=False + ) + ).then_return(Dimensions(90, 90, 0)) + decoy.when( + mock_state_view.geometry.get_highest_z_in_slot( + StagingSlotLocation(slotName=StagingSlotName.SLOT_C4) + ) + ).then_return(50) + for slot_name in [DeckSlotName.SLOT_C1, DeckSlotName.SLOT_D1, DeckSlotName.SLOT_D2]: + decoy.when( + mock_state_view.geometry.get_highest_z_in_slot( + DeckSlotLocation(slotName=slot_name) + ) + ).then_return(50) + decoy.when( + mock_state_view.addressable_areas.get_addressable_area_bounding_box( + addressable_area_name=slot_name.id, do_compatibility_check=False + ) + ).then_return(Dimensions(90, 90, 0)) + + with expected_raise: + deck_conflict.check_safe_for_pipette_movement( + engine_state=mock_state_view, + pipette_id="pipette-id", + labware_id="destination-labware-id", + well_name="A2", + well_location=WellLocation(origin=WellOrigin.TOP, offset=WellOffset(z=10)), + ) + + +@pytest.mark.parametrize( + ("robot_type", "deck_type"), + [("OT-3 Standard", DeckType.OT3_STANDARD)], +) +@pytest.mark.parametrize( + ["destination_well_point", "expected_raise"], + [ + ( + Point(x=-12, y=100, z=60), + pytest.raises( + deck_conflict.PartialTipMovementNotAllowedError, + match="outside of robot bounds", + ), + ), + ( + Point(x=593, y=100, z=60), + pytest.raises( + deck_conflict.PartialTipMovementNotAllowedError, + match="outside of robot bounds", + ), + ), + ( + Point(x=100, y=1, z=60), + pytest.raises( + deck_conflict.PartialTipMovementNotAllowedError, + match="outside of robot bounds", + ), + ), + ( + Point(x=100, y=507, z=60), + pytest.raises( + deck_conflict.PartialTipMovementNotAllowedError, + match="outside of robot bounds", + ), + ), + ], +) +def test_deck_conflict_raises_for_out_of_bounds_96_channel_move( + decoy: Decoy, + mock_state_view: StateView, + destination_well_point: Point, + expected_raise: ContextManager[Any], +) -> None: + """It should raise errors when moving to locations out of robot's bounds for partial tip 96-channel movement. + + Test premise: + - we are using a pipette configured for COLUMN nozzle layout with primary nozzle A12 + """ + decoy.when(mock_state_view.pipettes.get_channels("pipette-id")).then_return(96) + decoy.when( + mock_state_view.labware.get_display_name("destination-labware-id") + ).then_return("destination-labware") + decoy.when( + mock_state_view.pipettes.get_nozzle_layout_type("pipette-id") + ).then_return(NozzleConfigurationType.COLUMN) + decoy.when( + mock_state_view.pipettes.get_is_partially_configured("pipette-id") + ).then_return(True) + decoy.when(mock_state_view.pipettes.get_primary_nozzle("pipette-id")).then_return( + "A12" + ) + decoy.when( + mock_state_view.geometry.get_ancestor_slot_name("destination-labware-id") + ).then_return(DeckSlotName.SLOT_C2) + + decoy.when( + mock_state_view.geometry.get_well_position( + labware_id="destination-labware-id", + well_name="A2", + well_location=WellLocation(origin=WellOrigin.TOP, offset=WellOffset(z=10)), + ) + ).then_return(destination_well_point) + + +class PipetteMovementSpec(NamedTuple): + """Spec data to test deck_conflict.check_safe_for_tip_pickup_and_return .""" + + tiprack_parent: OnDeckLabwareLocation + tiprack_dim: Dimensions + is_on_flex_adapter: bool + is_partial_config: bool + expected_raise: ContextManager[Any] + + +pipette_movement_specs: List[PipetteMovementSpec] = [ + PipetteMovementSpec( + tiprack_parent=DeckSlotLocation(slotName=DeckSlotName.SLOT_5), + tiprack_dim=Dimensions(x=0, y=0, z=50), + is_on_flex_adapter=False, + is_partial_config=False, + expected_raise=pytest.raises( + deck_conflict.UnsuitableTiprackForPipetteMotion, + match="A cool tiprack must be on an Opentrons Flex 96 Tip Rack Adapter", + ), + ), + PipetteMovementSpec( + tiprack_parent=OnLabwareLocation(labwareId="adapter-id"), + tiprack_dim=Dimensions(x=0, y=0, z=50), + is_on_flex_adapter=True, + is_partial_config=False, + expected_raise=does_not_raise(), + ), + PipetteMovementSpec( + tiprack_parent=OnLabwareLocation(labwareId="adapter-id"), + tiprack_dim=Dimensions(x=0, y=0, z=50), + is_on_flex_adapter=False, + is_partial_config=False, + expected_raise=pytest.raises( + deck_conflict.UnsuitableTiprackForPipetteMotion, + match="A cool tiprack must be on an Opentrons Flex 96 Tip Rack Adapter", + ), + ), + PipetteMovementSpec( + tiprack_parent=OnLabwareLocation(labwareId="adapter-id"), + tiprack_dim=Dimensions(x=0, y=0, z=50), + is_on_flex_adapter=True, + is_partial_config=True, + expected_raise=pytest.raises( + deck_conflict.PartialTipMovementNotAllowedError, + match="A cool tiprack cannot be on an adapter taller than the tip rack", + ), + ), + PipetteMovementSpec( + tiprack_parent=OnLabwareLocation(labwareId="adapter-id"), + tiprack_dim=Dimensions(x=0, y=0, z=101), + is_on_flex_adapter=True, + is_partial_config=True, + expected_raise=does_not_raise(), + ), + PipetteMovementSpec( + tiprack_parent=DeckSlotLocation(slotName=DeckSlotName.SLOT_5), + tiprack_dim=Dimensions(x=0, y=0, z=50), + is_on_flex_adapter=True, # will be ignored + is_partial_config=True, + expected_raise=does_not_raise(), + ), +] + + +@pytest.mark.parametrize( + ("robot_type", "deck_type"), + [("OT-3 Standard", DeckType.OT3_STANDARD)], +) +@pytest.mark.parametrize( + argnames=PipetteMovementSpec._fields, + argvalues=pipette_movement_specs, +) +def test_valid_96_pipette_movement_for_tiprack_and_adapter( + decoy: Decoy, + mock_state_view: StateView, + tiprack_parent: OnDeckLabwareLocation, + tiprack_dim: Dimensions, + is_on_flex_adapter: bool, + is_partial_config: bool, + expected_raise: ContextManager[Any], +) -> None: + """It should raise appropriate error for unsuitable tiprack parent when moving 96 channel to it.""" + decoy.when(mock_state_view.pipettes.get_channels("pipette-id")).then_return(96) + decoy.when(mock_state_view.labware.get_dimensions("adapter-id")).then_return( + Dimensions(x=0, y=0, z=100) + ) + decoy.when(mock_state_view.labware.get_display_name("labware-id")).then_return( + "A cool tiprack" + ) + decoy.when( + mock_state_view.pipettes.get_is_partially_configured("pipette-id") + ).then_return(is_partial_config) + decoy.when(mock_state_view.labware.get_location("labware-id")).then_return( + tiprack_parent + ) + decoy.when(mock_state_view.labware.get_dimensions("labware-id")).then_return( + tiprack_dim + ) + decoy.when( + mock_state_view.labware.get_has_quirk( + labware_id="adapter-id", quirk="tiprackAdapterFor96Channel" + ) + ).then_return(is_on_flex_adapter) + + with expected_raise: + deck_conflict.check_safe_for_tip_pickup_and_return( + engine_state=mock_state_view, + pipette_id="pipette-id", + labware_id="labware-id", + ) diff --git a/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py b/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py index b53fa674ef1..eaed859b17d 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py @@ -1,5 +1,5 @@ """Test for the ProtocolEngine-based instrument API core.""" -from typing import cast +from typing import cast, Optional, Union import pytest from decoy import Decoy @@ -8,6 +8,7 @@ from opentrons.hardware_control import SyncHardwareAPI from opentrons.hardware_control.dev_types import PipetteDict +from opentrons.hardware_control.nozzle_manager import NozzleConfigurationType from opentrons.protocol_engine import ( DeckPoint, LoadedPipette, @@ -18,10 +19,26 @@ DropTipWellLocation, DropTipWellOrigin, ) +from opentrons.protocol_engine.clients.sync_client import SyncClient from opentrons.protocol_engine.errors.exceptions import TipNotAttachedError from opentrons.protocol_engine.clients import SyncClient as EngineClient -from opentrons.protocol_engine.types import FlowRates, TipGeometry -from opentrons.protocol_api.core.engine import InstrumentCore, WellCore, ProtocolCore +from opentrons.protocol_engine.types import ( + FlowRates, + TipGeometry, + NozzleLayoutConfigurationType, + RowNozzleLayoutConfiguration, + SingleNozzleLayoutConfiguration, + ColumnNozzleLayoutConfiguration, +) +from opentrons.protocol_api._nozzle_layout import NozzleLayout +from opentrons.protocol_api.core.engine import ( + InstrumentCore, + WellCore, + ProtocolCore, + deck_conflict, +) +from opentrons.protocols.api_support.definitions import MAX_SUPPORTED_VERSION +from opentrons.protocols.api_support.types import APIVersion from opentrons.types import Location, Mount, MountType, Point @@ -43,6 +60,15 @@ def mock_protocol_core(decoy: Decoy) -> ProtocolCore: return decoy.mock(cls=ProtocolCore) +@pytest.fixture(autouse=True) +def patch_mock_pipette_movement_safety_check( + decoy: Decoy, monkeypatch: pytest.MonkeyPatch +) -> None: + """Replace deck_conflict.check() with a mock.""" + mock = decoy.mock(func=deck_conflict.check_safe_for_pipette_movement) + monkeypatch.setattr(deck_conflict, "check_safe_for_pipette_movement", mock) + + @pytest.fixture def subject( decoy: Decoy, @@ -230,6 +256,20 @@ def test_pick_up_tip( ) decoy.verify( + deck_conflict.check_safe_for_tip_pickup_and_return( + engine_state=mock_engine_client.state, + pipette_id="abc123", + labware_id="labware-id", + ), + deck_conflict.check_safe_for_pipette_movement( + engine_state=mock_engine_client.state, + pipette_id="abc123", + labware_id="labware-id", + well_name="well-name", + well_location=WellLocation( + origin=WellOrigin.TOP, offset=WellOffset(x=3, y=2, z=1) + ), + ), mock_engine_client.pick_up_tip( pipette_id="abc123", labware_id="labware-id", @@ -268,6 +308,16 @@ def test_drop_tip_no_location( subject.drop_tip(location=None, well_core=well_core, home_after=True) decoy.verify( + deck_conflict.check_safe_for_pipette_movement( + engine_state=mock_engine_client.state, + pipette_id="abc123", + labware_id="labware-id", + well_name="well-name", + well_location=DropTipWellLocation( + origin=DropTipWellOrigin.DEFAULT, + offset=WellOffset(x=0, y=0, z=0), + ), + ), mock_engine_client.drop_tip( pipette_id="abc123", labware_id="labware-id", @@ -279,7 +329,6 @@ def test_drop_tip_no_location( home_after=True, alternateDropLocation=False, ), - times=1, ) @@ -301,10 +350,27 @@ def test_drop_tip_with_location( absolute_point=Point(1, 2, 3), ) ).then_return(WellLocation(origin=WellOrigin.TOP, offset=WellOffset(x=3, y=2, z=1))) + decoy.when(mock_engine_client.state.labware.is_tiprack("labware-id")).then_return( + True + ) subject.drop_tip(location=location, well_core=well_core, home_after=True) decoy.verify( + deck_conflict.check_safe_for_tip_pickup_and_return( + engine_state=mock_engine_client.state, + pipette_id="abc123", + labware_id="labware-id", + ), + deck_conflict.check_safe_for_pipette_movement( + engine_state=mock_engine_client.state, + pipette_id="abc123", + labware_id="labware-id", + well_name="well-name", + well_location=DropTipWellLocation( + origin=DropTipWellOrigin.TOP, offset=WellOffset(x=3, y=2, z=1) + ), + ), mock_engine_client.drop_tip( pipette_id="abc123", labware_id="labware-id", @@ -315,7 +381,6 @@ def test_drop_tip_with_location( home_after=True, alternateDropLocation=False, ), - times=1, ) @@ -348,6 +413,15 @@ def test_aspirate_from_well( ) decoy.verify( + deck_conflict.check_safe_for_pipette_movement( + engine_state=mock_engine_client.state, + pipette_id="abc123", + labware_id="123abc", + well_name="my cool well", + well_location=WellLocation( + origin=WellOrigin.TOP, offset=WellOffset(x=3, y=2, z=1) + ), + ), mock_engine_client.aspirate( pipette_id="abc123", labware_id="123abc", @@ -445,6 +519,15 @@ def test_blow_out_to_well( subject.blow_out(location=location, well_core=well_core, in_place=False) decoy.verify( + deck_conflict.check_safe_for_pipette_movement( + engine_state=mock_engine_client.state, + pipette_id="abc123", + labware_id="123abc", + well_name="my cool well", + well_location=WellLocation( + origin=WellOrigin.TOP, offset=WellOffset(x=3, y=2, z=1) + ), + ), mock_engine_client.blow_out( pipette_id="abc123", labware_id="123abc", @@ -520,6 +603,8 @@ def test_dispense_to_well( name="my cool well", labware_id="123abc", engine_client=mock_engine_client ) + decoy.when(mock_protocol_core.api_version).then_return(MAX_SUPPORTED_VERSION) + decoy.when( mock_engine_client.state.geometry.get_relative_well_location( labware_id="123abc", well_name="my cool well", absolute_point=Point(1, 2, 3) @@ -537,6 +622,15 @@ def test_dispense_to_well( ) decoy.verify( + deck_conflict.check_safe_for_pipette_movement( + engine_state=mock_engine_client.state, + pipette_id="abc123", + labware_id="123abc", + well_name="my cool well", + well_location=WellLocation( + origin=WellOrigin.TOP, offset=WellOffset(x=3, y=2, z=1) + ), + ), mock_engine_client.dispense( pipette_id="abc123", labware_id="123abc", @@ -559,6 +653,7 @@ def test_dispense_in_place( subject: InstrumentCore, ) -> None: """It should dispense in place.""" + decoy.when(mock_protocol_core.api_version).then_return(MAX_SUPPORTED_VERSION) location = Location(point=Point(1, 2, 3), labware=None) subject.dispense( volume=12.34, @@ -584,6 +679,7 @@ def test_dispense_to_coordinates( subject: InstrumentCore, ) -> None: """It should dispense in place.""" + decoy.when(mock_protocol_core.api_version).then_return(MAX_SUPPORTED_VERSION) location = Location(point=Point(1, 2, 3), labware=None) subject.dispense( volume=12.34, @@ -609,6 +705,51 @@ def test_dispense_to_coordinates( ) +@pytest.mark.parametrize( + ("api_version", "expect_clampage"), + [(APIVersion(2, 16), True), (APIVersion(2, 17), False)], +) +def test_dispense_conditionally_clamps_volume( + api_version: APIVersion, + expect_clampage: bool, + decoy: Decoy, + subject: InstrumentCore, + mock_protocol_core: ProtocolCore, + mock_engine_client: SyncClient, +) -> None: + """It should clamp the dispensed volume to the available volume on older API versions.""" + decoy.when(mock_protocol_core.api_version).then_return(api_version) + decoy.when( + mock_engine_client.state.pipettes.get_aspirated_volume(subject.pipette_id) + ).then_return(111.111) + + subject.dispense( + volume=99999999.99999999, + rate=5.6, + flow_rate=7.8, + well_core=None, + location=Location(point=Point(1, 2, 3), labware=None), + in_place=True, + push_out=None, + ) + + if expect_clampage: + decoy.verify( + mock_engine_client.dispense_in_place( + pipette_id="abc123", volume=111.111, flow_rate=7.8, push_out=None + ), + ) + else: + decoy.verify( + mock_engine_client.dispense_in_place( + pipette_id="abc123", + volume=99999999.99999999, + flow_rate=7.8, + push_out=None, + ), + ) + + def test_initialization_sets_default_movement_speed( decoy: Decoy, subject: InstrumentCore, @@ -849,6 +990,15 @@ def test_touch_tip( ) decoy.verify( + deck_conflict.check_safe_for_pipette_movement( + engine_state=mock_engine_client.state, + pipette_id="abc123", + labware_id="123abc", + well_name="my cool well", + well_location=WellLocation( + origin=WellOrigin.TOP, offset=WellOffset(x=0, y=0, z=4.56) + ), + ), mock_engine_client.touch_tip( pipette_id="abc123", labware_id="123abc", @@ -874,3 +1024,82 @@ def test_has_tip( ).then_return(TipGeometry(length=1, diameter=2, volume=3)) assert subject.has_tip() is True + + +@pytest.mark.parametrize( + argnames=["style", "primary_nozzle", "front_right_nozzle", "expected_model"], + argvalues=[ + [ + NozzleLayout.COLUMN, + "A1", + "H1", + ColumnNozzleLayoutConfiguration(primaryNozzle="A1"), + ], + [ + NozzleLayout.SINGLE, + "H12", + None, + SingleNozzleLayoutConfiguration(primaryNozzle="H12"), + ], + [ + NozzleLayout.ROW, + "A12", + None, + RowNozzleLayoutConfiguration(primaryNozzle="A12"), + ], + ], +) +def test_configure_nozzle_layout( + decoy: Decoy, + mock_engine_client: EngineClient, + subject: InstrumentCore, + style: NozzleLayout, + primary_nozzle: Optional[str], + front_right_nozzle: Optional[str], + expected_model: NozzleLayoutConfigurationType, +) -> None: + """The correct model is passed to the engine client.""" + subject.configure_nozzle_layout(style, primary_nozzle, front_right_nozzle) + + decoy.verify( + mock_engine_client.configure_nozzle_layout(subject._pipette_id, expected_model) + ) + + +@pytest.mark.parametrize( + argnames=["pipette_channels", "nozzle_layout", "primary_nozzle", "expected_result"], + argvalues=[ + (96, NozzleConfigurationType.FULL, "A1", True), + (96, NozzleConfigurationType.FULL, None, True), + (96, NozzleConfigurationType.ROW, "A1", False), + (96, NozzleConfigurationType.COLUMN, "A1", False), + (96, NozzleConfigurationType.COLUMN, "A12", True), + (96, NozzleConfigurationType.SINGLE, "H12", False), + (96, NozzleConfigurationType.SINGLE, "A1", False), + (8, NozzleConfigurationType.FULL, "A1", True), + (8, NozzleConfigurationType.FULL, None, True), + (8, NozzleConfigurationType.SINGLE, "H1", True), + (8, NozzleConfigurationType.SINGLE, "A1", False), + (1, NozzleConfigurationType.FULL, None, True), + ], +) +def test_is_tip_tracking_available( + decoy: Decoy, + mock_engine_client: EngineClient, + subject: InstrumentCore, + pipette_channels: int, + nozzle_layout: NozzleConfigurationType, + primary_nozzle: Union[str, None], + expected_result: bool, +) -> None: + """It should return whether tip tracking is available based on nozzle configuration.""" + decoy.when( + mock_engine_client.state.tips.get_pipette_channels(subject.pipette_id) + ).then_return(pipette_channels) + decoy.when( + mock_engine_client.state.pipettes.get_nozzle_layout_type(subject.pipette_id) + ).then_return(nozzle_layout) + decoy.when( + mock_engine_client.state.pipettes.get_primary_nozzle(subject.pipette_id) + ).then_return(primary_nozzle) + assert subject.is_tip_tracking_available() == expected_result diff --git a/api/tests/opentrons/protocol_api/core/engine/test_labware_core.py b/api/tests/opentrons/protocol_api/core/engine/test_labware_core.py index cfd97644a22..5f84df6f62c 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_labware_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_labware_core.py @@ -80,6 +80,10 @@ def test_set_calibration(subject: LabwareCore) -> None: namespace="hello", parameters=LabwareDefinitionParameters.construct(loadName="world"), # type: ignore[call-arg] ordering=[], + allowedRoles=[], + stackingOffsetWithLabware={}, + stackingOffsetWithModule={}, + gripperOffsets={}, ) ], ) @@ -103,7 +107,7 @@ def test_get_definition(subject: LabwareCore) -> None: def test_get_user_display_name(decoy: Decoy, mock_engine_client: EngineClient) -> None: """It should get the labware's user-provided label, if any.""" decoy.when( - mock_engine_client.state.labware.get_display_name("cool-labware") + mock_engine_client.state.labware.get_user_specified_display_name("cool-labware") ).then_return("Cool Label") subject = LabwareCore(labware_id="cool-labware", engine_client=mock_engine_client) @@ -149,7 +153,7 @@ def test_get_name_load_name(subject: LabwareCore) -> None: def test_get_name_display_name(decoy: Decoy, mock_engine_client: EngineClient) -> None: """It should get the user display name when one is defined.""" decoy.when( - mock_engine_client.state.labware.get_display_name("cool-labware") + mock_engine_client.state.labware.get_user_specified_display_name("cool-labware") ).then_return("my cool display name") subject = LabwareCore(labware_id="cool-labware", engine_client=mock_engine_client) diff --git a/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py b/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py index 89b6d878445..a8f83d63a7e 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py @@ -3,11 +3,11 @@ from typing import Optional, Type, cast, Tuple import pytest -from pytest_lazyfixture import lazy_fixture # type: ignore[import] +from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] from decoy import Decoy from opentrons_shared_data.deck import load as load_deck -from opentrons_shared_data.deck.dev_types import DeckDefinitionV3, SlotDefV3 +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4, SlotDefV3 from opentrons_shared_data.pipette.dev_types import PipetteNameType from opentrons_shared_data.labware.dev_types import ( LabwareDefinition as LabwareDefDict, @@ -16,7 +16,7 @@ from opentrons_shared_data.labware.labware_definition import LabwareDefinition from opentrons_shared_data.robot.dev_types import RobotType -from opentrons.types import DeckSlotName, Mount, MountType, Point +from opentrons.types import DeckSlotName, StagingSlotName, Mount, MountType, Point from opentrons.protocol_api import OFF_DECK from opentrons.hardware_control import SyncHardwareAPI, SynchronousAdapter from opentrons.hardware_control.modules import AbstractModule, ModuleType @@ -33,6 +33,7 @@ DeckSlotLocation, ModuleLocation, OnLabwareLocation, + AddressableAreaLocation, ModuleDefinition, LabwareMovementStrategy, LoadedLabware, @@ -83,15 +84,15 @@ @pytest.fixture(scope="session") -def ot2_standard_deck_def() -> DeckDefinitionV3: +def ot2_standard_deck_def() -> DeckDefinitionV4: """Get the OT-2 standard deck definition.""" - return load_deck(STANDARD_OT2_DECK, 3) + return load_deck(STANDARD_OT2_DECK, 4) @pytest.fixture(scope="session") -def ot3_standard_deck_def() -> DeckDefinitionV3: +def ot3_standard_deck_def() -> DeckDefinitionV4: """Get the OT-2 standard deck definition.""" - return load_deck(STANDARD_OT3_DECK, 3) + return load_deck(STANDARD_OT3_DECK, 4) @pytest.fixture(autouse=True) @@ -144,6 +145,8 @@ def mock_sync_hardware_api(decoy: Decoy) -> SyncHardwareAPI: @pytest.fixture +# APIv2.15 because we're expecting a fixed trash. +@pytest.mark.parametrize("api_version", [APIVersion(2, 15)]) def subject( decoy: Decoy, mock_engine_client: EngineClient, @@ -167,16 +170,6 @@ def subject( ) -def _get_slot_def( - deck_def: DeckDefinitionV3, slot_name: DeckSlotName -) -> Optional[SlotDefV3]: - slots_def = deck_def["locations"]["orderedSlots"] - for slot in slots_def: - if slot["id"] == slot_name.id: - return slot - return None - - @pytest.mark.parametrize("api_version", [APIVersion(2, 3)]) def test_api_version( decoy: Decoy, subject: ProtocolCore, api_version: APIVersion @@ -185,15 +178,34 @@ def test_api_version( assert subject.api_version == api_version -# def test_get_slot_definition(ot2_standard_deck_def: DeckDefinitionV3, subject: ProtocolCore, decoy: Decoy) -> None: -# """It should return a deck slot's definition.""" -# decoy.when(subject._engine_client.state.labware.get_slot_definition(5)) -# result = subject.get_slot_definition(DeckSlotName.SLOT_6) -# -# assert result["id"] == "6" -# assert result == ot2_standard_deck_def["locations"]["orderedSlots"][5] +def test_get_slot_definition( + ot2_standard_deck_def: DeckDefinitionV4, subject: ProtocolCore, decoy: Decoy +) -> None: + """It should return a deck slot's definition.""" + expected_slot_def = cast( + SlotDefV3, + { + "id": "abc", + "position": [1, 2, 3], + "boundingBox": { + "xDimension": 4, + "yDimension": 5, + "zDimension": 6, + }, + "displayName": "xyz", + "compatibleModuleTypes": [], + }, + ) + decoy.when( + subject._engine_client.state.addressable_areas.get_slot_definition( + DeckSlotName.SLOT_6.id + ) + ).then_return(expected_slot_def) + assert subject.get_slot_definition(DeckSlotName.SLOT_6) == expected_slot_def +# APIv2.15 because we're expecting a fixed trash. +@pytest.mark.parametrize("api_version", [APIVersion(2, 15)]) def test_fixed_trash(subject: ProtocolCore) -> None: """It should have a single labware core for the fixed trash.""" result = subject.fixed_trash @@ -213,8 +225,6 @@ def test_get_slot_item_empty( decoy.when( mock_engine_client.state.geometry.get_slot_item( slot_name=DeckSlotName.SLOT_1, - allowed_labware_ids={"fixed-trash-123"}, - allowed_module_ids=set(), ) ).then_return(None) @@ -271,12 +281,6 @@ def test_load_labware( ) ).then_return(("some_namespace", 9001)) - decoy.when( - load_labware_params.resolve_loadname( - "some_labware", - ) - ).then_return("some_labware") - decoy.when( mock_engine_client.load_labware( location=DeckSlotLocation(slotName=DeckSlotName.SLOT_5), @@ -307,13 +311,14 @@ def test_load_labware( assert isinstance(result, LabwareCore) assert result.labware_id == "abc123" - assert subject.get_labware_cores() == [subject.fixed_trash, result] + assert subject.get_labware_cores() == [result] decoy.verify( deck_conflict.check( engine_state=mock_engine_client.state, - existing_labware_ids=["fixed-trash-123"], + existing_labware_ids=[], existing_module_ids=[], + existing_disposal_locations=[], new_labware_id="abc123", ) ) @@ -321,8 +326,6 @@ def test_load_labware( decoy.when( mock_engine_client.state.geometry.get_slot_item( slot_name=DeckSlotName.SLOT_5, - allowed_labware_ids={"fixed-trash-123", "abc123"}, - allowed_module_ids=set(), ) ).then_return( LoadedLabware.construct(id="abc123") # type: ignore[call-arg] @@ -331,6 +334,78 @@ def test_load_labware( assert subject.get_slot_item(DeckSlotName.SLOT_5) is result +def test_load_labware_on_staging_slot( + decoy: Decoy, + mock_engine_client: EngineClient, + subject: ProtocolCore, +) -> None: + """It should issue a LoadLabware command for a labware on a staging slot.""" + decoy.when( + mock_engine_client.state.labware.find_custom_labware_load_params() + ).then_return([EngineLabwareLoadParams("hello", "world", 654)]) + + decoy.when( + load_labware_params.resolve( + "some_labware", + "a_namespace", + 456, + [EngineLabwareLoadParams("hello", "world", 654)], + ) + ).then_return(("some_namespace", 9001)) + + decoy.when( + mock_engine_client.load_labware( + location=AddressableAreaLocation(addressableAreaName="B4"), + load_name="some_labware", + display_name="some_display_name", + namespace="some_namespace", + version=9001, + ) + ).then_return( + commands.LoadLabwareResult( + labwareId="abc123", + definition=LabwareDefinition.construct(), # type: ignore[call-arg] + offsetId=None, + ) + ) + + decoy.when(mock_engine_client.state.labware.get_definition("abc123")).then_return( + LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + ) + + result = subject.load_labware( + load_name="some_labware", + location=StagingSlotName.SLOT_B4, + label="some_display_name", # maps to optional display name + namespace="a_namespace", + version=456, + ) + + assert isinstance(result, LabwareCore) + assert result.labware_id == "abc123" + assert subject.get_labware_cores() == [result] + + decoy.verify( + deck_conflict.check( + engine_state=mock_engine_client.state, + existing_labware_ids=[], + existing_module_ids=[], + existing_disposal_locations=[], + new_labware_id="abc123", + ) + ) + + decoy.when( + mock_engine_client.state.geometry.get_slot_item( + slot_name=StagingSlotName.SLOT_B4, + ) + ).then_return( + LoadedLabware.construct(id="abc123") # type: ignore[call-arg] + ) + + assert subject.get_slot_item(StagingSlotName.SLOT_B4) is result + + def test_load_labware_on_labware( decoy: Decoy, mock_engine_client: EngineClient, @@ -344,15 +419,9 @@ def test_load_labware_on_labware( mock_engine_client.state.labware.find_custom_labware_load_params() ).then_return([EngineLabwareLoadParams("hello", "world", 654)]) - decoy.when( - load_labware_params.resolve_loadname( - "some_labware", - ) - ).then_return("labware_some") - decoy.when( load_labware_params.resolve( - "labware_some", + "some_labware", "a_namespace", 456, [EngineLabwareLoadParams("hello", "world", 654)], @@ -362,7 +431,7 @@ def test_load_labware_on_labware( decoy.when( mock_engine_client.load_labware( location=OnLabwareLocation(labwareId="labware-id"), - load_name="labware_some", + load_name="some_labware", display_name="some_display_name", namespace="some_namespace", version=9001, @@ -393,13 +462,14 @@ def test_load_labware_on_labware( assert isinstance(result, LabwareCore) assert result.labware_id == "abc123" - assert subject.get_labware_cores() == [subject.fixed_trash, result] + assert subject.get_labware_cores() == [result] decoy.verify( deck_conflict.check( engine_state=mock_engine_client.state, - existing_labware_ids=["fixed-trash-123"], + existing_labware_ids=[], existing_module_ids=[], + existing_disposal_locations=[], new_labware_id="abc123", ) ) @@ -426,12 +496,6 @@ def test_load_labware_off_deck( ) ).then_return(("some_namespace", 9001)) - decoy.when( - load_labware_params.resolve_loadname( - "some_labware", - ) - ).then_return("some_labware") - decoy.when( mock_engine_client.load_labware( location=OFF_DECK_LOCATION, @@ -462,13 +526,14 @@ def test_load_labware_off_deck( assert isinstance(result, LabwareCore) assert result.labware_id == "abc123" - assert subject.get_labware_cores() == [subject.fixed_trash, result] + assert subject.get_labware_cores() == [result] decoy.verify( deck_conflict.check( engine_state=mock_engine_client.state, - existing_labware_ids=["fixed-trash-123"], + existing_labware_ids=[], existing_module_ids=[], + existing_disposal_locations=[], new_labware_id="abc123", ) ) @@ -521,13 +586,14 @@ def test_load_adapter( assert isinstance(result, LabwareCore) assert result.labware_id == "abc123" - assert subject.get_labware_cores() == [subject.fixed_trash, result] + assert subject.get_labware_cores() == [result] decoy.verify( deck_conflict.check( engine_state=mock_engine_client.state, - existing_labware_ids=["fixed-trash-123"], + existing_labware_ids=[], existing_module_ids=[], + existing_disposal_locations=[], new_labware_id="abc123", ) ) @@ -535,8 +601,6 @@ def test_load_adapter( decoy.when( mock_engine_client.state.geometry.get_slot_item( slot_name=DeckSlotName.SLOT_5, - allowed_labware_ids={"fixed-trash-123", "abc123"}, - allowed_module_ids=set(), ) ).then_return( LoadedLabware.construct(id="abc123") # type: ignore[call-arg] @@ -545,6 +609,76 @@ def test_load_adapter( assert subject.get_slot_item(DeckSlotName.SLOT_5) is result +def test_load_adapter_on_staging_slot( + decoy: Decoy, + mock_engine_client: EngineClient, + subject: ProtocolCore, +) -> None: + """It should issue a LoadLabware command for an adapter.""" + decoy.when( + mock_engine_client.state.labware.find_custom_labware_load_params() + ).then_return([EngineLabwareLoadParams("hello", "world", 654)]) + + decoy.when( + load_labware_params.resolve( + "some_adapter", + "a_namespace", + 456, + [EngineLabwareLoadParams("hello", "world", 654)], + ) + ).then_return(("some_namespace", 9001)) + + decoy.when( + mock_engine_client.load_labware( + location=AddressableAreaLocation(addressableAreaName="B4"), + load_name="some_adapter", + namespace="some_namespace", + version=9001, + ) + ).then_return( + commands.LoadLabwareResult( + labwareId="abc123", + definition=LabwareDefinition.construct(), # type: ignore[call-arg] + offsetId=None, + ) + ) + + decoy.when(mock_engine_client.state.labware.get_definition("abc123")).then_return( + LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + ) + + result = subject.load_adapter( + load_name="some_adapter", + location=StagingSlotName.SLOT_B4, + namespace="a_namespace", + version=456, + ) + + assert isinstance(result, LabwareCore) + assert result.labware_id == "abc123" + assert subject.get_labware_cores() == [result] + + decoy.verify( + deck_conflict.check( + engine_state=mock_engine_client.state, + existing_labware_ids=[], + existing_module_ids=[], + existing_disposal_locations=[], + new_labware_id="abc123", + ) + ) + + decoy.when( + mock_engine_client.state.geometry.get_slot_item( + slot_name=StagingSlotName.SLOT_B4, + ) + ).then_return( + LoadedLabware.construct(id="abc123") # type: ignore[call-arg] + ) + + assert subject.get_slot_item(StagingSlotName.SLOT_B4) is result + + @pytest.mark.parametrize( argnames=["use_gripper", "pause_for_manual_move", "expected_strategy"], argvalues=[ @@ -596,7 +730,53 @@ def test_move_labware( if pick_up_offset else None, drop_offset=LabwareOffsetVector(x=4, y=5, z=6) if drop_offset else None, - ) + ), + deck_conflict.check( + engine_state=mock_engine_client.state, + existing_labware_ids=[], + existing_module_ids=[], + existing_disposal_locations=[], + new_labware_id="labware-id", + ), + ) + + +def test_move_labware_on_staging_slot( + decoy: Decoy, + subject: ProtocolCore, + mock_engine_client: EngineClient, + api_version: APIVersion, +) -> None: + """It should issue a move labware command to the engine.""" + decoy.when( + mock_engine_client.state.labware.get_definition("labware-id") + ).then_return( + LabwareDefinition.construct(ordering=[]) # type: ignore[call-arg] + ) + labware = LabwareCore(labware_id="labware-id", engine_client=mock_engine_client) + subject.move_labware( + labware_core=labware, + new_location=StagingSlotName.SLOT_B4, + use_gripper=False, + pause_for_manual_move=True, + pick_up_offset=None, + drop_offset=None, + ) + decoy.verify( + mock_engine_client.move_labware( + labware_id="labware-id", + new_location=AddressableAreaLocation(addressableAreaName="B4"), + strategy=LabwareMovementStrategy.MANUAL_MOVE_WITH_PAUSE, + pick_up_offset=None, + drop_offset=None, + ), + deck_conflict.check( + engine_state=mock_engine_client.state, + existing_labware_ids=[], + existing_module_ids=[], + existing_disposal_locations=[], + new_labware_id="labware-id", + ), ) @@ -633,7 +813,14 @@ def test_move_labware_on_non_connected_module( strategy=LabwareMovementStrategy.MANUAL_MOVE_WITH_PAUSE, pick_up_offset=None, drop_offset=None, - ) + ), + deck_conflict.check( + engine_state=mock_engine_client.state, + existing_labware_ids=[], + existing_module_ids=[], + existing_disposal_locations=[], + new_labware_id="labware-id", + ), ) @@ -666,11 +853,17 @@ def test_move_labware_off_deck( strategy=LabwareMovementStrategy.MANUAL_MOVE_WITH_PAUSE, pick_up_offset=None, drop_offset=None, - ) + ), + deck_conflict.check( + engine_state=mock_engine_client.state, + existing_labware_ids=[], + existing_module_ids=[], + existing_disposal_locations=[], + new_labware_id="labware-id", + ), ) -@pytest.mark.parametrize("api_version", [APIVersion(2, 3)]) def test_load_labware_on_module( decoy: Decoy, mock_engine_client: EngineClient, @@ -692,12 +885,6 @@ def test_load_labware_on_module( ) ).then_return(("some_namespace", 9001)) - decoy.when( - load_labware_params.resolve_loadname( - "some_labware", - ) - ).then_return("some_labware") - decoy.when( mock_engine_client.load_labware( location=ModuleLocation(moduleId="module-id"), @@ -739,8 +926,9 @@ def test_load_labware_on_module( decoy.verify( deck_conflict.check( engine_state=mock_engine_client.state, - existing_labware_ids=["fixed-trash-123"], + existing_labware_ids=[], existing_module_ids=[], + existing_disposal_locations=[], new_labware_id="abc123", ) ) @@ -772,12 +960,6 @@ def test_load_labware_on_non_connected_module( ) ).then_return(("some_namespace", 9001)) - decoy.when( - load_labware_params.resolve_loadname( - "some_labware", - ) - ).then_return("some_labware") - decoy.when( mock_engine_client.load_labware( location=ModuleLocation(moduleId="module-id"), @@ -818,8 +1000,9 @@ def test_load_labware_on_non_connected_module( decoy.verify( deck_conflict.check( engine_state=mock_engine_client.state, - existing_labware_ids=["fixed-trash-123"], + existing_labware_ids=[], existing_module_ids=[], + existing_disposal_locations=[], new_labware_id="abc123", ) ) @@ -909,6 +1092,8 @@ def test_add_labware_definition( ), ], ) +# APIv2.15 because we're expecting a fixed trash. +@pytest.mark.parametrize("api_version", [APIVersion(2, 15)]) def test_load_module( decoy: Decoy, mock_engine_client: EngineClient, @@ -917,7 +1102,7 @@ def test_load_module( engine_model: EngineModuleModel, expected_core_cls: Type[ModuleCore], subject: ProtocolCore, - deck_def: DeckDefinitionV3, + deck_def: DeckDefinitionV4, slot_name: DeckSlotName, robot_type: RobotType, ) -> None: @@ -934,7 +1119,10 @@ def test_load_module( ) decoy.when(subject.get_slot_definition(slot_name)).then_return( - _get_slot_def(deck_def=deck_def, slot_name=slot_name) # type: ignore[arg-type] + cast( + SlotDefV3, + {"compatibleModuleTypes": [ModuleType.from_model(requested_model)]}, + ) ) decoy.when(mock_engine_client.state.config.robot_type).then_return(robot_type) @@ -968,6 +1156,7 @@ def test_load_module( engine_state=mock_engine_client.state, existing_labware_ids=["fixed-trash-123"], existing_module_ids=[], + existing_disposal_locations=[], new_module_id="abc123", ) ) @@ -975,8 +1164,6 @@ def test_load_module( decoy.when( mock_engine_client.state.geometry.get_slot_item( slot_name=slot_name, - allowed_labware_ids={"fixed-trash-123"}, - allowed_module_ids={"abc123"}, ) ).then_return( LoadedModule.construct(id="abc123") # type: ignore[call-arg] @@ -1049,7 +1236,7 @@ def test_load_module_raises_wrong_location( engine_model: EngineModuleModel, expected_core_cls: Type[ModuleCore], subject: ProtocolCore, - deck_def: DeckDefinitionV3, + deck_def: DeckDefinitionV4, slot_name: DeckSlotName, robot_type: RobotType, ) -> None: @@ -1066,7 +1253,7 @@ def test_load_module_raises_wrong_location( decoy.when(mock_engine_client.state.config.robot_type).then_return(robot_type) decoy.when(subject.get_slot_definition(slot_name)).then_return( - _get_slot_def(deck_def=deck_def, slot_name=slot_name) # type: ignore[arg-type] + cast(SlotDefV3, {"compatibleModuleTypes": []}) ) with pytest.raises( @@ -1080,12 +1267,14 @@ def test_load_module_raises_wrong_location( ) +# APIv2.15 because we're expecting a fixed trash. +@pytest.mark.parametrize("api_version", [APIVersion(2, 15)]) def test_load_mag_block( decoy: Decoy, mock_engine_client: EngineClient, mock_sync_hardware_api: SyncHardwareAPI, subject: ProtocolCore, - ot3_standard_deck_def: DeckDefinitionV3, + ot3_standard_deck_def: DeckDefinitionV4, ) -> None: """It should issue a load module engine command.""" definition = ModuleDefinition.construct() # type: ignore[call-arg] @@ -1093,7 +1282,14 @@ def test_load_mag_block( decoy.when(mock_engine_client.state.config.robot_type).then_return("OT-3 Standard") decoy.when(subject.get_slot_definition(DeckSlotName.SLOT_A2)).then_return( - _get_slot_def(deck_def=ot3_standard_deck_def, slot_name=DeckSlotName.SLOT_A2) # type: ignore[arg-type] + cast( + SlotDefV3, + { + "compatibleModuleTypes": [ + ModuleType.from_model(MagneticBlockModel.MAGNETIC_BLOCK_V1) + ] + }, + ) ) decoy.when( @@ -1125,6 +1321,7 @@ def test_load_mag_block( engine_state=mock_engine_client.state, existing_labware_ids=["fixed-trash-123"], existing_module_ids=[], + existing_disposal_locations=[], new_module_id="abc123", ) ) @@ -1132,8 +1329,6 @@ def test_load_mag_block( decoy.when( mock_engine_client.state.geometry.get_slot_item( slot_name=DeckSlotName.SLOT_1, - allowed_labware_ids={"fixed-trash-123"}, - allowed_module_ids={"abc123"}, ) ).then_return( LoadedModule.construct(id="abc123") # type: ignore[call-arg] @@ -1170,7 +1365,7 @@ def test_load_module_thermocycler_with_no_location( requested_model: ModuleModel, engine_model: EngineModuleModel, subject: ProtocolCore, - deck_def: DeckDefinitionV3, + deck_def: DeckDefinitionV4, expected_slot: DeckSlotName, ) -> None: """It should issue a load module engine command with location at 7.""" @@ -1181,7 +1376,10 @@ def test_load_module_thermocycler_with_no_location( decoy.when(mock_sync_hardware_api.attached_modules).then_return([mock_hw_mod]) decoy.when(mock_engine_client.state.config.robot_type).then_return("OT-3 Standard") decoy.when(subject.get_slot_definition(expected_slot)).then_return( - _get_slot_def(deck_def=deck_def, slot_name=expected_slot) # type: ignore[arg-type] + cast( + SlotDefV3, + {"compatibleModuleTypes": [ModuleType.from_model(requested_model)]}, + ) ) decoy.when( @@ -1207,8 +1405,9 @@ def test_load_module_thermocycler_with_no_location( decoy.verify( deck_conflict.check( engine_state=mock_engine_client.state, - existing_labware_ids=["fixed-trash-123"], + existing_labware_ids=[], existing_module_ids=[], + existing_disposal_locations=[], new_module_id="abc123", ) ) @@ -1316,7 +1515,7 @@ def test_get_deck_definition( decoy: Decoy, mock_engine_client: EngineClient, subject: ProtocolCore ) -> None: """It should return the loaded deck definition from engine state.""" - deck_definition = cast(DeckDefinitionV3, {"schemaVersion": "3"}) + deck_definition = cast(DeckDefinitionV4, {"schemaVersion": "4"}) decoy.when(mock_engine_client.state.labware.get_deck_definition()).then_return( deck_definition @@ -1394,7 +1593,9 @@ def test_get_slot_center( ) -> None: """It should return a slot center from engine state.""" decoy.when( - mock_engine_client.state.labware.get_slot_center_position(DeckSlotName.SLOT_2) + mock_engine_client.state.addressable_areas.get_addressable_area_center( + DeckSlotName.SLOT_2.id + ) ).then_return(Point(1, 2, 3)) result = subject.get_slot_center(DeckSlotName.SLOT_2) @@ -1407,7 +1608,7 @@ def test_get_highest_z( ) -> None: """It should return a slot center from engine state.""" decoy.when( - mock_engine_client.state.geometry.get_all_labware_highest_z() + mock_engine_client.state.geometry.get_all_obstacle_highest_z() ).then_return(9001) result = subject.get_highest_z() diff --git a/api/tests/opentrons/protocol_api/core/engine/test_stringify.py b/api/tests/opentrons/protocol_api/core/engine/test_stringify.py new file mode 100644 index 00000000000..4ccc8e5f9ba --- /dev/null +++ b/api/tests/opentrons/protocol_api/core/engine/test_stringify.py @@ -0,0 +1,108 @@ +"""Unit tests for `stringify`.""" + + +from decoy import Decoy +from opentrons_shared_data.labware.labware_definition import LabwareDefinition + +from opentrons.protocol_api.core.engine import stringify as subject +from opentrons.protocol_engine.clients.sync_client import SyncClient +from opentrons.protocol_engine.types import ( + OFF_DECK_LOCATION, + DeckSlotLocation, + ModuleDefinition, + ModuleLocation, + OnLabwareLocation, +) +from opentrons.types import DeckSlotName + + +def _make_dummy_labware_definition( + decoy: Decoy, display_name: str +) -> LabwareDefinition: + mock = decoy.mock(cls=LabwareDefinition) + decoy.when(mock.metadata.displayName).then_return(display_name) + return mock + + +def _make_dummy_module_definition(decoy: Decoy, display_name: str) -> ModuleDefinition: + mock = decoy.mock(cls=ModuleDefinition) + decoy.when(mock.displayName).then_return(display_name) + return mock + + +def test_well_on_labware_without_user_display_name(decoy: Decoy) -> None: + """Test stringifying a well on a labware that doesn't have a user-defined label.""" + mock_client = decoy.mock(cls=SyncClient) + decoy.when( + mock_client.state.labware.get_user_specified_display_name("labware-id") + ).then_return(None) + decoy.when(mock_client.state.labware.get_definition("labware-id")).then_return( + _make_dummy_labware_definition(decoy, "definition-display-name") + ) + decoy.when(mock_client.state.labware.get_location("labware-id")).then_return( + OFF_DECK_LOCATION + ) + + result = subject.well( + engine_client=mock_client, well_name="well-name", labware_id="labware-id" + ) + assert result == "well-name of definition-display-name on [off-deck]" + + +def test_well_on_labware_with_user_display_name(decoy: Decoy) -> None: + """Test stringifying a well on a labware that does have a user-defined label.""" + mock_client = decoy.mock(cls=SyncClient) + decoy.when( + mock_client.state.labware.get_user_specified_display_name("labware-id") + ).then_return("user-display-name") + decoy.when(mock_client.state.labware.get_definition("labware-id")).then_return( + _make_dummy_labware_definition(decoy, "definition-display-name") + ) + decoy.when(mock_client.state.labware.get_location("labware-id")).then_return( + OFF_DECK_LOCATION + ) + + result = subject.well( + engine_client=mock_client, well_name="well-name", labware_id="labware-id" + ) + assert result == "well-name of user-display-name on [off-deck]" + + +def test_well_on_labware_with_complicated_location(decoy: Decoy) -> None: + """Test stringifying a well on a labware with a deeply-nested location.""" + mock_client = decoy.mock(cls=SyncClient) + + decoy.when( + mock_client.state.labware.get_user_specified_display_name("labware-id-1") + ).then_return(None) + decoy.when(mock_client.state.labware.get_definition("labware-id-1")).then_return( + _make_dummy_labware_definition(decoy, "lw-1-display-name") + ) + decoy.when(mock_client.state.labware.get_location("labware-id-1")).then_return( + OnLabwareLocation(labwareId="labware-id-2") + ) + + decoy.when( + mock_client.state.labware.get_user_specified_display_name("labware-id-2") + ).then_return(None) + decoy.when(mock_client.state.labware.get_definition("labware-id-2")).then_return( + _make_dummy_labware_definition(decoy, "lw-2-display-name") + ) + decoy.when(mock_client.state.labware.get_location("labware-id-2")).then_return( + ModuleLocation(moduleId="module-id") + ) + + decoy.when(mock_client.state.modules.get_definition("module-id")).then_return( + _make_dummy_module_definition(decoy, "module-display-name") + ) + decoy.when(mock_client.state.modules.get_location("module-id")).then_return( + DeckSlotLocation(slotName=DeckSlotName.SLOT_C2) + ) + + result = subject.well( + engine_client=mock_client, well_name="well-name", labware_id="labware-id-1" + ) + assert ( + result + == "well-name of lw-1-display-name on lw-2-display-name on module-display-name on slot C2" + ) diff --git a/api/tests/opentrons/protocol_api/core/engine/test_well_core.py b/api/tests/opentrons/protocol_api/core/engine/test_well_core.py index cefce273fe5..5fd33fb01ed 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_well_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_well_core.py @@ -14,7 +14,7 @@ from opentrons.types import Point from opentrons.protocol_api._liquid import Liquid -from opentrons.protocol_api.core.engine import WellCore, point_calculations +from opentrons.protocol_api.core.engine import WellCore, point_calculations, stringify @pytest.fixture(autouse=True) @@ -26,6 +26,13 @@ def patch_mock_point_calculations( monkeypatch.setattr(point_calculations, name, decoy.mock(func=func)) +@pytest.fixture(autouse=True) +def patch_mock_stringify(decoy: Decoy, monkeypatch: pytest.MonkeyPatch) -> None: + """Mock out stringify.py functions.""" + for name, func in inspect.getmembers(stringify, inspect.isfunction): + monkeypatch.setattr(stringify, name, decoy.mock(func=func)) + + @pytest.fixture def mock_engine_client(decoy: Decoy) -> EngineClient: """Get a mock ProtocolEngine synchronous client.""" @@ -73,10 +80,14 @@ def test_display_name( ) -> None: """It should have a display name.""" decoy.when( - mock_engine_client.state.labware.get_display_name("labware-id") - ).then_return("Cool Labware") + stringify.well( + engine_client=mock_engine_client, + well_name="well-name", + labware_id="labware-id", + ) + ).then_return("Matthew Zwimpfer") - assert subject.get_display_name() == "well-name of Cool Labware" + assert subject.get_display_name() == "Matthew Zwimpfer" @pytest.mark.parametrize( diff --git a/api/tests/opentrons/protocol_api/core/legacy/test_module_geometry.py b/api/tests/opentrons/protocol_api/core/legacy/test_module_geometry.py index 22e787baab7..744235ea03a 100644 --- a/api/tests/opentrons/protocol_api/core/legacy/test_module_geometry.py +++ b/api/tests/opentrons/protocol_api/core/legacy/test_module_geometry.py @@ -3,7 +3,7 @@ import mock from typing import ContextManager, Any, Optional -from pytest_lazyfixture import lazy_fixture # type: ignore[import] +from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] from contextlib import nullcontext as does_not_raise from opentrons.types import Location, Point diff --git a/api/tests/opentrons/protocol_api/core/legacy/test_protocol_context_implementation.py b/api/tests/opentrons/protocol_api/core/legacy/test_protocol_context_implementation.py index 883deffed73..a2993444d6b 100644 --- a/api/tests/opentrons/protocol_api/core/legacy/test_protocol_context_implementation.py +++ b/api/tests/opentrons/protocol_api/core/legacy/test_protocol_context_implementation.py @@ -9,18 +9,18 @@ from opentrons_shared_data.pipette.dev_types import PipetteNameType from opentrons_shared_data.module.dev_types import ModuleDefinitionV3 -from opentrons.types import DeckSlotName, Location, Mount, Point -from opentrons.protocol_api import OFF_DECK -from opentrons.equipment_broker import EquipmentBroker +from opentrons.types import DeckSlotName, StagingSlotName, Location, Mount, Point +from opentrons.util.broker import Broker + from opentrons.hardware_control import SyncHardwareAPI from opentrons.hardware_control.dev_types import PipetteDict - from opentrons.hardware_control.modules import AbstractModule from opentrons.hardware_control.modules.types import ModuleType, TemperatureModuleModel + from opentrons.protocols import labware as mock_labware from opentrons.protocols.api_support.util import APIVersionError from opentrons.protocol_api.core.legacy.module_geometry import ModuleGeometry -from opentrons.protocol_api import MAX_SUPPORTED_VERSION +from opentrons.protocol_api import MAX_SUPPORTED_VERSION, OFF_DECK from opentrons.protocol_api.core.labware import LabwareLoadParams from opentrons.protocol_api.core.legacy.deck import Deck @@ -102,16 +102,16 @@ def mock_labware_offset_provider(decoy: Decoy) -> AbstractLabwareOffsetProvider: @pytest.fixture -def mock_equipment_broker(decoy: Decoy) -> EquipmentBroker[LoadInfo]: +def mock_equipment_broker(decoy: Decoy) -> Broker[LoadInfo]: """Get a mock equipment broker.""" - return decoy.mock(cls=EquipmentBroker) + return decoy.mock(cls=Broker) @pytest.fixture def subject( mock_sync_hardware_api: SyncHardwareAPI, mock_labware_offset_provider: AbstractLabwareOffsetProvider, - mock_equipment_broker: EquipmentBroker[LoadInfo], + mock_equipment_broker: Broker[LoadInfo], mock_deck: Deck, ) -> LegacyProtocolCore: """Get a legacy protocol implementation core with mocked out dependencies.""" @@ -127,7 +127,7 @@ def subject( def test_load_instrument( decoy: Decoy, mock_sync_hardware_api: SyncHardwareAPI, - mock_equipment_broker: EquipmentBroker[LoadInfo], + mock_equipment_broker: Broker[LoadInfo], subject: LegacyProtocolCore, ) -> None: """It should load an instrument core.""" @@ -179,11 +179,25 @@ def test_load_labware_off_deck_raises( ) +def test_load_labware_on_staging_slot_raises( + subject: LegacyProtocolCore, +) -> None: + """It should raise an api error when loading onto a staging slot.""" + with pytest.raises(APIVersionError): + subject.load_labware( + load_name="cool load name", + location=StagingSlotName.SLOT_B4, + label="cool label", + namespace="cool namespace", + version=1337, + ) + + def test_load_labware( decoy: Decoy, mock_deck: Deck, mock_labware_offset_provider: AbstractLabwareOffsetProvider, - mock_equipment_broker: EquipmentBroker[LoadInfo], + mock_equipment_broker: Broker[LoadInfo], subject: LegacyProtocolCore, ) -> None: """It should load a labware core.""" @@ -278,7 +292,7 @@ def test_load_adapter_raises( def test_load_labware_on_module( decoy: Decoy, mock_labware_offset_provider: AbstractLabwareOffsetProvider, - mock_equipment_broker: EquipmentBroker[LoadInfo], + mock_equipment_broker: Broker[LoadInfo], subject: LegacyProtocolCore, ) -> None: """It should load a labware core.""" @@ -377,7 +391,7 @@ def test_load_module( decoy: Decoy, mock_deck: Deck, mock_sync_hardware_api: SyncHardwareAPI, - mock_equipment_broker: EquipmentBroker[LoadInfo], + mock_equipment_broker: Broker[LoadInfo], subject: LegacyProtocolCore, ) -> None: """It should load a module core. diff --git a/api/tests/opentrons/protocol_api/test_deck.py b/api/tests/opentrons/protocol_api/test_deck.py index 19dac4aea05..b3dc4716449 100644 --- a/api/tests/opentrons/protocol_api/test_deck.py +++ b/api/tests/opentrons/protocol_api/test_deck.py @@ -1,11 +1,11 @@ """Tests for opentrons.legacy.Deck.""" import inspect -from typing import cast +from typing import cast, Dict import pytest from decoy import Decoy -from opentrons_shared_data.deck.dev_types import DeckDefinitionV3 +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4, SlotDefV3 from opentrons.motion_planning import adjacent_slots_getters as mock_adjacent_slots from opentrons.protocols.api_support.types import APIVersion @@ -23,17 +23,21 @@ @pytest.fixture -def deck_definition() -> DeckDefinitionV3: +def deck_definition() -> DeckDefinitionV4: """Get a deck definition value object.""" return cast( - DeckDefinitionV3, {"locations": {"orderedSlots": [], "calibrationPoints": []}} + DeckDefinitionV4, + { + "locations": {"addressableAreas": [], "calibrationPoints": []}, + "cutoutFixtures": {}, + }, ) @pytest.fixture def api_version() -> APIVersion: """Get a dummy `APIVersion` with which to configure the subject.""" - return APIVersion(123, 456) + return APIVersion(1, 234) @pytest.fixture(autouse=True) @@ -62,16 +66,36 @@ def mock_core_map(decoy: Decoy) -> LoadedCoreMap: return decoy.mock(cls=LoadedCoreMap) +@pytest.fixture +def slot_definitions_by_name() -> Dict[str, SlotDefV3]: + """Get a dictionary of slot names to slot definitions.""" + return {"1": {}} + + +@pytest.fixture +def staging_slot_definitions_by_name() -> Dict[str, SlotDefV3]: + """Get a dictionary of staging slot names to slot definitions.""" + return {"2": {}} + + @pytest.fixture def subject( decoy: Decoy, - deck_definition: DeckDefinitionV3, + deck_definition: DeckDefinitionV4, mock_protocol_core: ProtocolCore, mock_core_map: LoadedCoreMap, api_version: APIVersion, + slot_definitions_by_name: Dict[str, SlotDefV3], + staging_slot_definitions_by_name: Dict[str, SlotDefV3], ) -> Deck: """Get a Deck test subject with its dependencies mocked out.""" decoy.when(mock_protocol_core.get_deck_definition()).then_return(deck_definition) + decoy.when(mock_protocol_core.get_slot_definitions()).then_return( + slot_definitions_by_name + ) + decoy.when(mock_protocol_core.get_staging_slot_definitions()).then_return( + staging_slot_definitions_by_name + ) return Deck( protocol_core=mock_protocol_core, @@ -225,18 +249,16 @@ def test_delitem_raises_if_slot_has_module( @pytest.mark.parametrize( - "deck_definition", - [ - { - "locations": { - "orderedSlots": [ - {"id": "1"}, - {"id": "2"}, - {"id": "3"}, - ], - "calibrationPoints": [], - } - }, + argnames=["slot_definitions_by_name", "staging_slot_definitions_by_name"], + argvalues=[ + ( + { + "1": {}, + "2": {}, + "3": {}, + }, + {"4": {}}, + ) ], ) def test_slot_keys_iter(subject: Deck) -> None: @@ -248,18 +270,39 @@ def test_slot_keys_iter(subject: Deck) -> None: @pytest.mark.parametrize( - "deck_definition", + argnames=[ + "slot_definitions_by_name", + "staging_slot_definitions_by_name", + "api_version", + ], + argvalues=[ + ( + { + "1": {}, + "2": {}, + "3": {}, + }, + {"4": {}}, + APIVersion(2, 16), + ) + ], +) +def test_slot_keys_iter_with_staging_slots(subject: Deck) -> None: + """It should provide an iterable interface to deck slots.""" + result = list(subject) + + assert len(subject) == 4 + assert result == ["1", "2", "3", "4"] + + +@pytest.mark.parametrize( + "slot_definitions_by_name", [ { - "locations": { - "orderedSlots": [ - {"id": "fee"}, - {"id": "foe"}, - {"id": "fum"}, - ], - "calibrationPoints": [], - } - }, + "1": {"id": "fee"}, + "2": {"id": "foe"}, + "3": {"id": "fum"}, + } ], ) def test_slots_property(subject: Deck) -> None: @@ -272,16 +315,14 @@ def test_slots_property(subject: Deck) -> None: @pytest.mark.parametrize( - "deck_definition", + "slot_definitions_by_name", [ { - "locations": { - "orderedSlots": [ - {"id": DeckSlotName.SLOT_2.id, "displayName": "foobar"}, - ], - "calibrationPoints": [], + "2": { + "id": DeckSlotName.SLOT_2.id, + "displayName": "foobar", } - }, + } ], ) def test_get_slot_definition( @@ -303,17 +344,8 @@ def test_get_slot_definition( @pytest.mark.parametrize( - "deck_definition", - [ - { - "locations": { - "orderedSlots": [ - {"id": DeckSlotName.SLOT_3.id, "position": [1.0, 2.0, 3.0]}, - ], - "calibrationPoints": [], - } - }, - ], + "slot_definitions_by_name", + [{"3": {"position": [1.0, 2.0, 3.0]}}], ) def test_get_position_for( decoy: Decoy, diff --git a/api/tests/opentrons/protocol_api/test_heater_shaker_context.py b/api/tests/opentrons/protocol_api/test_heater_shaker_context.py index c4d99d60789..7ccf84777a7 100644 --- a/api/tests/opentrons/protocol_api/test_heater_shaker_context.py +++ b/api/tests/opentrons/protocol_api/test_heater_shaker_context.py @@ -2,7 +2,7 @@ import pytest from decoy import Decoy, matchers -from opentrons.broker import Broker +from opentrons.legacy_broker import LegacyBroker from opentrons.drivers.types import HeaterShakerLabwareLatchStatus from opentrons.hardware_control.modules import TemperatureStatus, SpeedStatus from opentrons.protocols.api_support.types import APIVersion @@ -30,9 +30,9 @@ def mock_core_map(decoy: Decoy) -> LoadedCoreMap: @pytest.fixture -def mock_broker(decoy: Decoy) -> Broker: +def mock_broker(decoy: Decoy) -> LegacyBroker: """Get a mock command message broker.""" - return decoy.mock(cls=Broker) + return decoy.mock(cls=LegacyBroker) @pytest.fixture @@ -47,7 +47,7 @@ def subject( mock_core: HeaterShakerCore, mock_protocol_core: ProtocolCore, mock_core_map: LoadedCoreMap, - mock_broker: Broker, + mock_broker: LegacyBroker, ) -> HeaterShakerContext: """Get a temperature module context with its dependencies mocked out.""" return HeaterShakerContext( @@ -129,7 +129,7 @@ def test_get_labware_latch_status( def test_set_target_temperature( decoy: Decoy, mock_core: HeaterShakerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: HeaterShakerContext, ) -> None: """It should set the temperature via the core.""" @@ -156,7 +156,7 @@ def test_set_target_temperature( def test_wait_for_temperature( decoy: Decoy, mock_core: HeaterShakerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: HeaterShakerContext, ) -> None: """It should wait for temperature via the core.""" @@ -183,7 +183,7 @@ def test_wait_for_temperature( def test_set_and_wait_for_temperature( decoy: Decoy, mock_core: HeaterShakerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: HeaterShakerContext, ) -> None: """It should set and wait for the temperature via the core.""" @@ -226,7 +226,7 @@ def test_set_and_wait_for_temperature( def test_set_and_wait_for_shake_speed( decoy: Decoy, mock_core: HeaterShakerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: HeaterShakerContext, ) -> None: """It should set and wait for shake speed via the core.""" @@ -253,7 +253,7 @@ def test_set_and_wait_for_shake_speed( def test_open_labware_latch( decoy: Decoy, mock_core: HeaterShakerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: HeaterShakerContext, ) -> None: """It should open the labware latch via the core.""" @@ -280,7 +280,7 @@ def test_open_labware_latch( def test_close_labware_latch( decoy: Decoy, mock_core: HeaterShakerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: HeaterShakerContext, ) -> None: """It should close the labware latch via the core.""" @@ -307,7 +307,7 @@ def test_close_labware_latch( def test_deactivate_shaker( decoy: Decoy, mock_core: HeaterShakerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: HeaterShakerContext, ) -> None: """It should stop shaking via the core.""" @@ -334,7 +334,7 @@ def test_deactivate_shaker( def test_deactivate_heater( decoy: Decoy, mock_core: HeaterShakerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: HeaterShakerContext, ) -> None: """It should stop heating via the core.""" diff --git a/api/tests/opentrons/protocol_api/test_instrument_context.py b/api/tests/opentrons/protocol_api/test_instrument_context.py index 3e201fad41e..be45907ab31 100644 --- a/api/tests/opentrons/protocol_api/test_instrument_context.py +++ b/api/tests/opentrons/protocol_api/test_instrument_context.py @@ -2,10 +2,13 @@ import inspect import pytest -from pytest_lazyfixture import lazy_fixture # type: ignore[import] +from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] from decoy import Decoy -from opentrons.broker import Broker +from opentrons.legacy_broker import LegacyBroker +from typing import ContextManager, Optional +from contextlib import nullcontext as does_not_raise + from opentrons.protocols.api_support import instrument as mock_instrument_support from opentrons.protocols.api_support.types import APIVersion from opentrons.protocols.api_support.util import ( @@ -26,8 +29,13 @@ from opentrons.protocol_api.core.legacy.legacy_instrument_core import ( LegacyInstrumentCore, ) +from opentrons.protocol_api._nozzle_layout import NozzleLayout from opentrons.types import Location, Mount, Point +from opentrons_shared_data.errors.exceptions import ( + CommandPreconditionViolated, +) + @pytest.fixture(autouse=True) def _mock_validation_module(decoy: Decoy, monkeypatch: pytest.MonkeyPatch) -> None: @@ -72,9 +80,9 @@ def mock_protocol_core(decoy: Decoy) -> ProtocolCore: @pytest.fixture -def mock_broker(decoy: Decoy) -> Broker: +def mock_broker(decoy: Decoy) -> LegacyBroker: """Get a mock command message broker.""" - return decoy.mock(cls=Broker) + return decoy.mock(cls=LegacyBroker) @pytest.fixture @@ -93,7 +101,7 @@ def api_version() -> APIVersion: def subject( mock_instrument_core: InstrumentCore, mock_protocol_core: ProtocolCore, - mock_broker: Broker, + mock_broker: LegacyBroker, mock_trash: Labware, api_version: APIVersion, ) -> InstrumentContext: @@ -115,6 +123,38 @@ def test_api_version(api_version: APIVersion, subject: InstrumentContext) -> Non assert subject.api_version == api_version +@pytest.mark.parametrize("channels_from_core", [1, 8, 96]) +def test_channels( + decoy: Decoy, + subject: InstrumentContext, + mock_instrument_core: InstrumentCore, + channels_from_core: int, +) -> None: + """It should return the number of channels, as returned by the core.""" + decoy.when(mock_instrument_core.get_channels()).then_return(channels_from_core) + assert subject.channels == channels_from_core + + +@pytest.mark.parametrize( + ("channels_from_core", "expected_type"), + [ + (1, "single"), + (8, "multi"), + (96, "multi"), + ], +) +def test_type( + decoy: Decoy, + subject: InstrumentContext, + mock_instrument_core: InstrumentCore, + channels_from_core: int, + expected_type: str, +) -> None: + """It should map the number of channels from the core into the string "single" or "multi".""" + decoy.when(mock_instrument_core.get_channels()).then_return(channels_from_core) + assert subject.type == expected_type + + def test_trash_container( decoy: Decoy, mock_trash: Labware, @@ -472,7 +512,7 @@ def test_pick_up_tip_from_labware( mock_well = decoy.mock(cls=Well) top_location = Location(point=Point(1, 2, 3), labware=mock_well) - decoy.when(mock_instrument_core.get_channels()).then_return(123) + decoy.when(mock_instrument_core.get_active_channels()).then_return(123) decoy.when( labware.next_available_tip( starting_tip=None, @@ -526,7 +566,7 @@ def test_pick_up_tip_from_labware_location( location = Location(point=Point(1, 2, 3), labware=mock_tip_rack) top_location = Location(point=Point(1, 2, 3), labware=mock_well) - decoy.when(mock_instrument_core.get_channels()).then_return(123) + decoy.when(mock_instrument_core.get_active_channels()).then_return(123) decoy.when( labware.next_available_tip( starting_tip=None, @@ -560,7 +600,8 @@ def test_pick_up_from_associated_tip_racks( mock_well = decoy.mock(cls=Well) top_location = Location(point=Point(1, 2, 3), labware=mock_well) - decoy.when(mock_instrument_core.get_channels()).then_return(123) + decoy.when(mock_instrument_core.is_tip_tracking_available()).then_return(True) + decoy.when(mock_instrument_core.get_active_channels()).then_return(123) decoy.when( labware.next_available_tip( starting_tip=mock_starting_tip, @@ -586,6 +627,22 @@ def test_pick_up_from_associated_tip_racks( ) +def test_pick_up_fails_when_tip_tracking_unavailable( + decoy: Decoy, mock_instrument_core: InstrumentCore, subject: InstrumentContext +) -> None: + """It should raise an error if automatic tip tracking is not available..""" + mock_tip_rack_1 = decoy.mock(cls=Labware) + + decoy.when(mock_instrument_core.is_tip_tracking_available()).then_return(False) + decoy.when(mock_instrument_core.get_active_channels()).then_return(123) + + subject.tip_racks = [mock_tip_rack_1] + with pytest.raises( + CommandPreconditionViolated, match="Automatic tip tracking is not available" + ): + subject.pick_up_tip() + + def test_drop_tip_to_well( decoy: Decoy, mock_instrument_core: InstrumentCore, subject: InstrumentContext ) -> None: @@ -912,3 +969,178 @@ def test_plunger_speed_removed(subject: InstrumentContext) -> None: """It should raise an error on PAPI >= v2.14.""" with pytest.raises(APIVersionError): subject.speed + + +def test_prepare_to_aspirate( + subject: InstrumentContext, decoy: Decoy, mock_instrument_core: InstrumentCore +) -> None: + """It should call the core function.""" + decoy.when(mock_instrument_core.get_current_volume()).then_return(0) + subject.prepare_to_aspirate() + decoy.verify(mock_instrument_core.prepare_to_aspirate(), times=1) + + +def test_prepare_to_aspirate_checks_volume( + subject: InstrumentContext, decoy: Decoy, mock_instrument_core: InstrumentCore +) -> None: + """It should raise an error if you prepare for aspirate with liquid in the pipette.""" + decoy.when(mock_instrument_core.get_current_volume()).then_return(10) + with pytest.raises(CommandPreconditionViolated): + subject.prepare_to_aspirate() + + +@pytest.mark.parametrize( + argnames=["style", "primary_nozzle", "front_right_nozzle", "exception"], + argvalues=[ + [NozzleLayout.COLUMN, "A1", "H1", does_not_raise()], + [NozzleLayout.SINGLE, None, None, pytest.raises(ValueError)], + [NozzleLayout.ROW, "E1", None, pytest.raises(ValueError)], + ], +) +def test_configure_nozzle_layout( + subject: InstrumentContext, + style: NozzleLayout, + primary_nozzle: Optional[str], + front_right_nozzle: Optional[str], + exception: ContextManager[None], +) -> None: + """The correct model is passed to the engine client.""" + with exception: + subject.configure_nozzle_layout(style, primary_nozzle, front_right_nozzle) + + +@pytest.mark.parametrize("api_version", [APIVersion(2, 15)]) +def test_dispense_0_volume_means_dispense_everything( + decoy: Decoy, + mock_instrument_core: InstrumentCore, + subject: InstrumentContext, + mock_protocol_core: ProtocolCore, +) -> None: + """It should dispense all liquid to a well.""" + input_location = Location(point=Point(2, 2, 2), labware=None) + decoy.when( + mock_validation.validate_location(location=input_location, last_location=None) + ).then_return(mock_validation.PointTarget(location=input_location, in_place=False)) + decoy.when(mock_instrument_core.get_current_volume()).then_return(100) + decoy.when(mock_instrument_core.get_dispense_flow_rate(1.23)).then_return(5.67) + subject.dispense(volume=0, location=input_location, rate=1.23, push_out=None) + + decoy.verify( + mock_instrument_core.dispense( + location=input_location, + well_core=None, + in_place=False, + volume=100, + rate=1.23, + flow_rate=5.67, + push_out=None, + ), + times=1, + ) + + +@pytest.mark.parametrize("api_version", [APIVersion(2, 16)]) +def test_dispense_0_volume_means_dispense_nothing( + decoy: Decoy, + mock_instrument_core: InstrumentCore, + subject: InstrumentContext, + mock_protocol_core: ProtocolCore, +) -> None: + """It should dispense no liquid to a well.""" + input_location = Location(point=Point(2, 2, 2), labware=None) + decoy.when( + mock_validation.validate_location(location=input_location, last_location=None) + ).then_return(mock_validation.PointTarget(location=input_location, in_place=False)) + decoy.when(mock_instrument_core.get_dispense_flow_rate(1.23)).then_return(5.67) + subject.dispense(volume=0, location=input_location, rate=1.23, push_out=None) + + decoy.verify( + mock_instrument_core.dispense( + location=input_location, + well_core=None, + in_place=False, + volume=0, + rate=1.23, + flow_rate=5.67, + push_out=None, + ), + times=1, + ) + + +@pytest.mark.parametrize("api_version", [APIVersion(2, 15)]) +def test_aspirate_0_volume_means_aspirate_everything( + decoy: Decoy, + mock_instrument_core: InstrumentCore, + subject: InstrumentContext, + mock_protocol_core: ProtocolCore, +) -> None: + """It should aspirate to a well.""" + mock_well = decoy.mock(cls=Well) + input_location = Location(point=Point(2, 2, 2), labware=mock_well) + last_location = Location(point=Point(9, 9, 9), labware=None) + decoy.when(mock_instrument_core.get_mount()).then_return(Mount.RIGHT) + + decoy.when(mock_protocol_core.get_last_location(Mount.RIGHT)).then_return( + last_location + ) + + decoy.when( + mock_validation.validate_location( + location=input_location, last_location=last_location + ) + ).then_return(WellTarget(well=mock_well, location=input_location, in_place=False)) + decoy.when(mock_instrument_core.get_aspirate_flow_rate(1.23)).then_return(5.67) + decoy.when(mock_instrument_core.get_available_volume()).then_return(200) + subject.aspirate(volume=0, location=input_location, rate=1.23) + + decoy.verify( + mock_instrument_core.aspirate( + location=input_location, + well_core=mock_well._core, + in_place=False, + volume=200, + rate=1.23, + flow_rate=5.67, + ), + times=1, + ) + + +@pytest.mark.parametrize("api_version", [APIVersion(2, 16)]) +def test_aspirate_0_volume_means_aspirate_nothing( + decoy: Decoy, + mock_instrument_core: InstrumentCore, + subject: InstrumentContext, + mock_protocol_core: ProtocolCore, +) -> None: + """It should aspirate to a well.""" + mock_well = decoy.mock(cls=Well) + input_location = Location(point=Point(2, 2, 2), labware=mock_well) + last_location = Location(point=Point(9, 9, 9), labware=None) + decoy.when(mock_instrument_core.get_mount()).then_return(Mount.RIGHT) + + decoy.when(mock_protocol_core.get_last_location(Mount.RIGHT)).then_return( + last_location + ) + + decoy.when( + mock_validation.validate_location( + location=input_location, last_location=last_location + ) + ).then_return(WellTarget(well=mock_well, location=input_location, in_place=False)) + decoy.when(mock_instrument_core.get_aspirate_flow_rate(1.23)).then_return(5.67) + + subject.aspirate(volume=0, location=input_location, rate=1.23) + + decoy.verify( + mock_instrument_core.aspirate( + location=input_location, + well_core=mock_well._core, + in_place=False, + volume=0, + rate=1.23, + flow_rate=5.67, + ), + times=1, + ) diff --git a/api/tests/opentrons/protocol_api/test_magnetic_module_context.py b/api/tests/opentrons/protocol_api/test_magnetic_module_context.py index a37a68f5d70..6435d5d8787 100644 --- a/api/tests/opentrons/protocol_api/test_magnetic_module_context.py +++ b/api/tests/opentrons/protocol_api/test_magnetic_module_context.py @@ -2,7 +2,7 @@ import pytest from decoy import Decoy, matchers -from opentrons.broker import Broker +from opentrons.legacy_broker import LegacyBroker from opentrons.hardware_control.modules import MagneticStatus from opentrons.protocols.api_support.types import APIVersion from opentrons.protocols.api_support.util import APIVersionError @@ -30,9 +30,9 @@ def mock_core_map(decoy: Decoy) -> LoadedCoreMap: @pytest.fixture -def mock_broker(decoy: Decoy) -> Broker: +def mock_broker(decoy: Decoy) -> LegacyBroker: """Get a mock command message broker.""" - return decoy.mock(cls=Broker) + return decoy.mock(cls=LegacyBroker) @pytest.fixture @@ -47,7 +47,7 @@ def subject( mock_core: MagneticModuleCore, mock_protocol_core: ProtocolCore, mock_core_map: LoadedCoreMap, - mock_broker: Broker, + mock_broker: LegacyBroker, ) -> MagneticModuleContext: """Get a magnetic module context with its dependencies mocked out.""" return MagneticModuleContext( @@ -62,7 +62,7 @@ def subject( def test_disengage( decoy: Decoy, mock_core: MagneticModuleCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: MagneticModuleContext, ) -> None: """It should disengage magnets via the core.""" @@ -92,7 +92,7 @@ def test_get_status( @pytest.mark.parametrize("api_version", [APIVersion(2, 13)]) def test_engage_height_from_home_succeeds_on_low_version( decoy: Decoy, - mock_broker: Broker, + mock_broker: LegacyBroker, mock_core: MagneticModuleCore, subject: MagneticModuleContext, ) -> None: @@ -136,7 +136,7 @@ def test_calibrate_raises_on_high_version( def test_engage_height_from_base( decoy: Decoy, - mock_broker: Broker, + mock_broker: LegacyBroker, mock_core: MagneticModuleCore, subject: MagneticModuleContext, ) -> None: @@ -156,7 +156,7 @@ def test_engage_height_from_base( @pytest.mark.parametrize("api_version", [APIVersion(2, 3)]) def test_engage_offset_from_default( decoy: Decoy, - mock_broker: Broker, + mock_broker: LegacyBroker, mock_core: MagneticModuleCore, subject: MagneticModuleContext, ) -> None: diff --git a/api/tests/opentrons/protocol_api/test_module_context.py b/api/tests/opentrons/protocol_api/test_module_context.py index 6847f2b06e2..6ce8928abc4 100644 --- a/api/tests/opentrons/protocol_api/test_module_context.py +++ b/api/tests/opentrons/protocol_api/test_module_context.py @@ -7,7 +7,7 @@ from opentrons_shared_data.labware.dev_types import LabwareDefinition as LabwareDefDict from opentrons.hardware_control.modules.types import ModuleType, HeaterShakerModuleModel -from opentrons.broker import Broker +from opentrons.legacy_broker import LegacyBroker from opentrons.protocols.api_support.types import APIVersion from opentrons.protocol_api import MAX_SUPPORTED_VERSION, ModuleContext, Labware from opentrons.protocol_api.core.common import LabwareCore, ModuleCore, ProtocolCore @@ -34,9 +34,9 @@ def mock_protocol_core(decoy: Decoy) -> ProtocolCore: @pytest.fixture -def mock_broker(decoy: Decoy) -> Broker: +def mock_broker(decoy: Decoy) -> LegacyBroker: """Get a mock command message broker.""" - return decoy.mock(cls=Broker) + return decoy.mock(cls=LegacyBroker) @pytest.fixture @@ -50,7 +50,7 @@ def subject( mock_core: ModuleCore, mock_core_map: LoadedCoreMap, mock_protocol_core: ProtocolCore, - mock_broker: Broker, + mock_broker: LegacyBroker, api_version: APIVersion, ) -> ModuleContext: """Get a generic module context with its dependencies mocked out.""" diff --git a/api/tests/opentrons/protocol_api/test_protocol_context.py b/api/tests/opentrons/protocol_api/test_protocol_context.py index fc6c2892ae5..f70299209cb 100644 --- a/api/tests/opentrons/protocol_api/test_protocol_context.py +++ b/api/tests/opentrons/protocol_api/test_protocol_context.py @@ -8,9 +8,9 @@ from opentrons_shared_data.pipette.dev_types import PipetteNameType from opentrons_shared_data.labware.dev_types import LabwareDefinition as LabwareDefDict -from opentrons.types import Mount, DeckSlotName +from opentrons.types import Mount, DeckSlotName, StagingSlotName from opentrons.protocol_api import OFF_DECK -from opentrons.broker import Broker +from opentrons.legacy_broker import LegacyBroker from opentrons.hardware_control.modules.types import ModuleType, TemperatureModuleModel from opentrons.protocols.api_support import instrument as mock_instrument_support from opentrons.protocols.api_support.types import APIVersion @@ -38,6 +38,9 @@ MagneticModuleCore, MagneticBlockCore, ) +from opentrons.protocols.api_support.deck_type import ( + NoTrashDefinedError, +) @pytest.fixture(autouse=True) @@ -58,9 +61,11 @@ def _mock_instrument_support_module( def mock_core(decoy: Decoy) -> ProtocolCore: """Get a mock implementation core.""" mock_core = decoy.mock(cls=ProtocolCore) - decoy.when(mock_core.fixed_trash.get_name()).then_return("cool trash") - decoy.when(mock_core.fixed_trash.get_display_name()).then_return("Cool Trash") - decoy.when(mock_core.fixed_trash.get_well_columns()).then_return([]) + mock_fixed_trash = decoy.mock(cls=LabwareCore) + decoy.when(mock_core.fixed_trash).then_return(mock_fixed_trash) + decoy.when(mock_fixed_trash.get_name()).then_return("cool trash") + decoy.when(mock_fixed_trash.get_display_name()).then_return("Cool Trash") + decoy.when(mock_fixed_trash.get_well_columns()).then_return([]) return mock_core @@ -76,6 +81,12 @@ def mock_deck(decoy: Decoy) -> Deck: return decoy.mock(cls=Deck) +@pytest.fixture +def mock_fixed_trash(decoy: Decoy) -> Labware: + """Get a mock Fixed Trash.""" + return decoy.mock(cls=Labware) + + @pytest.fixture def api_version() -> APIVersion: """The API version under test.""" @@ -88,8 +99,11 @@ def subject( mock_core_map: LoadedCoreMap, mock_deck: Deck, api_version: APIVersion, + mock_fixed_trash: Labware, + decoy: Decoy, ) -> ProtocolContext: """Get a ProtocolContext test subject with its dependencies mocked out.""" + decoy.when(mock_core_map.get(mock_core.fixed_trash)).then_return(mock_fixed_trash) return ProtocolContext( api_version=api_version, core=mock_core, @@ -107,12 +121,13 @@ def test_fixed_trash( """It should get the fixed trash labware from the core.""" trash_captor = matchers.Captor() + assert mock_core.fixed_trash is not None decoy.verify(mock_core_map.add(mock_core.fixed_trash, trash_captor), times=1) trash = trash_captor.value decoy.when(mock_core_map.get(mock_core.fixed_trash)).then_return(trash) - + decoy.when(mock_core.get_disposal_locations()).then_return([trash]) result = subject.fixed_trash assert result is trash @@ -135,11 +150,15 @@ def test_load_instrument( mock_instrument_core = decoy.mock(cls=InstrumentCore) mock_tip_racks = [decoy.mock(cls=Labware), decoy.mock(cls=Labware)] - decoy.when(mock_validation.ensure_mount("shadowfax")).then_return(Mount.LEFT) decoy.when(mock_validation.ensure_lowercase_name("Gandalf")).then_return("gandalf") decoy.when(mock_validation.ensure_pipette_name("gandalf")).then_return( PipetteNameType.P300_SINGLE ) + decoy.when( + mock_validation.ensure_mount_for_pipette( + "shadowfax", PipetteNameType.P300_SINGLE + ) + ).then_return(Mount.LEFT) decoy.when( mock_core.load_instrument( @@ -149,6 +168,9 @@ def test_load_instrument( ).then_return(mock_instrument_core) decoy.when(mock_instrument_core.get_pipette_name()).then_return("Gandalf the Grey") + decoy.when(mock_core.get_disposal_locations()).then_raise( + NoTrashDefinedError("No trash!") + ) result = subject.load_instrument( instrument_name="Gandalf", mount="shadowfax", tip_racks=mock_tip_racks @@ -179,13 +201,17 @@ def test_load_instrument_replace( """It should allow/disallow pipette replacement.""" mock_instrument_core = decoy.mock(cls=InstrumentCore) - decoy.when(mock_validation.ensure_lowercase_name("ada")).then_return("ada") - decoy.when(mock_validation.ensure_mount(matchers.IsA(Mount))).then_return( - Mount.RIGHT + decoy.when(mock_validation.ensure_lowercase_name(matchers.IsA(str))).then_return( + "ada" ) decoy.when(mock_validation.ensure_pipette_name(matchers.IsA(str))).then_return( PipetteNameType.P300_SINGLE ) + decoy.when( + mock_validation.ensure_mount_for_pipette( + matchers.IsA(Mount), matchers.IsA(PipetteNameType) + ) + ).then_return(Mount.RIGHT) decoy.when( mock_core.load_instrument( instrument_name=matchers.IsA(PipetteNameType), @@ -193,6 +219,9 @@ def test_load_instrument_replace( ) ).then_return(mock_instrument_core) decoy.when(mock_instrument_core.get_pipette_name()).then_return("Ada Lovelace") + decoy.when(mock_core.get_disposal_locations()).then_raise( + NoTrashDefinedError("No trash!") + ) pipette_1 = subject.load_instrument(instrument_name="ada", mount=Mount.RIGHT) assert subject.loaded_instruments["right"] is pipette_1 @@ -206,33 +235,6 @@ def test_load_instrument_replace( subject.load_instrument(instrument_name="ada", mount=Mount.RIGHT) -def test_96_channel_pipette_always_loads_on_the_left_mount( - decoy: Decoy, - mock_core: ProtocolCore, - subject: ProtocolContext, -) -> None: - """It should always load a 96-channel pipette on left mount, regardless of the mount arg specified.""" - mock_instrument_core = decoy.mock(cls=InstrumentCore) - - decoy.when(mock_validation.ensure_lowercase_name("A 96 Channel Name")).then_return( - "a 96 channel name" - ) - decoy.when(mock_validation.ensure_pipette_name("a 96 channel name")).then_return( - PipetteNameType.P1000_96 - ) - decoy.when( - mock_core.load_instrument( - instrument_name=PipetteNameType.P1000_96, - mount=Mount.LEFT, - ) - ).then_return(mock_instrument_core) - - result = subject.load_instrument( - instrument_name="A 96 Channel Name", mount="shadowfax" - ) - assert result == subject.loaded_instruments["left"] - - def test_96_channel_pipette_raises_if_another_pipette_attached( decoy: Decoy, mock_core: ProtocolCore, @@ -241,13 +243,17 @@ def test_96_channel_pipette_raises_if_another_pipette_attached( """It should always raise when loading a 96-channel pipette when another pipette is attached.""" mock_instrument_core = decoy.mock(cls=InstrumentCore) - decoy.when(mock_validation.ensure_lowercase_name("ada")).then_return("ada") - decoy.when(mock_validation.ensure_pipette_name("ada")).then_return( - PipetteNameType.P300_SINGLE - ) - decoy.when(mock_validation.ensure_mount(matchers.IsA(Mount))).then_return( - Mount.RIGHT - ) + decoy.when( + mock_validation.ensure_lowercase_name("A Single Channel Name") + ).then_return("a single channel name") + decoy.when( + mock_validation.ensure_pipette_name("a single channel name") + ).then_return(PipetteNameType.P300_SINGLE) + decoy.when( + mock_validation.ensure_mount_for_pipette( + Mount.RIGHT, PipetteNameType.P300_SINGLE + ) + ).then_return(Mount.RIGHT) decoy.when( mock_core.load_instrument( @@ -258,7 +264,13 @@ def test_96_channel_pipette_raises_if_another_pipette_attached( decoy.when(mock_instrument_core.get_pipette_name()).then_return("ada") - pipette_1 = subject.load_instrument(instrument_name="ada", mount=Mount.RIGHT) + decoy.when(mock_core.get_disposal_locations()).then_raise( + NoTrashDefinedError("No trash!") + ) + + pipette_1 = subject.load_instrument( + instrument_name="A Single Channel Name", mount=Mount.RIGHT + ) assert subject.loaded_instruments["right"] is pipette_1 decoy.when(mock_validation.ensure_lowercase_name("A 96 Channel Name")).then_return( @@ -267,6 +279,9 @@ def test_96_channel_pipette_raises_if_another_pipette_attached( decoy.when(mock_validation.ensure_pipette_name("a 96 channel name")).then_return( PipetteNameType.P1000_96 ) + decoy.when( + mock_validation.ensure_mount_for_pipette("shadowfax", PipetteNameType.P1000_96) + ).then_return(Mount.LEFT) decoy.when( mock_core.load_instrument( instrument_name=PipetteNameType.P1000_96, @@ -380,6 +395,52 @@ def test_load_labware_off_deck_raises( ) +def test_load_labware_on_staging_slot( + decoy: Decoy, + mock_core: ProtocolCore, + mock_core_map: LoadedCoreMap, + api_version: APIVersion, + subject: ProtocolContext, +) -> None: + """It should create a labware on a staging slot using its execution core.""" + mock_labware_core = decoy.mock(cls=LabwareCore) + + decoy.when(mock_validation.ensure_lowercase_name("UPPERCASE_LABWARE")).then_return( + "lowercase_labware" + ) + decoy.when(mock_core.robot_type).then_return("OT-3 Standard") + decoy.when( + mock_validation.ensure_and_convert_deck_slot(42, api_version, "OT-3 Standard") + ).then_return(StagingSlotName.SLOT_B4) + + decoy.when( + mock_core.load_labware( + load_name="lowercase_labware", + location=StagingSlotName.SLOT_B4, + label="some_display_name", + namespace="some_namespace", + version=1337, + ) + ).then_return(mock_labware_core) + + decoy.when(mock_labware_core.get_name()).then_return("Full Name") + decoy.when(mock_labware_core.get_display_name()).then_return("Display Name") + decoy.when(mock_labware_core.get_well_columns()).then_return([]) + + result = subject.load_labware( + load_name="UPPERCASE_LABWARE", + location=42, + label="some_display_name", + namespace="some_namespace", + version=1337, + ) + + assert isinstance(result, Labware) + assert result.name == "Full Name" + + decoy.verify(mock_core_map.add(mock_labware_core, result), times=1) + + def test_load_labware_from_definition( decoy: Decoy, mock_core: ProtocolCore, @@ -465,6 +526,47 @@ def test_load_adapter( decoy.verify(mock_core_map.add(mock_labware_core, result), times=1) +def test_load_adapter_on_staging_slot( + decoy: Decoy, + mock_core: ProtocolCore, + mock_core_map: LoadedCoreMap, + api_version: APIVersion, + subject: ProtocolContext, +) -> None: + """It should create an adapter on a staging slot using its execution core.""" + mock_labware_core = decoy.mock(cls=LabwareCore) + + decoy.when(mock_validation.ensure_lowercase_name("UPPERCASE_ADAPTER")).then_return( + "lowercase_adapter" + ) + decoy.when(mock_core.robot_type).then_return("OT-3 Standard") + decoy.when( + mock_validation.ensure_and_convert_deck_slot(42, api_version, "OT-3 Standard") + ).then_return(StagingSlotName.SLOT_B4) + + decoy.when( + mock_core.load_adapter( + load_name="lowercase_adapter", + location=StagingSlotName.SLOT_B4, + namespace="some_namespace", + version=1337, + ) + ).then_return(mock_labware_core) + + decoy.when(mock_labware_core.get_well_columns()).then_return([]) + + result = subject.load_adapter( + load_name="UPPERCASE_ADAPTER", + location=42, + namespace="some_namespace", + version=1337, + ) + + assert isinstance(result, Labware) + + decoy.verify(mock_core_map.add(mock_labware_core, result), times=1) + + def test_load_labware_on_adapter( decoy: Decoy, mock_core: ProtocolCore, @@ -596,6 +698,50 @@ def test_move_labware_to_slot( ) +def test_move_labware_to_staging_slot( + decoy: Decoy, + mock_core: ProtocolCore, + mock_core_map: LoadedCoreMap, + api_version: APIVersion, + subject: ProtocolContext, +) -> None: + """It should move labware to new slot location.""" + drop_offset = {"x": 4, "y": 5, "z": 6} + mock_labware_core = decoy.mock(cls=LabwareCore) + + decoy.when(mock_core.robot_type).then_return("OT-3 Standard") + decoy.when( + mock_validation.ensure_and_convert_deck_slot(42, api_version, "OT-3 Standard") + ).then_return(StagingSlotName.SLOT_B4) + decoy.when(mock_labware_core.get_well_columns()).then_return([]) + + movable_labware = Labware( + core=mock_labware_core, + api_version=MAX_SUPPORTED_VERSION, + protocol_core=mock_core, + core_map=mock_core_map, + ) + decoy.when( + mock_validation.ensure_valid_labware_offset_vector(drop_offset) + ).then_return((1, 2, 3)) + subject.move_labware( + labware=movable_labware, + new_location=42, + drop_offset=drop_offset, + ) + + decoy.verify( + mock_core.move_labware( + labware_core=mock_labware_core, + new_location=StagingSlotName.SLOT_B4, + use_gripper=False, + pause_for_manual_move=True, + pick_up_offset=None, + drop_offset=(1, 2, 3), + ) + ) + + def test_move_labware_to_module( decoy: Decoy, mock_core: ProtocolCore, @@ -605,9 +751,12 @@ def test_move_labware_to_module( """It should move labware to new module location.""" mock_labware_core = decoy.mock(cls=LabwareCore) mock_module_core = decoy.mock(cls=TemperatureModuleCore) - mock_broker = decoy.mock(cls=Broker) + mock_broker = decoy.mock(cls=LegacyBroker) decoy.when(mock_labware_core.get_well_columns()).then_return([]) + decoy.when(mock_module_core.get_deck_slot()).then_return(DeckSlotName.SLOT_A1) + decoy.when(mock_core.get_labware_on_module(mock_module_core)).then_return(None) + decoy.when(mock_core_map.get(None)).then_return(None) movable_labware = Labware( core=mock_labware_core, @@ -782,6 +931,26 @@ def test_load_module_with_mag_block_raises(subject: ProtocolContext) -> None: ) +def test_load_module_on_staging_slot_raises( + decoy: Decoy, + mock_core: ProtocolCore, + mock_core_map: LoadedCoreMap, + api_version: APIVersion, + subject: ProtocolContext, +) -> None: + """It should raise when attempting to load a module onto a staging slot.""" + decoy.when(mock_validation.ensure_module_model("spline reticulator")).then_return( + TemperatureModuleModel.TEMPERATURE_V1 + ) + decoy.when(mock_core.robot_type).then_return("OT-3 Standard") + decoy.when( + mock_validation.ensure_and_convert_deck_slot(42, api_version, "OT-3 Standard") + ).then_return(StagingSlotName.SLOT_B4) + + with pytest.raises(ValueError, match="Cannot load a module onto a staging slot."): + subject.load_module(module_name="spline reticulator", location=42) + + def test_loaded_modules( decoy: Decoy, mock_core_map: LoadedCoreMap, diff --git a/api/tests/opentrons/protocol_api/test_temperature_module_context.py b/api/tests/opentrons/protocol_api/test_temperature_module_context.py index ade48b8af1c..2c4c3c6b8d4 100644 --- a/api/tests/opentrons/protocol_api/test_temperature_module_context.py +++ b/api/tests/opentrons/protocol_api/test_temperature_module_context.py @@ -2,7 +2,7 @@ import pytest from decoy import Decoy, matchers -from opentrons.broker import Broker +from opentrons.legacy_broker import LegacyBroker from opentrons.hardware_control.modules import TemperatureStatus from opentrons.protocols.api_support.types import APIVersion from opentrons.protocols.api_support.util import APIVersionError @@ -30,9 +30,9 @@ def mock_core_map(decoy: Decoy) -> LoadedCoreMap: @pytest.fixture -def mock_broker(decoy: Decoy) -> Broker: +def mock_broker(decoy: Decoy) -> LegacyBroker: """Get a mock command message broker.""" - return decoy.mock(cls=Broker) + return decoy.mock(cls=LegacyBroker) @pytest.fixture @@ -47,7 +47,7 @@ def subject( mock_core: TemperatureModuleCore, mock_protocol_core: ProtocolCore, mock_core_map: LoadedCoreMap, - mock_broker: Broker, + mock_broker: LegacyBroker, ) -> TemperatureModuleContext: """Get a temperature module context with its dependencies mocked out.""" return TemperatureModuleContext( @@ -62,7 +62,7 @@ def subject( def test_set_temperature( decoy: Decoy, mock_core: TemperatureModuleCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: TemperatureModuleContext, ) -> None: """It should set and wait for the temperature via the core.""" @@ -92,7 +92,7 @@ def test_set_temperature( def test_start_set_temperature( decoy: Decoy, mock_core: TemperatureModuleCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: TemperatureModuleContext, ) -> None: """It should set the target temperature via the core.""" @@ -120,7 +120,7 @@ def test_start_set_temperature( @pytest.mark.parametrize("api_version", [APIVersion(2, 2)]) def test_start_set_temperature_api_version_low( - decoy: Decoy, mock_broker: Broker, subject: TemperatureModuleContext + decoy: Decoy, mock_broker: LegacyBroker, subject: TemperatureModuleContext ) -> None: """It should reject if API version is lower than 2.3.""" with pytest.raises(APIVersionError) as exc_info: @@ -138,7 +138,7 @@ def test_start_set_temperature_api_version_low( def test_await_temperature( decoy: Decoy, mock_core: TemperatureModuleCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: TemperatureModuleContext, ) -> None: """It should wait for a specified target temperature.""" @@ -162,7 +162,7 @@ def test_await_temperature( @pytest.mark.parametrize("api_version", [APIVersion(2, 2)]) def test_await_temperature_api_version_low( - decoy: Decoy, mock_broker: Broker, subject: TemperatureModuleContext + decoy: Decoy, mock_broker: LegacyBroker, subject: TemperatureModuleContext ) -> None: """It should reject if API version is lower than 2.3.""" with pytest.raises(APIVersionError) as exc_info: @@ -179,7 +179,7 @@ def test_await_temperature_api_version_low( def test_deactivate( decoy: Decoy, mock_core: TemperatureModuleCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: TemperatureModuleContext, ) -> None: """It should deactivate the heater.""" diff --git a/api/tests/opentrons/protocol_api/test_thermocycler_context.py b/api/tests/opentrons/protocol_api/test_thermocycler_context.py index fcf08126a3c..d8f5feed1ba 100644 --- a/api/tests/opentrons/protocol_api/test_thermocycler_context.py +++ b/api/tests/opentrons/protocol_api/test_thermocycler_context.py @@ -3,7 +3,7 @@ import pytest from decoy import Decoy, matchers -from opentrons.broker import Broker +from opentrons.legacy_broker import LegacyBroker from opentrons.drivers.types import ThermocyclerLidStatus from opentrons.hardware_control.modules import TemperatureStatus from opentrons.protocols.api_support.types import APIVersion @@ -41,9 +41,9 @@ def mock_core_map(decoy: Decoy) -> LoadedCoreMap: @pytest.fixture -def mock_broker(decoy: Decoy) -> Broker: +def mock_broker(decoy: Decoy) -> LegacyBroker: """Get a mock command message broker.""" - return decoy.mock(cls=Broker) + return decoy.mock(cls=LegacyBroker) @pytest.fixture @@ -58,7 +58,7 @@ def subject( mock_core: ThermocyclerCore, mock_protocol_core: ProtocolCore, mock_core_map: LoadedCoreMap, - mock_broker: Broker, + mock_broker: LegacyBroker, ) -> ThermocyclerContext: """Get a thermocycler module context with its dependencies mocked out.""" return ThermocyclerContext( @@ -200,7 +200,7 @@ def test_get_current_step_index( def test_open_lid( decoy: Decoy, mock_core: ThermocyclerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: ThermocyclerContext, ) -> None: """It should open the lid via the core.""" @@ -231,7 +231,7 @@ def test_open_lid( def test_close_lid( decoy: Decoy, mock_core: ThermocyclerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: ThermocyclerContext, ) -> None: """It should close the lid via the core.""" @@ -262,7 +262,7 @@ def test_close_lid( def test_set_block_temperature( decoy: Decoy, mock_core: ThermocyclerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: ThermocyclerContext, ) -> None: """It should set the block temperature via the core.""" @@ -314,7 +314,7 @@ def test_set_block_temperature( def test_set_lid_temperature( decoy: Decoy, mock_core: ThermocyclerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: ThermocyclerContext, ) -> None: """It should close the lid via the core.""" @@ -342,7 +342,7 @@ def test_set_lid_temperature( def test_execute_profile( decoy: Decoy, mock_core: ThermocyclerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: ThermocyclerContext, ) -> None: """It should execute a thermocycler profile via the core.""" @@ -425,7 +425,7 @@ def test_execute_profile( def test_deactivate_lid( decoy: Decoy, mock_core: ThermocyclerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: ThermocyclerContext, ) -> None: """It should turn off the heated lid via the core.""" @@ -452,7 +452,7 @@ def test_deactivate_lid( def test_deactivate_block( decoy: Decoy, mock_core: ThermocyclerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: ThermocyclerContext, ) -> None: """It should turn off the well block temperature controller via the core.""" @@ -479,7 +479,7 @@ def test_deactivate_block( def test_deactivate( decoy: Decoy, mock_core: ThermocyclerCore, - mock_broker: Broker, + mock_broker: LegacyBroker, subject: ThermocyclerContext, ) -> None: """It should turn off the well block and heated lid via the core.""" diff --git a/api/tests/opentrons/protocol_api/test_validation.py b/api/tests/opentrons/protocol_api/test_validation.py index 13ec1d77db6..667349f0f8d 100644 --- a/api/tests/opentrons/protocol_api/test_validation.py +++ b/api/tests/opentrons/protocol_api/test_validation.py @@ -12,7 +12,7 @@ from opentrons_shared_data.pipette.dev_types import PipetteNameType from opentrons_shared_data.robot.dev_types import RobotType -from opentrons.types import Mount, DeckSlotName, Location, Point +from opentrons.types import Mount, DeckSlotName, StagingSlotName, Location, Point from opentrons.hardware_control.modules.types import ( ModuleModel, MagneticModuleModel, @@ -28,18 +28,28 @@ @pytest.mark.parametrize( - ["input_value", "expected"], + ["input_mount", "input_pipette", "expected"], [ - ("left", Mount.LEFT), - ("right", Mount.RIGHT), - ("LeFt", Mount.LEFT), - (Mount.LEFT, Mount.LEFT), - (Mount.RIGHT, Mount.RIGHT), + # Different string capitalizations: + ("left", PipetteNameType.P300_MULTI_GEN2, Mount.LEFT), + ("right", PipetteNameType.P300_MULTI_GEN2, Mount.RIGHT), + ("LeFt", PipetteNameType.P300_MULTI_GEN2, Mount.LEFT), + # Passing in a Mount: + (Mount.LEFT, PipetteNameType.P300_MULTI_GEN2, Mount.LEFT), + (Mount.RIGHT, PipetteNameType.P300_MULTI_GEN2, Mount.RIGHT), + # Special handling for the 96-channel: + ("left", PipetteNameType.P1000_96, Mount.LEFT), + ("right", PipetteNameType.P1000_96, Mount.LEFT), + (None, PipetteNameType.P1000_96, Mount.LEFT), ], ) -def test_ensure_mount(input_value: Union[str, Mount], expected: Mount) -> None: +def test_ensure_mount( + input_mount: Union[str, Mount, None], + input_pipette: PipetteNameType, + expected: Mount, +) -> None: """It should properly map strings and mounts.""" - result = subject.ensure_mount(input_value) + result = subject.ensure_mount_for_pipette(input_mount, input_pipette) assert result == expected @@ -48,18 +58,31 @@ def test_ensure_mount_input_invalid() -> None: with pytest.raises( subject.InvalidPipetteMountError, match="must be 'left' or 'right'" ): - subject.ensure_mount("oh no") + subject.ensure_mount_for_pipette("oh no", PipetteNameType.P300_MULTI_GEN2) + + # Any mount is valid for the 96-Channel, but it needs to be a valid mount. + with pytest.raises( + subject.InvalidPipetteMountError, match="must be 'left' or 'right'" + ): + subject.ensure_mount_for_pipette("oh no", PipetteNameType.P1000_96) with pytest.raises( subject.PipetteMountTypeError, match="'left', 'right', or an opentrons.types.Mount", ): - subject.ensure_mount(42) # type: ignore[arg-type] + subject.ensure_mount_for_pipette(42, PipetteNameType.P300_MULTI_GEN2) # type: ignore[arg-type] with pytest.raises( subject.InvalidPipetteMountError, match="Use the left or right mounts instead" ): - subject.ensure_mount(Mount.EXTENSION) + subject.ensure_mount_for_pipette( + Mount.EXTENSION, PipetteNameType.P300_MULTI_GEN2 + ) + + with pytest.raises( + subject.InvalidPipetteMountError, match="You must specify a left or right mount" + ): + subject.ensure_mount_for_pipette(None, PipetteNameType.P300_MULTI_GEN2) @pytest.mark.parametrize( @@ -131,6 +154,11 @@ def test_ensure_pipette_input_invalid(input_value: str) -> None: ("a3", APIVersion(2, 15), "OT-3 Standard", DeckSlotName.SLOT_A3), ("A3", APIVersion(2, 15), "OT-2 Standard", DeckSlotName.FIXED_TRASH), ("A3", APIVersion(2, 15), "OT-3 Standard", DeckSlotName.SLOT_A3), + # Staging slots: + ("A4", APIVersion(2, 16), "OT-3 Standard", StagingSlotName.SLOT_A4), + ("b4", APIVersion(2, 16), "OT-3 Standard", StagingSlotName.SLOT_B4), + ("C4", APIVersion(2, 16), "OT-3 Standard", StagingSlotName.SLOT_C4), + ("d4", APIVersion(2, 16), "OT-3 Standard", StagingSlotName.SLOT_D4), ], ) def test_ensure_and_convert_deck_slot( @@ -162,6 +190,7 @@ def test_ensure_and_convert_deck_slot( APIVersionError, '"A1" requires apiLevel 2.15. Increase your protocol\'s apiLevel, or use slot "10" instead.', ), + ("A4", APIVersion(2, 15), APIVersionError, "Using a staging deck slot"), ], ) @pytest.mark.parametrize("input_robot_type", ["OT-2 Standard", "OT-3 Standard"]) diff --git a/api/tests/opentrons/protocol_api_integration/__init__.py b/api/tests/opentrons/protocol_api_integration/__init__.py new file mode 100644 index 00000000000..58628c808e6 --- /dev/null +++ b/api/tests/opentrons/protocol_api_integration/__init__.py @@ -0,0 +1,10 @@ +"""Integration tests for the Python Protocol API. + +These test the Python Protocol API from the point of view of the user's Python protocol. + +They do not make sure the robot would actually move to the right place--that is the job of +other tests, such as g-code-testing. + +These are supplementary for Python Protocol API features that depend on nontrivial interaction +between those layers. +""" diff --git a/api/tests/opentrons/protocol_api_integration/test_pipette_movement_deck_conflicts.py b/api/tests/opentrons/protocol_api_integration/test_pipette_movement_deck_conflicts.py new file mode 100644 index 00000000000..66e3e560776 --- /dev/null +++ b/api/tests/opentrons/protocol_api_integration/test_pipette_movement_deck_conflicts.py @@ -0,0 +1,179 @@ +"""Tests for the APIs around deck conflicts during pipette movement.""" + +import pytest + +from opentrons import simulate +from opentrons.protocol_api import COLUMN, ALL +from opentrons.protocol_api.core.engine.deck_conflict import ( + PartialTipMovementNotAllowedError, +) + + +@pytest.mark.ot3_only +def test_deck_conflicts_for_96_ch_a12_column_configuration() -> None: + """It should raise errors for the expected deck conflicts.""" + protocol_context = simulate.get_protocol_api(version="2.16", robot_type="Flex") + trash_labware = protocol_context.load_labware( + "opentrons_1_trash_3200ml_fixed", "A3" + ) + + badly_placed_tiprack = protocol_context.load_labware( + "opentrons_flex_96_tiprack_50ul", "C2" + ) + well_placed_tiprack = protocol_context.load_labware( + "opentrons_flex_96_tiprack_50ul", "C1" + ) + tiprack_on_adapter = protocol_context.load_labware( + "opentrons_flex_96_tiprack_50ul", + "C3", + adapter="opentrons_flex_96_tiprack_adapter", + ) + + thermocycler = protocol_context.load_module("thermocyclerModuleV2") + partially_accessible_plate = thermocycler.load_labware( + "opentrons_96_wellplate_200ul_pcr_full_skirt" + ) + + instrument = protocol_context.load_instrument("flex_96channel_1000", mount="left") + instrument.trash_container = trash_labware + + # ############ SHORT LABWARE ################ + # These labware should be to the west of tall labware to avoid any partial tip deck conflicts + badly_placed_labware = protocol_context.load_labware( + "nest_96_wellplate_200ul_flat", "D2" + ) + well_placed_labware = protocol_context.load_labware( + "nest_96_wellplate_200ul_flat", "D3" + ) + + # ############ TALL LABWARE ############## + protocol_context.load_labware( + "opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical", "D1" + ) + + # ########### Use Partial Nozzles ############# + instrument.configure_nozzle_layout(style=COLUMN, start="A12") + + with pytest.raises( + PartialTipMovementNotAllowedError, match="collision with items in deck slot" + ): + instrument.pick_up_tip(badly_placed_tiprack.wells_by_name()["A1"]) + + # No error since no tall item in west slot of destination slot + instrument.pick_up_tip(well_placed_tiprack.wells_by_name()["A1"]) + instrument.aspirate(50, well_placed_labware.wells_by_name()["A4"]) + + with pytest.raises( + PartialTipMovementNotAllowedError, match="collision with items in deck slot D1" + ): + instrument.dispense(50, badly_placed_labware.wells()[0]) + + # No error cuz dispensing from high above plate, so it clears tuberack in west slot + instrument.dispense(25, badly_placed_labware.wells_by_name()["A1"].top(150)) + + thermocycler.open_lid() # type: ignore[union-attr] + + # Will NOT raise error since first column of TC labware is accessible + # (it is just a few mm away from the left bound) + instrument.dispense(25, partially_accessible_plate.wells_by_name()["A1"]) + + instrument.drop_tip() + + # ######## CHANGE CONFIG TO ALL ######### + instrument.configure_nozzle_layout(style=ALL, tip_racks=[tiprack_on_adapter]) + + # No error because of full config + instrument.pick_up_tip() + + # No error NOW because of full config + instrument.aspirate(50, badly_placed_labware.wells_by_name()["A1"]) + + # No error NOW because of full config + instrument.dispense(50, partially_accessible_plate.wells_by_name()["A1"]) + + +@pytest.mark.ot3_only +def test_deck_conflicts_for_96_ch_a1_column_configuration() -> None: + """It should raise errors for expected deck conflicts.""" + protocol = simulate.get_protocol_api(version="2.16", robot_type="Flex") + instrument = protocol.load_instrument("flex_96channel_1000", mount="left") + trash_labware = protocol.load_labware("opentrons_1_trash_3200ml_fixed", "A3") + instrument.trash_container = trash_labware + + badly_placed_tiprack = protocol.load_labware("opentrons_flex_96_tiprack_50ul", "C2") + well_placed_tiprack = protocol.load_labware("opentrons_flex_96_tiprack_50ul", "A1") + tiprack_on_adapter = protocol.load_labware( + "opentrons_flex_96_tiprack_50ul", + "C3", + adapter="opentrons_flex_96_tiprack_adapter", + ) + + # ############ SHORT LABWARE ################ + # These labware should be to the east of tall labware to avoid any partial tip deck conflicts + badly_placed_plate = protocol.load_labware("nest_96_wellplate_200ul_flat", "B1") + well_placed_plate = protocol.load_labware("nest_96_wellplate_200ul_flat", "B3") + + # ############ TALL LABWARE ############### + my_tuberack = protocol.load_labware( + "opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical", "B2" + ) + + # ########### Use Partial Nozzles ############# + instrument.configure_nozzle_layout(style=COLUMN, start="A1") + + with pytest.raises( + PartialTipMovementNotAllowedError, match="collision with items in deck slot" + ): + instrument.pick_up_tip(badly_placed_tiprack.wells_by_name()["H12"]) + + # No error cuz within pipette extent bounds and no taller labware to right of tiprack + instrument.pick_up_tip(well_placed_tiprack.wells_by_name()["A12"]) + + # No error cuz no labware on right of plate, and also well A10 is juusst inside the right bound + instrument.aspirate(25, well_placed_plate.wells_by_name()["A10"]) + + # No error cuz dispensing from high above plate, so it clears tuberack on the right + instrument.dispense(25, badly_placed_plate.wells_by_name()["A1"].top(150)) + + with pytest.raises( + PartialTipMovementNotAllowedError, match="collision with items in deck slot" + ): + instrument.aspirate(25, badly_placed_plate.wells_by_name()["A10"]) + + with pytest.raises( + PartialTipMovementNotAllowedError, match="outside of robot bounds" + ): + instrument.aspirate(25, well_placed_plate.wells_by_name()["A11"]) + + # No error cuz no taller labware on the right + instrument.aspirate(10, my_tuberack.wells_by_name()["A1"]) + + with pytest.raises( + PartialTipMovementNotAllowedError, match="outside of robot bounds" + ): + # Raises error because drop tip alternation makes the pipette drop the tips + # near the trash bin labware's right edge, which is out of bounds for column1 nozzles + # We should probably move this tip drop location within the nozzles' accessible area, + # but since we do not recommend loading the trash as labware (there are other things + # wrong with that approach), it is not a critical issue. + instrument.drop_tip() + + instrument.trash_container = None # type: ignore + protocol.load_trash_bin("C1") + + # This doesn't raise an error because it now treats the trash bin as an addressable area + # and the bounds check doesn't yet check moves to addressable areas. + # The aim is to do checks for ALL moves, but also, fix the offset used for tip drop alternation. + instrument.drop_tip() + + # ######## CHANGE CONFIG TO ALL ######### + instrument.configure_nozzle_layout(style=ALL, tip_racks=[tiprack_on_adapter]) + + # No error because of full config + instrument.pick_up_tip() + + # No error NOW because of full config + instrument.aspirate(50, badly_placed_plate.wells_by_name()["A1"]) + + # No error NOW because of full config + instrument.dispense(50, badly_placed_plate.wells_by_name()["A1"].bottom()) diff --git a/api/tests/opentrons/protocol_api_integration/test_trashes.py b/api/tests/opentrons/protocol_api_integration/test_trashes.py new file mode 100644 index 00000000000..f687e497c93 --- /dev/null +++ b/api/tests/opentrons/protocol_api_integration/test_trashes.py @@ -0,0 +1,174 @@ +"""Tests for the APIs around waste chutes and trash bins.""" + + +from opentrons import protocol_api, simulate +from opentrons.protocols.api_support.types import APIVersion + +import contextlib +from typing import ContextManager, Optional, Type +from typing_extensions import Literal + +import pytest + + +@pytest.mark.parametrize( + ("version", "robot_type", "expected_trash_class"), + [ + ("2.13", "OT-2", protocol_api.Labware), + ("2.14", "OT-2", protocol_api.Labware), + ("2.15", "OT-2", protocol_api.Labware), + pytest.param( + "2.15", + "Flex", + protocol_api.Labware, + marks=pytest.mark.ot3_only, # Simulating a Flex protocol requires a Flex hardware API. + ), + pytest.param( + "2.16", + "OT-2", + protocol_api.TrashBin, + ), + pytest.param( + "2.16", + "Flex", + None, + marks=pytest.mark.ot3_only, # Simulating a Flex protocol requires a Flex hardware API. + ), + ], +) +def test_fixed_trash_presence( + robot_type: Literal["OT-2", "Flex"], + version: str, + expected_trash_class: Optional[Type[object]], +) -> None: + """Test the presence of the fixed trash. + + Certain combinations of API version and robot type have a fixed trash. + For those that do, ProtocolContext.fixed_trash and InstrumentContext.trash_container + should point to it. The type of the object depends on the API version. + """ + protocol = simulate.get_protocol_api(version=version, robot_type=robot_type) + instrument = protocol.load_instrument( + "p300_single_gen2" if robot_type == "OT-2" else "flex_1channel_50", + mount="left", + ) + + if expected_trash_class is None: + with pytest.raises( + Exception, + match="Fixed Trash is not supported on Flex protocols in API Version 2.16 and above.", + ): + protocol.fixed_trash + with pytest.raises(Exception, match="No trash container has been defined"): + instrument.trash_container + + else: + assert isinstance(protocol.fixed_trash, expected_trash_class) + assert instrument.trash_container is protocol.fixed_trash + + +@pytest.mark.ot3_only # Simulating a Flex protocol requires a Flex hardware API. +def test_trash_search() -> None: + """Test the automatic trash search for protocols without a fixed trash.""" + protocol = simulate.get_protocol_api(version="2.16", robot_type="Flex") + instrument = protocol.load_instrument("flex_1channel_50", mount="left") + + # By default, there should be no trash. + with pytest.raises( + Exception, + match="Fixed Trash is not supported on Flex protocols in API Version 2.16 and above.", + ): + protocol.fixed_trash + with pytest.raises(Exception, match="No trash container has been defined"): + instrument.trash_container + + loaded_first = protocol.load_trash_bin("A1") + loaded_second = protocol.load_trash_bin("B1") + + # After loading some trashes, there should still be no protocol.fixed_trash... + with pytest.raises( + Exception, + match="Fixed Trash is not supported on Flex protocols in API Version 2.16 and above.", + ): + protocol.fixed_trash + # ...but instrument.trash_container should automatically update to point to + # the first trash that we loaded. + assert instrument.trash_container is loaded_first + + # You should be able to override instrument.trash_container explicitly. + instrument.trash_container = loaded_second + assert instrument.trash_container is loaded_second + + +@pytest.mark.parametrize( + ("version", "robot_type", "expect_load_to_succeed"), + [ + pytest.param( + "2.13", + "OT-2", + False, + # This xfail (the system does let you load a labware onto slot 12, and does not raise) + # is surprising to me. It may be be a bug in old PAPI versions. + marks=pytest.mark.xfail(strict=True, raises=pytest.fail.Exception), + ), + ("2.14", "OT-2", False), + ("2.15", "OT-2", False), + pytest.param( + "2.15", + "Flex", + False, + marks=pytest.mark.ot3_only, # Simulating a Flex protocol requires a Flex hardware API. + ), + pytest.param( + "2.16", + "OT-2", + False, + # This should ideally raise, matching OT-2 behavior on prior Protocol API versions. + # It currently does not because Protocol API v2.15's trashes are implemented as + # addressable areas, not labware--and they're only brought into existence + # *on first use,* not at the beginning of a protocol. + # + # The good news is that even though the conflicting load will not raise like we want, + # something in the protocol will eventually raise, e.g. when a pipette goes to drop a + # tip in the fixed trash and finds that a fixed trash can't exist there because there's + # a labware. + marks=pytest.mark.xfail(strict=True, raises=pytest.fail.Exception), + ), + pytest.param( + "2.16", + "Flex", + True, + marks=pytest.mark.ot3_only, # Simulating a Flex protocol requires a Flex hardware API. + ), + ], +) +def test_fixed_trash_load_conflicts( + robot_type: Literal["Flex", "OT-2"], + version: str, + expect_load_to_succeed: bool, +) -> None: + """Test loading something onto the location historically used for the fixed trash. + + In configurations where there is a fixed trash, this should be disallowed. + In configurations without a fixed trash, this should be allowed. + """ + protocol = simulate.get_protocol_api(version=version, robot_type=robot_type) + + if expect_load_to_succeed: + expected_error: ContextManager[object] = contextlib.nullcontext() + else: + # If we're expecting an error, it'll be a LocationIsOccupied for 2.15 and below, otherwise + # it will fail with an IncompatibleAddressableAreaError, since slot 12 will not be in the deck config + if APIVersion.from_string(version) < APIVersion(2, 16): + error_name = "LocationIsOccupiedError" + else: + error_name = "IncompatibleAddressableAreaError" + + expected_error = pytest.raises( + Exception, + # Exact message doesn't matter, as long as it's definitely a labware load or addressable area conflict. + match=error_name, + ) + + with expected_error: + protocol.load_labware("opentrons_96_wellplate_200ul_pcr_full_skirt", 12) diff --git a/api/tests/opentrons/protocol_api_old/core/protocol_api/test_instrument_context.py b/api/tests/opentrons/protocol_api_old/core/protocol_api/test_instrument_context.py index 77438c1f4ed..7cea4113e28 100644 --- a/api/tests/opentrons/protocol_api_old/core/protocol_api/test_instrument_context.py +++ b/api/tests/opentrons/protocol_api_old/core/protocol_api/test_instrument_context.py @@ -2,6 +2,7 @@ from typing import cast import pytest +from _pytest.fixtures import SubRequest from decoy import Decoy from opentrons.types import Mount @@ -18,9 +19,9 @@ @pytest.fixture(params=[Mount.LEFT, Mount.RIGHT]) -def mount(request: pytest.FixtureRequest) -> Mount: +def mount(request: SubRequest) -> Mount: """Set the subject's mount.""" - return cast(Mount, request.param) # type: ignore[attr-defined] + return cast(Mount, request.param) @pytest.fixture diff --git a/api/tests/opentrons/protocol_api_old/core/simulator/conftest.py b/api/tests/opentrons/protocol_api_old/core/simulator/conftest.py index 015040a39f9..723dc568add 100644 --- a/api/tests/opentrons/protocol_api_old/core/simulator/conftest.py +++ b/api/tests/opentrons/protocol_api_old/core/simulator/conftest.py @@ -117,8 +117,8 @@ def tip_rack(minimal_labware_def: LabwareDefinition) -> LegacyLabwareCore: tip_rack_parameters["isTiprack"] = True tip_rack_parameters["tipLength"] = 123 tip_rack_definition["parameters"] = tip_rack_parameters - tip_rack_definition["wells"]["A1"]["totalLiquidVolume"] = 200 # type: ignore - tip_rack_definition["wells"]["A2"]["totalLiquidVolume"] = 200 # type: ignore + tip_rack_definition["wells"]["A1"]["totalLiquidVolume"] = 200 + tip_rack_definition["wells"]["A2"]["totalLiquidVolume"] = 200 """Labware fixture.""" return LegacyLabwareCore( diff --git a/api/tests/opentrons/protocol_api_old/core/simulator/test_instrument_context.py b/api/tests/opentrons/protocol_api_old/core/simulator/test_instrument_context.py index 35a152839c8..c9bd57c0997 100644 --- a/api/tests/opentrons/protocol_api_old/core/simulator/test_instrument_context.py +++ b/api/tests/opentrons/protocol_api_old/core/simulator/test_instrument_context.py @@ -1,15 +1,16 @@ """Test instrument context simulation.""" -from typing import Callable +from typing import Callable, cast import pytest -from pytest_lazyfixture import lazy_fixture # type: ignore[import] +from _pytest.fixtures import SubRequest +from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] -from opentrons.hardware_control import ( - NoTipAttachedError, - TipAttachedError, -) from opentrons.protocol_api.core.common import InstrumentCore, LabwareCore from opentrons.types import Location, Point +from opentrons_shared_data.errors.exceptions import ( + UnexpectedTipRemovalError, + UnexpectedTipAttachError, +) # TODO (lc 12-8-2022) Not sure if we plan to keep these tests, but if we do # we should re-write them to be agnostic to the underlying hardware. Otherwise @@ -23,8 +24,8 @@ lazy_fixture("simulating_instrument_context"), ] ) -def subject(request: pytest.FixtureRequest) -> InstrumentCore: - return request.param # type: ignore[attr-defined, no-any-return] +def subject(request: SubRequest) -> InstrumentCore: + return cast(InstrumentCore, request.param) def test_same_pipette( @@ -40,15 +41,17 @@ def test_same_pipette( def test_prepare_to_aspirate_no_tip(subject: InstrumentCore) -> None: """It should raise an error if a tip is not attached.""" - with pytest.raises(NoTipAttachedError, match="Cannot perform PREPARE_ASPIRATE"): - subject.prepare_for_aspirate() # type: ignore[attr-defined] + with pytest.raises( + UnexpectedTipRemovalError, match="Cannot perform PREPARE_ASPIRATE" + ): + subject.prepare_to_aspirate() def test_dispense_no_tip(subject: InstrumentCore) -> None: """It should raise an error if a tip is not attached.""" subject.home() location = Location(point=Point(1, 2, 3), labware=None) - with pytest.raises(NoTipAttachedError, match="Cannot perform DISPENSE"): + with pytest.raises(UnexpectedTipRemovalError, match="Cannot perform DISPENSE"): subject.dispense( volume=1, rate=1, @@ -60,25 +63,6 @@ def test_dispense_no_tip(subject: InstrumentCore) -> None: ) -def test_drop_tip_no_tip(subject: InstrumentCore, tip_rack: LabwareCore) -> None: - """It should raise an error if a tip is not attached.""" - tip_core = tip_rack.get_well_core("A1") - - subject.home() - with pytest.raises(NoTipAttachedError, match="Cannot perform DROPTIP"): - subject.drop_tip(location=None, well_core=tip_core, home_after=False) - - -def test_blow_out_no_tip(subject: InstrumentCore, labware: LabwareCore) -> None: - """It should raise an error if a tip is not attached.""" - with pytest.raises(NoTipAttachedError, match="Cannot perform BLOWOUT"): - subject.blow_out( - location=Location(point=Point(1, 2, 3), labware=None), - well_core=labware.get_well_core("A1"), - in_place=True, - ) - - def test_pick_up_tip_no_tip(subject: InstrumentCore, tip_rack: LabwareCore) -> None: """It should raise an error if a tip is already attached.""" tip_core = tip_rack.get_well_core("A1") @@ -91,7 +75,7 @@ def test_pick_up_tip_no_tip(subject: InstrumentCore, tip_rack: LabwareCore) -> N increment=None, prep_after=False, ) - with pytest.raises(TipAttachedError): + with pytest.raises(UnexpectedTipAttachError): subject.pick_up_tip( location=Location(point=tip_core.get_top(z_offset=0), labware=None), well_core=tip_core, @@ -178,7 +162,7 @@ def test_aspirate_too_much( increment=None, prep_after=False, ) - subject.prepare_for_aspirate() # type: ignore[attr-defined] + subject.prepare_to_aspirate() with pytest.raises( AssertionError, match="Cannot aspirate more than pipette max volume" ): @@ -232,7 +216,7 @@ def test_pipette_dict( def _aspirate(i: InstrumentCore, labware: LabwareCore) -> None: """pipette dict with tip fixture.""" - i.prepare_for_aspirate() # type: ignore[attr-defined] + i.prepare_to_aspirate() i.aspirate( location=Location(point=Point(1, 2, 3), labware=None), well_core=labware.get_well_core("A1"), @@ -245,7 +229,7 @@ def _aspirate(i: InstrumentCore, labware: LabwareCore) -> None: def _aspirate_dispense(i: InstrumentCore, labware: LabwareCore) -> None: """pipette dict with tip fixture.""" - i.prepare_for_aspirate() # type: ignore[attr-defined] + i.prepare_to_aspirate() i.aspirate( location=Location(point=Point(1, 2, 3), labware=None), well_core=labware.get_well_core("A1"), @@ -267,7 +251,7 @@ def _aspirate_dispense(i: InstrumentCore, labware: LabwareCore) -> None: def _aspirate_blowout(i: InstrumentCore, labware: LabwareCore) -> None: """pipette dict with tip fixture.""" - i.prepare_for_aspirate() # type: ignore[attr-defined] + i.prepare_to_aspirate() i.aspirate( location=Location(point=Point(1, 2, 3), labware=None), well_core=labware.get_well_core("A1"), @@ -286,7 +270,7 @@ def _aspirate_blowout(i: InstrumentCore, labware: LabwareCore) -> None: @pytest.mark.parametrize( argnames=["side_effector"], argvalues=[ - [lambda i, l: None], + [lambda i, l: None], # noqa: E741 [_aspirate], [_aspirate_dispense], [_aspirate_blowout], diff --git a/api/tests/opentrons/protocol_api_old/core/simulator/test_protocol_context.py b/api/tests/opentrons/protocol_api_old/core/simulator/test_protocol_context.py index f0c634b02cb..022ce3e5853 100644 --- a/api/tests/opentrons/protocol_api_old/core/simulator/test_protocol_context.py +++ b/api/tests/opentrons/protocol_api_old/core/simulator/test_protocol_context.py @@ -1,6 +1,8 @@ """Test instrument context simulation.""" +from typing import cast import pytest -from pytest_lazyfixture import lazy_fixture # type: ignore[import] +from _pytest.fixtures import SubRequest +from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] from opentrons_shared_data.pipette.dev_types import PipetteNameType @@ -14,8 +16,8 @@ lazy_fixture("simulating_protocol_context"), ] ) -def subject(request: pytest.FixtureRequest) -> ProtocolCore: - return request.param # type: ignore[attr-defined, no-any-return] +def subject(request: SubRequest) -> ProtocolCore: + return cast(ProtocolCore, request.param) @pytest.mark.ot2_only @@ -52,3 +54,11 @@ def test_replacing_instrument_tip_state( assert pip1.has_tip() is False assert pip2.has_tip() is False + + +@pytest.mark.ot2_only +def test_load_instrument_raises(simulating_protocol_context: ProtocolCore) -> None: + with pytest.raises(ValueError): + simulating_protocol_context.load_instrument( + instrument_name=PipetteNameType.P1000_SINGLE_FLEX, mount=Mount.RIGHT + ) diff --git a/api/tests/opentrons/protocol_api_old/test_context.py b/api/tests/opentrons/protocol_api_old/test_context.py index 3d5faed74fb..bb8b8f6c7ca 100644 --- a/api/tests/opentrons/protocol_api_old/test_context.py +++ b/api/tests/opentrons/protocol_api_old/test_context.py @@ -6,6 +6,7 @@ from opentrons_shared_data import load_shared_data from opentrons_shared_data.pipette.dev_types import LabwareUri +from opentrons_shared_data.errors.exceptions import UnexpectedTipRemovalError import opentrons.protocol_api as papi import opentrons.protocols.api_support as papi_support @@ -17,7 +18,7 @@ HeaterShakerContext, ) from opentrons.types import Mount, Point, Location, TransferTipPolicy -from opentrons.hardware_control import API, NoTipAttachedError, ThreadManagedHardware +from opentrons.hardware_control import API, ThreadManagedHardware from opentrons.hardware_control.instruments.ot2.pipette import Pipette from opentrons.hardware_control.types import Axis from opentrons.protocols.advanced_control import transfers as tf @@ -581,7 +582,7 @@ def test_prevent_liquid_handling_without_tip(ctx): plate = ctx.load_labware("corning_384_wellplate_112ul_flat", "2") pipR = ctx.load_instrument("p300_single", Mount.RIGHT, tip_racks=[tr]) - with pytest.raises(NoTipAttachedError): + with pytest.raises(UnexpectedTipRemovalError): pipR.aspirate(100, plate.wells()[0]) pipR.pick_up_tip() @@ -589,7 +590,7 @@ def test_prevent_liquid_handling_without_tip(ctx): pipR.aspirate(100, plate.wells()[0]) pipR.drop_tip() - with pytest.raises(NoTipAttachedError): + with pytest.raises(UnexpectedTipRemovalError): pipR.dispense(100, plate.wells()[1]) @@ -875,46 +876,47 @@ def fake_execute_transfer(xfer_plan): def test_flow_rate(ctx, monkeypatch): - old_sfm = ctx._core.get_hardware() + instr = ctx.load_instrument("p300_single", Mount.RIGHT) + old_sfm = instr._core.set_flow_rate - def pass_on(mount, aspirate=None, dispense=None, blow_out=None): - old_sfm(mount, aspirate=None, dispense=None, blow_out=None) + def pass_on(aspirate=None, dispense=None, blow_out=None): + old_sfm(aspirate=aspirate, dispense=dispense, blow_out=blow_out) set_flow_rate = mock.Mock(side_effect=pass_on) - monkeypatch.setattr(ctx._core.get_hardware(), "set_flow_rate", set_flow_rate) - instr = ctx.load_instrument("p300_single", Mount.RIGHT) + monkeypatch.setattr(instr._core, "set_flow_rate", set_flow_rate) ctx.home() instr.flow_rate.aspirate = 1 - assert set_flow_rate.called_once_with(Mount.RIGHT, aspirate=1) + set_flow_rate.assert_called_once_with(aspirate=1) set_flow_rate.reset_mock() instr.flow_rate.dispense = 10 - assert set_flow_rate.called_once_with(Mount.RIGHT, dispense=10) + set_flow_rate.assert_called_once_with(dispense=10) set_flow_rate.reset_mock() instr.flow_rate.blow_out = 2 - assert set_flow_rate.called_once_with(Mount.RIGHT, blow_out=2) + set_flow_rate.assert_called_once_with(blow_out=2) assert instr.flow_rate.aspirate == 1 assert instr.flow_rate.dispense == 10 assert instr.flow_rate.blow_out == 2 def test_pipette_speed(ctx, monkeypatch): - old_sfm = ctx._core.get_hardware() + instr = ctx.load_instrument("p300_single", Mount.RIGHT) + old_sfm = instr._core.set_pipette_speed - def pass_on(mount, aspirate=None, dispense=None, blow_out=None): - old_sfm(aspirate=None, dispense=None, blow_out=None) + def pass_on(aspirate=None, dispense=None, blow_out=None): + old_sfm(aspirate=aspirate, dispense=dispense, blow_out=blow_out) set_speed = mock.Mock(side_effect=pass_on) - monkeypatch.setattr(ctx._core.get_hardware(), "set_pipette_speed", set_speed) - instr = ctx.load_instrument("p300_single", Mount.RIGHT) - + monkeypatch.setattr(instr._core, "set_pipette_speed", set_speed) ctx.home() instr.speed.aspirate = 1 - assert set_speed.called_once_with(Mount.RIGHT, dispense=1) + set_speed.assert_called_once_with(aspirate=1) + set_speed.reset_mock() instr.speed.dispense = 10 + set_speed.assert_called_once_with(dispense=10) + set_speed.reset_mock() instr.speed.blow_out = 2 - assert set_speed.called_with(Mount.RIGHT, dispense=10) - assert set_speed.called_with(Mount.RIGHT, blow_out=2) + set_speed.assert_called_once_with(blow_out=2) assert instr.speed.aspirate == 1 assert instr.speed.dispense == 10 assert instr.speed.blow_out == 2 @@ -1186,11 +1188,11 @@ def raiser(*args, **kwargs): mod = ctx.load_module("thermocycler") assert isinstance(mod, ThermocyclerContext) - mod._core.flag_unsafe_move = mock.MagicMock(side_effect=raiser) # type: ignore[attr-defined, assignment] + mod._core.flag_unsafe_move = mock.MagicMock(side_effect=raiser) # type: ignore[attr-defined] instr = ctx.load_instrument("p1000_single", "left") with pytest.raises(RuntimeError, match="Cannot"): instr.move_to(Location(Point(0, 0, 0), None)) - mod._core.flag_unsafe_move.assert_called_once_with( # type: ignore[attr-defined] + mod._core.flag_unsafe_move.assert_called_once_with( # type: ignore[attr-defined] # type: ignore[attr-defined] to_loc=Location(Point(0, 0, 0), None), from_loc=Location(Point(0, 0, 0), None) ) diff --git a/api/tests/opentrons/protocol_api_old/test_labware.py b/api/tests/opentrons/protocol_api_old/test_labware.py index a245fb5be5f..c72c8a87346 100644 --- a/api/tests/opentrons/protocol_api_old/test_labware.py +++ b/api/tests/opentrons/protocol_api_old/test_labware.py @@ -15,6 +15,7 @@ from opentrons.protocols.api_support.types import APIVersion from opentrons.protocol_api import labware, validation from opentrons.protocol_api.core.labware import AbstractLabware +from opentrons.protocol_api.core.well import AbstractWellCore from opentrons.protocol_api.core.legacy import module_geometry from opentrons.protocol_api.core.legacy.legacy_labware_core import LegacyLabwareCore from opentrons.protocol_api.core.legacy.legacy_well_core import LegacyWellCore @@ -652,7 +653,7 @@ def test_labware_hash_func_diff_implementation_same_version( def test_set_offset(decoy: Decoy) -> None: """It should set the labware's offset using the implementation.""" - labware_impl = decoy.mock(cls=AbstractLabware) + labware_impl: AbstractLabware[AbstractWellCore] = decoy.mock(cls=AbstractLabware) decoy.when(labware_impl.get_well_columns()).then_return([]) subject = labware.Labware( core=labware_impl, diff --git a/api/tests/opentrons/protocol_api_old/test_labware_load.py b/api/tests/opentrons/protocol_api_old/test_labware_load.py index 8ff48429f45..69a41f7a365 100644 --- a/api/tests/opentrons/protocol_api_old/test_labware_load.py +++ b/api/tests/opentrons/protocol_api_old/test_labware_load.py @@ -11,16 +11,16 @@ # TODO(mm, 2022-04-28): Make sure this logic is tested elsewhere, then delete this test. @pytest.mark.apiv2_non_pe_only def test_load_to_slot( - ctx: papi.ProtocolContext, deck_definition: DeckDefinitionV3 + ctx: papi.ProtocolContext, legacy_deck_definition: DeckDefinitionV3 ) -> None: slot_1 = [ slot - for slot in deck_definition["locations"]["orderedSlots"] + for slot in legacy_deck_definition["locations"]["orderedSlots"] if slot["id"] == "1" ][0] slot_2 = [ slot - for slot in deck_definition["locations"]["orderedSlots"] + for slot in legacy_deck_definition["locations"]["orderedSlots"] if slot["id"] == "2" ][0] labware = ctx.load_labware(labware_name, "1") diff --git a/api/tests/opentrons/protocol_engine/clients/test_sync_client.py b/api/tests/opentrons/protocol_engine/clients/test_sync_client.py index f172b93cab1..d5d1f930cca 100644 --- a/api/tests/opentrons/protocol_engine/clients/test_sync_client.py +++ b/api/tests/opentrons/protocol_engine/clients/test_sync_client.py @@ -31,6 +31,7 @@ Liquid, LabwareMovementStrategy, LabwareOffsetVector, + AddressableOffsetVector, ) @@ -67,6 +68,23 @@ def test_add_labware_definition( assert result == expected_labware_uri +def test_add_addressable_area( + decoy: Decoy, + transport: ChildThreadTransport, + subject: SyncClient, +) -> None: + """It should add an addressable area.""" + subject.add_addressable_area(addressable_area_name="cool-area") + + decoy.verify( + transport.call_method( + "add_addressable_area", + addressable_area_name="cool-area", + ), + times=1, + ) + + def test_add_liquid( decoy: Decoy, transport: ChildThreadTransport, @@ -267,6 +285,74 @@ def test_move_to_well( assert result == response +def test_move_to_addressable_area( + decoy: Decoy, + transport: ChildThreadTransport, + subject: SyncClient, +) -> None: + """It should execute a move to addressable area command.""" + request = commands.MoveToAddressableAreaCreate( + params=commands.MoveToAddressableAreaParams( + pipetteId="123", + addressableAreaName="abc", + offset=AddressableOffsetVector(x=3, y=2, z=1), + forceDirect=True, + minimumZHeight=4.56, + speed=7.89, + ) + ) + response = commands.MoveToAddressableAreaResult(position=DeckPoint(x=4, y=5, z=6)) + + decoy.when(transport.execute_command(request=request)).then_return(response) + + result = subject.move_to_addressable_area( + pipette_id="123", + addressable_area_name="abc", + offset=AddressableOffsetVector(x=3, y=2, z=1), + force_direct=True, + minimum_z_height=4.56, + speed=7.89, + ) + + assert result == response + + +def test_move_to_addressable_area_for_drop_tip( + decoy: Decoy, + transport: ChildThreadTransport, + subject: SyncClient, +) -> None: + """It should execute a move to addressable area for drop tip command.""" + request = commands.MoveToAddressableAreaForDropTipCreate( + params=commands.MoveToAddressableAreaForDropTipParams( + pipetteId="123", + addressableAreaName="abc", + offset=AddressableOffsetVector(x=3, y=2, z=1), + forceDirect=True, + minimumZHeight=4.56, + speed=7.89, + alternateDropLocation=True, + ) + ) + response = commands.MoveToAddressableAreaForDropTipResult( + position=DeckPoint(x=4, y=5, z=6) + ) + + decoy.when(transport.execute_command(request=request)).then_return(response) + + result = subject.move_to_addressable_area_for_drop_tip( + pipette_id="123", + addressable_area_name="abc", + offset=AddressableOffsetVector(x=3, y=2, z=1), + force_direct=True, + minimum_z_height=4.56, + speed=7.89, + alternate_drop_location=True, + ) + + assert result == response + + def test_move_to_coordinates( decoy: Decoy, transport: ChildThreadTransport, diff --git a/api/tests/opentrons/protocol_engine/commands/calibration/test_calibrate_module.py b/api/tests/opentrons/protocol_engine/commands/calibration/test_calibrate_module.py index 9907473f0b9..a7821bd80e0 100644 --- a/api/tests/opentrons/protocol_engine/commands/calibration/test_calibrate_module.py +++ b/api/tests/opentrons/protocol_engine/commands/calibration/test_calibrate_module.py @@ -17,6 +17,7 @@ from opentrons.protocol_engine.types import ( DeckSlotLocation, ModuleOffsetVector, + ModuleOffsetData, ) from opentrons.hardware_control.types import OT3Mount @@ -61,7 +62,12 @@ async def test_calibrate_module_implementation( ) decoy.when( subject._state_view.modules.get_module_calibration_offset(module_id) - ).then_return(ModuleOffsetVector(x=0, y=0, z=0)) + ).then_return( + ModuleOffsetData( + moduleOffsetVector=ModuleOffsetVector(x=0, y=0, z=0), + location=location, + ) + ) decoy.when( subject._state_view.geometry.get_nominal_well_position( labware_id=labware_id, well_name="B1" @@ -80,7 +86,12 @@ async def test_calibrate_module_implementation( result = await subject.execute(params) assert result == CalibrateModuleResult( - moduleOffset=ModuleOffsetVector(x=3, y=4, z=6) + moduleOffset=ModuleOffsetVector( + x=3, + y=4, + z=6, + ), + location=location, ) diff --git a/api/tests/opentrons/protocol_engine/commands/conftest.py b/api/tests/opentrons/protocol_engine/commands/conftest.py index f9275b0d1e1..aad3cf21d4a 100644 --- a/api/tests/opentrons/protocol_engine/commands/conftest.py +++ b/api/tests/opentrons/protocol_engine/commands/conftest.py @@ -12,6 +12,7 @@ RailLightsHandler, LabwareMovementHandler, StatusBarHandler, + TipHandler, ) from opentrons.protocol_engine.state import StateView @@ -46,6 +47,12 @@ def pipetting(decoy: Decoy) -> PipettingHandler: return decoy.mock(cls=PipettingHandler) +@pytest.fixture +def tip_handler(decoy: Decoy) -> TipHandler: + """Get a mocked out EquipmentHandler.""" + return decoy.mock(cls=TipHandler) + + @pytest.fixture def run_control(decoy: Decoy) -> RunControlHandler: """Get a mocked out RunControlHandler.""" diff --git a/api/tests/opentrons/protocol_engine/commands/test_configure_for_volume.py b/api/tests/opentrons/protocol_engine/commands/test_configure_for_volume.py index 857386f83a0..8ccc3d3f8cc 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_configure_for_volume.py +++ b/api/tests/opentrons/protocol_engine/commands/test_configure_for_volume.py @@ -16,6 +16,7 @@ ConfigureForVolumePrivateResult, ConfigureForVolumeImplementation, ) +from opentrons.types import Point async def test_configure_for_volume_implementation( @@ -43,6 +44,8 @@ async def test_configure_for_volume_implementation( ), tip_configuration_lookup_table={}, nominal_tip_overlap={}, + back_left_nozzle_offset=Point(x=1, y=2, z=3), + front_right_nozzle_offset=Point(x=4, y=5, z=6), ) decoy.when( diff --git a/api/tests/opentrons/protocol_engine/commands/test_configure_nozzle_layout.py b/api/tests/opentrons/protocol_engine/commands/test_configure_nozzle_layout.py new file mode 100644 index 00000000000..f6b45376f7e --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/test_configure_nozzle_layout.py @@ -0,0 +1,138 @@ +"""Test configure nozzle layout commands.""" +import pytest +from decoy import Decoy +from typing import Union, Optional, Dict +from collections import OrderedDict + +from opentrons.protocol_engine.execution import ( + EquipmentHandler, + TipHandler, +) +from opentrons.types import Point +from opentrons.hardware_control.nozzle_manager import NozzleMap + + +from opentrons.protocol_engine.commands.configure_nozzle_layout import ( + ConfigureNozzleLayoutParams, + ConfigureNozzleLayoutResult, + ConfigureNozzleLayoutPrivateResult, + ConfigureNozzleLayoutImplementation, +) + +from opentrons.protocol_engine.types import ( + AllNozzleLayoutConfiguration, + ColumnNozzleLayoutConfiguration, + QuadrantNozzleLayoutConfiguration, + SingleNozzleLayoutConfiguration, +) +from ..pipette_fixtures import ( + NINETY_SIX_MAP, + NINETY_SIX_COLS, + NINETY_SIX_ROWS, +) + + +@pytest.mark.parametrize( + argnames=["request_model", "expected_nozzlemap", "nozzle_params"], + argvalues=[ + [ + SingleNozzleLayoutConfiguration(primaryNozzle="A1"), + NozzleMap.build( + physical_nozzles=OrderedDict({"A1": Point(0, 0, 0)}), + physical_rows=OrderedDict({"A": ["A1"]}), + physical_columns=OrderedDict({"1": ["A1"]}), + starting_nozzle="A1", + back_left_nozzle="A1", + front_right_nozzle="A1", + ), + {"primary_nozzle": "A1"}, + ], + [ + ColumnNozzleLayoutConfiguration(primaryNozzle="A1"), + NozzleMap.build( + physical_nozzles=NINETY_SIX_MAP, + physical_rows=NINETY_SIX_ROWS, + physical_columns=NINETY_SIX_COLS, + starting_nozzle="A1", + back_left_nozzle="A1", + front_right_nozzle="H1", + ), + {"primary_nozzle": "A1", "front_right_nozzle": "H1"}, + ], + [ + QuadrantNozzleLayoutConfiguration( + primaryNozzle="A1", frontRightNozzle="E1" + ), + NozzleMap.build( + physical_nozzles=NINETY_SIX_MAP, + physical_rows=NINETY_SIX_ROWS, + physical_columns=NINETY_SIX_COLS, + starting_nozzle="A1", + back_left_nozzle="A1", + front_right_nozzle="E1", + ), + {"primary_nozzle": "A1", "front_right_nozzle": "E1"}, + ], + [ + AllNozzleLayoutConfiguration(), + None, + {}, + ], + ], +) +async def test_configure_nozzle_layout_implementation( + decoy: Decoy, + equipment: EquipmentHandler, + tip_handler: TipHandler, + request_model: Union[ + AllNozzleLayoutConfiguration, + ColumnNozzleLayoutConfiguration, + QuadrantNozzleLayoutConfiguration, + SingleNozzleLayoutConfiguration, + ], + expected_nozzlemap: Optional[NozzleMap], + nozzle_params: Dict[str, str], +) -> None: + """A ConfigureForVolume command should have an execution implementation.""" + subject = ConfigureNozzleLayoutImplementation( + equipment=equipment, tip_handler=tip_handler + ) + + requested_nozzle_layout = ConfigureNozzleLayoutParams( + pipetteId="pipette-id", + configurationParams=request_model, + ) + primary_nozzle = ( + None + if isinstance(request_model, AllNozzleLayoutConfiguration) + else request_model.primaryNozzle + ) + front_right_nozzle = ( + request_model.frontRightNozzle + if isinstance(request_model, QuadrantNozzleLayoutConfiguration) + else None + ) + + decoy.when( + await tip_handler.available_for_nozzle_layout( + pipette_id="pipette-id", + style=request_model.style, + primary_nozzle=primary_nozzle, + front_right_nozzle=front_right_nozzle, + ) + ).then_return(nozzle_params) + + decoy.when( + await equipment.configure_nozzle_layout( + pipette_id="pipette-id", + **nozzle_params, + ) + ).then_return(expected_nozzlemap) + + result, private_result = await subject.execute(requested_nozzle_layout) + + assert result == ConfigureNozzleLayoutResult() + assert private_result == ConfigureNozzleLayoutPrivateResult( + pipette_id="pipette-id", + nozzle_map=expected_nozzlemap, + ) diff --git a/api/tests/opentrons/protocol_engine/commands/test_drop_tip.py b/api/tests/opentrons/protocol_engine/commands/test_drop_tip.py index 7551c67ea25..4a3c547c07a 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_drop_tip.py +++ b/api/tests/opentrons/protocol_engine/commands/test_drop_tip.py @@ -86,11 +86,16 @@ async def test_drop_tip_implementation( homeAfter=True, ) + decoy.when( + mock_state_view.pipettes.get_is_partially_configured(pipette_id="abc") + ).then_return(False) + decoy.when( mock_state_view.geometry.get_checked_tip_drop_location( pipette_id="abc", labware_id="123", well_location=DropTipWellLocation(offset=WellOffset(x=1, y=2, z=3)), + partially_configured=False, ) ).then_return(WellLocation(offset=WellOffset(x=4, y=5, z=6))) @@ -142,9 +147,16 @@ async def test_drop_tip_with_alternating_locations( ) ).then_return(drop_location) + decoy.when( + mock_state_view.pipettes.get_is_partially_configured(pipette_id="abc") + ).then_return(False) + decoy.when( mock_state_view.geometry.get_checked_tip_drop_location( - pipette_id="abc", labware_id="123", well_location=drop_location + pipette_id="abc", + labware_id="123", + well_location=drop_location, + partially_configured=False, ) ).then_return(WellLocation(offset=WellOffset(x=4, y=5, z=6))) diff --git a/api/tests/opentrons/protocol_engine/commands/test_get_tip_presence.py b/api/tests/opentrons/protocol_engine/commands/test_get_tip_presence.py new file mode 100644 index 00000000000..94fe8caadf3 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/test_get_tip_presence.py @@ -0,0 +1,42 @@ +"""Test get tip presence commands.""" +from decoy import Decoy +import pytest + +from opentrons.protocol_engine.execution import TipHandler +from opentrons.protocol_engine.types import TipPresenceStatus + +from opentrons.protocol_engine.commands.get_tip_presence import ( + GetTipPresenceParams, + GetTipPresenceResult, + GetTipPresenceImplementation, +) + + +@pytest.mark.parametrize( + "status", + [ + TipPresenceStatus.PRESENT, + TipPresenceStatus.ABSENT, + TipPresenceStatus.UNKNOWN, + ], +) +async def test_get_tip_presence_implementation( + decoy: Decoy, + tip_handler: TipHandler, + status: TipPresenceStatus, +) -> None: + """A GetTipPresence command should have an execution implementation.""" + subject = GetTipPresenceImplementation(tip_handler=tip_handler) + data = GetTipPresenceParams( + pipetteId="pipette-id", + ) + + decoy.when( + await tip_handler.get_tip_presence( + pipette_id="pipette-id", + ) + ).then_return(status) + + result = await subject.execute(data) + + assert result == GetTipPresenceResult(status=status) diff --git a/api/tests/opentrons/protocol_engine/commands/test_load_labware.py b/api/tests/opentrons/protocol_engine/commands/test_load_labware.py index 9444a3df5ec..7ca9d112e27 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_load_labware.py +++ b/api/tests/opentrons/protocol_engine/commands/test_load_labware.py @@ -9,6 +9,7 @@ from opentrons.protocol_engine.errors import ( LabwareIsNotAllowedInLocationError, + LocationIsOccupiedError, ) from opentrons.protocol_engine.types import ( @@ -52,9 +53,14 @@ async def test_load_labware_implementation( displayName="My custom display name", ) + decoy.when( + state_view.geometry.ensure_location_not_occupied( + DeckSlotLocation(slotName=DeckSlotName.SLOT_3) + ) + ).then_return(DeckSlotLocation(slotName=DeckSlotName.SLOT_4)) decoy.when( await equipment.load_labware( - location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_4), load_name="some-load-name", namespace="opentrons-test", version=1, @@ -120,9 +126,14 @@ async def test_load_labware_on_labware( displayName="My custom display name", ) + decoy.when( + state_view.geometry.ensure_location_not_occupied( + OnLabwareLocation(labwareId="other-labware-id") + ) + ).then_return(OnLabwareLocation(labwareId="another-labware-id")) decoy.when( await equipment.load_labware( - location=OnLabwareLocation(labwareId="other-labware-id"), + location=OnLabwareLocation(labwareId="another-labware-id"), load_name="some-load-name", namespace="opentrons-test", version=1, @@ -150,6 +161,33 @@ async def test_load_labware_on_labware( decoy.verify( state_view.labware.raise_if_labware_cannot_be_stacked( - well_plate_def, "other-labware-id" + well_plate_def, "another-labware-id" ) ) + + +async def test_load_labware_raises_if_location_occupied( + decoy: Decoy, + well_plate_def: LabwareDefinition, + equipment: EquipmentHandler, + state_view: StateView, +) -> None: + """A LoadLabware command should have an execution implementation.""" + subject = LoadLabwareImplementation(equipment=equipment, state_view=state_view) + + data = LoadLabwareParams( + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), + loadName="some-load-name", + namespace="opentrons-test", + version=1, + displayName="My custom display name", + ) + + decoy.when( + state_view.geometry.ensure_location_not_occupied( + DeckSlotLocation(slotName=DeckSlotName.SLOT_3) + ) + ).then_raise(LocationIsOccupiedError("Get your own spot!")) + + with pytest.raises(LocationIsOccupiedError): + await subject.execute(data) diff --git a/api/tests/opentrons/protocol_engine/commands/test_load_module.py b/api/tests/opentrons/protocol_engine/commands/test_load_module.py index e86d402058c..84be22d4661 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_load_module.py +++ b/api/tests/opentrons/protocol_engine/commands/test_load_module.py @@ -1,6 +1,9 @@ """Test load module command.""" +import pytest from decoy import Decoy +from opentrons.protocol_engine.errors import LocationIsOccupiedError +from opentrons.protocol_engine.state import StateView from opentrons.types import DeckSlotName from opentrons.protocol_engine.types import ( DeckSlotLocation, @@ -19,21 +22,27 @@ async def test_load_module_implementation( decoy: Decoy, equipment: EquipmentHandler, + state_view: StateView, tempdeck_v2_def: ModuleDefinition, ) -> None: """A loadModule command should have an execution implementation.""" - subject = LoadModuleImplementation(equipment=equipment) + subject = LoadModuleImplementation(equipment=equipment, state_view=state_view) data = LoadModuleParams( model=ModuleModel.TEMPERATURE_MODULE_V1, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), moduleId="some-id", ) + decoy.when( + state_view.geometry.ensure_location_not_occupied( + DeckSlotLocation(slotName=DeckSlotName.SLOT_1) + ) + ).then_return(DeckSlotLocation(slotName=DeckSlotName.SLOT_2)) decoy.when( await equipment.load_module( model=ModuleModel.TEMPERATURE_MODULE_V1, - location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_2), module_id="some-id", ) ).then_return( @@ -56,21 +65,27 @@ async def test_load_module_implementation( async def test_load_module_implementation_mag_block( decoy: Decoy, equipment: EquipmentHandler, + state_view: StateView, mag_block_v1_def: ModuleDefinition, ) -> None: """A loadModule command for mag block should have an execution implementation.""" - subject = LoadModuleImplementation(equipment=equipment) + subject = LoadModuleImplementation(equipment=equipment, state_view=state_view) data = LoadModuleParams( model=ModuleModel.MAGNETIC_BLOCK_V1, location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), moduleId="some-id", ) + decoy.when( + state_view.geometry.ensure_location_not_occupied( + DeckSlotLocation(slotName=DeckSlotName.SLOT_1) + ) + ).then_return(DeckSlotLocation(slotName=DeckSlotName.SLOT_2)) decoy.when( await equipment.load_magnetic_block( model=ModuleModel.MAGNETIC_BLOCK_V1, - location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_2), module_id="some-id", ) ).then_return( @@ -88,3 +103,27 @@ async def test_load_module_implementation_mag_block( model=ModuleModel.MAGNETIC_BLOCK_V1, definition=mag_block_v1_def, ) + + +async def test_load_module_raises_if_location_occupied( + decoy: Decoy, + equipment: EquipmentHandler, + state_view: StateView, +) -> None: + """A loadModule command should have an execution implementation.""" + subject = LoadModuleImplementation(equipment=equipment, state_view=state_view) + + data = LoadModuleParams( + model=ModuleModel.TEMPERATURE_MODULE_V1, + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), + moduleId="some-id", + ) + + decoy.when( + state_view.geometry.ensure_location_not_occupied( + DeckSlotLocation(slotName=DeckSlotName.SLOT_1) + ) + ).then_raise(LocationIsOccupiedError("Get your own spot!")) + + with pytest.raises(LocationIsOccupiedError): + await subject.execute(data) diff --git a/api/tests/opentrons/protocol_engine/commands/test_load_pipette.py b/api/tests/opentrons/protocol_engine/commands/test_load_pipette.py index 45a935c9d08..967d60be945 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_load_pipette.py +++ b/api/tests/opentrons/protocol_engine/commands/test_load_pipette.py @@ -1,15 +1,18 @@ """Test load pipette commands.""" +import pytest from decoy import Decoy from opentrons_shared_data.pipette.dev_types import PipetteNameType +from opentrons_shared_data.robot.dev_types import RobotType +from opentrons.types import MountType, Point -from opentrons.types import MountType +from opentrons.protocol_engine.errors import InvalidSpecificationForRobotTypeError from opentrons.protocol_engine.types import FlowRates from opentrons.protocol_engine.execution import LoadedPipetteData, EquipmentHandler from opentrons.protocol_engine.resources.pipette_data_provider import ( LoadedStaticPipetteData, ) - +from opentrons.protocol_engine.state import StateView from opentrons.protocol_engine.commands.load_pipette import ( LoadPipetteParams, LoadPipetteResult, @@ -21,9 +24,10 @@ async def test_load_pipette_implementation( decoy: Decoy, equipment: EquipmentHandler, + state_view: StateView, ) -> None: """A LoadPipette command should have an execution implementation.""" - subject = LoadPipetteImplementation(equipment=equipment) + subject = LoadPipetteImplementation(equipment=equipment, state_view=state_view) config_data = LoadedStaticPipetteData( model="some-model", display_name="Hello", @@ -37,6 +41,8 @@ async def test_load_pipette_implementation( ), tip_configuration_lookup_table={}, nominal_tip_overlap={}, + back_left_nozzle_offset=Point(x=1, y=2, z=3), + front_right_nozzle_offset=Point(x=4, y=5, z=6), ) data = LoadPipetteParams( pipetteName=PipetteNameType.P300_SINGLE, @@ -69,9 +75,10 @@ async def test_load_pipette_implementation( async def test_load_pipette_implementation_96_channel( decoy: Decoy, equipment: EquipmentHandler, + state_view: StateView, ) -> None: """A LoadPipette command should have an execution implementation.""" - subject = LoadPipetteImplementation(equipment=equipment) + subject = LoadPipetteImplementation(equipment=equipment, state_view=state_view) data = LoadPipetteParams( pipetteName=PipetteNameType.P1000_96, @@ -91,6 +98,8 @@ async def test_load_pipette_implementation_96_channel( ), tip_configuration_lookup_table={}, nominal_tip_overlap={}, + back_left_nozzle_offset=Point(x=1, y=2, z=3), + front_right_nozzle_offset=Point(x=4, y=5, z=6), ) decoy.when( @@ -111,3 +120,34 @@ async def test_load_pipette_implementation_96_channel( assert private_result == LoadPipettePrivateResult( pipette_id="pipette-id", serial_number="some id", config=config_data ) + + +@pytest.mark.parametrize( + argnames=["pipette_type", "robot_type"], + argvalues=[ + (PipetteNameType.P300_SINGLE, "OT-3 Standard"), + (PipetteNameType.P20_MULTI_GEN2, "OT-3 Standard"), + (PipetteNameType.P10_MULTI, "OT-3 Standard"), + (PipetteNameType.P1000_SINGLE, "OT-3 Standard"), + (PipetteNameType.P1000_MULTI_FLEX, "OT-2 Standard"), + (PipetteNameType.P50_SINGLE_FLEX, "OT-2 Standard"), + (PipetteNameType.P1000_96, "OT-2 Standard"), + ], +) +async def test_loading_wrong_pipette_for_robot_raises_error( + decoy: Decoy, + equipment: EquipmentHandler, + state_view: StateView, + pipette_type: PipetteNameType, + robot_type: RobotType, +) -> None: + """A LoadPipette command should raise error when pipette is not supported on robot.""" + subject = LoadPipetteImplementation(equipment=equipment, state_view=state_view) + p1000_params = LoadPipetteParams( + pipetteName=pipette_type, + mount=MountType.LEFT, + pipetteId="p1000-id", + ) + decoy.when(state_view.config.robot_type).then_return(robot_type) + with pytest.raises(InvalidSpecificationForRobotTypeError): + await subject.execute(p1000_params) diff --git a/api/tests/opentrons/protocol_engine/commands/test_move_labware.py b/api/tests/opentrons/protocol_engine/commands/test_move_labware.py index 0b76e8a2b56..beb9e14c11d 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_move_labware.py +++ b/api/tests/opentrons/protocol_engine/commands/test_move_labware.py @@ -3,9 +3,10 @@ import pytest from decoy import Decoy -from opentrons_shared_data.labware.labware_definition import Parameters +from opentrons_shared_data.labware.labware_definition import Parameters, Dimensions +from opentrons_shared_data.gripper.constants import GRIPPER_PADDLE_WIDTH -from opentrons.types import DeckSlotName +from opentrons.types import DeckSlotName, Point from opentrons.protocols.models import LabwareDefinition from opentrons.protocol_engine import errors, Config from opentrons.protocol_engine.resources import labware_validation @@ -18,6 +19,7 @@ LabwareOffsetVector, LabwareMovementOffsetData, DeckType, + AddressableAreaLocation, ) from opentrons.protocol_engine.state import StateView from opentrons.protocol_engine.commands.move_labware import ( @@ -241,6 +243,94 @@ async def test_gripper_move_labware_implementation( pickUpOffset=LabwareOffsetVector(x=1, y=2, z=3), dropOffset=LabwareOffsetVector(x=0, y=0, z=0), ), + post_drop_slide_offset=None, + ), + ) + assert result == MoveLabwareResult( + offsetId="wowzers-a-new-offset-id", + ) + + +async def test_gripper_move_to_waste_chute_implementation( + decoy: Decoy, + equipment: EquipmentHandler, + labware_movement: LabwareMovementHandler, + state_view: StateView, + run_control: RunControlHandler, +) -> None: + """It should drop the labware with a delay added.""" + subject = MoveLabwareImplementation( + state_view=state_view, + equipment=equipment, + labware_movement=labware_movement, + run_control=run_control, + ) + from_location = DeckSlotLocation(slotName=DeckSlotName.SLOT_1) + new_location = AddressableAreaLocation(addressableAreaName="gripperWasteChute") + labware_width = 50 + expected_slide_offset = Point( + x=labware_width / 2 + GRIPPER_PADDLE_WIDTH / 2 + 8, y=0, z=0 + ) + + data = MoveLabwareParams( + labwareId="my-cool-labware-id", + newLocation=new_location, + strategy=LabwareMovementStrategy.USING_GRIPPER, + pickUpOffset=LabwareOffsetVector(x=1, y=2, z=3), + dropOffset=None, + ) + labware_def = LabwareDefinition.construct( # type: ignore[call-arg] + namespace="my-cool-namespace", + dimensions=Dimensions( + yDimension=labware_width, zDimension=labware_width, xDimension=labware_width + ), + ) + decoy.when( + state_view.labware.get_definition(labware_id="my-cool-labware-id") + ).then_return(labware_def) + decoy.when(state_view.labware.get(labware_id="my-cool-labware-id")).then_return( + LoadedLabware( + id="my-cool-labware-id", + loadName="load-name", + definitionUri="opentrons-test/load-name/1", + location=from_location, + offsetId=None, + ) + ) + decoy.when( + state_view.geometry.ensure_location_not_occupied( + location=new_location, + ) + ).then_return(new_location) + decoy.when( + equipment.find_applicable_labware_offset_id( + labware_definition_uri="opentrons-test/load-name/1", + labware_location=new_location, + ) + ).then_return("wowzers-a-new-offset-id") + + decoy.when( + state_view.geometry.ensure_valid_gripper_location(from_location) + ).then_return(from_location) + decoy.when( + state_view.geometry.ensure_valid_gripper_location(new_location) + ).then_return(new_location) + decoy.when(labware_validation.validate_gripper_compatible(labware_def)).then_return( + True + ) + + result = await subject.execute(data) + decoy.verify( + state_view.labware.raise_if_labware_has_labware_on_top("my-cool-labware-id"), + await labware_movement.move_labware_with_gripper( + labware_id="my-cool-labware-id", + current_location=from_location, + new_location=new_location, + user_offset_data=LabwareMovementOffsetData( + pickUpOffset=LabwareOffsetVector(x=1, y=2, z=3), + dropOffset=LabwareOffsetVector(x=0, y=0, z=0), + ), + post_drop_slide_offset=expected_slide_offset, ), ) assert result == MoveLabwareResult( diff --git a/api/tests/opentrons/protocol_engine/commands/test_move_to_addressable_area.py b/api/tests/opentrons/protocol_engine/commands/test_move_to_addressable_area.py new file mode 100644 index 00000000000..20515bc12c4 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/test_move_to_addressable_area.py @@ -0,0 +1,50 @@ +"""Test move to addressable area commands.""" +from decoy import Decoy + +from opentrons.protocol_engine import DeckPoint, AddressableOffsetVector +from opentrons.protocol_engine.execution import MovementHandler +from opentrons.protocol_engine.state import StateView +from opentrons.types import Point + +from opentrons.protocol_engine.commands.move_to_addressable_area import ( + MoveToAddressableAreaParams, + MoveToAddressableAreaResult, + MoveToAddressableAreaImplementation, +) + + +async def test_move_to_addressable_area_implementation( + decoy: Decoy, + state_view: StateView, + movement: MovementHandler, +) -> None: + """A MoveToAddressableArea command should have an execution implementation.""" + subject = MoveToAddressableAreaImplementation( + movement=movement, state_view=state_view + ) + + data = MoveToAddressableAreaParams( + pipetteId="abc", + addressableAreaName="123", + offset=AddressableOffsetVector(x=1, y=2, z=3), + forceDirect=True, + minimumZHeight=4.56, + speed=7.89, + stayAtHighestPossibleZ=True, + ) + + decoy.when( + await movement.move_to_addressable_area( + pipette_id="abc", + addressable_area_name="123", + offset=AddressableOffsetVector(x=1, y=2, z=3), + force_direct=True, + minimum_z_height=4.56, + speed=7.89, + stay_at_highest_possible_z=True, + ) + ).then_return(Point(x=9, y=8, z=7)) + + result = await subject.execute(data) + + assert result == MoveToAddressableAreaResult(position=DeckPoint(x=9, y=8, z=7)) diff --git a/api/tests/opentrons/protocol_engine/commands/test_move_to_addressable_area_for_drop_tip.py b/api/tests/opentrons/protocol_engine/commands/test_move_to_addressable_area_for_drop_tip.py new file mode 100644 index 00000000000..73478ccafd5 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/test_move_to_addressable_area_for_drop_tip.py @@ -0,0 +1,59 @@ +"""Test move to addressable area for drop tip commands.""" +from decoy import Decoy + +from opentrons.protocol_engine import DeckPoint, AddressableOffsetVector +from opentrons.protocol_engine.execution import MovementHandler +from opentrons.protocol_engine.state import StateView +from opentrons.types import Point + +from opentrons.protocol_engine.commands.move_to_addressable_area_for_drop_tip import ( + MoveToAddressableAreaForDropTipParams, + MoveToAddressableAreaForDropTipResult, + MoveToAddressableAreaForDropTipImplementation, +) + + +async def test_move_to_addressable_area_for_drop_tip_implementation( + decoy: Decoy, + state_view: StateView, + movement: MovementHandler, +) -> None: + """A MoveToAddressableAreaForDropTip command should have an execution implementation.""" + subject = MoveToAddressableAreaForDropTipImplementation( + movement=movement, state_view=state_view + ) + + data = MoveToAddressableAreaForDropTipParams( + pipetteId="abc", + addressableAreaName="123", + offset=AddressableOffsetVector(x=1, y=2, z=3), + forceDirect=True, + minimumZHeight=4.56, + speed=7.89, + alternateDropLocation=True, + ignoreTipConfiguration=False, + ) + + decoy.when( + state_view.geometry.get_next_tip_drop_location_for_addressable_area( + addressable_area_name="123", pipette_id="abc" + ) + ).then_return(AddressableOffsetVector(x=10, y=11, z=12)) + + decoy.when( + await movement.move_to_addressable_area( + pipette_id="abc", + addressable_area_name="123", + offset=AddressableOffsetVector(x=10, y=11, z=12), + force_direct=True, + minimum_z_height=4.56, + speed=7.89, + ignore_tip_configuration=False, + ) + ).then_return(Point(x=9, y=8, z=7)) + + result = await subject.execute(data) + + assert result == MoveToAddressableAreaForDropTipResult( + position=DeckPoint(x=9, y=8, z=7) + ) diff --git a/api/tests/opentrons/protocol_engine/commands/test_prepare_to_aspirate.py b/api/tests/opentrons/protocol_engine/commands/test_prepare_to_aspirate.py new file mode 100644 index 00000000000..d3f09d6685f --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/test_prepare_to_aspirate.py @@ -0,0 +1,29 @@ +"""Test prepare to aspirate commands.""" + +from decoy import Decoy + +from opentrons.protocol_engine.execution import ( + PipettingHandler, +) + +from opentrons.protocol_engine.commands.prepare_to_aspirate import ( + PrepareToAspirateParams, + PrepareToAspirateImplementation, + PrepareToAspirateResult, +) + + +async def test_prepare_to_aspirate_implmenetation( + decoy: Decoy, pipetting: PipettingHandler +) -> None: + """A PrepareToAspirate command should have an executing implementation.""" + subject = PrepareToAspirateImplementation(pipetting=pipetting) + + data = PrepareToAspirateParams(pipetteId="some id") + + decoy.when(await pipetting.prepare_for_aspirate(pipette_id="some id")).then_return( + None + ) + + result = await subject.execute(data) + assert isinstance(result, PrepareToAspirateResult) diff --git a/api/tests/opentrons/protocol_engine/commands/test_save_position.py b/api/tests/opentrons/protocol_engine/commands/test_save_position.py index e31f44c779c..99b52a4cd42 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_save_position.py +++ b/api/tests/opentrons/protocol_engine/commands/test_save_position.py @@ -35,10 +35,7 @@ async def test_save_position_implementation( subject = SavePositionImplementation( model_utils=mock_model_utils, gantry_mover=mock_gantry_mover ) - params = SavePositionParams( - pipetteId="abc", - positionId="123", - ) + params = SavePositionParams(pipetteId="abc", positionId="123", failOnNotHomed=True) decoy.when(mock_model_utils.ensure_id("123")).then_return("456") diff --git a/api/tests/opentrons/protocol_engine/commands/test_verify_tip_presence.py b/api/tests/opentrons/protocol_engine/commands/test_verify_tip_presence.py new file mode 100644 index 00000000000..160ee056ae8 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/test_verify_tip_presence.py @@ -0,0 +1,34 @@ +"""Test verify tip presence commands.""" +from decoy import Decoy + +from opentrons.protocol_engine.execution import TipHandler +from opentrons.protocol_engine.types import TipPresenceStatus + +from opentrons.protocol_engine.commands.verify_tip_presence import ( + VerifyTipPresenceParams, + VerifyTipPresenceResult, + VerifyTipPresenceImplementation, +) + + +async def test_verify_tip_presence_implementation( + decoy: Decoy, + tip_handler: TipHandler, +) -> None: + """A VerifyTipPresence command should have an execution implementation.""" + subject = VerifyTipPresenceImplementation(tip_handler=tip_handler) + data = VerifyTipPresenceParams( + pipetteId="pipette-id", + expectedState=TipPresenceStatus.PRESENT, + ) + + decoy.when( + await tip_handler.verify_tip_presence( + pipette_id="pipette-id", + expected=TipPresenceStatus.PRESENT, + ) + ).then_return(None) + + result = await subject.execute(data) + + assert isinstance(result, VerifyTipPresenceResult) diff --git a/api/tests/opentrons/protocol_engine/conftest.py b/api/tests/opentrons/protocol_engine/conftest.py index 785b04f8989..d703a964078 100644 --- a/api/tests/opentrons/protocol_engine/conftest.py +++ b/api/tests/opentrons/protocol_engine/conftest.py @@ -7,7 +7,7 @@ from opentrons_shared_data import load_shared_data from opentrons_shared_data.deck import load as load_deck -from opentrons_shared_data.deck.dev_types import DeckDefinitionV3 +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4 from opentrons_shared_data.labware import load_definition from opentrons_shared_data.pipette import pipette_definition from opentrons.protocols.models import LabwareDefinition @@ -20,6 +20,7 @@ from opentrons.hardware_control import HardwareControlAPI, OT2HardwareControlAPI from opentrons.hardware_control.api import API +from opentrons.hardware_control.protocols.types import FlexRobotType, OT2RobotType if TYPE_CHECKING: from opentrons.hardware_control.ot3api import OT3API @@ -34,7 +35,9 @@ def hardware_api(decoy: Decoy) -> HardwareControlAPI: @pytest.fixture def ot2_hardware_api(decoy: Decoy) -> API: """Get a mocked out OT-2 hardware API.""" - return decoy.mock(cls=API) + mock = decoy.mock(cls=API) + decoy.when(mock.get_robot_type()).then_return(OT2RobotType) + return mock @pytest.mark.ot3_only @@ -44,28 +47,30 @@ def ot3_hardware_api(decoy: Decoy) -> OT3API: try: from opentrons.hardware_control.ot3api import OT3API - return decoy.mock(cls=OT3API) + mock = decoy.mock(cls=OT3API) + decoy.when(mock.get_robot_type()).then_return(FlexRobotType) + return mock except ImportError: # TODO (tz, 9-23-22) Figure out a better way to use this fixture with OT-3 api only. return None # type: ignore[return-value] @pytest.fixture(scope="session") -def ot2_standard_deck_def() -> DeckDefinitionV3: +def ot2_standard_deck_def() -> DeckDefinitionV4: """Get the OT-2 standard deck definition.""" - return load_deck(STANDARD_OT2_DECK, 3) + return load_deck(STANDARD_OT2_DECK, 4) @pytest.fixture(scope="session") -def ot2_short_trash_deck_def() -> DeckDefinitionV3: +def ot2_short_trash_deck_def() -> DeckDefinitionV4: """Get the OT-2 short-trash deck definition.""" - return load_deck(SHORT_TRASH_DECK, 3) + return load_deck(SHORT_TRASH_DECK, 4) @pytest.fixture(scope="session") -def ot3_standard_deck_def() -> DeckDefinitionV3: +def ot3_standard_deck_def() -> DeckDefinitionV4: """Get the OT-2 standard deck definition.""" - return load_deck(STANDARD_OT3_DECK, 3) + return load_deck(STANDARD_OT3_DECK, 4) @pytest.fixture(scope="session") diff --git a/api/tests/opentrons/protocol_engine/execution/test_door_watcher.py b/api/tests/opentrons/protocol_engine/execution/test_door_watcher.py index fd326b04920..1e252650957 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_door_watcher.py +++ b/api/tests/opentrons/protocol_engine/execution/test_door_watcher.py @@ -68,7 +68,7 @@ async def test_event_forwarding( ) -> None: """It should forward events that come from a different thread.""" handler_captor = matchers.Captor() - unsubscribe_callback = decoy.mock() + unsubscribe_callback = decoy.mock(name="unsubscribe_callback") decoy.when(hardware_control_api.register_callback(handler_captor)).then_return( unsubscribe_callback ) @@ -104,8 +104,8 @@ async def test_one_subscribe_one_unsubscribe( subject: DoorWatcher, ) -> None: """Multiple start()s and stop()s should be collapsed.""" - unsubscribe = decoy.mock() - wrong_unsubscribe = decoy.mock() + unsubscribe = decoy.mock(name="unsubscribe_callback") + wrong_unsubscribe = decoy.mock(name="wrong_unsubscribe") decoy.when(hardware_control_api.register_callback(matchers.Anything())).then_return( unsubscribe, wrong_unsubscribe diff --git a/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py b/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py index 17cf5d53248..0ef6a1b00bb 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py +++ b/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py @@ -10,7 +10,7 @@ from opentrons_shared_data.labware.dev_types import LabwareUri from opentrons.calibration_storage.helpers import uri_from_details -from opentrons.types import Mount as HwMount, MountType, DeckSlotName +from opentrons.types import Mount as HwMount, MountType, DeckSlotName, Point from opentrons.hardware_control import HardwareControlAPI from opentrons.hardware_control.modules import ( TempDeck, @@ -147,6 +147,8 @@ def loaded_static_pipette_data( nominal_tip_overlap={"default": 9.87}, home_position=10.11, nozzle_offset_z=12.13, + back_left_nozzle_offset=Point(x=1, y=2, z=3), + front_right_nozzle_offset=Point(x=4, y=5, z=6), ) diff --git a/api/tests/opentrons/protocol_engine/execution/test_gantry_mover.py b/api/tests/opentrons/protocol_engine/execution/test_gantry_mover.py index bb356d7f0a1..01a3ca6e3a5 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_gantry_mover.py +++ b/api/tests/opentrons/protocol_engine/execution/test_gantry_mover.py @@ -11,7 +11,7 @@ CriticalPoint, Axis as HardwareAxis, ) -from opentrons.hardware_control.errors import MustHomeError as HardwareMustHomeError +from opentrons_shared_data.errors.exceptions import PositionUnknownError from opentrons.motion_planning import Waypoint @@ -143,7 +143,7 @@ async def test_get_position_raises( critical_point=CriticalPoint.NOZZLE, fail_on_not_homed=False, ) - ).then_raise(HardwareMustHomeError("oh no")) + ).then_raise(PositionUnknownError("oh no")) with pytest.raises(MustHomeError, match="oh no"): await hardware_subject.get_position("pipette-id") @@ -266,7 +266,7 @@ async def test_move_relative_must_home( fail_on_not_homed=True, speed=456.7, ) - ).then_raise(HardwareMustHomeError("oh no")) + ).then_raise(PositionUnknownError("oh no")) with pytest.raises(MustHomeError, match="oh no"): await hardware_subject.move_relative( diff --git a/api/tests/opentrons/protocol_engine/execution/test_hardware_stopper.py b/api/tests/opentrons/protocol_engine/execution/test_hardware_stopper.py index 96e0cc3ea88..537fd07613c 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_hardware_stopper.py +++ b/api/tests/opentrons/protocol_engine/execution/test_hardware_stopper.py @@ -15,7 +15,12 @@ TipHandler, HardwareStopper, ) -from opentrons.protocol_engine.types import MotorAxis, TipGeometry, PostRunHardwareState +from opentrons.protocol_engine.types import ( + MotorAxis, + TipGeometry, + PostRunHardwareState, + AddressableOffsetVector, +) if TYPE_CHECKING: from opentrons.hardware_control.ot3api import OT3API @@ -91,7 +96,7 @@ async def test_hardware_stopping_sequence( post_run_hardware_state: PostRunHardwareState, expected_home_after: bool, ) -> None: - """It should stop the hardware, home the robot and perform drop tip if required.""" + """It should stop the hardware, and home the robot. Flex no longer performs automatic drop tip..""" decoy.when(state_store.pipettes.get_all_attached_tips()).then_return( [ ("pipette-id", TipGeometry(length=1.0, volume=2.0, diameter=3.0)), @@ -99,7 +104,8 @@ async def test_hardware_stopping_sequence( ) await subject.do_stop_and_recover( - drop_tips_after_run=True, post_run_hardware_state=post_run_hardware_state + drop_tips_after_run=True, + post_run_hardware_state=post_run_hardware_state, ) decoy.verify( @@ -107,16 +113,6 @@ async def test_hardware_stopping_sequence( await movement.home( axes=[MotorAxis.X, MotorAxis.Y, MotorAxis.LEFT_Z, MotorAxis.RIGHT_Z] ), - await mock_tip_handler.add_tip( - pipette_id="pipette-id", - tip=TipGeometry(length=1.0, volume=2.0, diameter=3.0), - ), - await movement.move_to_well( - pipette_id="pipette-id", - labware_id="fixedTrash", - well_name="A1", - ), - await mock_tip_handler.drop_tip(pipette_id="pipette-id", home_after=False), await hardware_api.stop(home_after=expected_home_after), ) @@ -210,7 +206,7 @@ async def test_hardware_stopping_sequence_with_gripper( movement: MovementHandler, mock_tip_handler: TipHandler, ) -> None: - """It should stop the hardware, home the robot and perform drop tip if required.""" + """It should stop the hardware, and home the robot. Flex no longer performs automatic drop tip.""" subject = HardwareStopper( hardware_api=ot3_hardware_api, state_store=state_store, @@ -224,6 +220,46 @@ async def test_hardware_stopping_sequence_with_gripper( ) decoy.when(state_store.config.use_virtual_gripper).then_return(False) decoy.when(ot3_hardware_api.has_gripper()).then_return(True) + + await subject.do_stop_and_recover( + drop_tips_after_run=True, + post_run_hardware_state=PostRunHardwareState.HOME_AND_STAY_ENGAGED, + ) + + decoy.verify( + await ot3_hardware_api.stop(home_after=False), + await ot3_hardware_api.home_z(mount=OT3Mount.GRIPPER), + await movement.home( + axes=[MotorAxis.X, MotorAxis.Y, MotorAxis.LEFT_Z, MotorAxis.RIGHT_Z] + ), + await ot3_hardware_api.stop(home_after=True), + ) + + +@pytest.mark.ot3_only +async def test_hardware_stopping_sequence_with_fixed_trash( + decoy: Decoy, + state_store: StateStore, + ot3_hardware_api: OT3API, + movement: MovementHandler, + mock_tip_handler: TipHandler, +) -> None: + """It should stop the hardware, and home the robot. Flex no longer performs automatic drop tip.""" + subject = HardwareStopper( + hardware_api=ot3_hardware_api, + state_store=state_store, + movement=movement, + tip_handler=mock_tip_handler, + ) + decoy.when(state_store.pipettes.get_all_attached_tips()).then_return( + [ + ("pipette-id", TipGeometry(length=1.0, volume=2.0, diameter=3.0)), + ] + ) + decoy.when(state_store.labware.get_fixed_trash_id()).then_return("fixedTrash") + decoy.when(state_store.config.use_virtual_gripper).then_return(False) + decoy.when(ot3_hardware_api.has_gripper()).then_return(True) + await subject.do_stop_and_recover( drop_tips_after_run=True, post_run_hardware_state=PostRunHardwareState.HOME_AND_STAY_ENGAGED, @@ -250,3 +286,55 @@ async def test_hardware_stopping_sequence_with_gripper( ), await ot3_hardware_api.stop(home_after=True), ) + + +async def test_hardware_stopping_sequence_with_OT2_addressable_area( + decoy: Decoy, + state_store: StateStore, + hardware_api: HardwareAPI, + movement: MovementHandler, + mock_tip_handler: TipHandler, +) -> None: + """It should stop the hardware, and home the robot. Flex no longer performs automatic drop tip.""" + subject = HardwareStopper( + hardware_api=hardware_api, + state_store=state_store, + movement=movement, + tip_handler=mock_tip_handler, + ) + decoy.when(state_store.pipettes.get_all_attached_tips()).then_return( + [ + ("pipette-id", TipGeometry(length=1.0, volume=2.0, diameter=3.0)), + ] + ) + decoy.when(state_store.config.robot_type).then_return("OT-2 Standard") + decoy.when(state_store.config.use_virtual_gripper).then_return(False) + + await subject.do_stop_and_recover( + drop_tips_after_run=True, + post_run_hardware_state=PostRunHardwareState.HOME_AND_STAY_ENGAGED, + ) + + decoy.verify( + await hardware_api.stop(home_after=False), + await movement.home( + axes=[MotorAxis.X, MotorAxis.Y, MotorAxis.LEFT_Z, MotorAxis.RIGHT_Z] + ), + await mock_tip_handler.add_tip( + pipette_id="pipette-id", + tip=TipGeometry(length=1.0, volume=2.0, diameter=3.0), + ), + await movement.move_to_addressable_area( + pipette_id="pipette-id", + addressable_area_name="fixedTrash", + offset=AddressableOffsetVector(x=0, y=0, z=0), + force_direct=False, + speed=None, + minimum_z_height=None, + ), + await mock_tip_handler.drop_tip( + pipette_id="pipette-id", + home_after=False, + ), + await hardware_api.stop(home_after=True), + ) diff --git a/api/tests/opentrons/protocol_engine/execution/test_labware_movement_handler.py b/api/tests/opentrons/protocol_engine/execution/test_labware_movement_handler.py index 0934b6d1c10..58619647f54 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_labware_movement_handler.py +++ b/api/tests/opentrons/protocol_engine/execution/test_labware_movement_handler.py @@ -5,7 +5,7 @@ import pytest from decoy import Decoy, matchers -from typing import TYPE_CHECKING, Union +from typing import TYPE_CHECKING, Union, Optional, Tuple from opentrons.protocol_engine.execution import EquipmentHandler, MovementHandler from opentrons.hardware_control import HardwareControlAPI @@ -22,6 +22,7 @@ LabwareLocation, NonStackedLocation, LabwareMovementOffsetData, + Dimensions, ) from opentrons.protocol_engine.execution.thermocycler_plate_lifter import ( ThermocyclerPlateLifter, @@ -85,6 +86,22 @@ def heater_shaker_movement_flagger(decoy: Decoy) -> HeaterShakerMovementFlagger: return decoy.mock(cls=HeaterShakerMovementFlagger) +@pytest.fixture +def hardware_gripper_offset_data() -> Tuple[ + LabwareMovementOffsetData, LabwareMovementOffsetData +]: + """Get a set of mocked labware offset data.""" + user_offset_data = LabwareMovementOffsetData( + pickUpOffset=LabwareOffsetVector(x=123, y=234, z=345), + dropOffset=LabwareOffsetVector(x=111, y=222, z=333), + ) + final_offset_data = LabwareMovementOffsetData( + pickUpOffset=LabwareOffsetVector(x=-1, y=-2, z=-3), + dropOffset=LabwareOffsetVector(x=1, y=2, z=3), + ) + return user_offset_data, final_offset_data + + def default_experimental_movement_data() -> LabwareMovementOffsetData: """Experimental movement data with default values.""" return LabwareMovementOffsetData( @@ -93,6 +110,45 @@ def default_experimental_movement_data() -> LabwareMovementOffsetData: ) +async def set_up_decoy_hardware_gripper( + decoy: Decoy, ot3_hardware_api: OT3API, state_store: StateStore +) -> None: + """Shared hardware gripper decoy setup.""" + decoy.when(state_store.config.use_virtual_gripper).then_return(False) + decoy.when(ot3_hardware_api.has_gripper()).then_return(True) + decoy.when(ot3_hardware_api.gripper_jaw_can_home()).then_return(True) + assert ot3_hardware_api.hardware_gripper + decoy.when( + await ot3_hardware_api.gantry_position(mount=OT3Mount.GRIPPER) + ).then_return(Point(x=777, y=888, z=999)) + + decoy.when( + await ot3_hardware_api.encoder_current_position_ot3(OT3Mount.GRIPPER) + ).then_return({Axis.G: 4.0}) + + decoy.when( + ot3_hardware_api.hardware_gripper.geometry.max_allowed_grip_error + ).then_return(6.0) + + decoy.when(ot3_hardware_api.hardware_gripper.jaw_width).then_return(89) + + decoy.when( + state_store.labware.get_grip_force("my-teleporting-labware") + ).then_return(100) + + decoy.when(state_store.labware.get_labware_offset("new-offset-id")).then_return( + LabwareOffset( + id="new-offset-id", + createdAt=datetime(year=2022, month=10, day=20), + definitionUri="my-labware", + location=LabwareOffsetLocation( + slotName=DeckSlotName.SLOT_5 + ), # this location doesn't matter for this test + vector=LabwareOffsetVector(x=0.5, y=0.6, z=0.7), + ) + ) + + @pytest.mark.ot3_only @pytest.fixture def subject( @@ -116,27 +172,126 @@ def subject( ) +@pytest.mark.ot3_only +async def test_raise_error_if_gripper_pickup_failed( + decoy: Decoy, + state_store: StateStore, + thermocycler_plate_lifter: ThermocyclerPlateLifter, + ot3_hardware_api: OT3API, + subject: LabwareMovementHandler, + hardware_gripper_offset_data: Tuple[ + LabwareMovementOffsetData, LabwareMovementOffsetData + ], +) -> None: + """Test that the gripper position check is called at the right time.""" + # This function should only be called when after the gripper opens, + # and then closes again. This is when we expect the labware to be + # in the gripper jaws. + await set_up_decoy_hardware_gripper(decoy, ot3_hardware_api, state_store) + assert ot3_hardware_api.hardware_gripper + + user_offset_data, final_offset_data = hardware_gripper_offset_data + + starting_location = DeckSlotLocation(slotName=DeckSlotName.SLOT_1) + to_location = DeckSlotLocation(slotName=DeckSlotName.SLOT_2) + + mock_tc_context_manager = decoy.mock(name="mock_tc_context_manager") + decoy.when( + thermocycler_plate_lifter.lift_plate_for_labware_movement( + labware_location=starting_location + ) + ).then_return(mock_tc_context_manager) + + decoy.when( + state_store.geometry.get_final_labware_movement_offset_vectors( + from_location=starting_location, + to_location=to_location, + additional_offset_vector=user_offset_data, + ) + ).then_return(final_offset_data) + + decoy.when( + state_store.geometry.get_labware_grip_point( + labware_id="my-teleporting-labware", location=starting_location + ) + ).then_return(Point(101, 102, 119.5)) + + decoy.when( + state_store.geometry.get_labware_grip_point( + labware_id="my-teleporting-labware", location=to_location + ) + ).then_return(Point(201, 202, 219.5)) + + decoy.when( + state_store.labware.get_dimensions(labware_id="my-teleporting-labware") + ).then_return(Dimensions(x=100, y=85, z=0)) + + decoy.when( + state_store.labware.get_well_bbox(labware_id="my-teleporting-labware") + ).then_return(Dimensions(x=99, y=80, z=1)) + + await subject.move_labware_with_gripper( + labware_id="my-teleporting-labware", + current_location=starting_location, + new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_2), + user_offset_data=user_offset_data, + post_drop_slide_offset=Point(x=1, y=1, z=1), + ) + + decoy.verify( + await ot3_hardware_api.home(axes=[Axis.Z_L, Axis.Z_R, Axis.Z_G]), + await mock_tc_context_manager.__aenter__(), + await ot3_hardware_api.grip(force_newtons=100), + await ot3_hardware_api.ungrip(), + await ot3_hardware_api.grip(force_newtons=100), + ot3_hardware_api.raise_error_if_gripper_pickup_failed( + expected_grip_width=85, + grip_width_uncertainty_wider=0, + grip_width_uncertainty_narrower=5, + ), + await ot3_hardware_api.grip(force_newtons=100), + ot3_hardware_api.raise_error_if_gripper_pickup_failed( + expected_grip_width=85, + grip_width_uncertainty_wider=0, + grip_width_uncertainty_narrower=5, + ), + await ot3_hardware_api.grip(force_newtons=100), + ot3_hardware_api.raise_error_if_gripper_pickup_failed( + expected_grip_width=85, + grip_width_uncertainty_wider=0, + grip_width_uncertainty_narrower=5, + ), + await ot3_hardware_api.disengage_axes([Axis.Z_G]), + await ot3_hardware_api.ungrip(), + await ot3_hardware_api.ungrip(), + ) + + # TODO (spp, 2022-10-18): # 1. Should write an acceptance test w/ real labware on ot3 deck. # 2. This test will be split once waypoints generation is moved to motion planning. @pytest.mark.parametrize( - argnames=["from_location", "to_location"], + argnames=["from_location", "to_location", "slide_offset"], argvalues=[ ( DeckSlotLocation(slotName=DeckSlotName.SLOT_1), DeckSlotLocation(slotName=DeckSlotName.SLOT_3), + None, ), ( DeckSlotLocation(slotName=DeckSlotName.SLOT_1), ModuleLocation(moduleId="module-id"), + Point(x=50, y=0, z=0), ), ( OnLabwareLocation(labwareId="a-labware-id"), OnLabwareLocation(labwareId="another-labware-id"), + None, ), ( ModuleLocation(moduleId="a-module-id"), DeckSlotLocation(slotName=DeckSlotName.SLOT_1), + Point(x=-10, y=40, z=-40), ), ], ) @@ -149,30 +304,18 @@ async def test_move_labware_with_gripper( subject: LabwareMovementHandler, from_location: Union[DeckSlotLocation, ModuleLocation, OnLabwareLocation], to_location: Union[DeckSlotLocation, ModuleLocation, OnLabwareLocation], + slide_offset: Optional[Point], + hardware_gripper_offset_data: Tuple[ + LabwareMovementOffsetData, LabwareMovementOffsetData + ], ) -> None: """It should perform a labware movement with gripper by delegating to OT3API.""" # TODO (spp, 2023-07-26): this test does NOT stub out movement waypoints in order to # keep this as the semi-smoke test that it previously was. We should add a proper # smoke test for gripper labware movement with actual labware and make this a unit test. + await set_up_decoy_hardware_gripper(decoy, ot3_hardware_api, state_store) - user_offset_data = LabwareMovementOffsetData( - pickUpOffset=LabwareOffsetVector(x=123, y=234, z=345), - dropOffset=LabwareOffsetVector(x=111, y=222, z=333), - ) - final_offset_data = LabwareMovementOffsetData( - pickUpOffset=LabwareOffsetVector(x=-1, y=-2, z=-3), - dropOffset=LabwareOffsetVector(x=1, y=2, z=3), - ) - - decoy.when(state_store.config.use_virtual_gripper).then_return(False) - decoy.when(ot3_hardware_api.has_gripper()).then_return(True) - decoy.when(ot3_hardware_api._gripper_handler.is_ready_for_jaw_home()).then_return( - True - ) - - decoy.when( - await ot3_hardware_api.gantry_position(mount=OT3Mount.GRIPPER) - ).then_return(Point(x=777, y=888, z=999)) + user_offset_data, final_offset_data = hardware_gripper_offset_data decoy.when( state_store.geometry.get_final_labware_movement_offset_vectors( @@ -182,39 +325,31 @@ async def test_move_labware_with_gripper( ) ).then_return(final_offset_data) + decoy.when( + state_store.labware.get_dimensions(labware_id="my-teleporting-labware") + ).then_return(Dimensions(x=100, y=85, z=0)) + + decoy.when( + state_store.labware.get_well_bbox(labware_id="my-teleporting-labware") + ).then_return(Dimensions(x=99, y=80, z=1)) + decoy.when( state_store.geometry.get_labware_grip_point( labware_id="my-teleporting-labware", location=from_location ) ).then_return(Point(101, 102, 119.5)) - decoy.when( state_store.geometry.get_labware_grip_point( labware_id="my-teleporting-labware", location=to_location ) ).then_return(Point(201, 202, 219.5)) - decoy.when( - state_store.labware.get_grip_force("my-teleporting-labware") - ).then_return(100) - mock_tc_context_manager = decoy.mock() + mock_tc_context_manager = decoy.mock(name="mock_tc_context_manager") decoy.when( thermocycler_plate_lifter.lift_plate_for_labware_movement( labware_location=from_location ) ).then_return(mock_tc_context_manager) - decoy.when(state_store.labware.get_labware_offset("new-offset-id")).then_return( - LabwareOffset( - id="new-offset-id", - createdAt=datetime(year=2022, month=10, day=20), - definitionUri="my-labware", - location=LabwareOffsetLocation( - slotName=DeckSlotName.SLOT_5 - ), # this location doesn't matter for this test - vector=LabwareOffsetVector(x=0.5, y=0.6, z=0.7), - ) - ) - expected_waypoints = [ Point(100, 100, 999), # move to above slot 1 Point(100, 100, 116.5), # move to labware on slot 1 @@ -229,38 +364,79 @@ async def test_move_labware_with_gripper( current_location=from_location, new_location=to_location, user_offset_data=user_offset_data, + post_drop_slide_offset=slide_offset, ) gripper = OT3Mount.GRIPPER - decoy.verify( - await ot3_hardware_api.home(axes=[Axis.Z_L, Axis.Z_R, Axis.Z_G]), - await mock_tc_context_manager.__aenter__(), - await ot3_hardware_api.grip(force_newtons=100), - await ot3_hardware_api.move_to( - mount=gripper, abs_position=expected_waypoints[0] - ), - await ot3_hardware_api.ungrip(), - await ot3_hardware_api.move_to( - mount=gripper, abs_position=expected_waypoints[1] - ), - await ot3_hardware_api.grip(force_newtons=100), - await ot3_hardware_api.move_to( - mount=gripper, abs_position=expected_waypoints[2] - ), - await ot3_hardware_api.grip(force_newtons=100), - await ot3_hardware_api.move_to( - mount=gripper, abs_position=expected_waypoints[3] - ), - await ot3_hardware_api.grip(force_newtons=100), - await ot3_hardware_api.move_to( - mount=gripper, abs_position=expected_waypoints[4] - ), - await ot3_hardware_api.ungrip(), - await ot3_hardware_api.move_to( - mount=gripper, abs_position=expected_waypoints[5] - ), - await ot3_hardware_api.idle_gripper(), - ) + + if slide_offset is None: + decoy.verify( + await ot3_hardware_api.home(axes=[Axis.Z_L, Axis.Z_R, Axis.Z_G]), + await mock_tc_context_manager.__aenter__(), + await ot3_hardware_api.grip(force_newtons=100), + await ot3_hardware_api.move_to( + mount=gripper, abs_position=expected_waypoints[0] + ), + await ot3_hardware_api.ungrip(), + await ot3_hardware_api.move_to( + mount=gripper, abs_position=expected_waypoints[1] + ), + await ot3_hardware_api.grip(force_newtons=100), + await ot3_hardware_api.move_to( + mount=gripper, abs_position=expected_waypoints[2] + ), + await ot3_hardware_api.grip(force_newtons=100), + await ot3_hardware_api.move_to( + mount=gripper, abs_position=expected_waypoints[3] + ), + await ot3_hardware_api.grip(force_newtons=100), + await ot3_hardware_api.move_to( + mount=gripper, abs_position=expected_waypoints[4] + ), + await ot3_hardware_api.disengage_axes([Axis.Z_G]), + await ot3_hardware_api.ungrip(), + await ot3_hardware_api.home_z(OT3Mount.GRIPPER), + await ot3_hardware_api.move_to( + mount=gripper, abs_position=expected_waypoints[5] + ), + await ot3_hardware_api.idle_gripper(), + ) + else: + decoy.verify( + await ot3_hardware_api.home(axes=[Axis.Z_L, Axis.Z_R, Axis.Z_G]), + await mock_tc_context_manager.__aenter__(), + await ot3_hardware_api.grip(force_newtons=100), + await ot3_hardware_api.move_to( + mount=gripper, abs_position=expected_waypoints[0] + ), + await ot3_hardware_api.ungrip(), + await ot3_hardware_api.move_to( + mount=gripper, abs_position=expected_waypoints[1] + ), + await ot3_hardware_api.grip(force_newtons=100), + await ot3_hardware_api.move_to( + mount=gripper, abs_position=expected_waypoints[2] + ), + await ot3_hardware_api.grip(force_newtons=100), + await ot3_hardware_api.move_to( + mount=gripper, abs_position=expected_waypoints[3] + ), + await ot3_hardware_api.grip(force_newtons=100), + await ot3_hardware_api.move_to( + mount=gripper, abs_position=expected_waypoints[4] + ), + await ot3_hardware_api.disengage_axes([Axis.Z_G]), + await ot3_hardware_api.ungrip(), + await ot3_hardware_api.home_z(OT3Mount.GRIPPER), + await ot3_hardware_api.move_to( + mount=gripper, abs_position=expected_waypoints[5] + ), + await ot3_hardware_api.ungrip(), + await ot3_hardware_api.move_to( + mount=gripper, abs_position=expected_waypoints[5] + slide_offset + ), + await ot3_hardware_api.idle_gripper(), + ) async def test_labware_movement_raises_on_ot2( @@ -285,6 +461,7 @@ async def test_labware_movement_raises_on_ot2( current_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), user_offset_data=default_experimental_movement_data(), + post_drop_slide_offset=None, ) @@ -302,6 +479,7 @@ async def test_labware_movement_skips_for_virtual_gripper( current_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), user_offset_data=default_experimental_movement_data(), + post_drop_slide_offset=None, ) decoy.verify( await ot3_hardware_api.move_to( @@ -328,6 +506,7 @@ async def test_labware_movement_raises_without_gripper( current_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), user_offset_data=default_experimental_movement_data(), + post_drop_slide_offset=None, ) diff --git a/api/tests/opentrons/protocol_engine/execution/test_movement_handler.py b/api/tests/opentrons/protocol_engine/execution/test_movement_handler.py index ac24a5810e1..75205b6e45d 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_movement_handler.py +++ b/api/tests/opentrons/protocol_engine/execution/test_movement_handler.py @@ -6,7 +6,6 @@ from opentrons.types import MountType, Point, DeckSlotName, Mount from opentrons.hardware_control import API as HardwareAPI from opentrons.hardware_control.types import CriticalPoint -from opentrons.hardware_control.errors import MustHomeError from opentrons.motion_planning import Waypoint from opentrons.protocol_engine.types import ( @@ -18,6 +17,7 @@ DeckSlotLocation, CurrentWell, MotorAxis, + AddressableOffsetVector, ) from opentrons.protocol_engine.state import ( StateStore, @@ -31,6 +31,7 @@ HeaterShakerMovementFlagger, ) from opentrons.protocol_engine.execution.gantry_mover import GantryMover +from opentrons_shared_data.errors.exceptions import PositionUnknownError @pytest.fixture @@ -111,7 +112,7 @@ async def test_move_to_well( decoy.when( state_store.motion.get_pipette_location( pipette_id="pipette-id", - current_well=None, + current_location=None, ) ).then_return( PipetteLocationData( @@ -225,7 +226,7 @@ async def test_move_to_well_from_starting_location( decoy.when( state_store.motion.get_pipette_location( pipette_id="pipette-id", - current_well=current_well, + current_location=current_well, ) ).then_return( PipetteLocationData( @@ -296,6 +297,103 @@ async def test_move_to_well_from_starting_location( ) +async def test_move_to_addressable_area( + decoy: Decoy, + state_store: StateStore, + thermocycler_movement_flagger: ThermocyclerMovementFlagger, + heater_shaker_movement_flagger: HeaterShakerMovementFlagger, + mock_gantry_mover: GantryMover, + subject: MovementHandler, +) -> None: + """Move requests should call hardware controller with movement data.""" + decoy.when( + state_store.modules.get_heater_shaker_movement_restrictors() + ).then_return([]) + + decoy.when( + state_store.addressable_areas.get_addressable_area_base_slot("area-name") + ).then_return(DeckSlotName.SLOT_1) + + decoy.when(state_store.tips.get_pipette_channels("pipette-id")).then_return(1) + + decoy.when( + state_store.motion.get_pipette_location( + pipette_id="pipette-id", + current_location=None, + ) + ).then_return( + PipetteLocationData( + mount=MountType.LEFT, + critical_point=CriticalPoint.FRONT_NOZZLE, + ) + ) + + decoy.when( + await mock_gantry_mover.get_position( + pipette_id="pipette-id", + ) + ).then_return(Point(1, 1, 1)) + + decoy.when(mock_gantry_mover.get_max_travel_z(pipette_id="pipette-id")).then_return( + 42.0 + ) + + decoy.when( + state_store.pipettes.get_movement_speed( + pipette_id="pipette-id", requested_speed=45.6 + ) + ).then_return(39339.5) + + decoy.when( + state_store.motion.get_movement_waypoints_to_addressable_area( + addressable_area_name="area-name", + offset=AddressableOffsetVector(x=9, y=8, z=7), + origin=Point(1, 1, 1), + origin_cp=CriticalPoint.FRONT_NOZZLE, + max_travel_z=42.0, + force_direct=True, + minimum_z_height=12.3, + stay_at_max_travel_z=True, + ignore_tip_configuration=False, + ) + ).then_return( + [Waypoint(Point(1, 2, 3), CriticalPoint.XY_CENTER), Waypoint(Point(4, 5, 6))] + ) + + decoy.when( + await mock_gantry_mover.move_to( + pipette_id="pipette-id", + waypoints=[ + Waypoint(Point(1, 2, 3), CriticalPoint.XY_CENTER), + Waypoint(Point(4, 5, 6)), + ], + speed=39339.5, + ), + ).then_return(Point(4, 5, 6)) + + result = await subject.move_to_addressable_area( + pipette_id="pipette-id", + addressable_area_name="area-name", + offset=AddressableOffsetVector(x=9, y=8, z=7), + force_direct=True, + minimum_z_height=12.3, + speed=45.6, + stay_at_highest_possible_z=True, + ignore_tip_configuration=False, + ) + + assert result == Point(x=4, y=5, z=6) + + decoy.verify( + heater_shaker_movement_flagger.raise_if_movement_restricted( + hs_movement_restrictors=[], + destination_slot=1, + is_multi_channel=False, + destination_is_tip_rack=False, + ) + ) + + class MoveRelativeSpec(NamedTuple): """Test data for move_relative.""" @@ -445,7 +543,7 @@ async def test_check_valid_position( ).then_return(Point(0, 0, 0)) decoy.when( await hardware_api.gantry_position(mount=Mount.RIGHT, fail_on_not_homed=True) - ).then_raise(MustHomeError()) + ).then_raise(PositionUnknownError()) assert await subject.check_for_valid_position(MountType.LEFT) assert not await subject.check_for_valid_position(MountType.RIGHT) diff --git a/api/tests/opentrons/protocol_engine/execution/test_pipetting_handler.py b/api/tests/opentrons/protocol_engine/execution/test_pipetting_handler.py index 495d545bf78..bcb61324ad0 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_pipetting_handler.py +++ b/api/tests/opentrons/protocol_engine/execution/test_pipetting_handler.py @@ -1,5 +1,5 @@ """Pipetting execution handler.""" -from typing import cast, Optional +from typing import cast import pytest from decoy import Decoy @@ -17,7 +17,7 @@ ) from opentrons.protocol_engine.errors.exceptions import ( TipNotAttachedError, - InvalidPipettingVolumeError, + InvalidAspirateVolumeError, InvalidPushOutVolumeError, InvalidDispenseVolumeError, ) @@ -77,7 +77,7 @@ async def test_create_pipette_handler( (1.0, False, False), ], ) -def test_get_is_ready_to_aspirate( +def test_hw_get_is_ready_to_aspirate( decoy: Decoy, mock_state_view: StateView, mock_hardware_api: HardwareAPI, @@ -103,7 +103,7 @@ def test_get_is_ready_to_aspirate( assert hardware_subject.get_is_ready_to_aspirate("pipette-id") == expected -def test_get_is_ready_to_aspirate_raises_no_tip_attached( +def test_hw_get_is_ready_to_aspirate_raises_no_tip_attached( decoy: Decoy, mock_state_view: StateView, mock_hardware_api: HardwareAPI, @@ -127,13 +127,17 @@ def test_get_is_ready_to_aspirate_raises_no_tip_attached( assert hardware_subject.get_is_ready_to_aspirate("pipette-id") -async def test_dispense_in_place( +async def test_hw_dispense_in_place( decoy: Decoy, mock_state_view: StateView, mock_hardware_api: HardwareAPI, hardware_subject: HardwarePipettingHandler, ) -> None: """It should find the pipette by ID and use it to dispense.""" + decoy.when(mock_state_view.pipettes.get_aspirated_volume("pipette-id")).then_return( + 25 + ) + decoy.when(mock_hardware_api.attached_instruments).then_return({}) decoy.when( mock_state_view.pipettes.get_hardware_pipette( @@ -171,13 +175,17 @@ async def test_dispense_in_place( ) -async def test_dispense_in_place_raises_invalid_push_out( +async def test_hw_dispense_in_place_raises_invalid_push_out( decoy: Decoy, mock_state_view: StateView, mock_hardware_api: HardwareAPI, hardware_subject: HardwarePipettingHandler, ) -> None: """It should raise an InvalidPushOutVolumeError.""" + decoy.when(mock_state_view.pipettes.get_aspirated_volume("pipette-id")).then_return( + 25 + ) + decoy.when(mock_hardware_api.attached_instruments).then_return({}) decoy.when( mock_state_view.pipettes.get_hardware_pipette( @@ -204,13 +212,20 @@ async def test_dispense_in_place_raises_invalid_push_out( ) -async def test_aspirate_in_place( +async def test_hw_aspirate_in_place( decoy: Decoy, mock_state_view: StateView, mock_hardware_api: HardwareAPI, hardware_subject: HardwarePipettingHandler, ) -> None: """Should set flow_rate and call hardware_api aspirate.""" + decoy.when(mock_state_view.pipettes.get_working_volume("pipette-id")).then_return( + 25 + ) + decoy.when(mock_state_view.pipettes.get_aspirated_volume("pipette-id")).then_return( + 0 + ) + decoy.when(mock_hardware_api.attached_instruments).then_return({}) decoy.when( mock_state_view.pipettes.get_hardware_pipette( @@ -248,28 +263,7 @@ async def test_aspirate_in_place( ) -async def test_virtual_validate_aspirated_volume_raises( - decoy: Decoy, - mock_state_view: StateView, -) -> None: - """Should validate if trying to aspirate more than the working volume.""" - decoy.when(mock_state_view.pipettes.get_attached_tip("pipette-id")).then_return( - TipGeometry(length=1, diameter=2, volume=3) - ) - - decoy.when(mock_state_view.pipettes.get_working_volume("pipette-id")).then_return(3) - - decoy.when(mock_state_view.pipettes.get_aspirated_volume("pipette-id")).then_return( - 2 - ) - - subject = VirtualPipettingHandler(state_view=mock_state_view) - - with pytest.raises(InvalidPipettingVolumeError): - await subject.aspirate_in_place(pipette_id="pipette-id", volume=4, flow_rate=1) - - -async def test_blow_out_in_place( +async def test_virtual_blow_out_in_place( decoy: Decoy, mock_state_view: StateView, mock_hardware_api: HardwareAPI, @@ -309,7 +303,7 @@ async def test_blow_out_in_place( ) -def test_get_is_ready_to_aspirate_virtual( +def test_virtual_get_is_ready_to_aspirate( decoy: Decoy, mock_state_view: StateView ) -> None: """Should check if pipette is ready to aspirate.""" @@ -329,7 +323,7 @@ def test_get_is_ready_to_aspirate_virtual( assert subject.get_is_ready_to_aspirate(pipette_id="pipette-id-123") is True -async def test_aspirate_in_place_virtual( +async def test_virtual_aspirate_in_place( mock_state_view: StateView, decoy: Decoy ) -> None: """Should return the volume.""" @@ -353,7 +347,7 @@ async def test_aspirate_in_place_virtual( assert result == 2 -async def test_dispense_in_place_virtual( +async def test_virtual_dispense_in_place( decoy: Decoy, mock_state_view: StateView ) -> None: """Should return the volume.""" @@ -373,7 +367,7 @@ async def test_dispense_in_place_virtual( assert result == 3 -async def test_dispense_in_place_virtual_raises_invalid_push_out( +async def test_virtual_dispense_in_place_raises_invalid_push_out( decoy: Decoy, mock_state_view: StateView ) -> None: """Should raise an InvalidPushOutVolumeError.""" @@ -393,9 +387,8 @@ async def test_dispense_in_place_virtual_raises_invalid_push_out( ) -@pytest.mark.parametrize("aspirated_volume", [(None), (1)]) -async def test_dispense_in_place_virtual_raises_invalid_dispense( - decoy: Decoy, mock_state_view: StateView, aspirated_volume: Optional[float] +async def test_virtual_dispense_in_place_raises_no_tip( + decoy: Decoy, mock_state_view: StateView ) -> None: """Should raise an InvalidDispenseVolumeError.""" subject = VirtualPipettingHandler(state_view=mock_state_view) @@ -405,7 +398,7 @@ async def test_dispense_in_place_virtual_raises_invalid_dispense( ) decoy.when(mock_state_view.pipettes.get_aspirated_volume("pipette-id")).then_return( - aspirated_volume + None ) with pytest.raises(InvalidDispenseVolumeError): @@ -414,21 +407,7 @@ async def test_dispense_in_place_virtual_raises_invalid_dispense( ) -async def test_validate_tip_attached_in_blow_out( - mock_state_view: StateView, decoy: Decoy -) -> None: - """Should raise an error that a tip is not attached.""" - subject = VirtualPipettingHandler(state_view=mock_state_view) - - decoy.when(mock_state_view.pipettes.get_attached_tip("pipette-id")).then_return( - None - ) - - with pytest.raises(TipNotAttachedError): - await subject.blow_out_in_place("pipette-id", flow_rate=1) - - -async def test_validate_tip_attached_in_aspirate( +async def test_virtual_aspirate_validate_tip_attached( mock_state_view: StateView, decoy: Decoy ) -> None: """Should raise an error that a tip is not attached.""" @@ -444,7 +423,7 @@ async def test_validate_tip_attached_in_aspirate( await subject.aspirate_in_place("pipette-id", volume=20, flow_rate=1) -async def test_validate_tip_attached_in_dispense( +async def test_virtual_dispense_validate_tip_attached( mock_state_view: StateView, decoy: Decoy ) -> None: """Should raise an error that a tip is not attached.""" @@ -460,3 +439,120 @@ async def test_validate_tip_attached_in_dispense( await subject.dispense_in_place( "pipette-id", volume=20, flow_rate=1, push_out=None ) + + +async def test_aspirate_volume_validation( + decoy: Decoy, + mock_state_view: StateView, + mock_hardware_api: HardwareAPI, + hardware_subject: HardwarePipettingHandler, +) -> None: + """It should validate the input volume, possibly adjusting it for rounding error. + + This is done on both the VirtualPipettingHandler and HardwarePipettingHandler + because they should behave the same way. + """ + virtual_subject = VirtualPipettingHandler(state_view=mock_state_view) + + decoy.when(mock_state_view.pipettes.get_attached_tip("pipette-id")).then_return( + TipGeometry(length=1, diameter=2, volume=3) + ) + decoy.when(mock_state_view.pipettes.get_working_volume("pipette-id")).then_return(3) + decoy.when(mock_state_view.pipettes.get_aspirated_volume("pipette-id")).then_return( + 2 + ) + + # Stuff that only matters for the hardware subject: + decoy.when(mock_hardware_api.attached_instruments).then_return({}) + decoy.when( + mock_state_view.pipettes.get_hardware_pipette( + pipette_id="pipette-id", + attached_pipettes={}, + ) + ).then_return( + HardwarePipette( + mount=Mount.LEFT, + config=cast( + PipetteDict, + { + "aspirate_flow_rate": 1.23, + "dispense_flow_rate": 4.56, + "blow_out_flow_rate": 7.89, + }, + ), + ) + ) + + ok_volume = 1.0000000000001 + not_ok_volume = 1.01 + expected_adjusted_volume = 1 + + for subject in [virtual_subject, hardware_subject]: + assert ( + await subject.aspirate_in_place( + pipette_id="pipette-id", volume=ok_volume, flow_rate=1 + ) + == expected_adjusted_volume + ) + with pytest.raises(InvalidAspirateVolumeError): + await subject.aspirate_in_place( + pipette_id="pipette-id", volume=not_ok_volume, flow_rate=1 + ) + + +async def test_dispense_volume_validation( + decoy: Decoy, + mock_state_view: StateView, + mock_hardware_api: HardwareAPI, + hardware_subject: HardwarePipettingHandler, +) -> None: + """It should validate the input volume, possibly adjusting it for rounding error. + + This is done on both the VirtualPipettingHandler and HardwarePipettingHandler + because they should behave the same way. + """ + virtual_subject = VirtualPipettingHandler(state_view=mock_state_view) + + decoy.when(mock_state_view.pipettes.get_attached_tip("pipette-id")).then_return( + TipGeometry(length=1, diameter=2, volume=3) + ) + decoy.when(mock_state_view.pipettes.get_aspirated_volume("pipette-id")).then_return( + 1 + ) + + # Stuff that only matters for the hardware subject: + decoy.when(mock_hardware_api.attached_instruments).then_return({}) + decoy.when( + mock_state_view.pipettes.get_hardware_pipette( + pipette_id="pipette-id", + attached_pipettes={}, + ) + ).then_return( + HardwarePipette( + mount=Mount.LEFT, + config=cast( + PipetteDict, + { + "aspirate_flow_rate": 1.23, + "dispense_flow_rate": 4.56, + "blow_out_flow_rate": 7.89, + }, + ), + ) + ) + + ok_volume = 1.0000000000001 + not_ok_volume = 1.01 + expected_adjusted_volume = 1 + + for subject in [virtual_subject, hardware_subject]: + assert ( + await subject.dispense_in_place( + pipette_id="pipette-id", volume=ok_volume, flow_rate=5, push_out=7 + ) + == expected_adjusted_volume + ) + with pytest.raises(InvalidDispenseVolumeError): + await subject.dispense_in_place( + pipette_id="pipette-id", volume=not_ok_volume, flow_rate=5, push_out=7 + ) diff --git a/api/tests/opentrons/protocol_engine/execution/test_tip_handler.py b/api/tests/opentrons/protocol_engine/execution/test_tip_handler.py index c8ce23e4756..6a84810ff61 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_tip_handler.py +++ b/api/tests/opentrons/protocol_engine/execution/test_tip_handler.py @@ -2,14 +2,22 @@ import pytest from decoy import Decoy +from typing import Dict, ContextManager, Optional +from contextlib import nullcontext as does_not_raise + from opentrons.types import Mount, MountType from opentrons.hardware_control import API as HardwareAPI +from opentrons.hardware_control.types import TipStateType +from opentrons.hardware_control.protocols.types import OT2RobotType, FlexRobotType from opentrons.protocols.models import LabwareDefinition from opentrons.protocol_engine.state import StateView -from opentrons.protocol_engine.types import TipGeometry +from opentrons.protocol_engine.types import TipGeometry, TipPresenceStatus from opentrons.protocol_engine.resources import LabwareDataProvider - +from opentrons_shared_data.errors.exceptions import ( + CommandPreconditionViolated, + CommandParameterLimitViolated, +) from opentrons.protocol_engine.execution.tip_handler import ( HardwareTipHandler, VirtualTipHandler, @@ -20,7 +28,9 @@ @pytest.fixture def mock_hardware_api(decoy: Decoy) -> HardwareAPI: """Get a mock in the shape of a HardwareAPI.""" - return decoy.mock(cls=HardwareAPI) + mock = decoy.mock(cls=HardwareAPI) + decoy.when(mock.get_robot_type()).then_return(OT2RobotType) + return mock @pytest.fixture @@ -191,6 +201,94 @@ async def test_add_tip( ) +@pytest.mark.parametrize( + argnames=[ + "test_channels", + "style", + "primary_nozzle", + "front_nozzle", + "exception", + "expected_result", + "tip_result", + ], + argvalues=[ + [ + 8, + "COLUMN", + "A1", + None, + does_not_raise(), + {"primary_nozzle": "A1", "front_right_nozzle": "H1"}, + None, + ], + [ + 8, + "ROW", + "A1", + None, + pytest.raises(CommandParameterLimitViolated), + None, + None, + ], + [8, "SINGLE", "A1", None, does_not_raise(), {"primary_nozzle": "A1"}, None], + [ + 1, + "SINGLE", + "A1", + None, + pytest.raises(CommandPreconditionViolated), + None, + None, + ], + [ + 8, + "COLUMN", + "A1", + None, + pytest.raises(CommandPreconditionViolated), + None, + TipGeometry(length=50, diameter=5, volume=300), + ], + ], +) +async def test_available_nozzle_layout( + decoy: Decoy, + mock_state_view: StateView, + mock_hardware_api: HardwareAPI, + mock_labware_data_provider: LabwareDataProvider, + test_channels: int, + style: str, + primary_nozzle: Optional[str], + front_nozzle: Optional[str], + exception: ContextManager[None], + expected_result: Optional[Dict[str, str]], + tip_result: Optional[TipGeometry], +) -> None: + """The virtual and hardware pipettes should return the same data and error at the same time.""" + hw_subject = HardwareTipHandler( + state_view=mock_state_view, + hardware_api=mock_hardware_api, + labware_data_provider=mock_labware_data_provider, + ) + virtual_subject = VirtualTipHandler(state_view=mock_state_view) + decoy.when(mock_state_view.pipettes.get_channels("pipette-id")).then_return( + test_channels + ) + decoy.when(mock_state_view.pipettes.get_attached_tip("pipette-id")).then_return( + tip_result + ) + + with exception: + hw_result = await hw_subject.available_for_nozzle_layout( + "pipette-id", style, primary_nozzle, front_nozzle + ) + virtual_result = await virtual_subject.available_for_nozzle_layout( + "pipette-id", style, primary_nozzle, front_nozzle + ) + + assert hw_result == virtual_result == expected_result + + async def test_virtual_pick_up_tip( decoy: Decoy, mock_state_view: StateView, @@ -239,3 +337,89 @@ async def test_virtual_drop_tip(decoy: Decoy, mock_state_view: StateView) -> Non mock_state_view.pipettes.validate_tip_state("pipette-id", True), times=1, ) + + +async def test_get_tip_presence_on_ot2( + decoy: Decoy, + mock_state_view: StateView, + mock_hardware_api: HardwareAPI, + mock_labware_data_provider: LabwareDataProvider, +) -> None: + """It should use the hardware API to up a tip.""" + subject = HardwareTipHandler( + state_view=mock_state_view, + hardware_api=mock_hardware_api, + labware_data_provider=mock_labware_data_provider, + ) + + result = await subject.get_tip_presence(pipette_id="pipette-id") + assert result == TipPresenceStatus.UNKNOWN + + +@pytest.mark.parametrize("hw_tip_state", [TipStateType.ABSENT, TipStateType.PRESENT]) +async def test_get_tip_presence_on_ot3( + decoy: Decoy, + mock_state_view: StateView, + mock_labware_data_provider: LabwareDataProvider, + hw_tip_state: TipStateType, +) -> None: + """It should use the hardware API to up a tip.""" + try: + from opentrons.hardware_control.ot3api import OT3API + + ot3_hardware_api = decoy.mock(cls=OT3API) + decoy.when(ot3_hardware_api.get_robot_type()).then_return(FlexRobotType) + + subject = HardwareTipHandler( + state_view=mock_state_view, + hardware_api=ot3_hardware_api, + labware_data_provider=mock_labware_data_provider, + ) + + decoy.when(mock_state_view.pipettes.get_mount("pipette-id")).then_return( + MountType.LEFT + ) + decoy.when( + await ot3_hardware_api.get_tip_presence_status(Mount.LEFT) + ).then_return(hw_tip_state) + result = await subject.get_tip_presence(pipette_id="pipette-id") + assert result == TipPresenceStatus.from_hw_state(hw_tip_state) + + except ImportError: + pass + + +@pytest.mark.parametrize( + "expected", [TipPresenceStatus.ABSENT, TipPresenceStatus.PRESENT] +) +async def test_verify_tip_presence_on_ot3( + decoy: Decoy, + mock_state_view: StateView, + mock_labware_data_provider: LabwareDataProvider, + expected: TipPresenceStatus, +) -> None: + """It should use the hardware API to up a tip.""" + try: + from opentrons.hardware_control.ot3api import OT3API + + ot3_hardware_api = decoy.mock(cls=OT3API) + decoy.when(ot3_hardware_api.get_robot_type()).then_return(FlexRobotType) + + subject = HardwareTipHandler( + state_view=mock_state_view, + hardware_api=ot3_hardware_api, + labware_data_provider=mock_labware_data_provider, + ) + decoy.when(mock_state_view.pipettes.get_mount("pipette-id")).then_return( + MountType.LEFT + ) + await subject.verify_tip_presence("pipette-id", expected) + + decoy.verify( + await ot3_hardware_api.verify_tip_presence( + Mount.LEFT, expected.to_hw_state() + ) + ) + + except ImportError: + pass diff --git a/api/tests/opentrons/protocol_engine/pipette_fixtures.py b/api/tests/opentrons/protocol_engine/pipette_fixtures.py new file mode 100644 index 00000000000..b2d2e6bafe3 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/pipette_fixtures.py @@ -0,0 +1,319 @@ +"""Nozzle Map data to use in tests.""" + +from collections import OrderedDict + +from opentrons.types import Point + +NINETY_SIX_ROWS = OrderedDict( + ( + ( + "A", + [ + "A1", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "A10", + "A11", + "A12", + ], + ), + ( + "B", + [ + "B1", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "B10", + "B11", + "B12", + ], + ), + ( + "C", + [ + "C1", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "C10", + "C11", + "C12", + ], + ), + ( + "D", + [ + "D1", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "D10", + "D11", + "D12", + ], + ), + ( + "E", + [ + "E1", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "E10", + "E11", + "E12", + ], + ), + ( + "F", + [ + "F1", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "F10", + "F11", + "F12", + ], + ), + ( + "G", + [ + "G1", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "G10", + "G11", + "G12", + ], + ), + ( + "H", + [ + "H1", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9", + "H10", + "H11", + "H12", + ], + ), + ) +) + + +NINETY_SIX_COLS = OrderedDict( + ( + ("1", ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"]), + ("2", ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"]), + ("3", ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"]), + ("4", ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"]), + ("5", ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"]), + ("6", ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"]), + ("7", ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"]), + ("8", ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"]), + ("9", ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"]), + ("10", ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"]), + ("11", ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"]), + ("12", ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"]), + ) +) + +NINETY_SIX_MAP = OrderedDict( + ( + ("A1", Point(-36.0, -25.5, -259.15)), + ("A2", Point(-27.0, -25.5, -259.15)), + ("A3", Point(-18.0, -25.5, -259.15)), + ("A4", Point(-9.0, -25.5, -259.15)), + ("A5", Point(0.0, -25.5, -259.15)), + ("A6", Point(9.0, -25.5, -259.15)), + ("A7", Point(18.0, -25.5, -259.15)), + ("A8", Point(27.0, -25.5, -259.15)), + ("A9", Point(36.0, -25.5, -259.15)), + ("A10", Point(45.0, -25.5, -259.15)), + ("A11", Point(54.0, -25.5, -259.15)), + ("A12", Point(63.0, -25.5, -259.15)), + ("B1", Point(-36.0, -34.5, -259.15)), + ("B2", Point(-27.0, -34.5, -259.15)), + ("B3", Point(-18.0, -34.5, -259.15)), + ("B4", Point(-9.0, -34.5, -259.15)), + ("B5", Point(0.0, -34.5, -259.15)), + ("B6", Point(9.0, -34.5, -259.15)), + ("B7", Point(18.0, -34.5, -259.15)), + ("B8", Point(27.0, -34.5, -259.15)), + ("B9", Point(36.0, -34.5, -259.15)), + ("B10", Point(45.0, -34.5, -259.15)), + ("B11", Point(54.0, -34.5, -259.15)), + ("B12", Point(63.0, -34.5, -259.15)), + ("C1", Point(-36.0, -43.5, -259.15)), + ("C2", Point(-27.0, -43.5, -259.15)), + ("C3", Point(-18.0, -43.5, -259.15)), + ("C4", Point(-9.0, -43.5, -259.15)), + ("C5", Point(0.0, -43.5, -259.15)), + ("C6", Point(9.0, -43.5, -259.15)), + ("C7", Point(18.0, -43.5, -259.15)), + ("C8", Point(27.0, -43.5, -259.15)), + ("C9", Point(36.0, -43.5, -259.15)), + ("C10", Point(45.0, -43.5, -259.15)), + ("C11", Point(54.0, -43.5, -259.15)), + ("C12", Point(63.0, -43.5, -259.15)), + ("D1", Point(-36.0, -52.5, -259.15)), + ("D2", Point(-27.0, -52.5, -259.15)), + ("D3", Point(-18.0, -52.5, -259.15)), + ("D4", Point(-9.0, -52.5, -259.15)), + ("D5", Point(0.0, -52.5, -259.15)), + ("D6", Point(9.0, -52.5, -259.15)), + ("D7", Point(18.0, -52.5, -259.15)), + ("D8", Point(27.0, -52.5, -259.15)), + ("D9", Point(36.0, -52.5, -259.15)), + ("D10", Point(45.0, -52.5, -259.15)), + ("D11", Point(54.0, -52.5, -259.15)), + ("D12", Point(63.0, -52.5, -259.15)), + ("E1", Point(-36.0, -61.5, -259.15)), + ("E2", Point(-27.0, -61.5, -259.15)), + ("E3", Point(-18.0, -61.5, -259.15)), + ("E4", Point(-9.0, -61.5, -259.15)), + ("E5", Point(0.0, -61.5, -259.15)), + ("E6", Point(9.0, -61.5, -259.15)), + ("E7", Point(18.0, -61.5, -259.15)), + ("E8", Point(27.0, -61.5, -259.15)), + ("E9", Point(36.0, -61.5, -259.15)), + ("E10", Point(45.0, -61.5, -259.15)), + ("E11", Point(54.0, -61.5, -259.15)), + ("E12", Point(63.0, -61.5, -259.15)), + ("F1", Point(-36.0, -70.5, -259.15)), + ("F2", Point(-27.0, -70.5, -259.15)), + ("F3", Point(-18.0, -70.5, -259.15)), + ("F4", Point(-9.0, -70.5, -259.15)), + ("F5", Point(0.0, -70.5, -259.15)), + ("F6", Point(9.0, -70.5, -259.15)), + ("F7", Point(18.0, -70.5, -259.15)), + ("F8", Point(27.0, -70.5, -259.15)), + ("F9", Point(36.0, -70.5, -259.15)), + ("F10", Point(45.0, -70.5, -259.15)), + ("F11", Point(54.0, -70.5, -259.15)), + ("F12", Point(63.0, -70.5, -259.15)), + ("G1", Point(-36.0, -79.5, -259.15)), + ("G2", Point(-27.0, -79.5, -259.15)), + ("G3", Point(-18.0, -79.5, -259.15)), + ("G4", Point(-9.0, -79.5, -259.15)), + ("G5", Point(0.0, -79.5, -259.15)), + ("G6", Point(9.0, -79.5, -259.15)), + ("G7", Point(18.0, -79.5, -259.15)), + ("G8", Point(27.0, -79.5, -259.15)), + ("G9", Point(36.0, -79.5, -259.15)), + ("G10", Point(45.0, -79.5, -259.15)), + ("G11", Point(54.0, -79.5, -259.15)), + ("G12", Point(63.0, -79.5, -259.15)), + ("H1", Point(-36.0, -88.5, -259.15)), + ("H2", Point(-27.0, -88.5, -259.15)), + ("H3", Point(-18.0, -88.5, -259.15)), + ("H4", Point(-9.0, -88.5, -259.15)), + ("H5", Point(0.0, -88.5, -259.15)), + ("H6", Point(9.0, -88.5, -259.15)), + ("H7", Point(18.0, -88.5, -259.15)), + ("H8", Point(27.0, -88.5, -259.15)), + ("H9", Point(36.0, -88.5, -259.15)), + ("H10", Point(45.0, -88.5, -259.15)), + ("H11", Point(54.0, -88.5, -259.15)), + ("H12", Point(63.0, -88.5, -259.15)), + ) +) + +EIGHT_CHANNEL_ROWS = OrderedDict( + ( + ( + "A", + ["A1"], + ), + ( + "B", + ["B1"], + ), + ( + "C", + ["C1"], + ), + ( + "D", + ["D1"], + ), + ( + "E", + ["E1"], + ), + ( + "F", + ["F1"], + ), + ( + "G", + ["G1"], + ), + ( + "H", + ["H1"], + ), + ) +) + +EIGHT_CHANNEL_COLS = OrderedDict( + (("1", ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"]),) +) + +EIGHT_CHANNEL_MAP = OrderedDict( + ( + ("A1", Point(0.0, 31.5, 35.52)), + ("B1", Point(0.0, 22.5, 35.52)), + ("C1", Point(0.0, 13.5, 35.52)), + ("D1", Point(0.0, 4.5, 35.52)), + ("E1", Point(0.0, -4.5, 35.52)), + ("F1", Point(0.0, -13.5, 35.52)), + ("G1", Point(0.0, -22.5, 35.52)), + ("H1", Point(0.0, -31.5, 35.52)), + ) +) diff --git a/api/tests/opentrons/protocol_engine/resources/test_deck_configuration_provider.py b/api/tests/opentrons/protocol_engine/resources/test_deck_configuration_provider.py new file mode 100644 index 00000000000..8071cc98a66 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/resources/test_deck_configuration_provider.py @@ -0,0 +1,349 @@ +"""Test deck configuration provider.""" +from typing import List, Set + +import pytest +from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] + +from opentrons_shared_data.deck import load as load_deck +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4 + +from opentrons.types import DeckSlotName + +from opentrons.protocol_engine.errors import ( + FixtureDoesNotExistError, + CutoutDoesNotExistError, + AddressableAreaDoesNotExistError, + FixtureDoesNotProvideAreasError, +) +from opentrons.protocol_engine.types import ( + AddressableArea, + AreaType, + PotentialCutoutFixture, + DeckPoint, + Dimensions, + AddressableOffsetVector, +) +from opentrons.protocols.api_support.deck_type import ( + SHORT_TRASH_DECK, + STANDARD_OT2_DECK, + STANDARD_OT3_DECK, +) + +from opentrons.protocol_engine.resources import deck_configuration_provider as subject + + +@pytest.fixture(scope="session") +def ot2_standard_deck_def() -> DeckDefinitionV4: + """Get the OT-2 standard deck definition.""" + return load_deck(STANDARD_OT2_DECK, 4) + + +@pytest.fixture(scope="session") +def ot2_short_trash_deck_def() -> DeckDefinitionV4: + """Get the OT-2 standard deck definition.""" + return load_deck(SHORT_TRASH_DECK, 4) + + +@pytest.fixture(scope="session") +def ot3_standard_deck_def() -> DeckDefinitionV4: + """Get the OT-2 standard deck definition.""" + return load_deck(STANDARD_OT3_DECK, 4) + + +@pytest.mark.parametrize( + ("cutout_id", "expected_deck_point", "deck_def"), + [ + ( + "cutout5", + DeckPoint(x=132.5, y=90.5, z=0.0), + lazy_fixture("ot2_standard_deck_def"), + ), + ( + "cutout5", + DeckPoint(x=132.5, y=90.5, z=0.0), + lazy_fixture("ot2_short_trash_deck_def"), + ), + ( + "cutoutC2", + DeckPoint(x=164.0, y=107, z=0.0), + lazy_fixture("ot3_standard_deck_def"), + ), + ], +) +def test_get_cutout_position( + cutout_id: str, + expected_deck_point: DeckPoint, + deck_def: DeckDefinitionV4, +) -> None: + """It should get the deck position for the requested cutout id.""" + cutout_position = subject.get_cutout_position(cutout_id, deck_def) + assert cutout_position == expected_deck_point + + +def test_get_cutout_position_raises( + ot3_standard_deck_def: DeckDefinitionV4, +) -> None: + """It should raise if there is no cutout with that ID in the deck definition.""" + with pytest.raises(CutoutDoesNotExistError): + subject.get_cutout_position("theFunCutout", ot3_standard_deck_def) + + +@pytest.mark.parametrize( + ("cutout_fixture_id", "expected_display_name", "deck_def"), + [ + ("singleStandardSlot", "Standard Slot", lazy_fixture("ot2_standard_deck_def")), + ( + "singleStandardSlot", + "Standard Slot", + lazy_fixture("ot2_short_trash_deck_def"), + ), + ( + "singleRightSlot", + "Standard Slot Right", + lazy_fixture("ot3_standard_deck_def"), + ), + ], +) +def test_get_cutout_fixture( + cutout_fixture_id: str, + expected_display_name: str, + deck_def: DeckDefinitionV4, +) -> None: + """It should get the cutout fixture given the cutout fixture id.""" + cutout_fixture = subject.get_cutout_fixture(cutout_fixture_id, deck_def) + assert cutout_fixture["displayName"] == expected_display_name + + +def test_get_cutout_fixture_raises( + ot3_standard_deck_def: DeckDefinitionV4, +) -> None: + """It should raise if the given cutout fixture id does not exist.""" + with pytest.raises(FixtureDoesNotExistError): + subject.get_cutout_fixture("theFunFixture", ot3_standard_deck_def) + + +@pytest.mark.parametrize( + ("cutout_fixture_id", "cutout_id", "expected_areas", "deck_def"), + [ + ( + "singleStandardSlot", + "cutout1", + ["1"], + lazy_fixture("ot2_standard_deck_def"), + ), + ( + "singleStandardSlot", + "cutout1", + ["1"], + lazy_fixture("ot2_short_trash_deck_def"), + ), + ( + "stagingAreaRightSlot", + "cutoutD3", + ["D3", "D4"], + lazy_fixture("ot3_standard_deck_def"), + ), + ], +) +def test_get_provided_addressable_area_names( + cutout_fixture_id: str, + cutout_id: str, + expected_areas: List[str], + deck_def: DeckDefinitionV4, +) -> None: + """It should get the provided addressable area for the cutout fixture and cutout.""" + provided_addressable_areas = subject.get_provided_addressable_area_names( + cutout_fixture_id, cutout_id, deck_def + ) + assert provided_addressable_areas == expected_areas + + +def test_get_provided_addressable_area_raises( + ot3_standard_deck_def: DeckDefinitionV4, +) -> None: + """It should raise if the cutout fixture does not provide areas for the given cutout id.""" + with pytest.raises(FixtureDoesNotProvideAreasError): + subject.get_provided_addressable_area_names( + "singleRightSlot", "theFunCutout", ot3_standard_deck_def + ) + + +@pytest.mark.parametrize( + ( + "addressable_area_name", + "expected_cutout_id", + "expected_potential_fixtures", + "deck_def", + ), + [ + ( + "3", + "cutout3", + { + PotentialCutoutFixture( + cutout_id="cutout3", + cutout_fixture_id="singleStandardSlot", + provided_addressable_areas=frozenset({"3"}), + ) + }, + lazy_fixture("ot2_standard_deck_def"), + ), + ( + "3", + "cutout3", + { + PotentialCutoutFixture( + cutout_id="cutout3", + cutout_fixture_id="singleStandardSlot", + provided_addressable_areas=frozenset({"3"}), + ) + }, + lazy_fixture("ot2_short_trash_deck_def"), + ), + ( + "D3", + "cutoutD3", + { + PotentialCutoutFixture( + cutout_id="cutoutD3", + cutout_fixture_id="singleRightSlot", + provided_addressable_areas=frozenset({"D3"}), + ), + PotentialCutoutFixture( + cutout_id="cutoutD3", + cutout_fixture_id="stagingAreaRightSlot", + provided_addressable_areas=frozenset({"D3", "D4"}), + ), + }, + lazy_fixture("ot3_standard_deck_def"), + ), + ], +) +def test_get_potential_cutout_fixtures( + addressable_area_name: str, + expected_cutout_id: str, + expected_potential_fixtures: Set[PotentialCutoutFixture], + deck_def: DeckDefinitionV4, +) -> None: + """It should get a cutout id and a set of potential cutout fixtures for an addressable area name.""" + cutout_id, potential_fixtures = subject.get_potential_cutout_fixtures( + addressable_area_name, deck_def + ) + assert cutout_id == expected_cutout_id + assert potential_fixtures == expected_potential_fixtures + + +def test_get_potential_cutout_fixtures_raises( + ot3_standard_deck_def: DeckDefinitionV4, +) -> None: + """It should raise if there is no fixtures that provide the requested area.""" + with pytest.raises(AddressableAreaDoesNotExistError): + subject.get_potential_cutout_fixtures("theFunArea", ot3_standard_deck_def) + + +# TODO put in fixed trash for OT2 decks +@pytest.mark.parametrize( + ("addressable_area_name", "expected_addressable_area", "deck_def"), + [ + ( + "1", + AddressableArea( + area_name="1", + area_type=AreaType.SLOT, + base_slot=DeckSlotName.SLOT_A1, + display_name="Slot 1", + bounding_box=Dimensions(x=128.0, y=86.0, z=0), + position=AddressableOffsetVector(x=1, y=2, z=3), + compatible_module_types=[ + "magneticModuleType", + "temperatureModuleType", + "heaterShakerModuleType", + ], + ), + lazy_fixture("ot2_standard_deck_def"), + ), + ( + "1", + AddressableArea( + area_name="1", + area_type=AreaType.SLOT, + base_slot=DeckSlotName.SLOT_A1, + display_name="Slot 1", + bounding_box=Dimensions(x=128.0, y=86.0, z=0), + position=AddressableOffsetVector(x=1, y=2, z=3), + compatible_module_types=[ + "magneticModuleType", + "temperatureModuleType", + "heaterShakerModuleType", + ], + ), + lazy_fixture("ot2_short_trash_deck_def"), + ), + ( + "D1", + AddressableArea( + area_name="D1", + area_type=AreaType.SLOT, + base_slot=DeckSlotName.SLOT_A1, + display_name="Slot D1", + bounding_box=Dimensions(x=128.0, y=86.0, z=0), + position=AddressableOffsetVector(x=1, y=2, z=3), + compatible_module_types=[ + "temperatureModuleType", + "heaterShakerModuleType", + "magneticBlockType", + ], + ), + lazy_fixture("ot3_standard_deck_def"), + ), + ( + "movableTrashB3", + AddressableArea( + area_name="movableTrashB3", + area_type=AreaType.MOVABLE_TRASH, + base_slot=DeckSlotName.SLOT_A1, + display_name="Trash Bin in B3", + bounding_box=Dimensions(x=225, y=78, z=40), + position=AddressableOffsetVector(x=-5.25, y=6, z=3), + compatible_module_types=[], + ), + lazy_fixture("ot3_standard_deck_def"), + ), + ( + "gripperWasteChute", + AddressableArea( + area_name="gripperWasteChute", + area_type=AreaType.WASTE_CHUTE, + base_slot=DeckSlotName.SLOT_A1, + display_name="Waste Chute", + bounding_box=Dimensions(x=0, y=0, z=0), + position=AddressableOffsetVector(x=65, y=31, z=139.5), + compatible_module_types=[], + ), + lazy_fixture("ot3_standard_deck_def"), + ), + ], +) +def test_get_addressable_area_from_name( + addressable_area_name: str, + expected_addressable_area: AddressableArea, + deck_def: DeckDefinitionV4, +) -> None: + """It should get the deck position for the requested cutout id.""" + addressable_area = subject.get_addressable_area_from_name( + addressable_area_name, DeckPoint(x=1, y=2, z=3), DeckSlotName.SLOT_A1, deck_def + ) + assert addressable_area == expected_addressable_area + + +def test_get_addressable_area_from_name_raises( + ot3_standard_deck_def: DeckDefinitionV4, +) -> None: + """It should raise if there is no addressable area by that name in the deck.""" + with pytest.raises(AddressableAreaDoesNotExistError): + subject.get_addressable_area_from_name( + "theFunArea", + DeckPoint(x=1, y=2, z=3), + DeckSlotName.SLOT_A1, + ot3_standard_deck_def, + ) diff --git a/api/tests/opentrons/protocol_engine/resources/test_deck_data_provider.py b/api/tests/opentrons/protocol_engine/resources/test_deck_data_provider.py index f7e04646d22..f587d7ce5dd 100644 --- a/api/tests/opentrons/protocol_engine/resources/test_deck_data_provider.py +++ b/api/tests/opentrons/protocol_engine/resources/test_deck_data_provider.py @@ -1,9 +1,9 @@ """Test deck data provider.""" import pytest -from pytest_lazyfixture import lazy_fixture # type: ignore[import] +from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] from decoy import Decoy -from opentrons_shared_data.deck.dev_types import DeckDefinitionV3 +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4 from opentrons.protocols.models import LabwareDefinition from opentrons.types import DeckSlotName @@ -31,7 +31,7 @@ def mock_labware_data_provider(decoy: Decoy) -> LabwareDataProvider: ) async def test_get_deck_definition( deck_type: DeckType, - expected_definition: DeckDefinitionV3, + expected_definition: DeckDefinitionV4, mock_labware_data_provider: LabwareDataProvider, ) -> None: """It should be able to load the correct deck definition.""" @@ -44,7 +44,7 @@ async def test_get_deck_definition( async def test_get_deck_labware_fixtures_ot2_standard( decoy: Decoy, - ot2_standard_deck_def: DeckDefinitionV3, + ot2_standard_deck_def: DeckDefinitionV4, ot2_fixed_trash_def: LabwareDefinition, mock_labware_data_provider: LabwareDataProvider, ) -> None: @@ -74,7 +74,7 @@ async def test_get_deck_labware_fixtures_ot2_standard( async def test_get_deck_labware_fixtures_ot2_short_trash( decoy: Decoy, - ot2_short_trash_deck_def: DeckDefinitionV3, + ot2_short_trash_deck_def: DeckDefinitionV4, ot2_short_fixed_trash_def: LabwareDefinition, mock_labware_data_provider: LabwareDataProvider, ) -> None: @@ -104,7 +104,7 @@ async def test_get_deck_labware_fixtures_ot2_short_trash( async def test_get_deck_labware_fixtures_ot3_standard( decoy: Decoy, - ot3_standard_deck_def: DeckDefinitionV3, + ot3_standard_deck_def: DeckDefinitionV4, ot3_fixed_trash_def: LabwareDefinition, mock_labware_data_provider: LabwareDataProvider, ) -> None: diff --git a/api/tests/opentrons/protocol_engine/resources/test_ot3_validation.py b/api/tests/opentrons/protocol_engine/resources/test_ot3_validation.py index d2382bf70a1..327daf82129 100644 --- a/api/tests/opentrons/protocol_engine/resources/test_ot3_validation.py +++ b/api/tests/opentrons/protocol_engine/resources/test_ot3_validation.py @@ -6,6 +6,7 @@ from opentrons.protocol_engine.errors.exceptions import HardwareNotSupportedError from opentrons.hardware_control.api import API +from opentrons.hardware_control.protocols.types import FlexRobotType, OT2RobotType @pytest.mark.ot3_only @@ -16,6 +17,7 @@ def test_ensure_ot3_hardware(decoy: Decoy) -> None: from opentrons.hardware_control.ot3api import OT3API ot_3_hardware_api = decoy.mock(cls=OT3API) + decoy.when(ot_3_hardware_api.get_robot_type()).then_return(FlexRobotType) result = ensure_ot3_hardware( ot_3_hardware_api, ) @@ -28,6 +30,7 @@ def test_ensure_ot3_hardware(decoy: Decoy) -> None: def test_ensure_ot3_hardware_raises_error(decoy: Decoy) -> None: """Should raise a HardwareNotSupportedError exception.""" ot_2_hardware_api = decoy.mock(cls=API) + decoy.when(ot_2_hardware_api.get_robot_type()).then_return(OT2RobotType) with pytest.raises(HardwareNotSupportedError): ensure_ot3_hardware( ot_2_hardware_api, diff --git a/api/tests/opentrons/protocol_engine/resources/test_pipette_data_provider.py b/api/tests/opentrons/protocol_engine/resources/test_pipette_data_provider.py index 1eb3787a509..432c408e43e 100644 --- a/api/tests/opentrons/protocol_engine/resources/test_pipette_data_provider.py +++ b/api/tests/opentrons/protocol_engine/resources/test_pipette_data_provider.py @@ -1,9 +1,12 @@ """Test pipette data provider.""" +from collections import OrderedDict + import pytest from opentrons_shared_data.pipette.dev_types import PipetteNameType, PipetteModel from opentrons_shared_data.pipette import pipette_definition, types as pip_types from opentrons.hardware_control.dev_types import PipetteDict +from opentrons.hardware_control.nozzle_manager import NozzleMap from opentrons.protocol_engine.types import FlowRates from opentrons.protocol_engine.resources.pipette_data_provider import ( LoadedStaticPipetteData, @@ -11,6 +14,7 @@ ) from opentrons.protocol_engine.resources import pipette_data_provider as subject +from opentrons.types import Point @pytest.fixture @@ -50,6 +54,8 @@ def test_get_virtual_pipette_static_config( "opentrons/opentrons_96_tiprack_10ul/1": 8.25, "opentrons/opentrons_96_tiprack_20ul/1": 8.25, }, + back_left_nozzle_offset=Point(x=0.0, y=0.0, z=10.45), + front_right_nozzle_offset=Point(x=0.0, y=0.0, z=10.45), ) @@ -75,6 +81,8 @@ def test_configure_virtual_pipette_for_volume( ), tip_configuration_lookup_table=result1.tip_configuration_lookup_table, nominal_tip_overlap=result1.nominal_tip_overlap, + back_left_nozzle_offset=Point(x=-8.0, y=-22.0, z=-259.15), + front_right_nozzle_offset=Point(x=-8.0, y=-22.0, z=-259.15), ) subject_instance.configure_virtual_pipette_for_volume( "my-pipette", 1, result1.model @@ -97,6 +105,8 @@ def test_configure_virtual_pipette_for_volume( ), tip_configuration_lookup_table=result2.tip_configuration_lookup_table, nominal_tip_overlap=result2.nominal_tip_overlap, + back_left_nozzle_offset=Point(x=-8.0, y=-22.0, z=-259.15), + front_right_nozzle_offset=Point(x=-8.0, y=-22.0, z=-259.15), ) @@ -122,7 +132,47 @@ def test_load_virtual_pipette_by_model_string( ), tip_configuration_lookup_table=result.tip_configuration_lookup_table, nominal_tip_overlap=result.nominal_tip_overlap, + back_left_nozzle_offset=Point(x=0.0, y=31.5, z=35.52), + front_right_nozzle_offset=Point(x=0.0, y=-31.5, z=35.52), + ) + + +def test_load_virtual_pipette_nozzle_layout( + subject_instance: VirtualPipetteDataProvider, +) -> None: + """It should return a NozzleMap object.""" + subject_instance.configure_virtual_pipette_nozzle_layout( + "my-pipette", "p300_multi_v2.1", "A1", "E1", "A1" ) + result = subject_instance.get_nozzle_layout_for_pipette("my-pipette") + assert result.configuration.value == "COLUMN" + assert result.starting_nozzle == "A1" + assert result.front_right == "E1" + assert result.back_left == "A1" + + subject_instance.configure_virtual_pipette_nozzle_layout( + "my-pipette", "p300_multi_v2.1" + ) + result = subject_instance.get_nozzle_layout_for_pipette("my-pipette") + assert result.configuration.value == "FULL" + + subject_instance.configure_virtual_pipette_nozzle_layout( + "my-96-pipette", "p1000_96_v3.5", "A1", "A12", "A1" + ) + result = subject_instance.get_nozzle_layout_for_pipette("my-96-pipette") + assert result.configuration.value == "ROW" + + subject_instance.configure_virtual_pipette_nozzle_layout( + "my-96-pipette", "p1000_96_v3.5", "A1", "A1" + ) + result = subject_instance.get_nozzle_layout_for_pipette("my-96-pipette") + assert result.configuration.value == "SINGLE" + + subject_instance.configure_virtual_pipette_nozzle_layout( + "my-96-pipette", "p1000_96_v3.5", "A1", "H1" + ) + result = subject_instance.get_nozzle_layout_for_pipette("my-96-pipette") + assert result.configuration.value == "COLUMN" def test_get_pipette_static_config( @@ -164,6 +214,14 @@ def test_get_pipette_static_config( "default_aspirate_speeds": {"2.0": 5.021202, "2.6": 10.042404}, "default_push_out_volume": 3, "supported_tips": {pip_types.PipetteTipType.t300: supported_tip_fixture}, + "current_nozzle_map": NozzleMap.build( + physical_nozzles=OrderedDict({"A1": Point(1, 2, 3), "B1": Point(4, 5, 6)}), + physical_rows=OrderedDict({"A": ["A1"], "B": ["B1"]}), + physical_columns=OrderedDict({"1": ["A1", "B1"]}), + starting_nozzle="A1", + back_left_nozzle="A1", + front_right_nozzle="B1", + ), } result = subject.get_pipette_static_config(pipette_dict) @@ -189,4 +247,6 @@ def test_get_pipette_static_config( # https://opentrons.atlassian.net/browse/RCORE-655 nozzle_offset_z=0, home_position=0, + back_left_nozzle_offset=Point(x=1, y=2, z=3), + front_right_nozzle_offset=Point(x=4, y=5, z=6), ) diff --git a/api/tests/opentrons/protocol_engine/state/command_fixtures.py b/api/tests/opentrons/protocol_engine/state/command_fixtures.py index e0b5368be2f..191dd49bd48 100644 --- a/api/tests/opentrons/protocol_engine/state/command_fixtures.py +++ b/api/tests/opentrons/protocol_engine/state/command_fixtures.py @@ -9,10 +9,14 @@ from opentrons.protocol_engine import ErrorOccurrence, commands as cmd from opentrons.protocol_engine.types import ( DeckPoint, + ModuleModel, + ModuleDefinition, MovementAxis, WellLocation, LabwareLocation, + DeckSlotLocation, LabwareMovementStrategy, + AddressableOffsetVector, ) @@ -159,6 +163,30 @@ def create_load_pipette_command( ) +def create_load_module_command( + module_id: str, + location: DeckSlotLocation, + model: ModuleModel, +) -> cmd.LoadModule: + """Get a completed LoadModule command.""" + params = cmd.LoadModuleParams(moduleId=module_id, location=location, model=model) + result = cmd.LoadModuleResult( + moduleId=module_id, + model=model, + serialNumber=None, + definition=ModuleDefinition.construct(), # type: ignore[call-arg] + ) + + return cmd.LoadModule( + id="command-id", + key="command-key", + status=cmd.CommandStatus.SUCCEEDED, + createdAt=datetime.now(), + params=params, + result=result, + ) + + def create_aspirate_command( pipette_id: str, volume: float, @@ -189,6 +217,29 @@ def create_aspirate_command( ) +def create_aspirate_in_place_command( + pipette_id: str, + volume: float, + flow_rate: float, +) -> cmd.AspirateInPlace: + """Get a completed Aspirate command.""" + params = cmd.AspirateInPlaceParams( + pipetteId=pipette_id, + volume=volume, + flowRate=flow_rate, + ) + result = cmd.AspirateInPlaceResult(volume=volume) + + return cmd.AspirateInPlace( + id="command-id", + key="command-key", + status=cmd.CommandStatus.SUCCEEDED, + createdAt=datetime.now(), + params=params, + result=result, + ) + + def create_dispense_command( pipette_id: str, volume: float, @@ -343,6 +394,31 @@ def create_move_to_well_command( ) +def create_move_to_addressable_area_command( + pipette_id: str, + addressable_area_name: str = "area-name", + offset: AddressableOffsetVector = AddressableOffsetVector(x=0, y=0, z=0), + destination: DeckPoint = DeckPoint(x=0, y=0, z=0), +) -> cmd.MoveToAddressableArea: + """Get a completed MoveToWell command.""" + params = cmd.MoveToAddressableAreaParams( + pipetteId=pipette_id, + addressableAreaName=addressable_area_name, + offset=offset, + ) + + result = cmd.MoveToAddressableAreaResult(position=destination) + + return cmd.MoveToAddressableArea( + id="command-id", + key="command-key", + status=cmd.CommandStatus.SUCCEEDED, + createdAt=datetime.now(), + params=params, + result=result, + ) + + def create_move_to_coordinates_command( pipette_id: str, coordinates: DeckPoint = DeckPoint(x=0, y=0, z=0), @@ -414,6 +490,27 @@ def create_blow_out_command( ) +def create_blow_out_in_place_command( + pipette_id: str, + flow_rate: float, +) -> cmd.BlowOutInPlace: + """Get a completed blowOutInPlace command.""" + params = cmd.BlowOutInPlaceParams( + pipetteId=pipette_id, + flowRate=flow_rate, + ) + result = cmd.BlowOutInPlaceResult() + + return cmd.BlowOutInPlace( + id="command-id", + key="command-key", + status=cmd.CommandStatus.SUCCEEDED, + createdAt=datetime(year=2022, month=1, day=1), + params=params, + result=result, + ) + + def create_touch_tip_command( pipette_id: str, labware_id: str = "labware-id", @@ -466,3 +563,17 @@ def create_move_labware_command( params=params, result=result, ) + + +def create_prepare_to_aspirate_command(pipette_id: str) -> cmd.PrepareToAspirate: + """Get a completed PrepareToAspirate command.""" + params = cmd.PrepareToAspirateParams(pipetteId=pipette_id) + result = cmd.PrepareToAspirateResult() + return cmd.PrepareToAspirate( + id="command-id", + key="command-key", + status=cmd.CommandStatus.SUCCEEDED, + createdAt=datetime(year=2023, month=10, day=24), + params=params, + result=result, + ) diff --git a/api/tests/opentrons/protocol_engine/state/conftest.py b/api/tests/opentrons/protocol_engine/state/conftest.py index 9188101b05b..f657a9c3ed9 100644 --- a/api/tests/opentrons/protocol_engine/state/conftest.py +++ b/api/tests/opentrons/protocol_engine/state/conftest.py @@ -4,6 +4,7 @@ from opentrons.protocol_engine.state.labware import LabwareView from opentrons.protocol_engine.state.pipettes import PipetteView +from opentrons.protocol_engine.state.addressable_areas import AddressableAreaView from opentrons.protocol_engine.state.geometry import GeometryView @@ -19,6 +20,12 @@ def pipette_view(decoy: Decoy) -> PipetteView: return decoy.mock(cls=PipetteView) +@pytest.fixture +def addressable_area_view(decoy: Decoy) -> AddressableAreaView: + """Get a mock in the shape of a AddressableAreaView.""" + return decoy.mock(cls=AddressableAreaView) + + @pytest.fixture def geometry_view(decoy: Decoy) -> GeometryView: """Get a mock in the shape of a GeometryView.""" diff --git a/api/tests/opentrons/protocol_engine/state/test_addressable_area_store.py b/api/tests/opentrons/protocol_engine/state/test_addressable_area_store.py new file mode 100644 index 00000000000..f49cd164c1f --- /dev/null +++ b/api/tests/opentrons/protocol_engine/state/test_addressable_area_store.py @@ -0,0 +1,262 @@ +"""Addressable area state store tests.""" +import pytest + +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4 +from opentrons_shared_data.labware.labware_definition import Parameters +from opentrons.protocols.models import LabwareDefinition +from opentrons.types import DeckSlotName + +from opentrons.protocol_engine.commands import Command +from opentrons.protocol_engine.actions import ( + UpdateCommandAction, + AddAddressableAreaAction, +) +from opentrons.protocol_engine.state import Config +from opentrons.protocol_engine.state.addressable_areas import ( + AddressableAreaStore, + AddressableAreaState, +) +from opentrons.protocol_engine.types import ( + DeckType, + DeckConfigurationType, + ModuleModel, + LabwareMovementStrategy, + DeckSlotLocation, + AddressableAreaLocation, +) + +from .command_fixtures import ( + create_load_labware_command, + create_load_module_command, + create_move_labware_command, + create_move_to_addressable_area_command, +) + + +def _make_deck_config() -> DeckConfigurationType: + return [ + ("cutoutA1", "singleLeftSlot"), + ("cutoutB1", "singleLeftSlot"), + ("cutoutC1", "singleLeftSlot"), + ("cutoutD1", "singleLeftSlot"), + ("cutoutA2", "singleCenterSlot"), + ("cutoutB2", "singleCenterSlot"), + ("cutoutC2", "singleCenterSlot"), + ("cutoutD2", "singleCenterSlot"), + ("cutoutA3", "trashBinAdapter"), + ("cutoutB3", "singleRightSlot"), + ("cutoutC3", "stagingAreaRightSlot"), + ("cutoutD3", "wasteChuteRightAdapterNoCover"), + ] + + +@pytest.fixture +def simulated_subject( + ot3_standard_deck_def: DeckDefinitionV4, +) -> AddressableAreaStore: + """Get an AddressableAreaStore test subject, under simulated deck conditions.""" + return AddressableAreaStore( + deck_configuration=[], + config=Config( + use_simulated_deck_config=True, + robot_type="OT-3 Standard", + deck_type=DeckType.OT3_STANDARD, + ), + deck_definition=ot3_standard_deck_def, + ) + + +@pytest.fixture +def subject( + ot3_standard_deck_def: DeckDefinitionV4, +) -> AddressableAreaStore: + """Get an AddressableAreaStore test subject.""" + return AddressableAreaStore( + deck_configuration=_make_deck_config(), + config=Config( + use_simulated_deck_config=False, + robot_type="OT-3 Standard", + deck_type=DeckType.OT3_STANDARD, + ), + deck_definition=ot3_standard_deck_def, + ) + + +def test_initial_state_simulated( + ot3_standard_deck_def: DeckDefinitionV4, + simulated_subject: AddressableAreaStore, +) -> None: + """It should create the Addressable Area store with no loaded addressable areas.""" + assert simulated_subject.state == AddressableAreaState( + loaded_addressable_areas_by_name={}, + potential_cutout_fixtures_by_cutout_id={}, + deck_definition=ot3_standard_deck_def, + deck_configuration=[], + robot_type="OT-3 Standard", + use_simulated_deck_config=True, + ) + + +def test_initial_state( + ot3_standard_deck_def: DeckDefinitionV4, + subject: AddressableAreaStore, +) -> None: + """It should create the Addressable Area store with loaded addressable areas.""" + assert subject.state.potential_cutout_fixtures_by_cutout_id == {} + assert not subject.state.use_simulated_deck_config + assert subject.state.deck_definition == ot3_standard_deck_def + assert subject.state.deck_configuration == _make_deck_config() + # Loading 9 regular slots, 1 trash, 2 Staging Area slots and 4 waste chute types + assert len(subject.state.loaded_addressable_areas_by_name) == 16 + + +@pytest.mark.parametrize( + ("command", "expected_area"), + ( + ( + create_load_labware_command( + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A1), + labware_id="test-labware-id", + definition=LabwareDefinition.construct( # type: ignore[call-arg] + parameters=Parameters.construct(loadName="blah"), # type: ignore[call-arg] + namespace="bleh", + version=123, + ), + offset_id="offset-id", + display_name="display-name", + ), + "A1", + ), + ( + create_load_labware_command( + location=AddressableAreaLocation(addressableAreaName="A4"), + labware_id="test-labware-id", + definition=LabwareDefinition.construct( # type: ignore[call-arg] + parameters=Parameters.construct(loadName="blah"), # type: ignore[call-arg] + namespace="bleh", + version=123, + ), + offset_id="offset-id", + display_name="display-name", + ), + "A4", + ), + ( + create_load_module_command( + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A1), + module_id="test-module-id", + model=ModuleModel.TEMPERATURE_MODULE_V2, + ), + "A1", + ), + ( + create_move_labware_command( + new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A1), + strategy=LabwareMovementStrategy.USING_GRIPPER, + ), + "A1", + ), + ( + create_move_labware_command( + new_location=AddressableAreaLocation(addressableAreaName="A4"), + strategy=LabwareMovementStrategy.USING_GRIPPER, + ), + "A4", + ), + ( + create_move_to_addressable_area_command( + pipette_id="pipette-id", addressable_area_name="gripperWasteChute" + ), + "gripperWasteChute", + ), + ), +) +def test_addressable_area_referencing_commands_load_on_simulated_deck( + command: Command, + expected_area: str, + simulated_subject: AddressableAreaStore, +) -> None: + """It should check and store the addressable area when referenced in a command.""" + simulated_subject.handle_action( + UpdateCommandAction(private_result=None, command=command) + ) + assert expected_area in simulated_subject.state.loaded_addressable_areas_by_name + + +@pytest.mark.parametrize( + ("command", "expected_area"), + ( + ( + create_load_labware_command( + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A1), + labware_id="test-labware-id", + definition=LabwareDefinition.construct( # type: ignore[call-arg] + parameters=Parameters.construct(loadName="blah"), # type: ignore[call-arg] + namespace="bleh", + version=123, + ), + offset_id="offset-id", + display_name="display-name", + ), + "A1", + ), + ( + create_load_labware_command( + location=AddressableAreaLocation(addressableAreaName="C4"), + labware_id="test-labware-id", + definition=LabwareDefinition.construct( # type: ignore[call-arg] + parameters=Parameters.construct(loadName="blah"), # type: ignore[call-arg] + namespace="bleh", + version=123, + ), + offset_id="offset-id", + display_name="display-name", + ), + "C4", + ), + ( + create_load_module_command( + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A1), + module_id="test-module-id", + model=ModuleModel.TEMPERATURE_MODULE_V2, + ), + "A1", + ), + ( + create_move_labware_command( + new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A1), + strategy=LabwareMovementStrategy.USING_GRIPPER, + ), + "A1", + ), + ( + create_move_labware_command( + new_location=AddressableAreaLocation(addressableAreaName="C4"), + strategy=LabwareMovementStrategy.USING_GRIPPER, + ), + "C4", + ), + ), +) +def test_addressable_area_referencing_commands_load( + command: Command, + expected_area: str, + subject: AddressableAreaStore, +) -> None: + """It should check that the addressable area is in the deck config.""" + subject.handle_action(UpdateCommandAction(private_result=None, command=command)) + assert expected_area in subject.state.loaded_addressable_areas_by_name + + +def test_add_addressable_area_action( + simulated_subject: AddressableAreaStore, +) -> None: + """It should add the addressable area to the store.""" + simulated_subject.handle_action( + AddAddressableAreaAction( + addressable_area=AddressableAreaLocation( + addressableAreaName="movableTrashA1" + ) + ) + ) + assert "movableTrashA1" in simulated_subject.state.loaded_addressable_areas_by_name diff --git a/api/tests/opentrons/protocol_engine/state/test_addressable_area_view.py b/api/tests/opentrons/protocol_engine/state/test_addressable_area_view.py new file mode 100644 index 00000000000..34ddcaa37fa --- /dev/null +++ b/api/tests/opentrons/protocol_engine/state/test_addressable_area_view.py @@ -0,0 +1,465 @@ +"""Addressable area state view tests.""" +import inspect + +import pytest +from decoy import Decoy +from typing import Dict, Set, Optional, cast + +from opentrons_shared_data.robot.dev_types import RobotType +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4 +from opentrons.types import Point, DeckSlotName + +from opentrons.protocol_engine.errors import ( + AreaNotInDeckConfigurationError, + IncompatibleAddressableAreaError, + SlotDoesNotExistError, + AddressableAreaDoesNotExistError, +) +from opentrons.protocol_engine.resources import deck_configuration_provider +from opentrons.protocol_engine.state.addressable_areas import ( + AddressableAreaState, + AddressableAreaView, +) +from opentrons.protocol_engine.types import ( + AddressableArea, + AreaType, + DeckConfigurationType, + PotentialCutoutFixture, + Dimensions, + DeckPoint, + AddressableOffsetVector, +) + + +@pytest.fixture(autouse=True) +def patch_mock_deck_configuration_provider( + decoy: Decoy, monkeypatch: pytest.MonkeyPatch +) -> None: + """Mock out deck_configuration_provider.py functions.""" + for name, func in inspect.getmembers( + deck_configuration_provider, inspect.isfunction + ): + monkeypatch.setattr(deck_configuration_provider, name, decoy.mock(func=func)) + + +def get_addressable_area_view( + loaded_addressable_areas_by_name: Optional[Dict[str, AddressableArea]] = None, + potential_cutout_fixtures_by_cutout_id: Optional[ + Dict[str, Set[PotentialCutoutFixture]] + ] = None, + deck_definition: Optional[DeckDefinitionV4] = None, + deck_configuration: Optional[DeckConfigurationType] = None, + robot_type: RobotType = "OT-3 Standard", + use_simulated_deck_config: bool = False, +) -> AddressableAreaView: + """Get a labware view test subject.""" + state = AddressableAreaState( + loaded_addressable_areas_by_name=loaded_addressable_areas_by_name or {}, + potential_cutout_fixtures_by_cutout_id=potential_cutout_fixtures_by_cutout_id + or {}, + deck_definition=deck_definition or cast(DeckDefinitionV4, {"otId": "fake"}), + deck_configuration=deck_configuration or [], + robot_type=robot_type, + use_simulated_deck_config=use_simulated_deck_config, + ) + + return AddressableAreaView(state=state) + + +def test_get_all_cutout_fixtures_simulated_deck_config() -> None: + """It should return no cutout fixtures when the deck config is simulated.""" + subject = get_addressable_area_view( + deck_configuration=None, + use_simulated_deck_config=True, + ) + assert subject.get_all_cutout_fixtures() is None + + +def test_get_all_cutout_fixtures_non_simulated_deck_config() -> None: + """It should return the cutout fixtures from the deck config, if it's not simulated.""" + subject = get_addressable_area_view( + deck_configuration=[ + ("cutout-id-1", "cutout-fixture-id-1"), + ("cutout-id-2", "cutout-fixture-id-2"), + ], + use_simulated_deck_config=False, + ) + assert subject.get_all_cutout_fixtures() == [ + "cutout-fixture-id-1", + "cutout-fixture-id-2", + ] + + +def test_get_loaded_addressable_area() -> None: + """It should get the loaded addressable area.""" + addressable_area = AddressableArea( + area_name="area", + area_type=AreaType.SLOT, + base_slot=DeckSlotName.SLOT_D3, + display_name="fancy name", + bounding_box=Dimensions(x=1, y=2, z=3), + position=AddressableOffsetVector(x=7, y=8, z=9), + compatible_module_types=["magneticModuleType"], + ) + subject = get_addressable_area_view( + loaded_addressable_areas_by_name={"abc": addressable_area} + ) + + assert subject.get_addressable_area("abc") is addressable_area + + +def test_get_loaded_addressable_area_raises() -> None: + """It should raise if the addressable area does not exist.""" + subject = get_addressable_area_view() + + with pytest.raises(AreaNotInDeckConfigurationError): + subject.get_addressable_area("abc") + + +def test_get_addressable_area_for_simulation_already_loaded() -> None: + """It should get the addressable area for a simulation that has not been loaded yet.""" + addressable_area = AddressableArea( + area_name="area", + area_type=AreaType.SLOT, + base_slot=DeckSlotName.SLOT_D3, + display_name="fancy name", + bounding_box=Dimensions(x=1, y=2, z=3), + position=AddressableOffsetVector(x=7, y=8, z=9), + compatible_module_types=["magneticModuleType"], + ) + subject = get_addressable_area_view( + loaded_addressable_areas_by_name={"abc": addressable_area}, + use_simulated_deck_config=True, + ) + + assert subject.get_addressable_area("abc") is addressable_area + + +def test_get_addressable_area_for_simulation_not_loaded(decoy: Decoy) -> None: + """It should get the addressable area for a simulation that has not been loaded yet.""" + subject = get_addressable_area_view( + potential_cutout_fixtures_by_cutout_id={ + "cutoutA1": { + PotentialCutoutFixture( + cutout_id="cutoutA1", + cutout_fixture_id="blah", + provided_addressable_areas=frozenset(), + ) + } + }, + use_simulated_deck_config=True, + ) + + addressable_area = AddressableArea( + area_name="area", + area_type=AreaType.SLOT, + base_slot=DeckSlotName.SLOT_D3, + display_name="fancy name", + bounding_box=Dimensions(x=1, y=2, z=3), + position=AddressableOffsetVector(x=7, y=8, z=9), + compatible_module_types=["magneticModuleType"], + ) + + decoy.when( + deck_configuration_provider.get_potential_cutout_fixtures( + "abc", subject.state.deck_definition + ) + ).then_return( + ( + "cutoutA1", + { + PotentialCutoutFixture( + cutout_id="cutoutA1", + cutout_fixture_id="blah", + provided_addressable_areas=frozenset(), + ) + }, + ) + ) + + decoy.when( + deck_configuration_provider.get_cutout_position( + "cutoutA1", subject.state.deck_definition + ) + ).then_return(DeckPoint(x=1, y=2, z=3)) + + decoy.when( + deck_configuration_provider.get_addressable_area_from_name( + "abc", + DeckPoint(x=1, y=2, z=3), + DeckSlotName.SLOT_A1, + subject.state.deck_definition, + ) + ).then_return(addressable_area) + + assert subject.get_addressable_area("abc") is addressable_area + + +def test_get_addressable_area_for_simulation_raises(decoy: Decoy) -> None: + """It should raise if the requested addressable area is incompatible with loaded ones.""" + subject = get_addressable_area_view( + potential_cutout_fixtures_by_cutout_id={ + "123": { + PotentialCutoutFixture( + cutout_id="789", + cutout_fixture_id="bleh", + provided_addressable_areas=frozenset(), + ) + } + }, + use_simulated_deck_config=True, + ) + + decoy.when( + deck_configuration_provider.get_potential_cutout_fixtures( + "abc", subject.state.deck_definition + ) + ).then_return( + ( + "123", + { + PotentialCutoutFixture( + cutout_id="123", + cutout_fixture_id="blah", + provided_addressable_areas=frozenset(), + ) + }, + ) + ) + + decoy.when( + deck_configuration_provider.get_provided_addressable_area_names( + "bleh", "789", subject.state.deck_definition + ) + ).then_return([]) + + with pytest.raises(IncompatibleAddressableAreaError): + subject.get_addressable_area("abc") + + +def test_get_addressable_area_position() -> None: + """It should get the absolute location of the addressable area.""" + subject = get_addressable_area_view( + loaded_addressable_areas_by_name={ + "abc": AddressableArea( + area_name="area", + area_type=AreaType.SLOT, + base_slot=DeckSlotName.SLOT_D3, + display_name="fancy name", + bounding_box=Dimensions(x=10, y=20, z=30), + position=AddressableOffsetVector(x=1, y=2, z=3), + compatible_module_types=[], + ) + } + ) + + result = subject.get_addressable_area_position("abc") + assert result == Point(1, 2, 3) + + +def test_get_addressable_area_move_to_location() -> None: + """It should get the absolute location of an addressable area's move to location.""" + subject = get_addressable_area_view( + loaded_addressable_areas_by_name={ + "abc": AddressableArea( + area_name="area", + area_type=AreaType.SLOT, + base_slot=DeckSlotName.SLOT_D3, + display_name="fancy name", + bounding_box=Dimensions(x=10, y=20, z=30), + position=AddressableOffsetVector(x=1, y=2, z=3), + compatible_module_types=[], + ) + } + ) + + result = subject.get_addressable_area_move_to_location("abc") + assert result == Point(6, 12, 33) + + +def test_get_addressable_area_center() -> None: + """It should get the absolute location of an addressable area's center.""" + subject = get_addressable_area_view( + loaded_addressable_areas_by_name={ + "abc": AddressableArea( + area_name="area", + area_type=AreaType.SLOT, + base_slot=DeckSlotName.SLOT_D3, + display_name="fancy name", + bounding_box=Dimensions(x=10, y=20, z=30), + position=AddressableOffsetVector(x=1, y=2, z=3), + compatible_module_types=[], + ) + } + ) + + result = subject.get_addressable_area_center("abc") + assert result == Point(6, 12, 3) + + +def test_get_fixture_height(decoy: Decoy) -> None: + """It should return the height of the requested fixture.""" + subject = get_addressable_area_view() + decoy.when( + deck_configuration_provider.get_cutout_fixture( + "someShortCutoutFixture", subject.state.deck_definition + ) + ).then_return( + { + "height": 10, + # These values don't matter: + "id": "id", + "mayMountTo": [], + "displayName": "", + "providesAddressableAreas": {}, + } + ) + + decoy.when( + deck_configuration_provider.get_cutout_fixture( + "someTallCutoutFixture", subject.state.deck_definition + ) + ).then_return( + { + "height": 9000.1, + # These values don't matter: + "id": "id", + "mayMountTo": [], + "displayName": "", + "providesAddressableAreas": {}, + } + ) + + assert subject.get_fixture_height("someShortCutoutFixture") == 10 + assert subject.get_fixture_height("someTallCutoutFixture") == 9000.1 + + +def test_get_slot_definition() -> None: + """It should return a deck slot's definition.""" + subject = get_addressable_area_view( + loaded_addressable_areas_by_name={ + "6": AddressableArea( + area_name="area", + area_type=AreaType.SLOT, + base_slot=DeckSlotName.SLOT_D3, + display_name="fancy name", + bounding_box=Dimensions(x=1, y=2, z=3), + position=AddressableOffsetVector(x=7, y=8, z=9), + compatible_module_types=["magneticModuleType"], + ) + } + ) + + result = subject.get_slot_definition(DeckSlotName.SLOT_6.id) + + assert result == { + "id": "area", + "position": [7, 8, 9], + "boundingBox": { + "xDimension": 1, + "yDimension": 2, + "zDimension": 3, + }, + "displayName": "fancy name", + "compatibleModuleTypes": ["magneticModuleType"], + } + + +def test_get_slot_definition_raises_with_bad_slot_name(decoy: Decoy) -> None: + """It should raise a SlotDoesNotExistError if a bad slot name is given.""" + subject = get_addressable_area_view() + + decoy.when( + deck_configuration_provider.get_potential_cutout_fixtures( + "foo", subject.state.deck_definition + ) + ).then_raise(AddressableAreaDoesNotExistError()) + + with pytest.raises(SlotDoesNotExistError): + subject.get_slot_definition("foo") + + +def test_raise_if_area_not_in_deck_configuration_on_robot(decoy: Decoy) -> None: + """It should raise if the requested addressable area name is not loaded in state.""" + subject = get_addressable_area_view( + loaded_addressable_areas_by_name={"real": decoy.mock(cls=AddressableArea)} + ) + + subject.raise_if_area_not_in_deck_configuration("real") + + with pytest.raises(AreaNotInDeckConfigurationError): + subject.raise_if_area_not_in_deck_configuration("fake") + + +def test_raise_if_area_not_in_deck_configuration_simulated_config(decoy: Decoy) -> None: + """It should raise if the requested addressable area name is not loaded in state.""" + subject = get_addressable_area_view( + use_simulated_deck_config=True, + potential_cutout_fixtures_by_cutout_id={ + "waluigi": { + PotentialCutoutFixture( + cutout_id="fire flower", + cutout_fixture_id="1up", + provided_addressable_areas=frozenset(), + ) + }, + "wario": { + PotentialCutoutFixture( + cutout_id="mushroom", + cutout_fixture_id="star", + provided_addressable_areas=frozenset(), + ) + }, + }, + ) + + decoy.when( + deck_configuration_provider.get_potential_cutout_fixtures( + "mario", subject.state.deck_definition + ) + ).then_return( + ( + "wario", + { + PotentialCutoutFixture( + cutout_id="mushroom", + cutout_fixture_id="star", + provided_addressable_areas=frozenset(), + ) + }, + ) + ) + + subject.raise_if_area_not_in_deck_configuration("mario") + + decoy.when( + deck_configuration_provider.get_potential_cutout_fixtures( + "luigi", subject.state.deck_definition + ) + ).then_return( + ( + "waluigi", + { + PotentialCutoutFixture( + cutout_id="mushroom", + cutout_fixture_id="star", + provided_addressable_areas=frozenset(), + ) + }, + ) + ) + + decoy.when( + deck_configuration_provider.get_provided_addressable_area_names( + "1up", "fire flower", subject.state.deck_definition + ) + ).then_return([]) + + decoy.when( + deck_configuration_provider.get_addressable_area_display_name( + "luigi", subject.state.deck_definition + ) + ).then_return("super luigi") + + with pytest.raises(IncompatibleAddressableAreaError): + subject.raise_if_area_not_in_deck_configuration("luigi") diff --git a/api/tests/opentrons/protocol_engine/state/test_change_notifier.py b/api/tests/opentrons/protocol_engine/state/test_change_notifier.py index 8939c17df0d..4967e6d254e 100644 --- a/api/tests/opentrons/protocol_engine/state/test_change_notifier.py +++ b/api/tests/opentrons/protocol_engine/state/test_change_notifier.py @@ -19,8 +19,8 @@ async def test_single_subscriber() -> None: await result -@pytest.mark.parametrize("count", range(10)) -async def test_multiple_subscribers(count: int) -> None: +@pytest.mark.parametrize("_test_repetition", range(10)) +async def test_multiple_subscribers(_test_repetition: int) -> None: """Test that multiple subscribers can wait for a notification. This test checks that the subscribers are awoken in the order they diff --git a/api/tests/opentrons/protocol_engine/state/test_command_store.py b/api/tests/opentrons/protocol_engine/state/test_command_store.py index 6a53ce46a61..a017df3b362 100644 --- a/api/tests/opentrons/protocol_engine/state/test_command_store.py +++ b/api/tests/opentrons/protocol_engine/state/test_command_store.py @@ -681,7 +681,11 @@ def test_command_store_handles_pause_action(pause_source: PauseSource) -> None: def test_command_store_handles_play_action(pause_source: PauseSource) -> None: """It should set the running flag on play.""" subject = CommandStore(is_door_open=False, config=_make_config()) - subject.handle_action(PlayAction(requested_at=datetime(year=2021, month=1, day=1))) + subject.handle_action( + PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ) + ) assert subject.state == CommandState( queue_status=QueueStatus.RUNNING, @@ -705,7 +709,11 @@ def test_command_store_handles_finish_action() -> None: """It should change to a succeeded state with FinishAction.""" subject = CommandStore(is_door_open=False, config=_make_config()) - subject.handle_action(PlayAction(requested_at=datetime(year=2021, month=1, day=1))) + subject.handle_action( + PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ) + ) subject.handle_action(FinishAction()) assert subject.state == CommandState( @@ -730,7 +738,11 @@ def test_command_store_handles_finish_action_with_stopped() -> None: """It should change to a stopped state if FinishAction has set_run_status=False.""" subject = CommandStore(is_door_open=False, config=_make_config()) - subject.handle_action(PlayAction(requested_at=datetime(year=2021, month=1, day=1))) + subject.handle_action( + PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ) + ) subject.handle_action(FinishAction(set_run_status=False)) assert subject.state.run_result == RunResult.STOPPED @@ -741,7 +753,11 @@ def test_command_store_handles_stop_action(from_estop: bool) -> None: """It should mark the engine as non-gracefully stopped on StopAction.""" subject = CommandStore(is_door_open=False, config=_make_config()) - subject.handle_action(PlayAction(requested_at=datetime(year=2021, month=1, day=1))) + subject.handle_action( + PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ) + ) subject.handle_action(StopAction(from_estop=from_estop)) assert subject.state == CommandState( @@ -766,7 +782,11 @@ def test_command_store_cannot_restart_after_should_stop() -> None: """It should reject a play action after finish.""" subject = CommandStore(is_door_open=False, config=_make_config()) subject.handle_action(FinishAction()) - subject.handle_action(PlayAction(requested_at=datetime(year=2021, month=1, day=1))) + subject.handle_action( + PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ) + ) assert subject.state == CommandState( queue_status=QueueStatus.PAUSED, @@ -792,7 +812,7 @@ def test_command_store_save_started_completed_run_timestamp() -> None: start_time = datetime(year=2021, month=1, day=1) hardware_stopped_time = datetime(year=2022, month=2, day=2) - subject.handle_action(PlayAction(requested_at=start_time)) + subject.handle_action(PlayAction(requested_at=start_time, deck_configuration=[])) subject.handle_action( HardwareStoppedAction( completed_at=hardware_stopped_time, finish_error_details=None @@ -812,9 +832,9 @@ def test_timestamps_are_latched() -> None: stop_time_1 = datetime(year=2023, month=3, day=3) stop_time_2 = datetime(year=2024, month=4, day=4) - subject.handle_action(PlayAction(requested_at=play_time_1)) + subject.handle_action(PlayAction(requested_at=play_time_1, deck_configuration=[])) subject.handle_action(PauseAction(source=PauseSource.CLIENT)) - subject.handle_action(PlayAction(requested_at=play_time_2)) + subject.handle_action(PlayAction(requested_at=play_time_2, deck_configuration=[])) subject.handle_action( HardwareStoppedAction(completed_at=stop_time_1, finish_error_details=None) ) @@ -979,7 +999,11 @@ def test_command_store_ignores_stop_after_graceful_finish() -> None: """It should no-op on stop if already gracefully finished.""" subject = CommandStore(is_door_open=False, config=_make_config()) - subject.handle_action(PlayAction(requested_at=datetime(year=2021, month=1, day=1))) + subject.handle_action( + PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ) + ) subject.handle_action(FinishAction()) subject.handle_action(StopAction()) @@ -1005,7 +1029,11 @@ def test_command_store_ignores_finish_after_non_graceful_stop() -> None: """It should no-op on finish if already ungracefully stopped.""" subject = CommandStore(is_door_open=False, config=_make_config()) - subject.handle_action(PlayAction(requested_at=datetime(year=2021, month=1, day=1))) + subject.handle_action( + PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ) + ) subject.handle_action(StopAction()) subject.handle_action(FinishAction()) @@ -1119,7 +1147,7 @@ def test_command_store_handles_play_according_to_initial_door_state( """It should set command queue state on play action according to door state.""" subject = CommandStore(is_door_open=is_door_open, config=config) start_time = datetime(year=2021, month=1, day=1) - subject.handle_action(PlayAction(requested_at=start_time)) + subject.handle_action(PlayAction(requested_at=start_time, deck_configuration=[])) assert subject.state.queue_status == expected_queue_status assert subject.state.run_started_at == start_time @@ -1162,7 +1190,11 @@ def test_handles_door_open_and_close_event_after_play( """It should update state when door opened and closed after run is played.""" subject = CommandStore(is_door_open=False, config=config) - subject.handle_action(PlayAction(requested_at=datetime(year=2021, month=1, day=1))) + subject.handle_action( + PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ) + ) subject.handle_action(DoorChangeAction(door_state=DoorState.OPEN)) assert subject.state.queue_status == expected_queue_status diff --git a/api/tests/opentrons/protocol_engine/state/test_command_view.py b/api/tests/opentrons/protocol_engine/state/test_command_view.py index b9cc6835ce3..46f431e8c63 100644 --- a/api/tests/opentrons/protocol_engine/state/test_command_view.py +++ b/api/tests/opentrons/protocol_engine/state/test_command_view.py @@ -305,6 +305,15 @@ def test_get_is_started() -> None: assert subject.has_been_played() is True +def test_get_is_terminal() -> None: + """It should return true if run is in a terminal state.""" + subject = get_command_view(run_result=None) + assert subject.get_is_terminal() is False + + subject = get_command_view(run_result=RunResult.SUCCEEDED) + assert subject.get_is_terminal() is True + + class ActionAllowedSpec(NamedTuple): """Spec data to test CommandView.validate_action_allowed.""" @@ -317,19 +326,25 @@ class ActionAllowedSpec(NamedTuple): # play is allowed if the engine is idle ActionAllowedSpec( subject=get_command_view(queue_status=QueueStatus.SETUP), - action=PlayAction(requested_at=datetime(year=2021, month=1, day=1)), + action=PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ), expected_error=None, ), # play is allowed if engine is idle, even if door is blocking ActionAllowedSpec( subject=get_command_view(is_door_blocking=True, queue_status=QueueStatus.SETUP), - action=PlayAction(requested_at=datetime(year=2021, month=1, day=1)), + action=PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ), expected_error=None, ), # play is allowed if the engine is paused ActionAllowedSpec( subject=get_command_view(queue_status=QueueStatus.PAUSED), - action=PlayAction(requested_at=datetime(year=2021, month=1, day=1)), + action=PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ), expected_error=None, ), # pause is allowed if the engine is running @@ -360,13 +375,17 @@ class ActionAllowedSpec(NamedTuple): subject=get_command_view( is_door_blocking=True, queue_status=QueueStatus.PAUSED ), - action=PlayAction(requested_at=datetime(year=2021, month=1, day=1)), + action=PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ), expected_error=errors.RobotDoorOpenError, ), # play is disallowed if stop has been requested ActionAllowedSpec( subject=get_command_view(run_result=RunResult.STOPPED), - action=PlayAction(requested_at=datetime(year=2021, month=1, day=1)), + action=PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ), expected_error=errors.RunStoppedError, ), # pause is disallowed if stop has been requested @@ -444,7 +463,7 @@ def test_validate_action_allowed( """It should validate allowed play/pause/stop actions.""" expectation = pytest.raises(expected_error) if expected_error else does_not_raise() - with expectation: # type: ignore[attr-defined] + with expectation: result = subject.validate_action_allowed(action) if expected_error is None: diff --git a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py index b6740482d04..93c3be8ebbe 100644 --- a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py +++ b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py @@ -5,12 +5,18 @@ from decoy import Decoy from typing import cast, List, Tuple, Optional, NamedTuple -from opentrons_shared_data.deck.dev_types import DeckDefinitionV3 +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4 from opentrons_shared_data.labware.dev_types import LabwareUri from opentrons_shared_data.pipette import pipette_definition from opentrons.calibration_storage.helpers import uri_from_details from opentrons.protocols.models import LabwareDefinition from opentrons.types import Point, DeckSlotName, MountType +from opentrons_shared_data.pipette.dev_types import PipetteNameType +from opentrons_shared_data.labware.labware_definition import ( + Dimensions as LabwareDimensions, + Parameters as LabwareDefinitionParameters, + CornerOffsetFromSlot, +) from opentrons.protocol_engine import errors from opentrons.protocol_engine.types import ( @@ -19,7 +25,9 @@ DeckSlotLocation, ModuleLocation, OnLabwareLocation, + AddressableAreaLocation, ModuleOffsetVector, + ModuleOffsetData, LoadedLabware, LoadedModule, ModuleModel, @@ -32,13 +40,22 @@ OverlapOffset, DeckType, CurrentWell, + CurrentAddressableArea, + CurrentPipetteLocation, LabwareMovementOffsetData, + LoadedPipette, + TipGeometry, ) from opentrons.protocol_engine.state import move_types from opentrons.protocol_engine.state.config import Config from opentrons.protocol_engine.state.labware import LabwareView from opentrons.protocol_engine.state.modules import ModuleView -from opentrons.protocol_engine.state.pipettes import PipetteView, StaticPipetteConfig +from opentrons.protocol_engine.state.pipettes import ( + PipetteView, + StaticPipetteConfig, + BoundingNozzlesOffsets, +) +from opentrons.protocol_engine.state.addressable_areas import AddressableAreaView from opentrons.protocol_engine.state.geometry import GeometryView, _GripperMoveType @@ -60,6 +77,12 @@ def mock_pipette_view(decoy: Decoy) -> PipetteView: return decoy.mock(cls=PipetteView) +@pytest.fixture +def addressable_area_view(decoy: Decoy) -> AddressableAreaView: + """Get a mock in the shape of a AddressableAreaView.""" + return decoy.mock(cls=AddressableAreaView) + + @pytest.fixture(autouse=True) def patch_mock_move_types(decoy: Decoy, monkeypatch: pytest.MonkeyPatch) -> None: """Mock out move_types.py functions.""" @@ -69,7 +92,10 @@ def patch_mock_move_types(decoy: Decoy, monkeypatch: pytest.MonkeyPatch) -> None @pytest.fixture def subject( - labware_view: LabwareView, module_view: ModuleView, mock_pipette_view: PipetteView + labware_view: LabwareView, + module_view: ModuleView, + mock_pipette_view: PipetteView, + addressable_area_view: AddressableAreaView, ) -> GeometryView: """Get a GeometryView with its store dependencies mocked out.""" return GeometryView( @@ -80,12 +106,14 @@ def subject( labware_view=labware_view, module_view=module_view, pipette_view=mock_pipette_view, + addressable_area_view=addressable_area_view, ) def test_get_labware_parent_position( decoy: Decoy, labware_view: LabwareView, + addressable_area_view: AddressableAreaView, subject: GeometryView, ) -> None: """It should return a deck slot position for labware in a deck slot.""" @@ -97,9 +125,9 @@ def test_get_labware_parent_position( offsetId=None, ) decoy.when(labware_view.get("labware-id")).then_return(labware_data) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_3)).then_return( - Point(1, 2, 3) - ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_3.id) + ).then_return(Point(1, 2, 3)) result = subject.get_labware_parent_position("labware-id") @@ -128,7 +156,8 @@ def test_get_labware_parent_position_on_module( decoy: Decoy, labware_view: LabwareView, module_view: ModuleView, - ot2_standard_deck_def: DeckDefinitionV3, + addressable_area_view: AddressableAreaView, + ot2_standard_deck_def: DeckDefinitionV4, subject: GeometryView, ) -> None: """It should return a module position for labware on a module.""" @@ -144,9 +173,9 @@ def test_get_labware_parent_position_on_module( decoy.when(module_view.get_location("module-id")).then_return( DeckSlotLocation(slotName=DeckSlotName.SLOT_3) ) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_3)).then_return( - Point(1, 2, 3) - ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_3.id) + ).then_return(Point(1, 2, 3)) decoy.when(labware_view.get_deck_definition()).then_return(ot2_standard_deck_def) decoy.when( module_view.get_nominal_module_offset( @@ -162,7 +191,10 @@ def test_get_labware_parent_position_on_module( ) ).then_return(OverlapOffset(x=1, y=2, z=3)) decoy.when(module_view.get_module_calibration_offset("module-id")).then_return( - ModuleOffsetVector(x=2, y=3, z=4) + ModuleOffsetData( + moduleOffsetVector=ModuleOffsetVector(x=2, y=3, z=4), + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), + ) ) result = subject.get_labware_parent_position("labware-id") @@ -174,7 +206,8 @@ def test_get_labware_parent_position_on_labware( decoy: Decoy, labware_view: LabwareView, module_view: ModuleView, - ot2_standard_deck_def: DeckDefinitionV3, + addressable_area_view: AddressableAreaView, + ot2_standard_deck_def: DeckDefinitionV4, subject: GeometryView, ) -> None: """It should return a labware position for labware on a labware on a module.""" @@ -196,12 +229,9 @@ def test_get_labware_parent_position_on_labware( decoy.when(module_view.get_location("module-id")).then_return( DeckSlotLocation(slotName=DeckSlotName.SLOT_3) ) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_3)).then_return( - Point(1, 2, 3) - ) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_3)).then_return( - Point(1, 2, 3) - ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_3.id) + ).then_return(Point(1, 2, 3)) decoy.when(labware_view.get("adapter-id")).then_return(adapter_data) decoy.when(labware_view.get_dimensions("adapter-id")).then_return( Dimensions(x=123, y=456, z=5) @@ -227,7 +257,10 @@ def test_get_labware_parent_position_on_labware( ).then_return(OverlapOffset(x=-3, y=-2, z=-1)) decoy.when(module_view.get_module_calibration_offset("module-id")).then_return( - ModuleOffsetVector(x=3, y=4, z=5) + ModuleOffsetData( + moduleOffsetVector=ModuleOffsetVector(x=3, y=4, z=5), + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), + ) ) result = subject.get_labware_parent_position("labware-id") @@ -235,10 +268,67 @@ def test_get_labware_parent_position_on_labware( assert result == Point(9, 12, 15) +def test_module_calibration_offset_rotation( + decoy: Decoy, + labware_view: LabwareView, + module_view: ModuleView, + ot2_standard_deck_def: DeckDefinitionV4, + subject: GeometryView, +) -> None: + """Return the rotated module calibration offset if the module was moved from one side of the deck to the other.""" + labware_data = LoadedLabware( + id="labware-id", + loadName="b", + definitionUri=uri_from_details(namespace="a", load_name="b", version=1), + location=ModuleLocation(moduleId="module-id"), + offsetId=None, + ) + + decoy.when(labware_view.get("labware-id")).then_return(labware_data) + decoy.when(module_view.get_location("module-id")).then_return( + DeckSlotLocation(slotName=DeckSlotName.SLOT_D1) + ) + decoy.when(module_view.get_connected_model("module-id")).then_return( + ModuleModel.TEMPERATURE_MODULE_V2 + ) + decoy.when(module_view.get_module_calibration_offset("module-id")).then_return( + ModuleOffsetData( + moduleOffsetVector=ModuleOffsetVector(x=2, y=3, z=4), + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_D1), + ) + ) + + # the module has not changed location after calibration, so there is no rotation + result = subject._get_calibrated_module_offset(ModuleLocation(moduleId="module-id")) + assert result == ModuleOffsetVector(x=2, y=3, z=4) + + # the module has changed from slot D1 to D3, so we should rotate the calibration offset 180 degrees along the z axis + decoy.when(module_view.get_location("module-id")).then_return( + DeckSlotLocation(slotName=DeckSlotName.SLOT_D3) + ) + result = subject._get_calibrated_module_offset(ModuleLocation(moduleId="module-id")) + assert result == ModuleOffsetVector(x=-2, y=-3, z=4) + + # attempting to load the module calibration offset from an invalid slot in the middle of the deck (A2, B2, C2, D2) + # is not be allowed since you can't even load a module in the middle to perform a module calibration in the + # first place. So if someone manually edits the stored module calibration offset we will throw an assert error. + decoy.when(module_view.get_module_calibration_offset("module-id")).then_return( + ModuleOffsetData( + moduleOffsetVector=ModuleOffsetVector(x=2, y=3, z=4), + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_D2), + ) + ) + with pytest.raises(AssertionError): + result = subject._get_calibrated_module_offset( + ModuleLocation(moduleId="module-id") + ) + + def test_get_labware_origin_position( decoy: Decoy, well_plate_def: LabwareDefinition, labware_view: LabwareView, + addressable_area_view: AddressableAreaView, subject: GeometryView, ) -> None: """It should return a deck slot position with the labware's offset as its origin.""" @@ -252,9 +342,9 @@ def test_get_labware_origin_position( decoy.when(labware_view.get("labware-id")).then_return(labware_data) decoy.when(labware_view.get_definition("labware-id")).then_return(well_plate_def) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_3)).then_return( - Point(1, 2, 3) - ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_3.id) + ).then_return(Point(1, 2, 3)) expected_parent = Point(1, 2, 3) expected_offset = Point( @@ -273,6 +363,7 @@ def test_get_labware_highest_z( decoy: Decoy, well_plate_def: LabwareDefinition, labware_view: LabwareView, + addressable_area_view: AddressableAreaView, subject: GeometryView, ) -> None: """It should get the absolute location of a labware's highest Z point.""" @@ -291,9 +382,9 @@ def test_get_labware_highest_z( decoy.when(labware_view.get_labware_offset_vector("labware-id")).then_return( calibration_offset ) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_3)).then_return( - slot_pos - ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_3.id) + ).then_return(slot_pos) highest_z = subject.get_labware_highest_z("labware-id") @@ -305,7 +396,8 @@ def test_get_module_labware_highest_z( well_plate_def: LabwareDefinition, labware_view: LabwareView, module_view: ModuleView, - ot2_standard_deck_def: DeckDefinitionV3, + addressable_area_view: AddressableAreaView, + ot2_standard_deck_def: DeckDefinitionV4, subject: GeometryView, ) -> None: """It should get the absolute location of a labware's highest Z point.""" @@ -324,9 +416,9 @@ def test_get_module_labware_highest_z( decoy.when(labware_view.get_labware_offset_vector("labware-id")).then_return( calibration_offset ) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_3)).then_return( - slot_pos - ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_3.id) + ).then_return(slot_pos) decoy.when(module_view.get_location("module-id")).then_return( DeckSlotLocation(slotName=DeckSlotName.SLOT_3) ) @@ -338,7 +430,10 @@ def test_get_module_labware_highest_z( ).then_return(LabwareOffsetVector(x=4, y=5, z=6)) decoy.when(module_view.get_height_over_labware("module-id")).then_return(0.5) decoy.when(module_view.get_module_calibration_offset("module-id")).then_return( - ModuleOffsetVector(x=0, y=0, z=0) + ModuleOffsetData( + moduleOffsetVector=ModuleOffsetVector(x=0, y=0, z=0), + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), + ) ) decoy.when(module_view.get_connected_model("module-id")).then_return( ModuleModel.MAGNETIC_MODULE_V2 @@ -354,28 +449,31 @@ def test_get_module_labware_highest_z( assert highest_z == (well_plate_def.dimensions.zDimension + 3 + 3 + 6 + 0.5) -def test_get_all_labware_highest_z_no_equipment( +def test_get_all_obstacle_highest_z_no_equipment( decoy: Decoy, labware_view: LabwareView, module_view: ModuleView, + addressable_area_view: AddressableAreaView, subject: GeometryView, ) -> None: """It should return 0 if no loaded equipment.""" decoy.when(module_view.get_all()).then_return([]) decoy.when(labware_view.get_all()).then_return([]) + decoy.when(addressable_area_view.get_all()).then_return([]) - result = subject.get_all_labware_highest_z() + result = subject.get_all_obstacle_highest_z() assert result == 0 -def test_get_all_labware_highest_z( +def test_get_all_obstacle_highest_z( decoy: Decoy, well_plate_def: LabwareDefinition, reservoir_def: LabwareDefinition, falcon_tuberack_def: LabwareDefinition, labware_view: LabwareView, module_view: ModuleView, + addressable_area_view: AddressableAreaView, subject: GeometryView, ) -> None: """It should get the highest Z amongst all labware.""" @@ -406,6 +504,7 @@ def test_get_all_labware_highest_z( reservoir_offset = LabwareOffsetVector(x=1, y=-2, z=3) decoy.when(module_view.get_all()).then_return([]) + decoy.when(addressable_area_view.get_all()).then_return([]) decoy.when(labware_view.get_all()).then_return([plate, off_deck_lw, reservoir]) decoy.when(labware_view.get("plate-id")).then_return(plate) @@ -428,25 +527,86 @@ def test_get_all_labware_highest_z( reservoir_offset ) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_3)).then_return( - Point(1, 2, 3) - ) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_4)).then_return( - Point(4, 5, 6) - ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_3.id) + ).then_return(Point(1, 2, 3)) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_4.id) + ).then_return(Point(4, 5, 6)) plate_z = subject.get_labware_highest_z("plate-id") reservoir_z = subject.get_labware_highest_z("reservoir-id") - all_z = subject.get_all_labware_highest_z() + all_z = subject.get_all_obstacle_highest_z() # Should exclude the off-deck plate. assert all_z == max(plate_z, reservoir_z) -def test_get_all_labware_highest_z_with_modules( +def test_get_all_obstacle_highest_z_with_staging_area( decoy: Decoy, + well_plate_def: LabwareDefinition, + falcon_tuberack_def: LabwareDefinition, labware_view: LabwareView, module_view: ModuleView, + addressable_area_view: AddressableAreaView, + subject: GeometryView, +) -> None: + """It should get the highest Z amongst all labware including staging area.""" + plate = LoadedLabware( + id="plate-id", + loadName="plate-load-name", + definitionUri="plate-definition-uri", + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), + offsetId="plate-offset-id", + ) + staging_lw = LoadedLabware( + id="staging-id", + loadName="staging-load-name", + definitionUri="staging-definition-uri", + location=AddressableAreaLocation(addressableAreaName="D4"), + offsetId="plate-offset-id", + ) + + plate_offset = LabwareOffsetVector(x=1, y=-2, z=3) + staging_lw_offset = LabwareOffsetVector(x=1, y=-2, z=3) + + decoy.when(module_view.get_all()).then_return([]) + decoy.when(addressable_area_view.get_all()).then_return([]) + + decoy.when(labware_view.get_all()).then_return([plate, staging_lw]) + decoy.when(labware_view.get("plate-id")).then_return(plate) + decoy.when(labware_view.get("staging-id")).then_return(staging_lw) + + decoy.when(labware_view.get_definition("plate-id")).then_return(well_plate_def) + decoy.when(labware_view.get_definition("staging-id")).then_return( + falcon_tuberack_def # Something tall. + ) + + decoy.when(labware_view.get_labware_offset_vector("plate-id")).then_return( + plate_offset + ) + decoy.when(labware_view.get_labware_offset_vector("staging-id")).then_return( + staging_lw_offset + ) + + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_3.id) + ).then_return(Point(1, 2, 3)) + decoy.when(addressable_area_view.get_addressable_area_position("D4")).then_return( + Point(4, 5, 6) + ) + + staging_z = subject.get_labware_highest_z("staging-id") + all_z = subject.get_all_obstacle_highest_z() + + assert all_z == staging_z + + +def test_get_all_obstacle_highest_z_with_modules( + decoy: Decoy, + labware_view: LabwareView, + module_view: ModuleView, + addressable_area_view: AddressableAreaView, subject: GeometryView, ) -> None: """It should get the highest Z including modules.""" @@ -454,15 +614,308 @@ def test_get_all_labware_highest_z_with_modules( module_2 = LoadedModule.construct(id="module-id-2") # type: ignore[call-arg] decoy.when(labware_view.get_all()).then_return([]) + decoy.when(addressable_area_view.get_all()).then_return([]) + decoy.when(module_view.get_all()).then_return([module_1, module_2]) decoy.when(module_view.get_overall_height("module-id-1")).then_return(42.0) decoy.when(module_view.get_overall_height("module-id-2")).then_return(1337.0) - result = subject.get_all_labware_highest_z() + result = subject.get_all_obstacle_highest_z() + + assert result == 1337.0 + + +def test_get_all_obstacle_highest_z_with_fixtures( + decoy: Decoy, + labware_view: LabwareView, + module_view: ModuleView, + addressable_area_view: AddressableAreaView, + subject: GeometryView, +) -> None: + """It should get the highest Z including fixtures.""" + decoy.when(labware_view.get_all()).then_return([]) + decoy.when(module_view.get_all()).then_return([]) + + decoy.when(addressable_area_view.get_all_cutout_fixtures()).then_return( + ["abc", "xyz"] + ) + decoy.when(addressable_area_view.get_fixture_height("abc")).then_return(42.0) + decoy.when(addressable_area_view.get_fixture_height("xyz")).then_return(1337.0) + + result = subject.get_all_obstacle_highest_z() assert result == 1337.0 +def test_get_highest_z_in_slot_with_single_labware( + decoy: Decoy, + labware_view: LabwareView, + addressable_area_view: AddressableAreaView, + subject: GeometryView, + well_plate_def: LabwareDefinition, +) -> None: + """It should get the highest Z in slot with just a single labware.""" + # Case: Slot has a labware that doesn't have any other labware on it. Highest z is equal to labware height. + labware_in_slot = LoadedLabware( + id="just-labware-id", + loadName="just-labware-name", + definitionUri="definition-uri", + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), + offsetId="offset-id", + ) + slot_pos = Point(1, 2, 3) + calibration_offset = LabwareOffsetVector(x=1, y=-2, z=3) + + decoy.when(labware_view.get_by_slot(DeckSlotName.SLOT_3)).then_return( + labware_in_slot + ) + decoy.when(labware_view.get_id_by_labware("just-labware-id")).then_raise( + errors.LabwareNotLoadedOnLabwareError("no more labware") + ) + decoy.when(labware_view.get("just-labware-id")).then_return(labware_in_slot) + decoy.when(labware_view.get_definition("just-labware-id")).then_return( + well_plate_def + ) + decoy.when(labware_view.get_labware_offset_vector("just-labware-id")).then_return( + calibration_offset + ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_3.id) + ).then_return(slot_pos) + + expected_highest_z = well_plate_def.dimensions.zDimension + 3 + 3 + assert ( + subject.get_highest_z_in_slot(DeckSlotLocation(slotName=DeckSlotName.SLOT_3)) + == expected_highest_z + ) + + +def test_get_highest_z_in_slot_with_single_module( + decoy: Decoy, + labware_view: LabwareView, + module_view: ModuleView, + addressable_area_view: AddressableAreaView, + subject: GeometryView, + ot2_standard_deck_def: DeckDefinitionV4, +) -> None: + """It should get the highest Z in slot with just a single module.""" + # Case: Slot has a module that doesn't have any labware on it. Highest z is equal to module height. + module_in_slot = LoadedModule.construct( + id="only-module", + model=ModuleModel.THERMOCYCLER_MODULE_V2, + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_4), + ) + + decoy.when(module_view.get_by_slot(DeckSlotName.SLOT_3)).then_return(module_in_slot) + decoy.when(labware_view.get_id_by_module("only-module")).then_raise( + errors.LabwareNotLoadedOnModuleError("only module") + ) + decoy.when(labware_view.get_deck_definition()).then_return(ot2_standard_deck_def) + decoy.when( + module_view.get_module_highest_z( + module_id="only-module", deck_type=DeckType("ot2_standard") + ) + ).then_return(12345) + + assert ( + subject.get_highest_z_in_slot(DeckSlotLocation(slotName=DeckSlotName.SLOT_3)) + == 12345 + ) + + +# TODO (spp, 2023-12-05): this is mocking out too many things and is hard to follow. +# Create an integration test that loads labware and modules and tests the geometry +# in an easier-to-understand manner. +def test_get_highest_z_in_slot_with_stacked_labware_on_slot( + decoy: Decoy, + labware_view: LabwareView, + addressable_area_view: AddressableAreaView, + subject: GeometryView, + well_plate_def: LabwareDefinition, +) -> None: + """It should get the highest z in slot of the topmost labware in stack. + + Tests both `get_highest_z_in_slot` and `get_highest_z_of_labware_stack`. + """ + labware_in_slot = LoadedLabware( + id="bottom-labware-id", + loadName="bottom-labware-name", + definitionUri="bottom-definition-uri", + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), + offsetId="offset-id", + ) + middle_labware = LoadedLabware( + id="middle-labware-id", + loadName="middle-labware-name", + definitionUri="middle-definition-uri", + location=OnLabwareLocation(labwareId="bottom-labware-id"), + offsetId="offset-id", + ) + top_labware = LoadedLabware( + id="top-labware-id", + loadName="top-labware-name", + definitionUri="top-definition-uri", + location=OnLabwareLocation(labwareId="middle-labware-id"), + offsetId="offset-id", + ) + slot_pos = Point(11, 22, 33) + top_lw_lpc_offset = LabwareOffsetVector(x=1, y=-2, z=3) + + decoy.when(labware_view.get_by_slot(DeckSlotName.SLOT_3)).then_return( + labware_in_slot + ) + + decoy.when(labware_view.get_id_by_labware("bottom-labware-id")).then_return( + "middle-labware-id" + ) + decoy.when(labware_view.get_id_by_labware("middle-labware-id")).then_return( + "top-labware-id" + ) + decoy.when(labware_view.get_id_by_labware("top-labware-id")).then_raise( + errors.LabwareNotLoadedOnLabwareError("top labware") + ) + + decoy.when(labware_view.get("bottom-labware-id")).then_return(labware_in_slot) + decoy.when(labware_view.get("middle-labware-id")).then_return(middle_labware) + decoy.when(labware_view.get("top-labware-id")).then_return(top_labware) + + decoy.when(labware_view.get_definition("top-labware-id")).then_return( + well_plate_def + ) + decoy.when(labware_view.get_labware_offset_vector("top-labware-id")).then_return( + top_lw_lpc_offset + ) + decoy.when(labware_view.get_dimensions("middle-labware-id")).then_return( + Dimensions(x=10, y=20, z=30) + ) + decoy.when(labware_view.get_dimensions("bottom-labware-id")).then_return( + Dimensions(x=11, y=12, z=13) + ) + + decoy.when( + labware_view.get_labware_overlap_offsets( + "top-labware-id", below_labware_name="middle-labware-name" + ) + ).then_return(OverlapOffset(x=4, y=5, z=6)) + decoy.when( + labware_view.get_labware_overlap_offsets( + "middle-labware-id", below_labware_name="bottom-labware-name" + ) + ).then_return(OverlapOffset(x=7, y=8, z=9)) + + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_3.id) + ).then_return(slot_pos) + + expected_highest_z = ( + slot_pos.z + well_plate_def.dimensions.zDimension - 6 + 30 - 9 + 13 + 3 + ) + assert ( + subject.get_highest_z_in_slot(DeckSlotLocation(slotName=DeckSlotName.SLOT_3)) + == expected_highest_z + ) + + +# TODO (spp, 2023-12-05): this is mocking out too many things and is hard to follow. +# Create an integration test that loads labware and modules and tests the geometry +# in an easier-to-understand manner. +def test_get_highest_z_in_slot_with_labware_stack_on_module( + decoy: Decoy, + labware_view: LabwareView, + module_view: ModuleView, + addressable_area_view: AddressableAreaView, + subject: GeometryView, + well_plate_def: LabwareDefinition, + ot2_standard_deck_def: DeckDefinitionV4, +) -> None: + """It should get the highest z in slot of labware on module. + + Tests both `get_highest_z_in_slot` and `get_highest_z_of_labware_stack`. + """ + top_labware = LoadedLabware( + id="top-labware-id", + loadName="top-labware-name", + definitionUri="top-labware-uri", + location=OnLabwareLocation(labwareId="adapter-id"), + offsetId="offset-id1", + ) + adapter = LoadedLabware( + id="adapter-id", + loadName="adapter-name", + definitionUri="adapter-uri", + location=ModuleLocation(moduleId="module-id"), + offsetId="offset-id2", + ) + module_on_slot = LoadedModule.construct( + id="module-id", + model=ModuleModel.THERMOCYCLER_MODULE_V2, + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_4), + ) + + slot_pos = Point(11, 22, 33) + top_lw_lpc_offset = LabwareOffsetVector(x=1, y=-2, z=3) + + decoy.when(module_view.get("module-id")).then_return(module_on_slot) + decoy.when(module_view.get_by_slot(DeckSlotName.SLOT_3)).then_return(module_on_slot) + + decoy.when(labware_view.get_id_by_module("module-id")).then_return("adapter-id") + decoy.when(labware_view.get_id_by_labware("adapter-id")).then_return( + "top-labware-id" + ) + decoy.when(labware_view.get_id_by_labware("top-labware-id")).then_raise( + errors.LabwareNotLoadedOnLabwareError("top labware") + ) + + decoy.when(labware_view.get_deck_definition()).then_return(ot2_standard_deck_def) + decoy.when(labware_view.get_definition("top-labware-id")).then_return( + well_plate_def + ) + + decoy.when(labware_view.get("adapter-id")).then_return(adapter) + decoy.when(labware_view.get("top-labware-id")).then_return(top_labware) + decoy.when(labware_view.get_labware_offset_vector("top-labware-id")).then_return( + top_lw_lpc_offset + ) + decoy.when(labware_view.get_dimensions("adapter-id")).then_return( + Dimensions(x=10, y=20, z=30) + ) + decoy.when( + labware_view.get_labware_overlap_offsets( + labware_id="top-labware-id", below_labware_name="adapter-name" + ) + ).then_return(OverlapOffset(x=4, y=5, z=6)) + + decoy.when(module_view.get_location("module-id")).then_return( + DeckSlotLocation(slotName=DeckSlotName.SLOT_3) + ) + decoy.when( + module_view.get_nominal_module_offset( + module_id="module-id", deck_type=DeckType("ot2_standard") + ) + ).then_return(LabwareOffsetVector(x=40, y=50, z=60)) + decoy.when(module_view.get_connected_model("module-id")).then_return( + ModuleModel.TEMPERATURE_MODULE_V2 + ) + + decoy.when( + labware_view.get_module_overlap_offsets( + "adapter-id", ModuleModel.TEMPERATURE_MODULE_V2 + ) + ).then_return(OverlapOffset(x=1.1, y=2.2, z=3.3)) + + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_3.id) + ).then_return(slot_pos) + + expected_highest_z = ( + slot_pos.z + 60 + 30 - 3.3 + well_plate_def.dimensions.zDimension - 6 + 3 + ) + assert ( + subject.get_highest_z_in_slot(DeckSlotLocation(slotName=DeckSlotName.SLOT_3)) + == expected_highest_z + ) + + @pytest.mark.parametrize( ["location", "min_z_height", "expected_min_z"], [ @@ -480,6 +933,7 @@ def test_get_min_travel_z( well_plate_def: LabwareDefinition, labware_view: LabwareView, module_view: ModuleView, + addressable_area_view: AddressableAreaView, location: Optional[CurrentWell], min_z_height: Optional[float], expected_min_z: float, @@ -499,12 +953,13 @@ def test_get_min_travel_z( decoy.when(labware_view.get_labware_offset_vector("labware-id")).then_return( LabwareOffsetVector(x=0, y=0, z=3) ) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_3)).then_return( - Point(0, 0, 3) - ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_3.id) + ).then_return(Point(0, 0, 3)) decoy.when(module_view.get_all()).then_return([]) decoy.when(labware_view.get_all()).then_return([]) + decoy.when(addressable_area_view.get_all()).then_return([]) min_travel_z = subject.get_min_travel_z( "pipette-id", "labware-id", location, min_z_height @@ -517,6 +972,7 @@ def test_get_labware_position( decoy: Decoy, well_plate_def: LabwareDefinition, labware_view: LabwareView, + addressable_area_view: AddressableAreaView, subject: GeometryView, ) -> None: """It should return the slot position plus calibrated offset.""" @@ -535,9 +991,9 @@ def test_get_labware_position( decoy.when(labware_view.get_labware_offset_vector("labware-id")).then_return( calibration_offset ) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_4)).then_return( - slot_pos - ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_4.id) + ).then_return(slot_pos) position = subject.get_labware_position(labware_id="labware-id") @@ -552,6 +1008,7 @@ def test_get_well_position( decoy: Decoy, well_plate_def: LabwareDefinition, labware_view: LabwareView, + addressable_area_view: AddressableAreaView, subject: GeometryView, ) -> None: """It should be able to get the position of a well top in a labware.""" @@ -571,9 +1028,9 @@ def test_get_well_position( decoy.when(labware_view.get_labware_offset_vector("labware-id")).then_return( calibration_offset ) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_4)).then_return( - slot_pos - ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_4.id) + ).then_return(slot_pos) decoy.when(labware_view.get_well_definition("labware-id", "B2")).then_return( well_def ) @@ -606,7 +1063,8 @@ def test_get_module_labware_well_position( well_plate_def: LabwareDefinition, labware_view: LabwareView, module_view: ModuleView, - ot2_standard_deck_def: DeckDefinitionV3, + addressable_area_view: AddressableAreaView, + ot2_standard_deck_def: DeckDefinitionV4, subject: GeometryView, ) -> None: """It should be able to get the position of a well top in a labware on module.""" @@ -626,9 +1084,9 @@ def test_get_module_labware_well_position( decoy.when(labware_view.get_labware_offset_vector("labware-id")).then_return( calibration_offset ) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_4)).then_return( - slot_pos - ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_4.id) + ).then_return(slot_pos) decoy.when(labware_view.get_well_definition("labware-id", "B2")).then_return( well_def ) @@ -642,7 +1100,10 @@ def test_get_module_labware_well_position( ) ).then_return(LabwareOffsetVector(x=4, y=5, z=6)) decoy.when(module_view.get_module_calibration_offset("module-id")).then_return( - ModuleOffsetVector(x=0, y=0, z=0) + ModuleOffsetData( + moduleOffsetVector=ModuleOffsetVector(x=0, y=0, z=0), + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), + ) ) decoy.when(module_view.get_connected_model("module-id")).then_return( ModuleModel.MAGNETIC_MODULE_V2 @@ -665,6 +1126,7 @@ def test_get_well_position_with_top_offset( decoy: Decoy, well_plate_def: LabwareDefinition, labware_view: LabwareView, + addressable_area_view: AddressableAreaView, subject: GeometryView, ) -> None: """It should be able to get the position of a well top in a labware.""" @@ -684,9 +1146,9 @@ def test_get_well_position_with_top_offset( decoy.when(labware_view.get_labware_offset_vector("labware-id")).then_return( calibration_offset ) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_4)).then_return( - slot_pos - ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_4.id) + ).then_return(slot_pos) decoy.when(labware_view.get_well_definition("labware-id", "B2")).then_return( well_def ) @@ -711,6 +1173,7 @@ def test_get_well_position_with_bottom_offset( decoy: Decoy, well_plate_def: LabwareDefinition, labware_view: LabwareView, + addressable_area_view: AddressableAreaView, subject: GeometryView, ) -> None: """It should be able to get the position of a well bottom in a labware.""" @@ -730,9 +1193,9 @@ def test_get_well_position_with_bottom_offset( decoy.when(labware_view.get_labware_offset_vector("labware-id")).then_return( calibration_offset ) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_4)).then_return( - slot_pos - ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_4.id) + ).then_return(slot_pos) decoy.when(labware_view.get_well_definition("labware-id", "B2")).then_return( well_def ) @@ -757,6 +1220,7 @@ def test_get_well_position_with_center_offset( decoy: Decoy, well_plate_def: LabwareDefinition, labware_view: LabwareView, + addressable_area_view: AddressableAreaView, subject: GeometryView, ) -> None: """It should be able to get the position of a well center in a labware.""" @@ -776,9 +1240,9 @@ def test_get_well_position_with_center_offset( decoy.when(labware_view.get_labware_offset_vector("labware-id")).then_return( calibration_offset ) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_4)).then_return( - slot_pos - ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_4.id) + ).then_return(slot_pos) decoy.when(labware_view.get_well_definition("labware-id", "B2")).then_return( well_def ) @@ -803,6 +1267,7 @@ def test_get_relative_well_location( decoy: Decoy, well_plate_def: LabwareDefinition, labware_view: LabwareView, + addressable_area_view: AddressableAreaView, subject: GeometryView, ) -> None: """It should get the relative location of a well given an absolute position.""" @@ -822,9 +1287,9 @@ def test_get_relative_well_location( decoy.when(labware_view.get_labware_offset_vector("labware-id")).then_return( calibration_offset ) - decoy.when(labware_view.get_slot_position(DeckSlotName.SLOT_4)).then_return( - slot_pos - ) + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_4.id) + ).then_return(slot_pos) decoy.when(labware_view.get_well_definition("labware-id", "B2")).then_return( well_def ) @@ -993,15 +1458,22 @@ def test_get_tip_drop_location_with_non_tiprack( ) -def test_get_tip_drop_explicit_location(subject: GeometryView) -> None: +def test_get_tip_drop_explicit_location( + decoy: Decoy, + labware_view: LabwareView, + subject: GeometryView, + tip_rack_def: LabwareDefinition, +) -> None: """It should pass the location through if origin is not WellOrigin.DROP_TIP.""" + decoy.when(labware_view.get_definition("tip-rack-id")).then_return(tip_rack_def) + input_location = DropTipWellLocation( origin=DropTipWellOrigin.TOP, offset=WellOffset(x=1, y=2, z=3), ) result = subject.get_checked_tip_drop_location( - pipette_id="pipette-id", labware_id="labware-id", well_location=input_location + pipette_id="pipette-id", labware_id="tip-rack-id", well_location=input_location ) assert result == WellLocation( @@ -1060,7 +1532,7 @@ def test_ensure_location_not_occupied_raises( subject.ensure_location_not_occupied(location=slot_location) # Raise if module in location - module_location = ModuleLocation(moduleId="module-id") + module_location = DeckSlotLocation(slotName=DeckSlotName.SLOT_1) decoy.when(labware_view.raise_if_labware_in_location(module_location)).then_return( None ) @@ -1081,7 +1553,8 @@ def test_get_labware_grip_point( decoy: Decoy, labware_view: LabwareView, module_view: ModuleView, - ot2_standard_deck_def: DeckDefinitionV3, + addressable_area_view: AddressableAreaView, + ot2_standard_deck_def: DeckDefinitionV4, subject: GeometryView, ) -> None: """It should get the grip point of the labware at the specified location.""" @@ -1089,9 +1562,9 @@ def test_get_labware_grip_point( labware_view.get_grip_height_from_labware_bottom("labware-id") ).then_return(100) - decoy.when(labware_view.get_slot_center_position(DeckSlotName.SLOT_1)).then_return( - Point(x=101, y=102, z=103) - ) + decoy.when( + addressable_area_view.get_addressable_area_center(DeckSlotName.SLOT_1.id) + ).then_return(Point(x=101, y=102, z=103)) labware_center = subject.get_labware_grip_point( labware_id="labware-id", location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1) ) @@ -1103,7 +1576,8 @@ def test_get_labware_grip_point_on_labware( decoy: Decoy, labware_view: LabwareView, module_view: ModuleView, - ot2_standard_deck_def: DeckDefinitionV3, + addressable_area_view: AddressableAreaView, + ot2_standard_deck_def: DeckDefinitionV4, subject: GeometryView, ) -> None: """It should get the grip point of a labware on another labware.""" @@ -1134,9 +1608,9 @@ def test_get_labware_grip_point_on_labware( labware_view.get_labware_overlap_offsets("labware-id", "below-name") ).then_return(OverlapOffset(x=0, y=1, z=6)) - decoy.when(labware_view.get_slot_center_position(DeckSlotName.SLOT_4)).then_return( - Point(x=5, y=9, z=10) - ) + decoy.when( + addressable_area_view.get_addressable_area_center(DeckSlotName.SLOT_4.id) + ).then_return(Point(x=5, y=9, z=10)) grip_point = subject.get_labware_grip_point( labware_id="labware-id", location=OnLabwareLocation(labwareId="below-id") @@ -1149,7 +1623,8 @@ def test_get_labware_grip_point_for_labware_on_module( decoy: Decoy, labware_view: LabwareView, module_view: ModuleView, - ot2_standard_deck_def: DeckDefinitionV3, + addressable_area_view: AddressableAreaView, + ot2_standard_deck_def: DeckDefinitionV4, subject: GeometryView, ) -> None: """It should return the grip point for labware directly on a module.""" @@ -1174,11 +1649,14 @@ def test_get_labware_grip_point_for_labware_on_module( ) ).then_return(OverlapOffset(x=10, y=20, z=30)) decoy.when(module_view.get_module_calibration_offset("module-id")).then_return( - ModuleOffsetVector(x=100, y=200, z=300) - ) - decoy.when(labware_view.get_slot_center_position(DeckSlotName.SLOT_4)).then_return( - Point(100, 200, 300) + ModuleOffsetData( + moduleOffsetVector=ModuleOffsetVector(x=100, y=200, z=300), + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_4), + ) ) + decoy.when( + addressable_area_view.get_addressable_area_center(DeckSlotName.SLOT_4.id) + ).then_return(Point(100, 200, 300)) result_grip_point = subject.get_labware_grip_point( labware_id="labware-id", location=ModuleLocation(moduleId="module-id") ) @@ -1190,15 +1668,19 @@ def test_get_labware_grip_point_for_labware_on_module( argnames=["location", "should_dodge", "expected_waypoints"], argvalues=[ (None, True, []), + (None, False, []), (CurrentWell("pipette-id", "from-labware-id", "well-name"), False, []), (CurrentWell("pipette-id", "from-labware-id", "well-name"), True, [(11, 22)]), + (CurrentAddressableArea("pipette-id", "area-name"), False, []), + (CurrentAddressableArea("pipette-id", "area-name"), True, [(11, 22)]), ], ) def test_get_extra_waypoints( decoy: Decoy, labware_view: LabwareView, module_view: ModuleView, - location: Optional[CurrentWell], + addressable_area_view: AddressableAreaView, + location: Optional[CurrentPipetteLocation], should_dodge: bool, expected_waypoints: List[Tuple[float, float]], subject: GeometryView, @@ -1212,14 +1694,10 @@ def test_get_extra_waypoints( location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), ) ) - decoy.when(labware_view.get("to-labware-id")).then_return( - LoadedLabware( - id="labware2", - loadName="load-name2", - definitionUri="4567", - location=DeckSlotLocation(slotName=DeckSlotName.SLOT_2), - ) - ) + + decoy.when( + addressable_area_view.get_addressable_area_base_slot("area-name") + ).then_return(DeckSlotName.SLOT_1) decoy.when( module_view.should_dodge_thermocycler( @@ -1228,10 +1706,12 @@ def test_get_extra_waypoints( ).then_return(should_dodge) decoy.when( # Assume the subject's Config is for an OT-3, so use an OT-3 slot name. - labware_view.get_slot_center_position(slot=DeckSlotName.SLOT_C2) + addressable_area_view.get_addressable_area_center( + addressable_area_name=DeckSlotName.SLOT_C2.id + ) ).then_return(Point(x=11, y=22, z=33)) - extra_waypoints = subject.get_extra_waypoints("to-labware-id", location) + extra_waypoints = subject.get_extra_waypoints(location, DeckSlotName.SLOT_2) assert extra_waypoints == expected_waypoints @@ -1243,49 +1723,25 @@ def test_get_slot_item( subject: GeometryView, ) -> None: """It should get items in certain slots.""" - allowed_labware_ids = {"foo", "bar"} - allowed_module_ids = {"fizz", "buzz"} labware = LoadedLabware.construct(id="cool-labware") # type: ignore[call-arg] module = LoadedModule.construct(id="cool-module") # type: ignore[call-arg] - decoy.when( - labware_view.get_by_slot(DeckSlotName.SLOT_1, allowed_labware_ids) - ).then_return(None) - decoy.when( - labware_view.get_by_slot(DeckSlotName.SLOT_2, allowed_labware_ids) - ).then_return(labware) - decoy.when( - labware_view.get_by_slot(DeckSlotName.SLOT_3, allowed_labware_ids) - ).then_return(None) + decoy.when(labware_view.get_by_slot(DeckSlotName.SLOT_1)).then_return(None) + decoy.when(labware_view.get_by_slot(DeckSlotName.SLOT_2)).then_return(labware) + decoy.when(labware_view.get_by_slot(DeckSlotName.SLOT_3)).then_return(None) - decoy.when( - module_view.get_by_slot(DeckSlotName.SLOT_1, allowed_module_ids) - ).then_return(None) - decoy.when( - module_view.get_by_slot(DeckSlotName.SLOT_2, allowed_module_ids) - ).then_return(None) - decoy.when( - module_view.get_by_slot(DeckSlotName.SLOT_3, allowed_module_ids) - ).then_return(module) + decoy.when(module_view.get_by_slot(DeckSlotName.SLOT_1)).then_return(None) + decoy.when(module_view.get_by_slot(DeckSlotName.SLOT_2)).then_return(None) + decoy.when(module_view.get_by_slot(DeckSlotName.SLOT_3)).then_return(module) assert ( subject.get_slot_item( - DeckSlotName.SLOT_1, allowed_labware_ids, allowed_module_ids + DeckSlotName.SLOT_1, ) is None ) - assert ( - subject.get_slot_item( - DeckSlotName.SLOT_2, allowed_labware_ids, allowed_module_ids - ) - == labware - ) - assert ( - subject.get_slot_item( - DeckSlotName.SLOT_3, allowed_labware_ids, allowed_module_ids - ) - == module - ) + assert subject.get_slot_item(DeckSlotName.SLOT_2) == labware + assert subject.get_slot_item(DeckSlotName.SLOT_3) == module @pytest.mark.parametrize( @@ -1395,6 +1851,10 @@ def test_get_next_drop_tip_location( nominal_tip_overlap={}, home_position=0, nozzle_offset_z=0, + bounding_nozzle_offsets=BoundingNozzlesOffsets( + back_left_offset=Point(x=10, y=20, z=30), + front_right_offset=Point(x=40, y=50, z=60), + ), ) ) decoy.when(mock_pipette_view.get_mount("pip-123")).then_return(pipette_mount) @@ -1611,3 +2071,96 @@ def test_get_stacked_labware_total_nominal_offset_default( move_type=_GripperMoveType.DROP_LABWARE, ) assert result2 == LabwareOffsetVector(x=333, y=222, z=111) + + +def test_check_gripper_labware_tip_collision( + decoy: Decoy, + mock_pipette_view: PipetteView, + labware_view: LabwareView, + addressable_area_view: AddressableAreaView, + subject: GeometryView, +) -> None: + """It should raise a labware movement error if attached tips will collide with the labware during a gripper lift.""" + pipettes = [ + LoadedPipette( + id="pipette-id", + mount=MountType.LEFT, + pipetteName=PipetteNameType.P1000_96, + ) + ] + decoy.when(mock_pipette_view.get_all()).then_return(pipettes) + decoy.when(mock_pipette_view.get_attached_tip("pipette-id")).then_return( + TipGeometry( + length=1000, + diameter=1000, + volume=1000, + ) + ) + + definition = LabwareDefinition.construct( # type: ignore[call-arg] + namespace="hello", + dimensions=LabwareDimensions.construct( + yDimension=1, zDimension=2, xDimension=3 + ), + version=1, + parameters=LabwareDefinitionParameters.construct( + format="96Standard", + loadName="labware-id", + isTiprack=True, + isMagneticModuleCompatible=False, + ), + cornerOffsetFromSlot=CornerOffsetFromSlot.construct(x=1, y=2, z=3), + ordering=[], + ) + + labware_data = LoadedLabware( + id="labware-id", + loadName="b", + definitionUri=uri_from_details( + namespace="hello", load_name="labware-id", version=1 + ), + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), + offsetId=None, + ) + + decoy.when(labware_view.get_definition("labware-id")).then_return(definition) + decoy.when(labware_view.get("labware-id")).then_return(labware_data) + + decoy.when( + addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_1.id) + ).then_return(Point(1, 2, 3)) + + calibration_offset = LabwareOffsetVector(x=1, y=-2, z=3) + decoy.when(labware_view.get_labware_offset_vector("labware-id")).then_return( + calibration_offset + ) + decoy.when(subject.get_labware_origin_position("labware-id")).then_return( + Point(1, 2, 3) + ) + decoy.when(labware_view.get_definition("labware-id")).then_return(definition) + decoy.when(subject._get_highest_z_from_labware_data(labware_data)).then_return(1000) + + decoy.when(labware_view.get_definition("labware-id")).then_return(definition) + decoy.when(subject.get_labware_highest_z("labware-id")).then_return(100.0) + decoy.when( + addressable_area_view.get_addressable_area_center( + addressable_area_name=DeckSlotName.SLOT_1.id + ) + ).then_return(Point(x=11, y=22, z=33)) + decoy.when( + labware_view.get_grip_height_from_labware_bottom("labware-id") + ).then_return(1.0) + decoy.when(labware_view.get_definition("labware-id")).then_return(definition) + decoy.when( + subject.get_labware_grip_point( + labware_id="labware-id", + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), + ) + ).then_return(Point(x=100.0, y=100.0, z=0.0)) + + with pytest.raises(errors.LabwareMovementNotAllowedError): + subject.check_gripper_labware_tip_collision( + gripper_homed_position_z=166.125, + labware_id="labware-id", + current_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), + ) diff --git a/api/tests/opentrons/protocol_engine/state/test_labware_store.py b/api/tests/opentrons/protocol_engine/state/test_labware_store.py index 1cd2711d06e..efe67422da0 100644 --- a/api/tests/opentrons/protocol_engine/state/test_labware_store.py +++ b/api/tests/opentrons/protocol_engine/state/test_labware_store.py @@ -4,11 +4,10 @@ from datetime import datetime from opentrons.calibration_storage.helpers import uri_from_details -from opentrons_shared_data.deck.dev_types import DeckDefinitionV3 +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4 from opentrons.protocols.models import LabwareDefinition from opentrons.types import DeckSlotName -from opentrons.protocol_engine.resources import DeckFixedLabware from opentrons.protocol_engine.types import ( LabwareOffset, LabwareOffsetCreate, @@ -34,47 +33,25 @@ @pytest.fixture def subject( - ot2_standard_deck_def: DeckDefinitionV3, - ot2_fixed_trash_def: LabwareDefinition, + ot2_standard_deck_def: DeckDefinitionV4, ) -> LabwareStore: """Get a LabwareStore test subject.""" return LabwareStore( deck_definition=ot2_standard_deck_def, - deck_fixed_labware=[ - DeckFixedLabware( - labware_id="fixedTrash", - location=DeckSlotLocation(slotName=DeckSlotName.FIXED_TRASH), - definition=ot2_fixed_trash_def, - ) - ], + deck_fixed_labware=[], ) def test_initial_state( - ot2_standard_deck_def: DeckDefinitionV3, - ot2_fixed_trash_def: LabwareDefinition, + ot2_standard_deck_def: DeckDefinitionV4, subject: LabwareStore, ) -> None: """It should create the labware store with preloaded fixed labware.""" - expected_trash_uri = uri_from_details( - namespace=ot2_fixed_trash_def.namespace, - version=ot2_fixed_trash_def.version, - load_name=ot2_fixed_trash_def.parameters.loadName, - ) - assert subject.state == LabwareState( deck_definition=ot2_standard_deck_def, - labware_by_id={ - "fixedTrash": LoadedLabware( - id="fixedTrash", - loadName=ot2_fixed_trash_def.parameters.loadName, - definitionUri=expected_trash_uri, - location=DeckSlotLocation(slotName=DeckSlotName.FIXED_TRASH), - offsetId=None, - ) - }, + labware_by_id={}, labware_offsets_by_id={}, - definitions_by_uri={expected_trash_uri: ot2_fixed_trash_def}, + definitions_by_uri={}, ) diff --git a/api/tests/opentrons/protocol_engine/state/test_labware_view.py b/api/tests/opentrons/protocol_engine/state/test_labware_view.py index 7d277d93b5a..5e7e96412fa 100644 --- a/api/tests/opentrons/protocol_engine/state/test_labware_view.py +++ b/api/tests/opentrons/protocol_engine/state/test_labware_view.py @@ -1,11 +1,13 @@ """Labware state store tests.""" import pytest from datetime import datetime -from typing import Dict, Optional, cast, ContextManager, Any, Union +from typing import Dict, Optional, cast, ContextManager, Any, Union, NamedTuple, List from contextlib import nullcontext as does_not_raise -from opentrons_shared_data.deck.dev_types import DeckDefinitionV3 +from opentrons_shared_data.deck import load as load_deck +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4 from opentrons_shared_data.pipette.dev_types import LabwareUri +from opentrons_shared_data.labware import load_definition from opentrons_shared_data.labware.labware_definition import ( Parameters, LabwareRole, @@ -13,8 +15,13 @@ GripperOffsets, OffsetVector, ) + +from opentrons.protocols.api_support.deck_type import ( + STANDARD_OT2_DECK, + STANDARD_OT3_DECK, +) from opentrons.protocols.models import LabwareDefinition -from opentrons.types import DeckSlotName, Point, MountType +from opentrons.types import DeckSlotName, MountType from opentrons.protocol_engine import errors from opentrons.protocol_engine.types import ( @@ -28,6 +35,7 @@ ModuleLocation, OnLabwareLocation, LabwareLocation, + AddressableAreaLocation, OFF_DECK_LOCATION, OverlapOffset, LabwareMovementOffsetData, @@ -39,7 +47,6 @@ LabwareLoadParams, ) - plate = LoadedLabware( id="plate-id", loadName="plate-load-name", @@ -103,14 +110,14 @@ def get_labware_view( labware_by_id: Optional[Dict[str, LoadedLabware]] = None, labware_offsets_by_id: Optional[Dict[str, LabwareOffset]] = None, definitions_by_uri: Optional[Dict[str, LabwareDefinition]] = None, - deck_definition: Optional[DeckDefinitionV3] = None, + deck_definition: Optional[DeckDefinitionV4] = None, ) -> LabwareView: """Get a labware view test subject.""" state = LabwareState( labware_by_id=labware_by_id or {}, labware_offsets_by_id=labware_offsets_by_id or {}, definitions_by_uri=definitions_by_uri or {}, - deck_definition=deck_definition or cast(DeckDefinitionV3, {"fake": True}), + deck_definition=deck_definition or cast(DeckDefinitionV4, {"fake": True}), ) return LabwareView(state=state) @@ -686,26 +693,91 @@ def test_get_labware_overlap_offsets() -> None: assert result == OverlapOffset(x=1, y=2, z=3) -def test_get_module_overlap_offsets() -> None: +class ModuleOverlapSpec(NamedTuple): + """Spec data to test LabwareView.get_module_overlap_offsets.""" + + spec_deck_definition: DeckDefinitionV4 + module_model: ModuleModel + stacking_offset_with_module: Dict[str, SharedDataOverlapOffset] + expected_offset: OverlapOffset + + +module_overlap_specs: List[ModuleOverlapSpec] = [ + ModuleOverlapSpec( + # Labware on temp module on OT2, with stacking overlap for temp module + spec_deck_definition=load_deck(STANDARD_OT2_DECK, 4), + module_model=ModuleModel.TEMPERATURE_MODULE_V2, + stacking_offset_with_module={ + str(ModuleModel.TEMPERATURE_MODULE_V2.value): SharedDataOverlapOffset( + x=1, y=2, z=3 + ), + }, + expected_offset=OverlapOffset(x=1, y=2, z=3), + ), + ModuleOverlapSpec( + # Labware on TC Gen1 on OT2, with stacking overlap for TC Gen1 + spec_deck_definition=load_deck(STANDARD_OT2_DECK, 4), + module_model=ModuleModel.THERMOCYCLER_MODULE_V1, + stacking_offset_with_module={ + str(ModuleModel.THERMOCYCLER_MODULE_V1.value): SharedDataOverlapOffset( + x=11, y=22, z=33 + ), + }, + expected_offset=OverlapOffset(x=11, y=22, z=33), + ), + ModuleOverlapSpec( + # Labware on TC Gen2 on OT2, with no stacking overlap + spec_deck_definition=load_deck(STANDARD_OT2_DECK, 4), + module_model=ModuleModel.THERMOCYCLER_MODULE_V2, + stacking_offset_with_module={}, + expected_offset=OverlapOffset(x=0, y=0, z=10.7), + ), + ModuleOverlapSpec( + # Labware on TC Gen2 on Flex, with no stacking overlap + spec_deck_definition=load_deck(STANDARD_OT3_DECK, 4), + module_model=ModuleModel.THERMOCYCLER_MODULE_V2, + stacking_offset_with_module={}, + expected_offset=OverlapOffset(x=0, y=0, z=0), + ), + ModuleOverlapSpec( + # Labware on TC Gen2 on Flex, with stacking overlap for TC Gen2 + spec_deck_definition=load_deck(STANDARD_OT3_DECK, 4), + module_model=ModuleModel.THERMOCYCLER_MODULE_V2, + stacking_offset_with_module={ + str(ModuleModel.THERMOCYCLER_MODULE_V2.value): SharedDataOverlapOffset( + x=111, y=222, z=333 + ), + }, + expected_offset=OverlapOffset(x=111, y=222, z=333), + ), +] + + +@pytest.mark.parametrize( + argnames=ModuleOverlapSpec._fields, + argvalues=module_overlap_specs, +) +def test_get_module_overlap_offsets( + spec_deck_definition: DeckDefinitionV4, + module_model: ModuleModel, + stacking_offset_with_module: Dict[str, SharedDataOverlapOffset], + expected_offset: OverlapOffset, +) -> None: """It should get the labware overlap offsets.""" subject = get_labware_view( + deck_definition=spec_deck_definition, labware_by_id={"plate-id": plate}, definitions_by_uri={ "some-plate-uri": LabwareDefinition.construct( # type: ignore[call-arg] - stackingOffsetWithModule={ - str( - ModuleModel.TEMPERATURE_MODULE_V2.value - ): SharedDataOverlapOffset(x=1, y=2, z=3) - } + stackingOffsetWithModule=stacking_offset_with_module ) }, ) - result = subject.get_module_overlap_offsets( - labware_id="plate-id", module_model=ModuleModel.TEMPERATURE_MODULE_V2 + labware_id="plate-id", module_model=module_model ) - assert result == OverlapOffset(x=1, y=2, z=3) + assert result == expected_offset def test_get_default_magnet_height( @@ -728,52 +800,13 @@ def test_get_default_magnet_height( assert subject.get_default_magnet_height(module_id="module-id", offset=2) == 12.0 -def test_get_deck_definition(ot2_standard_deck_def: DeckDefinitionV3) -> None: +def test_get_deck_definition(ot2_standard_deck_def: DeckDefinitionV4) -> None: """It should get the deck definition from the state.""" subject = get_labware_view(deck_definition=ot2_standard_deck_def) assert subject.get_deck_definition() == ot2_standard_deck_def -def test_get_slot_definition(ot2_standard_deck_def: DeckDefinitionV3) -> None: - """It should return a deck slot's definition.""" - subject = get_labware_view(deck_definition=ot2_standard_deck_def) - - result = subject.get_slot_definition(DeckSlotName.SLOT_6) - - assert result["id"] == "6" - assert result == ot2_standard_deck_def["locations"]["orderedSlots"][5] - - -def test_get_slot_definition_raises_with_bad_slot_name( - ot2_standard_deck_def: DeckDefinitionV3, -) -> None: - """It should raise a SlotDoesNotExistError if a bad slot name is given.""" - subject = get_labware_view(deck_definition=ot2_standard_deck_def) - - with pytest.raises(errors.SlotDoesNotExistError): - subject.get_slot_definition(DeckSlotName.SLOT_A1) - - -def test_get_slot_position(ot2_standard_deck_def: DeckDefinitionV3) -> None: - """It should get the absolute location of a deck slot's origin.""" - subject = get_labware_view(deck_definition=ot2_standard_deck_def) - - slot_pos = ot2_standard_deck_def["locations"]["orderedSlots"][2]["position"] - result = subject.get_slot_position(DeckSlotName.SLOT_3) - - assert result == Point(x=slot_pos[0], y=slot_pos[1], z=slot_pos[2]) - - -def test_get_slot_center_position(ot2_standard_deck_def: DeckDefinitionV3) -> None: - """It should get the absolute location of a deck slot's center.""" - subject = get_labware_view(deck_definition=ot2_standard_deck_def) - - expected_center = Point(x=196.5, y=43.0, z=0.0) - result = subject.get_slot_center_position(DeckSlotName.SLOT_2) - assert result == expected_center - - def test_get_labware_offset_vector() -> None: """It should get a labware's offset vector.""" labware_without_offset = LoadedLabware( @@ -953,7 +986,7 @@ def test_find_applicable_labware_offset() -> None: ) -def test_get_display_name() -> None: +def test_get_user_specified_display_name() -> None: """It should get a labware's user-specified display name.""" subject = get_labware_view( labware_by_id={ @@ -962,8 +995,38 @@ def test_get_display_name() -> None: }, ) - assert subject.get_display_name("plate_with_display_name") == "Fancy Plate Name" - assert subject.get_display_name("reservoir_without_display_name") is None + assert ( + subject.get_user_specified_display_name("plate_with_display_name") + == "Fancy Plate Name" + ) + assert ( + subject.get_user_specified_display_name("reservoir_without_display_name") + is None + ) + + +def test_get_display_name( + well_plate_def: LabwareDefinition, + reservoir_def: LabwareDefinition, +) -> None: + """It should get the labware's display name.""" + subject = get_labware_view( + labware_by_id={ + "plate_with_custom_display_name": plate, + "reservoir_with_default_display_name": reservoir, + }, + definitions_by_uri={ + "some-plate-uri": well_plate_def, + "some-reservoir-uri": reservoir_def, + }, + ) + assert ( + subject.get_display_name("plate_with_custom_display_name") == "Fancy Plate Name" + ) + assert ( + subject.get_display_name("reservoir_with_default_display_name") + == "NEST 12 Well Reservoir 15 mL" + ) def test_get_fixed_trash_id() -> None: @@ -1011,8 +1074,7 @@ def test_get_fixed_trash_id() -> None: ) }, ) - with pytest.raises(errors.LabwareNotLoadedError): - subject.get_fixed_trash_id() + assert subject.get_fixed_trash_id() is None @pytest.mark.parametrize( @@ -1075,41 +1137,9 @@ def test_get_by_slot() -> None: labware_by_id={"1": labware_1, "2": labware_2, "3": labware_3} ) - assert subject.get_by_slot(DeckSlotName.SLOT_1, {"1", "2"}) == labware_1 - assert subject.get_by_slot(DeckSlotName.SLOT_2, {"1", "2"}) == labware_2 - assert subject.get_by_slot(DeckSlotName.SLOT_3, {"1", "2"}) is None - - -def test_get_by_slot_prefers_later() -> None: - """It should get the labware in a slot, preferring later items if locations match.""" - labware_1 = LoadedLabware.construct( # type: ignore[call-arg] - id="1", location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1) - ) - labware_1_again = LoadedLabware.construct( # type: ignore[call-arg] - id="1-again", location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1) - ) - - subject = get_labware_view( - labware_by_id={"1": labware_1, "1-again": labware_1_again} - ) - - assert subject.get_by_slot(DeckSlotName.SLOT_1, {"1", "1-again"}) == labware_1_again - - -def test_get_by_slot_filter_ids() -> None: - """It should filter labwares in the same slot using IDs.""" - labware_1 = LoadedLabware.construct( # type: ignore[call-arg] - id="1", location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1) - ) - labware_1_again = LoadedLabware.construct( # type: ignore[call-arg] - id="1-again", location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1) - ) - - subject = get_labware_view( - labware_by_id={"1": labware_1, "1-again": labware_1_again} - ) - - assert subject.get_by_slot(DeckSlotName.SLOT_1, {"1"}) == labware_1 + assert subject.get_by_slot(DeckSlotName.SLOT_1) == labware_1 + assert subject.get_by_slot(DeckSlotName.SLOT_2) == labware_2 + assert subject.get_by_slot(DeckSlotName.SLOT_3) is None @pytest.mark.parametrize( @@ -1198,6 +1228,67 @@ def test_get_all_labware_definition_empty() -> None: assert result == [] +def test_raise_if_labware_inaccessible_by_pipette_staging_area() -> None: + """It should raise if the labware is on a staging slot.""" + subject = get_labware_view( + labware_by_id={ + "labware-id": LoadedLabware( + id="labware-id", + loadName="test", + definitionUri="def-uri", + location=AddressableAreaLocation(addressableAreaName="B4"), + ) + }, + ) + + with pytest.raises( + errors.LocationNotAccessibleByPipetteError, match="on staging slot" + ): + subject.raise_if_labware_inaccessible_by_pipette("labware-id") + + +def test_raise_if_labware_inaccessible_by_pipette_off_deck() -> None: + """It should raise if the labware is off-deck.""" + subject = get_labware_view( + labware_by_id={ + "labware-id": LoadedLabware( + id="labware-id", + loadName="test", + definitionUri="def-uri", + location=OFF_DECK_LOCATION, + ) + }, + ) + + with pytest.raises(errors.LocationNotAccessibleByPipetteError, match="off-deck"): + subject.raise_if_labware_inaccessible_by_pipette("labware-id") + + +def test_raise_if_labware_inaccessible_by_pipette_stacked_labware_on_staging_area() -> None: + """It should raise if the labware is stacked on a staging slot.""" + subject = get_labware_view( + labware_by_id={ + "labware-id": LoadedLabware( + id="labware-id", + loadName="test", + definitionUri="def-uri", + location=OnLabwareLocation(labwareId="lower-labware-id"), + ), + "lower-labware-id": LoadedLabware( + id="lower-labware-id", + loadName="test", + definitionUri="def-uri", + location=AddressableAreaLocation(addressableAreaName="B4"), + ), + }, + ) + + with pytest.raises( + errors.LocationNotAccessibleByPipetteError, match="on staging slot" + ): + subject.raise_if_labware_inaccessible_by_pipette("labware-id") + + def test_raise_if_labware_cannot_be_stacked_is_adapter() -> None: """It should raise if the labware trying to be stacked is an adapter.""" subject = get_labware_view() @@ -1313,13 +1404,13 @@ def test_raise_if_labware_cannot_be_stacked_on_labware_on_adapter() -> None: ) -def test_get_deck_gripper_offsets(ot3_standard_deck_def: DeckDefinitionV3) -> None: +def test_get_deck_gripper_offsets(ot3_standard_deck_def: DeckDefinitionV4) -> None: """It should get the deck's gripper offsets.""" subject = get_labware_view(deck_definition=ot3_standard_deck_def) assert subject.get_deck_default_gripper_offsets() == LabwareMovementOffsetData( pickUpOffset=LabwareOffsetVector(x=0, y=0, z=0), - dropOffset=LabwareOffsetVector(x=0, y=0, z=-0.25), + dropOffset=LabwareOffsetVector(x=0, y=0, z=-0.75), ) @@ -1427,3 +1518,36 @@ def test_get_grip_height_from_labware_bottom( assert ( subject.get_grip_height_from_labware_bottom("reservoir-id") == 15.7 ) # default + + +@pytest.mark.parametrize( + "labware_to_check,well_bbox", + [ + ("opentrons_universal_flat_adapter", Dimensions(0, 0, 0)), + ( + "corning_96_wellplate_360ul_flat", + Dimensions(116.81 - 10.95, 77.67 - 7.81, 14.22), + ), + ("nest_12_reservoir_15ml", Dimensions(117.48 - 10.28, 78.38 - 7.18, 31.4)), + ], +) +def test_calculates_well_bounding_box( + labware_to_check: str, well_bbox: Dimensions +) -> None: + """It should be able to calculate well bounding boxes.""" + definition = LabwareDefinition.parse_obj(load_definition(labware_to_check, 1)) + labware = LoadedLabware( + id="test-labware-id", + loadName=labware_to_check, + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), + definitionUri="test-labware-uri", + offsetId=None, + displayName="Fancy Plate Name", + ) + subject = get_labware_view( + labware_by_id={"test-labware-id": labware}, + definitions_by_uri={"test-labware-uri": definition}, + ) + assert subject.get_well_bbox("test-labware-id").x == pytest.approx(well_bbox.x) + assert subject.get_well_bbox("test-labware-id").y == pytest.approx(well_bbox.y) + assert subject.get_well_bbox("test-labware-id").z == pytest.approx(well_bbox.z) diff --git a/api/tests/opentrons/protocol_engine/state/test_module_store.py b/api/tests/opentrons/protocol_engine/state/test_module_store.py index ffeca3dba2c..ff7a75859e9 100644 --- a/api/tests/opentrons/protocol_engine/state/test_module_store.py +++ b/api/tests/opentrons/protocol_engine/state/test_module_store.py @@ -1,6 +1,6 @@ """Module state store tests.""" import pytest -from pytest_lazyfixture import lazy_fixture # type: ignore[import] +from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] from opentrons.types import DeckSlotName from opentrons.protocol_engine import commands, actions diff --git a/api/tests/opentrons/protocol_engine/state/test_module_view.py b/api/tests/opentrons/protocol_engine/state/test_module_view.py index 7c9a3a9dc90..c93d3fdbdc7 100644 --- a/api/tests/opentrons/protocol_engine/state/test_module_view.py +++ b/api/tests/opentrons/protocol_engine/state/test_module_view.py @@ -1,6 +1,7 @@ """Tests for module state accessors in the protocol engine state store.""" import pytest -from pytest_lazyfixture import lazy_fixture # type: ignore[import] +from math import isclose +from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] from contextlib import nullcontext as does_not_raise from typing import ContextManager, Dict, NamedTuple, Optional, Type, Union, Any @@ -13,10 +14,9 @@ DeckSlotLocation, ModuleDefinition, ModuleModel, - ModuleLocation, LabwareOffsetVector, DeckType, - ModuleOffsetVector, + ModuleOffsetData, HeaterShakerLatchStatus, LabwareMovementOffsetData, ) @@ -44,7 +44,7 @@ def make_module_view( requested_model_by_module_id: Optional[Dict[str, Optional[ModuleModel]]] = None, hardware_by_module_id: Optional[Dict[str, HardwareModule]] = None, substate_by_module_id: Optional[Dict[str, ModuleSubStateType]] = None, - module_offset_by_serial: Optional[Dict[str, ModuleOffsetVector]] = None, + module_offset_by_serial: Optional[Dict[str, ModuleOffsetData]] = None, ) -> ModuleView: """Get a module view test subject with the specified state.""" state = ModuleState( @@ -295,7 +295,7 @@ def test_get_properties_by_id( ( lazy_fixture("thermocycler_v2_def"), DeckSlotName.SLOT_7, - LabwareOffsetVector(x=0, y=68.06, z=98.26), + LabwareOffsetVector(x=0, y=68.8, z=108.96), ), ( lazy_fixture("heater_shaker_v1_def"), @@ -325,7 +325,8 @@ def test_get_module_offset_for_ot2_standard( }, ) assert ( - subject.get_module_offset("module-id", DeckType.OT2_STANDARD) == expected_offset + subject.get_nominal_module_offset("module-id", DeckType.OT2_STANDARD) + == expected_offset ) @@ -345,7 +346,7 @@ def test_get_module_offset_for_ot2_standard( ( lazy_fixture("thermocycler_v2_def"), DeckSlotName.SLOT_7.to_ot3_equivalent(), - LabwareOffsetVector(x=-20.005, y=67.96, z=0.26), + LabwareOffsetVector(x=-20.005, y=67.96, z=10.96), ), ( lazy_fixture("heater_shaker_v1_def"), @@ -379,7 +380,9 @@ def test_get_module_offset_for_ot3_standard( ) }, ) - result_offset = subject.get_module_offset("module-id", DeckType.OT3_STANDARD) + result_offset = subject.get_nominal_module_offset( + "module-id", DeckType.OT3_STANDARD + ) assert (result_offset.x, result_offset.y, result_offset.z) == pytest.approx( (expected_offset.x, expected_offset.y, expected_offset.z) ) @@ -1592,11 +1595,10 @@ def test_get_overall_height( ), (DeckSlotLocation(slotName=DeckSlotName.SLOT_2), does_not_raise()), (DeckSlotLocation(slotName=DeckSlotName.FIXED_TRASH), does_not_raise()), - (ModuleLocation(moduleId="module-id-1"), does_not_raise()), ], ) def test_raise_if_labware_in_location( - location: Union[DeckSlotLocation, ModuleLocation], + location: DeckSlotLocation, expected_raise: ContextManager[Any], thermocycler_v1_def: ModuleDefinition, ) -> None: @@ -1645,19 +1647,19 @@ def test_get_by_slot() -> None: }, ) - assert subject.get_by_slot(DeckSlotName.SLOT_1, {"1", "2"}) == LoadedModule( + assert subject.get_by_slot(DeckSlotName.SLOT_1) == LoadedModule( id="1", location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), model=ModuleModel.TEMPERATURE_MODULE_V1, serialNumber="serial-number-1", ) - assert subject.get_by_slot(DeckSlotName.SLOT_2, {"1", "2"}) == LoadedModule( + assert subject.get_by_slot(DeckSlotName.SLOT_2) == LoadedModule( id="2", location=DeckSlotLocation(slotName=DeckSlotName.SLOT_2), model=ModuleModel.TEMPERATURE_MODULE_V2, serialNumber="serial-number-2", ) - assert subject.get_by_slot(DeckSlotName.SLOT_3, {"1", "2"}) is None + assert subject.get_by_slot(DeckSlotName.SLOT_3) is None def test_get_by_slot_prefers_later() -> None: @@ -1683,7 +1685,7 @@ def test_get_by_slot_prefers_later() -> None: }, ) - assert subject.get_by_slot(DeckSlotName.SLOT_1, {"1", "1-again"}) == LoadedModule( + assert subject.get_by_slot(DeckSlotName.SLOT_1) == LoadedModule( id="1-again", location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), model=ModuleModel.TEMPERATURE_MODULE_V1, @@ -1691,37 +1693,6 @@ def test_get_by_slot_prefers_later() -> None: ) -def test_get_by_slot_filter_ids() -> None: - """It should filter modules by ID in addition to checking the slot.""" - subject = make_module_view( - slot_by_module_id={ - "1": DeckSlotName.SLOT_1, - "1-again": DeckSlotName.SLOT_1, - }, - hardware_by_module_id={ - "1": HardwareModule( - serial_number="serial-number-1", - definition=ModuleDefinition.construct( # type: ignore[call-arg] - model=ModuleModel.TEMPERATURE_MODULE_V1 - ), - ), - "1-again": HardwareModule( - serial_number="serial-number-1-again", - definition=ModuleDefinition.construct( # type: ignore[call-arg] - model=ModuleModel.TEMPERATURE_MODULE_V1 - ), - ), - }, - ) - - assert subject.get_by_slot(DeckSlotName.SLOT_1, {"1"}) == LoadedModule( - id="1", - location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), - model=ModuleModel.TEMPERATURE_MODULE_V1, - serialNumber="serial-number-1", - ) - - @pytest.mark.parametrize( argnames=["mount", "target_slot", "expected_result"], argvalues=[ @@ -1753,14 +1724,14 @@ def test_is_edge_move_unsafe( lazy_fixture("thermocycler_v2_def"), LabwareMovementOffsetData( pickUpOffset=LabwareOffsetVector(x=0, y=0, z=4.6), - dropOffset=LabwareOffsetVector(x=0, y=0, z=4.6), + dropOffset=LabwareOffsetVector(x=0, y=0, z=5.6), ), ), ( lazy_fixture("heater_shaker_v1_def"), LabwareMovementOffsetData( pickUpOffset=LabwareOffsetVector(x=0, y=0, z=0), - dropOffset=LabwareOffsetVector(x=0, y=0, z=0.5), + dropOffset=LabwareOffsetVector(x=0, y=0, z=1.0), ), ), ( @@ -1789,3 +1760,35 @@ def test_get_default_gripper_offsets( }, ) assert subject.get_default_gripper_offsets("module-1") == expected_offset_data + + +@pytest.mark.parametrize( + argnames=["deck_type", "slot_name", "expected_highest_z"], + argvalues=[ + (DeckType.OT2_STANDARD, DeckSlotName.SLOT_1, 84), + (DeckType.OT3_STANDARD, DeckSlotName.SLOT_D1, 12.91), + ], +) +def test_get_module_highest_z( + tempdeck_v2_def: ModuleDefinition, + deck_type: DeckType, + slot_name: DeckSlotName, + expected_highest_z: float, +) -> None: + """It should get the highest z point of the module.""" + subject = make_module_view( + slot_by_module_id={"module-id": slot_name}, + requested_model_by_module_id={ + "module-id": ModuleModel.TEMPERATURE_MODULE_V2, + }, + hardware_by_module_id={ + "module-id": HardwareModule( + serial_number="module-serial", + definition=tempdeck_v2_def, + ) + }, + ) + assert isclose( + subject.get_module_highest_z(module_id="module-id", deck_type=deck_type), + expected_highest_z, + ) diff --git a/api/tests/opentrons/protocol_engine/state/test_motion_view.py b/api/tests/opentrons/protocol_engine/state/test_motion_view.py index 19680688644..61ec01262f3 100644 --- a/api/tests/opentrons/protocol_engine/state/test_motion_view.py +++ b/api/tests/opentrons/protocol_engine/state/test_motion_view.py @@ -16,12 +16,15 @@ LoadedPipette, DeckSlotLocation, CurrentWell, + CurrentAddressableArea, MotorAxis, + AddressableOffsetVector, ) from opentrons.protocol_engine.state import PipetteLocationData, move_types from opentrons.protocol_engine.state.config import Config from opentrons.protocol_engine.state.labware import LabwareView from opentrons.protocol_engine.state.pipettes import PipetteView +from opentrons.protocol_engine.state.addressable_areas import AddressableAreaView from opentrons.protocol_engine.state.geometry import GeometryView from opentrons.protocol_engine.state.motion import MotionView from opentrons.protocol_engine.state.modules import ModuleView @@ -60,6 +63,7 @@ def subject( mock_engine_config: Config, labware_view: LabwareView, pipette_view: PipetteView, + addressable_area_view: AddressableAreaView, geometry_view: GeometryView, mock_module_view: ModuleView, ) -> MotionView: @@ -68,6 +72,7 @@ def subject( config=mock_engine_config, labware_view=labware_view, pipette_view=pipette_view, + addressable_area_view=addressable_area_view, geometry_view=geometry_view, module_view=mock_module_view, ) @@ -79,7 +84,7 @@ def test_get_pipette_location_with_no_current_location( subject: MotionView, ) -> None: """It should return mount and critical_point=None if no location.""" - decoy.when(pipette_view.get_current_well()).then_return(None) + decoy.when(pipette_view.get_current_location()).then_return(None) decoy.when(pipette_view.get("pipette-id")).then_return( LoadedPipette( @@ -94,14 +99,14 @@ def test_get_pipette_location_with_no_current_location( assert result == PipetteLocationData(mount=MountType.LEFT, critical_point=None) -def test_get_pipette_location_with_current_location_with_quirks( +def test_get_pipette_location_with_current_location_with_y_center( decoy: Decoy, labware_view: LabwareView, pipette_view: PipetteView, subject: MotionView, ) -> None: - """It should return cp=XY_CENTER if location labware has center quirk.""" - decoy.when(pipette_view.get_current_well()).then_return( + """It should return cp=Y_CENTER if location labware requests.""" + decoy.when(pipette_view.get_current_location()).then_return( CurrentWell(pipette_id="pipette-id", labware_id="reservoir-id", well_name="A1") ) @@ -114,9 +119,41 @@ def test_get_pipette_location_with_current_location_with_quirks( ) decoy.when( - labware_view.get_has_quirk( + labware_view.get_should_center_column_on_target_well( + "reservoir-id", + ) + ).then_return(True) + + result = subject.get_pipette_location("pipette-id") + + assert result == PipetteLocationData( + mount=MountType.RIGHT, + critical_point=CriticalPoint.Y_CENTER, + ) + + +def test_get_pipette_location_with_current_location_with_xy_center( + decoy: Decoy, + labware_view: LabwareView, + pipette_view: PipetteView, + subject: MotionView, +) -> None: + """It should return cp=XY_CENTER if location labware requests.""" + decoy.when(pipette_view.get_current_location()).then_return( + CurrentWell(pipette_id="pipette-id", labware_id="reservoir-id", well_name="A1") + ) + + decoy.when(pipette_view.get("pipette-id")).then_return( + LoadedPipette( + id="pipette-id", + mount=MountType.RIGHT, + pipetteName=PipetteNameType.P300_SINGLE, + ) + ) + + decoy.when( + labware_view.get_should_center_pipette_on_target_well( "reservoir-id", - "centerMultichannelOnWells", ) ).then_return(True) @@ -135,7 +172,7 @@ def test_get_pipette_location_with_current_location_different_pipette( subject: MotionView, ) -> None: """It should return mount and cp=None if location used other pipette.""" - decoy.when(pipette_view.get_current_well()).then_return( + decoy.when(pipette_view.get_current_location()).then_return( CurrentWell( pipette_id="other-pipette-id", labware_id="reservoir-id", @@ -152,9 +189,14 @@ def test_get_pipette_location_with_current_location_different_pipette( ) decoy.when( - labware_view.get_has_quirk( + labware_view.get_should_center_column_on_target_well( + "reservoir-id", + ) + ).then_return(False) + + decoy.when( + labware_view.get_should_center_pipette_on_target_well( "reservoir-id", - "centerMultichannelOnWells", ) ).then_return(False) @@ -166,13 +208,13 @@ def test_get_pipette_location_with_current_location_different_pipette( ) -def test_get_pipette_location_override_current_location( +def test_get_pipette_location_override_current_location_xy_center( decoy: Decoy, labware_view: LabwareView, pipette_view: PipetteView, subject: MotionView, ) -> None: - """It should calculate pipette location from a passed in deck location.""" + """It should calculate pipette location from a passed in deck location with xy override.""" current_well = CurrentWell( pipette_id="pipette-id", labware_id="reservoir-id", @@ -188,15 +230,14 @@ def test_get_pipette_location_override_current_location( ) decoy.when( - labware_view.get_has_quirk( + labware_view.get_should_center_pipette_on_target_well( "reservoir-id", - "centerMultichannelOnWells", ) ).then_return(True) result = subject.get_pipette_location( pipette_id="pipette-id", - current_well=current_well, + current_location=current_well, ) assert result == PipetteLocationData( @@ -205,7 +246,127 @@ def test_get_pipette_location_override_current_location( ) -def test_get_movement_waypoints_to_well( +def test_get_pipette_location_override_current_location_y_center( + decoy: Decoy, + labware_view: LabwareView, + pipette_view: PipetteView, + subject: MotionView, +) -> None: + """It should calculate pipette location from a passed in deck location with xy override.""" + current_well = CurrentWell( + pipette_id="pipette-id", + labware_id="reservoir-id", + well_name="A1", + ) + + decoy.when(pipette_view.get("pipette-id")).then_return( + LoadedPipette( + id="pipette-id", + mount=MountType.RIGHT, + pipetteName=PipetteNameType.P300_SINGLE, + ) + ) + + decoy.when( + labware_view.get_should_center_column_on_target_well( + "reservoir-id", + ) + ).then_return(True) + + result = subject.get_pipette_location( + pipette_id="pipette-id", + current_location=current_well, + ) + + assert result == PipetteLocationData( + mount=MountType.RIGHT, + critical_point=CriticalPoint.Y_CENTER, + ) + + +def test_get_movement_waypoints_to_well_for_y_center( + decoy: Decoy, + labware_view: LabwareView, + pipette_view: PipetteView, + geometry_view: GeometryView, + mock_module_view: ModuleView, + subject: MotionView, +) -> None: + """It should call get_waypoints() with the correct args to move to a well.""" + location = CurrentWell(pipette_id="123", labware_id="456", well_name="abc") + + decoy.when(pipette_view.get_current_location()).then_return(location) + + decoy.when( + labware_view.get_should_center_column_on_target_well( + "labware-id", + ) + ).then_return(True) + decoy.when( + labware_view.get_should_center_pipette_on_target_well( + "labware-id", + ) + ).then_return(False) + + decoy.when( + geometry_view.get_well_position("labware-id", "well-name", WellLocation()) + ).then_return(Point(x=4, y=5, z=6)) + + decoy.when( + move_types.get_move_type_to_well( + "pipette-id", "labware-id", "well-name", location, True + ) + ).then_return(motion_planning.MoveType.GENERAL_ARC) + decoy.when( + geometry_view.get_min_travel_z("pipette-id", "labware-id", location, 123) + ).then_return(42.0) + + decoy.when(geometry_view.get_ancestor_slot_name("labware-id")).then_return( + DeckSlotName.SLOT_2 + ) + + decoy.when( + geometry_view.get_extra_waypoints(location, DeckSlotName.SLOT_2) + ).then_return([(456, 789)]) + + waypoints = [ + motion_planning.Waypoint( + position=Point(1, 2, 3), critical_point=CriticalPoint.Y_CENTER + ), + motion_planning.Waypoint( + position=Point(4, 5, 6), critical_point=CriticalPoint.MOUNT + ), + ] + + decoy.when( + motion_planning.get_waypoints( + move_type=motion_planning.MoveType.GENERAL_ARC, + origin=Point(x=1, y=2, z=3), + origin_cp=CriticalPoint.MOUNT, + max_travel_z=1337, + min_travel_z=42, + dest=Point(x=4, y=5, z=6), + dest_cp=CriticalPoint.Y_CENTER, + xy_waypoints=[(456, 789)], + ) + ).then_return(waypoints) + + result = subject.get_movement_waypoints_to_well( + pipette_id="pipette-id", + labware_id="labware-id", + well_name="well-name", + well_location=WellLocation(), + origin=Point(x=1, y=2, z=3), + origin_cp=CriticalPoint.MOUNT, + max_travel_z=1337, + force_direct=True, + minimum_z_height=123, + ) + + assert result == waypoints + + +def test_get_movement_waypoints_to_well_for_xy_center( decoy: Decoy, labware_view: LabwareView, pipette_view: PipetteView, @@ -216,9 +377,17 @@ def test_get_movement_waypoints_to_well( """It should call get_waypoints() with the correct args to move to a well.""" location = CurrentWell(pipette_id="123", labware_id="456", well_name="abc") - decoy.when(pipette_view.get_current_well()).then_return(location) + decoy.when(pipette_view.get_current_location()).then_return(location) + decoy.when( - labware_view.get_has_quirk("labware-id", "centerMultichannelOnWells") + labware_view.get_should_center_column_on_target_well( + "labware-id", + ) + ).then_return(False) + decoy.when( + labware_view.get_should_center_pipette_on_target_well( + "labware-id", + ) ).then_return(True) decoy.when( @@ -233,10 +402,15 @@ def test_get_movement_waypoints_to_well( decoy.when( geometry_view.get_min_travel_z("pipette-id", "labware-id", location, 123) ).then_return(42.0) - decoy.when(geometry_view.get_extra_waypoints("labware-id", location)).then_return( - [(456, 789)] + + decoy.when(geometry_view.get_ancestor_slot_name("labware-id")).then_return( + DeckSlotName.SLOT_2 ) + decoy.when( + geometry_view.get_extra_waypoints(location, DeckSlotName.SLOT_2) + ).then_return([(456, 789)]) + waypoints = [ motion_planning.Waypoint( position=Point(1, 2, 3), critical_point=CriticalPoint.XY_CENTER @@ -288,7 +462,7 @@ def test_get_movement_waypoints_to_well_raises( well_location=None, ) ).then_return(Point(x=4, y=5, z=6)) - decoy.when(pipette_view.get_current_well()).then_return(None) + decoy.when(pipette_view.get_current_location()).then_return(None) decoy.when( geometry_view.get_min_travel_z("pipette-id", "labware-id", None, None) ).then_return(456) @@ -326,6 +500,196 @@ def test_get_movement_waypoints_to_well_raises( ) +def test_get_movement_waypoints_to_addressable_area( + decoy: Decoy, + pipette_view: PipetteView, + addressable_area_view: AddressableAreaView, + geometry_view: GeometryView, + subject: MotionView, +) -> None: + """It should call get_waypoints() with the correct args to move to an addressable area.""" + location = CurrentAddressableArea(pipette_id="123", addressable_area_name="abc") + + decoy.when(pipette_view.get_current_location()).then_return(location) + decoy.when( + addressable_area_view.get_addressable_area_move_to_location("area-name") + ).then_return(Point(x=3, y=3, z=3)) + decoy.when(geometry_view.get_all_obstacle_highest_z()).then_return(42) + + decoy.when( + addressable_area_view.get_addressable_area_base_slot("area-name") + ).then_return(DeckSlotName.SLOT_2) + + decoy.when( + geometry_view.get_extra_waypoints(location, DeckSlotName.SLOT_2) + ).then_return([]) + + waypoints = [ + motion_planning.Waypoint( + position=Point(1, 2, 3), critical_point=CriticalPoint.XY_CENTER + ), + motion_planning.Waypoint( + position=Point(4, 5, 6), critical_point=CriticalPoint.MOUNT + ), + ] + + decoy.when( + motion_planning.get_waypoints( + move_type=motion_planning.MoveType.DIRECT, + origin=Point(x=1, y=2, z=3), + origin_cp=CriticalPoint.MOUNT, + max_travel_z=1337, + min_travel_z=123, + dest=Point(x=4, y=5, z=6), + dest_cp=CriticalPoint.XY_CENTER, + xy_waypoints=[], + ) + ).then_return(waypoints) + + result = subject.get_movement_waypoints_to_addressable_area( + addressable_area_name="area-name", + offset=AddressableOffsetVector(x=1, y=2, z=3), + origin=Point(x=1, y=2, z=3), + origin_cp=CriticalPoint.MOUNT, + max_travel_z=1337, + force_direct=True, + minimum_z_height=123, + ignore_tip_configuration=False, + ) + + assert result == waypoints + + +def test_move_to_moveable_trash_addressable_area( + decoy: Decoy, + pipette_view: PipetteView, + addressable_area_view: AddressableAreaView, + geometry_view: GeometryView, + subject: MotionView, +) -> None: + """Ensure that a move request to a moveableTrash addressable utilizes the Instrument Center critical point.""" + location = CurrentAddressableArea( + pipette_id="123", addressable_area_name="moveableTrashA1" + ) + + decoy.when(pipette_view.get_current_location()).then_return(location) + decoy.when( + addressable_area_view.get_addressable_area_move_to_location("moveableTrashA1") + ).then_return(Point(x=3, y=3, z=3)) + decoy.when(geometry_view.get_all_obstacle_highest_z()).then_return(42) + + decoy.when( + addressable_area_view.get_addressable_area_base_slot("moveableTrashA1") + ).then_return(DeckSlotName.SLOT_1) + + decoy.when( + geometry_view.get_extra_waypoints(location, DeckSlotName.SLOT_1) + ).then_return([]) + + waypoints = [ + motion_planning.Waypoint( + position=Point(1, 2, 3), critical_point=CriticalPoint.INSTRUMENT_XY_CENTER + ) + ] + + decoy.when( + motion_planning.get_waypoints( + move_type=motion_planning.MoveType.DIRECT, + origin=Point(x=1, y=2, z=3), + origin_cp=CriticalPoint.MOUNT, + max_travel_z=1337, + min_travel_z=123, + dest=Point(x=4, y=5, z=6), + dest_cp=CriticalPoint.INSTRUMENT_XY_CENTER, + xy_waypoints=[], + ) + ).then_return(waypoints) + + result = subject.get_movement_waypoints_to_addressable_area( + addressable_area_name="moveableTrashA1", + offset=AddressableOffsetVector(x=1, y=2, z=3), + origin=Point(x=1, y=2, z=3), + origin_cp=CriticalPoint.MOUNT, + max_travel_z=1337, + force_direct=True, + minimum_z_height=123, + ignore_tip_configuration=True, + ) + + assert result == waypoints + + +def test_get_movement_waypoints_to_addressable_area_stay_at_max_travel_z( + decoy: Decoy, + pipette_view: PipetteView, + addressable_area_view: AddressableAreaView, + geometry_view: GeometryView, + subject: MotionView, +) -> None: + """It should call get_waypoints() with the correct args to move to an addressable area. + + This is the variant where we pass stay_at_max_travel_z=True to the subject. + This should affect the dest argument of get_waypoints(). + """ + location = CurrentAddressableArea(pipette_id="123", addressable_area_name="abc") + + decoy.when(pipette_view.get_current_location()).then_return(location) + decoy.when( + addressable_area_view.get_addressable_area_move_to_location("area-name") + ).then_return(Point(x=3, y=3, z=3)) + decoy.when(geometry_view.get_all_obstacle_highest_z()).then_return(42) + + decoy.when( + addressable_area_view.get_addressable_area_base_slot("area-name") + ).then_return(DeckSlotName.SLOT_2) + + decoy.when( + geometry_view.get_extra_waypoints(location, DeckSlotName.SLOT_2) + ).then_return([]) + + waypoints = [ + motion_planning.Waypoint( + position=Point(1, 2, 3), critical_point=CriticalPoint.XY_CENTER + ), + motion_planning.Waypoint( + position=Point(4, 5, 6), critical_point=CriticalPoint.MOUNT + ), + ] + + decoy.when( + motion_planning.get_waypoints( + move_type=motion_planning.MoveType.DIRECT, + origin=Point(x=1, y=2, z=3), + origin_cp=CriticalPoint.MOUNT, + max_travel_z=1337, + min_travel_z=123, + dest=Point( + x=4, + y=5, + # The max_travel_z arg passed to the subject, plus the offset passed to the subject, + # minus a 1 mm margin as a hack--see comments in the subject. + z=1337 + 3 - 1, + ), + dest_cp=CriticalPoint.XY_CENTER, + xy_waypoints=[], + ) + ).then_return(waypoints) + + result = subject.get_movement_waypoints_to_addressable_area( + addressable_area_name="area-name", + offset=AddressableOffsetVector(x=1, y=2, z=3), + origin=Point(x=1, y=2, z=3), + origin_cp=CriticalPoint.MOUNT, + max_travel_z=1337, + force_direct=True, + minimum_z_height=123, + stay_at_max_travel_z=True, + ignore_tip_configuration=False, + ) + + assert result == waypoints + + @pytest.mark.parametrize( ("direct", "expected_move_type"), [ @@ -359,7 +723,7 @@ def test_get_movement_waypoints_to_coords( dest = Point(4, 5, 6) max_travel_z = 789 - decoy.when(geometry_view.get_all_labware_highest_z()).then_return( + decoy.when(geometry_view.get_all_obstacle_highest_z()).then_return( all_labware_highest_z ) @@ -401,7 +765,7 @@ def test_get_movement_waypoints_to_coords_raises( subject: MotionView, ) -> None: """It should raise FailedToPlanMoveError if motion_planning.get_waypoints raises.""" - decoy.when(geometry_view.get_all_labware_highest_z()).then_return(123) + decoy.when(geometry_view.get_all_obstacle_highest_z()).then_return(123) decoy.when( # TODO(mm, 2022-06-22): We should use decoy.matchers.Anything() for all # arguments. For some reason, Decoy does not match the call unless we @@ -455,7 +819,7 @@ def test_check_pipette_blocking_hs_latch( expected_result: bool, ) -> None: """It should return True if pipette is blocking opening the latch.""" - decoy.when(pipette_view.get_current_well()).then_return( + decoy.when(pipette_view.get_current_location()).then_return( CurrentWell(pipette_id="pipette-id", labware_id="labware-id", well_name="A1") ) @@ -495,7 +859,7 @@ def test_check_pipette_blocking_hs_shake( expected_result: bool, ) -> None: """It should return True if pipette is blocking the h/s from shaking.""" - decoy.when(pipette_view.get_current_well()).then_return( + decoy.when(pipette_view.get_current_location()).then_return( CurrentWell(pipette_id="pipette-id", labware_id="labware-id", well_name="A1") ) @@ -526,8 +890,11 @@ def test_get_touch_tip_waypoints( center_point = Point(1, 2, 3) decoy.when( - labware_view.get_has_quirk("labware-id", "centerMultichannelOnWells") + labware_view.get_should_center_pipette_on_target_well("labware-id") ).then_return(True) + decoy.when( + labware_view.get_should_center_column_on_target_well("labware-id") + ).then_return(False) decoy.when(pipette_view.get_mount("pipette-id")).then_return(MountType.LEFT) diff --git a/api/tests/opentrons/protocol_engine/state/test_pipette_store.py b/api/tests/opentrons/protocol_engine/state/test_pipette_store.py index b4fb8f868ec..a8a03539848 100644 --- a/api/tests/opentrons/protocol_engine/state/test_pipette_store.py +++ b/api/tests/opentrons/protocol_engine/state/test_pipette_store.py @@ -6,7 +6,7 @@ from opentrons_shared_data.pipette.dev_types import PipetteNameType from opentrons_shared_data.pipette import pipette_definition -from opentrons.types import DeckSlotName, MountType +from opentrons.types import DeckSlotName, MountType, Point from opentrons.protocol_engine import commands as cmd from opentrons.protocol_engine.types import ( DeckPoint, @@ -27,6 +27,7 @@ PipetteState, CurrentDeckPoint, StaticPipetteConfig, + BoundingNozzlesOffsets, ) from opentrons.protocol_engine.resources.pipette_data_provider import ( LoadedStaticPipetteData, @@ -35,6 +36,7 @@ from .command_fixtures import ( create_load_pipette_command, create_aspirate_command, + create_aspirate_in_place_command, create_dispense_command, create_dispense_in_place_command, create_pick_up_tip_command, @@ -43,9 +45,11 @@ create_touch_tip_command, create_move_to_well_command, create_blow_out_command, + create_blow_out_in_place_command, create_move_labware_command, create_move_to_coordinates_command, create_move_relative_command, + create_prepare_to_aspirate_command, ) @@ -62,12 +66,13 @@ def test_sets_initial_state(subject: PipetteStore) -> None: assert result == PipetteState( pipettes_by_id={}, aspirated_volume_by_id={}, - current_well=None, + current_location=None, current_deck_point=CurrentDeckPoint(mount=None, deck_point=None), attached_tip_by_id={}, movement_speed_by_id={}, static_config_by_id={}, flow_rates_by_id={}, + nozzle_configuration_by_id={}, ) @@ -161,18 +166,24 @@ def test_handles_drop_tip_in_place(subject: PipetteStore) -> None: assert subject.state.aspirated_volume_by_id["xyz"] is None -def test_pipette_volume_adds_aspirate(subject: PipetteStore) -> None: +@pytest.mark.parametrize( + "aspirate_command", + [ + create_aspirate_command(pipette_id="pipette-id", volume=42, flow_rate=1.23), + create_aspirate_in_place_command( + pipette_id="pipette-id", volume=42, flow_rate=1.23 + ), + ], +) +def test_aspirate_adds_volume( + subject: PipetteStore, aspirate_command: cmd.Command +) -> None: """It should add volume to pipette after an aspirate.""" load_command = create_load_pipette_command( pipette_id="pipette-id", pipette_name=PipetteNameType.P300_SINGLE, mount=MountType.LEFT, ) - aspirate_command = create_aspirate_command( - pipette_id="pipette-id", - volume=42, - flow_rate=1.23, - ) subject.handle_action( UpdateCommandAction(private_result=None, command=load_command) @@ -190,28 +201,6 @@ def test_pipette_volume_adds_aspirate(subject: PipetteStore) -> None: assert subject.state.aspirated_volume_by_id["pipette-id"] == 84 -def test_handles_blow_out(subject: PipetteStore) -> None: - """It should set volume to 0 and set current well.""" - command = create_blow_out_command( - pipette_id="pipette-id", - labware_id="labware-id", - well_name="well-name", - flow_rate=1.23, - ) - - subject.handle_action(UpdateCommandAction(private_result=None, command=command)) - - result = subject.state - - assert result.aspirated_volume_by_id["pipette-id"] is None - - assert result.current_well == CurrentWell( - pipette_id="pipette-id", - labware_id="labware-id", - well_name="well-name", - ) - - @pytest.mark.parametrize( "dispense_command", [ @@ -223,7 +212,7 @@ def test_handles_blow_out(subject: PipetteStore) -> None: ), ], ) -def test_pipette_volume_subtracts_dispense( +def test_dispense_subtracts_volume( subject: PipetteStore, dispense_command: cmd.Command ) -> None: """It should subtract volume from pipette after a dispense.""" @@ -256,11 +245,40 @@ def test_pipette_volume_subtracts_dispense( assert subject.state.aspirated_volume_by_id["pipette-id"] == 0 + +@pytest.mark.parametrize( + "blow_out_command", + [ + create_blow_out_command("pipette-id", 1.23), + create_blow_out_in_place_command("pipette-id", 1.23), + ], +) +def test_blow_out_clears_volume( + subject: PipetteStore, blow_out_command: cmd.Command +) -> None: + """It should wipe out the aspirated volume after a blowOut.""" + load_command = create_load_pipette_command( + pipette_id="pipette-id", + pipette_name=PipetteNameType.P300_SINGLE, + mount=MountType.LEFT, + ) + aspirate_command = create_aspirate_command( + pipette_id="pipette-id", + volume=42, + flow_rate=1.23, + ) + subject.handle_action( - UpdateCommandAction(private_result=None, command=dispense_command) + UpdateCommandAction(private_result=None, command=load_command) + ) + subject.handle_action( + UpdateCommandAction(private_result=None, command=aspirate_command) + ) + subject.handle_action( + UpdateCommandAction(private_result=None, command=blow_out_command) ) - assert subject.state.aspirated_volume_by_id["pipette-id"] == 0 + assert subject.state.aspirated_volume_by_id["pipette-id"] is None @pytest.mark.parametrize( @@ -362,7 +380,7 @@ def test_movement_commands_update_current_well( ) subject.handle_action(UpdateCommandAction(private_result=None, command=command)) - assert subject.state.current_well == expected_location + assert subject.state.current_location == expected_location @pytest.mark.parametrize( @@ -449,7 +467,7 @@ def test_movement_commands_without_well_clear_current_well( ) subject.handle_action(UpdateCommandAction(private_result=None, command=command)) - assert subject.state.current_well is None + assert subject.state.current_location is None @pytest.mark.parametrize( @@ -502,7 +520,7 @@ def test_heater_shaker_command_without_movement( ) subject.handle_action(UpdateCommandAction(private_result=None, command=command)) - assert subject.state.current_well == CurrentWell( + assert subject.state.current_location == CurrentWell( pipette_id="pipette-id", labware_id="labware-id", well_name="well-name", @@ -615,7 +633,7 @@ def test_move_labware_clears_current_well( subject.handle_action( UpdateCommandAction(private_result=None, command=move_labware_command) ) - assert subject.state.current_well == expected_current_well + assert subject.state.current_location == expected_current_well def test_set_movement_speed(subject: PipetteStore) -> None: @@ -664,6 +682,8 @@ def test_add_pipette_config( nominal_tip_overlap={"default": 5}, home_position=8.9, nozzle_offset_z=10.11, + back_left_nozzle_offset=Point(x=1, y=2, z=3), + front_right_nozzle_offset=Point(x=4, y=5, z=6), ), ) subject.handle_action( @@ -681,6 +701,10 @@ def test_add_pipette_config( nominal_tip_overlap={"default": 5}, home_position=8.9, nozzle_offset_z=10.11, + bounding_nozzle_offsets=BoundingNozzlesOffsets( + back_left_offset=Point(x=1, y=2, z=3), + front_right_offset=Point(x=4, y=5, z=6), + ), ) assert subject.state.flow_rates_by_id["pipette-id"].default_aspirate == {"a": 1.0} assert subject.state.flow_rates_by_id["pipette-id"].default_dispense == {"b": 2.0} @@ -855,3 +879,40 @@ def test_homing_commands_clear_deck_point( assert subject.state.current_deck_point == CurrentDeckPoint( mount=None, deck_point=None ) + + +@pytest.mark.parametrize( + "previous", + [ + create_blow_out_command(pipette_id="pipette-id", flow_rate=1.0), + create_dispense_command(pipette_id="pipette-id", volume=10, flow_rate=1.0), + ], +) +def test_prepare_to_aspirate_marks_pipette_ready( + subject: PipetteStore, previous: cmd.Command +) -> None: + """It should mark a pipette as ready to aspirate.""" + load_pipette_command = create_load_pipette_command( + pipette_id="pipette-id", + pipette_name=PipetteNameType.P50_MULTI_FLEX, + mount=MountType.LEFT, + ) + pick_up_tip_command = create_pick_up_tip_command( + pipette_id="pipette-id", tip_volume=42, tip_length=101, tip_diameter=8.0 + ) + subject.handle_action( + UpdateCommandAction(private_result=None, command=load_pipette_command) + ) + subject.handle_action( + UpdateCommandAction(private_result=None, command=pick_up_tip_command) + ) + + subject.handle_action(UpdateCommandAction(private_result=None, command=previous)) + + prepare_to_aspirate_command = create_prepare_to_aspirate_command( + pipette_id="pipette-id" + ) + subject.handle_action( + UpdateCommandAction(private_result=None, command=prepare_to_aspirate_command) + ) + assert subject.state.aspirated_volume_by_id["pipette-id"] == 0.0 diff --git a/api/tests/opentrons/protocol_engine/state/test_pipette_view.py b/api/tests/opentrons/protocol_engine/state/test_pipette_view.py index b76ba20303f..b272ca6aa54 100644 --- a/api/tests/opentrons/protocol_engine/state/test_pipette_view.py +++ b/api/tests/opentrons/protocol_engine/state/test_pipette_view.py @@ -1,12 +1,14 @@ """Tests for pipette state accessors in the protocol_engine state store.""" +from collections import OrderedDict + import pytest -from typing import cast, Dict, List, Optional +from typing import cast, Dict, List, Optional, Tuple, NamedTuple from opentrons_shared_data.pipette.dev_types import PipetteNameType from opentrons_shared_data.pipette import pipette_definition from opentrons.config.defaults_ot2 import Z_RETRACT_DISTANCE -from opentrons.types import MountType, Mount as HwMount +from opentrons.types import MountType, Mount as HwMount, Point from opentrons.hardware_control.dev_types import PipetteDict from opentrons.protocol_engine import errors from opentrons.protocol_engine.types import ( @@ -14,7 +16,7 @@ MotorAxis, FlowRates, DeckPoint, - CurrentWell, + CurrentPipetteLocation, TipGeometry, ) from opentrons.protocol_engine.state.pipettes import ( @@ -23,14 +25,29 @@ CurrentDeckPoint, HardwarePipette, StaticPipetteConfig, + BoundingNozzlesOffsets, ) +from opentrons.hardware_control.nozzle_manager import NozzleMap, NozzleConfigurationType from opentrons.protocol_engine.errors import TipNotAttachedError, PipetteNotLoadedError +from ..pipette_fixtures import ( + NINETY_SIX_ROWS, + NINETY_SIX_COLS, + NINETY_SIX_MAP, + EIGHT_CHANNEL_ROWS, + EIGHT_CHANNEL_COLS, + EIGHT_CHANNEL_MAP, +) + +_SAMPLE_NOZZLE_BOUNDS_OFFSETS = BoundingNozzlesOffsets( + back_left_offset=Point(x=10, y=20, z=30), front_right_offset=Point(x=40, y=50, z=60) +) + def get_pipette_view( pipettes_by_id: Optional[Dict[str, LoadedPipette]] = None, aspirated_volume_by_id: Optional[Dict[str, Optional[float]]] = None, - current_well: Optional[CurrentWell] = None, + current_well: Optional[CurrentPipetteLocation] = None, current_deck_point: CurrentDeckPoint = CurrentDeckPoint( mount=None, deck_point=None ), @@ -38,17 +55,19 @@ def get_pipette_view( movement_speed_by_id: Optional[Dict[str, Optional[float]]] = None, static_config_by_id: Optional[Dict[str, StaticPipetteConfig]] = None, flow_rates_by_id: Optional[Dict[str, FlowRates]] = None, + nozzle_layout_by_id: Optional[Dict[str, Optional[NozzleMap]]] = None, ) -> PipetteView: """Get a pipette view test subject with the specified state.""" state = PipetteState( pipettes_by_id=pipettes_by_id or {}, aspirated_volume_by_id=aspirated_volume_by_id or {}, - current_well=current_well, + current_location=current_well, current_deck_point=current_deck_point, attached_tip_by_id=attached_tip_by_id or {}, movement_speed_by_id=movement_speed_by_id or {}, static_config_by_id=static_config_by_id or {}, flow_rates_by_id=flow_rates_by_id or {}, + nozzle_configuration_by_id=nozzle_layout_by_id or {}, ) return PipetteView(state=state) @@ -248,6 +267,7 @@ def test_get_pipette_working_volume( nominal_tip_overlap={}, home_position=0, nozzle_offset_z=0, + bounding_nozzle_offsets=_SAMPLE_NOZZLE_BOUNDS_OFFSETS, ) }, ) @@ -275,6 +295,7 @@ def test_get_pipette_working_volume_raises_if_tip_volume_is_none( nominal_tip_overlap={}, home_position=0, nozzle_offset_z=0, + bounding_nozzle_offsets=_SAMPLE_NOZZLE_BOUNDS_OFFSETS, ) }, ) @@ -311,6 +332,7 @@ def test_get_pipette_available_volume( nominal_tip_overlap={}, home_position=0, nozzle_offset_z=0, + bounding_nozzle_offsets=_SAMPLE_NOZZLE_BOUNDS_OFFSETS, ), "pipette-id-none": StaticPipetteConfig( min_volume=1, @@ -323,6 +345,7 @@ def test_get_pipette_available_volume( nominal_tip_overlap={}, home_position=0, nozzle_offset_z=0, + bounding_nozzle_offsets=_SAMPLE_NOZZLE_BOUNDS_OFFSETS, ), }, ) @@ -431,6 +454,7 @@ def test_get_static_config( nominal_tip_overlap={}, home_position=10.12, nozzle_offset_z=12.13, + bounding_nozzle_offsets=_SAMPLE_NOZZLE_BOUNDS_OFFSETS, ) subject = get_pipette_view( @@ -478,6 +502,7 @@ def test_get_nominal_tip_overlap( }, home_position=0, nozzle_offset_z=0, + bounding_nozzle_offsets=_SAMPLE_NOZZLE_BOUNDS_OFFSETS, ) subject = get_pipette_view(static_config_by_id={"pipette-id": config}) @@ -509,3 +534,217 @@ def test_get_motor_axes( assert subject.get_z_axis("pipette-id") == expected_z_axis assert subject.get_plunger_axis("pipette-id") == expected_plunger_axis + + +def test_nozzle_configuration_getters() -> None: + """Test that pipette view returns correct nozzle configuration data.""" + nozzle_map = NozzleMap.build( + physical_nozzles=OrderedDict({"A1": Point(0, 0, 0)}), + physical_rows=OrderedDict({"A": ["A1"]}), + physical_columns=OrderedDict({"1": ["A1"]}), + starting_nozzle="A1", + back_left_nozzle="A1", + front_right_nozzle="A1", + ) + subject = get_pipette_view(nozzle_layout_by_id={"pipette-id": nozzle_map}) + assert subject.get_nozzle_layout_type("pipette-id") == NozzleConfigurationType.FULL + assert subject.get_is_partially_configured("pipette-id") is False + assert subject.get_primary_nozzle("pipette-id") == "A1" + + +class _PipetteSpecs(NamedTuple): + tip_length: float + bounding_nozzle_offsets: BoundingNozzlesOffsets + nozzle_map: NozzleMap + destination_position: Point + nozzle_bounds_result: Tuple[Point, Point, Point, Point] + + +_pipette_spec_cases = [ + _PipetteSpecs( + # 8-channel P300, full configuration + tip_length=42, + bounding_nozzle_offsets=BoundingNozzlesOffsets( + back_left_offset=Point(0.0, 31.5, 35.52), + front_right_offset=Point(0.0, -31.5, 35.52), + ), + nozzle_map=NozzleMap.build( + physical_nozzles=EIGHT_CHANNEL_MAP, + physical_rows=EIGHT_CHANNEL_ROWS, + physical_columns=EIGHT_CHANNEL_COLS, + starting_nozzle="A1", + back_left_nozzle="A1", + front_right_nozzle="H1", + ), + destination_position=Point(100, 200, 300), + nozzle_bounds_result=( + ( + Point(x=100.0, y=200.0, z=342.0), + Point(x=100.0, y=137.0, z=342.0), + Point(x=100.0, y=200.0, z=342.0), + Point(x=100.0, y=137.0, z=342.0), + ) + ), + ), + _PipetteSpecs( + # 8-channel P300, single configuration + tip_length=42, + bounding_nozzle_offsets=BoundingNozzlesOffsets( + back_left_offset=Point(0.0, 31.5, 35.52), + front_right_offset=Point(0.0, -31.5, 35.52), + ), + nozzle_map=NozzleMap.build( + physical_nozzles=EIGHT_CHANNEL_MAP, + physical_rows=EIGHT_CHANNEL_ROWS, + physical_columns=EIGHT_CHANNEL_COLS, + starting_nozzle="H1", + back_left_nozzle="H1", + front_right_nozzle="H1", + ), + destination_position=Point(100, 200, 300), + nozzle_bounds_result=( + ( + Point(x=100.0, y=263.0, z=342.0), + Point(x=100.0, y=200.0, z=342.0), + Point(x=100.0, y=263.0, z=342.0), + Point(x=100.0, y=200.0, z=342.0), + ) + ), + ), + _PipetteSpecs( + # 96-channel P1000, full configuration + tip_length=42, + bounding_nozzle_offsets=BoundingNozzlesOffsets( + back_left_offset=Point(-36.0, -25.5, -259.15), + front_right_offset=Point(63.0, -88.5, -259.15), + ), + nozzle_map=NozzleMap.build( + physical_nozzles=NINETY_SIX_MAP, + physical_rows=NINETY_SIX_ROWS, + physical_columns=NINETY_SIX_COLS, + starting_nozzle="A1", + back_left_nozzle="A1", + front_right_nozzle="H12", + ), + destination_position=Point(100, 200, 300), + nozzle_bounds_result=( + ( + Point(x=100.0, y=200.0, z=342.0), + Point(x=199.0, y=137.0, z=342.0), + Point(x=199.0, y=200.0, z=342.0), + Point(x=100.0, y=137.0, z=342.0), + ) + ), + ), + _PipetteSpecs( + # 96-channel P1000, A1 COLUMN configuration + tip_length=42, + bounding_nozzle_offsets=BoundingNozzlesOffsets( + back_left_offset=Point(-36.0, -25.5, -259.15), + front_right_offset=Point(63.0, -88.5, -259.15), + ), + nozzle_map=NozzleMap.build( + physical_nozzles=NINETY_SIX_MAP, + physical_rows=NINETY_SIX_ROWS, + physical_columns=NINETY_SIX_COLS, + starting_nozzle="A1", + back_left_nozzle="A1", + front_right_nozzle="H1", + ), + destination_position=Point(100, 200, 300), + nozzle_bounds_result=( + Point(100, 200, 342), + Point(199, 137, 342), + Point(199, 200, 342), + Point(100, 137, 342), + ), + ), + _PipetteSpecs( + # 96-channel P1000, A12 COLUMN configuration + tip_length=42, + bounding_nozzle_offsets=BoundingNozzlesOffsets( + back_left_offset=Point(-36.0, -25.5, -259.15), + front_right_offset=Point(63.0, -88.5, -259.15), + ), + nozzle_map=NozzleMap.build( + physical_nozzles=NINETY_SIX_MAP, + physical_rows=NINETY_SIX_ROWS, + physical_columns=NINETY_SIX_COLS, + starting_nozzle="A12", + back_left_nozzle="A12", + front_right_nozzle="H12", + ), + destination_position=Point(100, 200, 300), + nozzle_bounds_result=( + Point(1, 200, 342), + Point(100, 137, 342), + Point(100, 200, 342), + Point(1, 137, 342), + ), + ), + _PipetteSpecs( + # 96-channel P1000, ROW configuration + tip_length=42, + bounding_nozzle_offsets=BoundingNozzlesOffsets( + back_left_offset=Point(-36.0, -25.5, -259.15), + front_right_offset=Point(63.0, -88.5, -259.15), + ), + nozzle_map=NozzleMap.build( + physical_nozzles=NINETY_SIX_MAP, + physical_rows=NINETY_SIX_ROWS, + physical_columns=NINETY_SIX_COLS, + starting_nozzle="A1", + back_left_nozzle="A1", + front_right_nozzle="A12", + ), + destination_position=Point(100, 200, 300), + nozzle_bounds_result=( + Point(100, 200, 342), + Point(199, 137, 342), + Point(199, 200, 342), + Point(100, 137, 342), + ), + ), +] + + +@pytest.mark.parametrize( + argnames=_PipetteSpecs._fields, + argvalues=_pipette_spec_cases, +) +def test_get_nozzle_bounds_at_location( + tip_length: float, + bounding_nozzle_offsets: BoundingNozzlesOffsets, + nozzle_map: NozzleMap, + destination_position: Point, + nozzle_bounds_result: Tuple[Point, Point, Point, Point], +) -> None: + """It should get the pipette's nozzle's bounds at the given location.""" + subject = get_pipette_view( + nozzle_layout_by_id={"pipette-id": nozzle_map}, + attached_tip_by_id={ + "pipette-id": TipGeometry(length=tip_length, diameter=123, volume=123), + }, + static_config_by_id={ + "pipette-id": StaticPipetteConfig( + min_volume=1, + max_volume=9001, + channels=5, + model="blah", + display_name="bleh", + serial_number="", + tip_configuration_lookup_table={}, + nominal_tip_overlap={}, + home_position=0, + nozzle_offset_z=0, + bounding_nozzle_offsets=bounding_nozzle_offsets, + ) + }, + ) + assert ( + subject.get_nozzle_bounds_at_specified_move_to_position( + pipette_id="pipette-id", + destination_position=destination_position, + ) + == nozzle_bounds_result + ) diff --git a/api/tests/opentrons/protocol_engine/state/test_state_store.py b/api/tests/opentrons/protocol_engine/state/test_state_store.py index e1b4b115ca6..dd32bbec591 100644 --- a/api/tests/opentrons/protocol_engine/state/test_state_store.py +++ b/api/tests/opentrons/protocol_engine/state/test_state_store.py @@ -5,7 +5,7 @@ import pytest from decoy import Decoy -from opentrons_shared_data.deck.dev_types import DeckDefinitionV3 +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4 from opentrons.protocol_engine.actions import PlayAction from opentrons.protocol_engine.state import State, StateStore, Config @@ -32,7 +32,7 @@ def engine_config() -> Config: @pytest.fixture def subject( change_notifier: ChangeNotifier, - ot2_standard_deck_def: DeckDefinitionV3, + ot2_standard_deck_def: DeckDefinitionV4, engine_config: Config, ) -> StateStore: """Get a StateStore test subject.""" @@ -55,7 +55,11 @@ def test_has_state(subject: StateStore) -> None: def test_state_is_immutable(subject: StateStore) -> None: """It should treat the state as immutable.""" result_1 = subject.state - subject.handle_action(PlayAction(requested_at=datetime(year=2021, month=1, day=1))) + subject.handle_action( + PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ) + ) result_2 = subject.state assert result_1 is not result_2 @@ -68,7 +72,11 @@ def test_notify_on_state_change( ) -> None: """It should notify state changes when actions are handled.""" decoy.verify(change_notifier.notify(), times=0) - subject.handle_action(PlayAction(requested_at=datetime(year=2021, month=1, day=1))) + subject.handle_action( + PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ) + ) decoy.verify(change_notifier.notify(), times=1) @@ -78,7 +86,7 @@ async def test_wait_for_state( subject: StateStore, ) -> None: """It should return an awaitable that signals state changes.""" - check_condition: Callable[..., Optional[str]] = decoy.mock() + check_condition: Callable[..., Optional[str]] = decoy.mock(name="check_condition") decoy.when(check_condition("foo", bar="baz")).then_return( None, @@ -98,7 +106,7 @@ async def test_wait_for_state_short_circuit( change_notifier: ChangeNotifier, ) -> None: """It should short-circuit the change notifier if condition is satisfied.""" - check_condition: Callable[..., Optional[str]] = decoy.mock() + check_condition: Callable[..., Optional[str]] = decoy.mock(name="check_condition") decoy.when(check_condition("foo", bar="baz")).then_return("hello world") @@ -110,14 +118,14 @@ async def test_wait_for_state_short_circuit( async def test_wait_for_already_true(decoy: Decoy, subject: StateStore) -> None: """It should signal immediately if condition is already met.""" - check_condition = decoy.mock() + check_condition = decoy.mock(name="check_condition") decoy.when(check_condition()).then_return(True) await subject.wait_for(check_condition) async def test_wait_for_raises(decoy: Decoy, subject: StateStore) -> None: """It should raise if the condition function raises.""" - check_condition = decoy.mock() + check_condition = decoy.mock(name="check_condition") decoy.when(check_condition()).then_raise(ValueError("oh no")) diff --git a/api/tests/opentrons/protocol_engine/state/test_tip_state.py b/api/tests/opentrons/protocol_engine/state/test_tip_state.py index 44da21f97c6..59be5e927f5 100644 --- a/api/tests/opentrons/protocol_engine/state/test_tip_state.py +++ b/api/tests/opentrons/protocol_engine/state/test_tip_state.py @@ -1,4 +1,6 @@ """Tests for tip state store and selectors.""" +from collections import OrderedDict + import pytest from typing import Optional @@ -9,12 +11,20 @@ ) from opentrons_shared_data.pipette import pipette_definition +from opentrons.hardware_control.nozzle_manager import NozzleMap from opentrons.protocol_engine import actions, commands from opentrons.protocol_engine.state.tips import TipStore, TipView from opentrons.protocol_engine.types import FlowRates, DeckPoint from opentrons.protocol_engine.resources.pipette_data_provider import ( LoadedStaticPipetteData, ) +from opentrons.types import Point + +from ..pipette_fixtures import ( + NINETY_SIX_MAP, + NINETY_SIX_COLS, + NINETY_SIX_ROWS, +) _tip_rack_parameters = LabwareParameters.construct(isTiprack=True) # type: ignore[call-arg] @@ -208,6 +218,8 @@ def test_get_next_tip_skips_picked_up_tip( nominal_tip_overlap={}, nozzle_offset_z=1.23, home_position=4.56, + back_left_nozzle_offset=Point(x=1, y=2, z=3), + front_right_nozzle_offset=Point(x=4, y=5, z=6), ), ) subject.handle_action( @@ -400,6 +412,8 @@ def test_reset_tips( nominal_tip_overlap={}, nozzle_offset_z=1.23, home_position=4.56, + back_left_nozzle_offset=Point(x=1, y=2, z=3), + front_right_nozzle_offset=Point(x=4, y=5, z=6), ), ) @@ -448,6 +462,8 @@ def test_handle_pipette_config_action( nominal_tip_overlap={}, nozzle_offset_z=1.23, home_position=4.56, + back_left_nozzle_offset=Point(x=1, y=2, z=3), + front_right_nozzle_offset=Point(x=4, y=5, z=6), ), ) subject.handle_action( @@ -456,7 +472,8 @@ def test_handle_pipette_config_action( ) ) - assert TipView(subject.state).get_pipette_channels(pipette_id="pipette-id") == 8 + assert TipView(subject.state).get_pipette_channels("pipette-id") == 8 + assert TipView(subject.state).get_pipette_active_channels("pipette-id") == 8 @pytest.mark.parametrize( @@ -527,6 +544,8 @@ def test_drop_tip( nominal_tip_overlap={}, nozzle_offset_z=1.23, home_position=4.56, + back_left_nozzle_offset=Point(x=1, y=2, z=3), + front_right_nozzle_offset=Point(x=4, y=5, z=6), ), ) subject.handle_action( @@ -560,3 +579,179 @@ def test_drop_tip( ) result = TipView(subject.state).get_tip_length("pipette-id") assert result == 0 + + +@pytest.mark.parametrize( + argnames=["nozzle_map", "expected_channels"], + argvalues=[ + ( + NozzleMap.build( + physical_nozzles=OrderedDict({"A1": Point(0, 0, 0)}), + physical_rows=OrderedDict({"A": ["A1"]}), + physical_columns=OrderedDict({"1": ["A1"]}), + starting_nozzle="A1", + back_left_nozzle="A1", + front_right_nozzle="A1", + ), + 1, + ), + ( + NozzleMap.build( + physical_nozzles=NINETY_SIX_MAP, + physical_rows=NINETY_SIX_ROWS, + physical_columns=NINETY_SIX_COLS, + starting_nozzle="A1", + back_left_nozzle="A1", + front_right_nozzle="H12", + ), + 96, + ), + ( + NozzleMap.build( + physical_nozzles=NINETY_SIX_MAP, + physical_rows=NINETY_SIX_ROWS, + physical_columns=NINETY_SIX_COLS, + starting_nozzle="A1", + back_left_nozzle="A1", + front_right_nozzle="E1", + ), + 5, + ), + (None, 9), + ], +) +def test_active_channels( + subject: TipStore, + supported_tip_fixture: pipette_definition.SupportedTipsDefinition, + nozzle_map: NozzleMap, + expected_channels: int, +) -> None: + """Should update active channels after pipette configuration change.""" + # Load pipette to update state + load_pipette_command = commands.LoadPipette.construct( # type: ignore[call-arg] + result=commands.LoadPipetteResult(pipetteId="pipette-id") + ) + load_pipette_private_result = commands.LoadPipettePrivateResult( + pipette_id="pipette-id", + serial_number="pipette-serial", + config=LoadedStaticPipetteData( + channels=9, + max_volume=15, + min_volume=3, + model="gen a", + display_name="display name", + flow_rates=FlowRates( + default_aspirate={}, + default_dispense={}, + default_blow_out={}, + ), + tip_configuration_lookup_table={15: supported_tip_fixture}, + nominal_tip_overlap={}, + nozzle_offset_z=1.23, + home_position=4.56, + back_left_nozzle_offset=Point(x=1, y=2, z=3), + front_right_nozzle_offset=Point(x=4, y=5, z=6), + ), + ) + subject.handle_action( + actions.UpdateCommandAction( + private_result=load_pipette_private_result, command=load_pipette_command + ) + ) + + # Configure nozzle for partial configuration + configure_nozzle_layout_cmd = commands.ConfigureNozzleLayout.construct( # type: ignore[call-arg] + result=commands.ConfigureNozzleLayoutResult() + ) + configure_nozzle_private_result = commands.ConfigureNozzleLayoutPrivateResult( + pipette_id="pipette-id", + nozzle_map=nozzle_map, + ) + subject.handle_action( + actions.UpdateCommandAction( + private_result=configure_nozzle_private_result, + command=configure_nozzle_layout_cmd, + ) + ) + assert ( + TipView(subject.state).get_pipette_active_channels("pipette-id") + == expected_channels + ) + + +def test_next_tip_uses_active_channels( + subject: TipStore, + supported_tip_fixture: pipette_definition.SupportedTipsDefinition, + load_labware_command: commands.LoadLabware, + pick_up_tip_command: commands.PickUpTip, +) -> None: + """Test that tip tracking logic uses pipette's active channels.""" + # Load labware + subject.handle_action( + actions.UpdateCommandAction(private_result=None, command=load_labware_command) + ) + + # Load pipette + load_pipette_command = commands.LoadPipette.construct( # type: ignore[call-arg] + result=commands.LoadPipetteResult(pipetteId="pipette-id") + ) + load_pipette_private_result = commands.LoadPipettePrivateResult( + pipette_id="pipette-id", + serial_number="pipette-serial", + config=LoadedStaticPipetteData( + channels=96, + max_volume=15, + min_volume=3, + model="gen a", + display_name="display name", + flow_rates=FlowRates( + default_aspirate={}, + default_dispense={}, + default_blow_out={}, + ), + tip_configuration_lookup_table={15: supported_tip_fixture}, + nominal_tip_overlap={}, + nozzle_offset_z=1.23, + home_position=4.56, + back_left_nozzle_offset=Point(x=1, y=2, z=3), + front_right_nozzle_offset=Point(x=4, y=5, z=6), + ), + ) + subject.handle_action( + actions.UpdateCommandAction( + private_result=load_pipette_private_result, command=load_pipette_command + ) + ) + + # Configure nozzle for partial configuration + configure_nozzle_layout_cmd = commands.ConfigureNozzleLayout.construct( # type: ignore[call-arg] + result=commands.ConfigureNozzleLayoutResult() + ) + configure_nozzle_private_result = commands.ConfigureNozzleLayoutPrivateResult( + pipette_id="pipette-id", + nozzle_map=NozzleMap.build( + physical_nozzles=NINETY_SIX_MAP, + physical_rows=NINETY_SIX_ROWS, + physical_columns=NINETY_SIX_COLS, + starting_nozzle="A12", + back_left_nozzle="A12", + front_right_nozzle="H12", + ), + ) + subject.handle_action( + actions.UpdateCommandAction( + private_result=configure_nozzle_private_result, + command=configure_nozzle_layout_cmd, + ) + ) + # Pick up partial tips + subject.handle_action( + actions.UpdateCommandAction(command=pick_up_tip_command, private_result=None) + ) + + result = TipView(subject.state).get_next_tip( + labware_id="cool-labware", + num_tips=5, + starting_tip_name=None, + ) + assert result == "A2" diff --git a/api/tests/opentrons/protocol_engine/test_create_protocol_engine.py b/api/tests/opentrons/protocol_engine/test_create_protocol_engine.py index 78454056ca6..b509946de75 100644 --- a/api/tests/opentrons/protocol_engine/test_create_protocol_engine.py +++ b/api/tests/opentrons/protocol_engine/test_create_protocol_engine.py @@ -1,8 +1,8 @@ """Smoke tests for the ProtocolEngine creation factory.""" import pytest -from pytest_lazyfixture import lazy_fixture # type: ignore[import] +from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] -from opentrons_shared_data.deck.dev_types import DeckDefinitionV3 +from opentrons_shared_data.deck.dev_types import DeckDefinitionV4 from opentrons_shared_data.robot.dev_types import RobotType from opentrons.calibration_storage.helpers import uri_from_details @@ -19,6 +19,53 @@ from opentrons.types import DeckSlotName +@pytest.mark.parametrize( + ( + "robot_type", + "deck_type", + "expected_deck_def", + ), + [ + ( + "OT-2 Standard", + DeckType.OT2_STANDARD, + lazy_fixture("ot2_standard_deck_def"), + ), + ( + "OT-2 Standard", + DeckType.OT2_SHORT_TRASH, + lazy_fixture("ot2_short_trash_deck_def"), + ), + ( + "OT-3 Standard", + DeckType.OT3_STANDARD, + lazy_fixture("ot3_standard_deck_def"), + ), + ], +) +async def test_create_engine_initializes_state_with_no_fixed_trash( + hardware_api: HardwareAPI, + robot_type: RobotType, + deck_type: DeckType, + expected_deck_def: DeckDefinitionV4, +) -> None: + """It should load deck geometry data into the store on create.""" + engine = await create_protocol_engine( + hardware_api=hardware_api, + config=EngineConfig( + # robot_type chosen to match hardware_api. + robot_type=robot_type, + deck_type=deck_type, + ), + load_fixed_trash=False, + ) + state = engine.state_view + + assert isinstance(engine, ProtocolEngine) + assert state.labware.get_deck_definition() == expected_deck_def + assert state.labware.get_all() == [] + + @pytest.mark.parametrize( ( "robot_type", @@ -51,11 +98,11 @@ ), ], ) -async def test_create_engine_initializes_state_with_deck_geometry( +async def test_create_engine_initializes_state_with_fixed_trash( hardware_api: HardwareAPI, robot_type: RobotType, deck_type: DeckType, - expected_deck_def: DeckDefinitionV3, + expected_deck_def: DeckDefinitionV4, expected_fixed_trash_def: LabwareDefinition, expected_fixed_trash_slot: DeckSlotName, ) -> None: @@ -67,6 +114,7 @@ async def test_create_engine_initializes_state_with_deck_geometry( robot_type=robot_type, deck_type=deck_type, ), + load_fixed_trash=True, ) state = engine.state_view diff --git a/api/tests/opentrons/protocol_engine/test_plugins.py b/api/tests/opentrons/protocol_engine/test_plugins.py index 0da44ab62bc..471a689e265 100644 --- a/api/tests/opentrons/protocol_engine/test_plugins.py +++ b/api/tests/opentrons/protocol_engine/test_plugins.py @@ -29,7 +29,9 @@ def test_configure( decoy: Decoy, state_view: StateView, action_dispatcher: ActionDispatcher ) -> None: """The engine should be able to configure the plugin.""" - action = PlayAction(requested_at=datetime(year=2021, month=1, day=1)) + action = PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ) subject = _MyPlugin() subject._configure( diff --git a/api/tests/opentrons/protocol_engine/test_protocol_engine.py b/api/tests/opentrons/protocol_engine/test_protocol_engine.py index 8ae068e7480..59772c868ed 100644 --- a/api/tests/opentrons/protocol_engine/test_protocol_engine.py +++ b/api/tests/opentrons/protocol_engine/test_protocol_engine.py @@ -28,6 +28,7 @@ ModuleModel, Liquid, PostRunHardwareState, + AddressableAreaLocation, ) from opentrons.protocol_engine.execution import ( QueueWorker, @@ -43,6 +44,7 @@ ActionDispatcher, AddLabwareOffsetAction, AddLabwareDefinitionAction, + AddAddressableAreaAction, AddLiquidAction, AddModuleAction, PlayAction, @@ -343,15 +345,23 @@ def test_play( ) decoy.when( state_store.commands.validate_action_allowed( - PlayAction(requested_at=datetime(year=2021, month=1, day=1)) + PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ) ), - ).then_return(PlayAction(requested_at=datetime(year=2022, month=2, day=2))) + ).then_return( + PlayAction( + requested_at=datetime(year=2022, month=2, day=2), deck_configuration=[] + ) + ) - subject.play() + subject.play(deck_configuration=[]) decoy.verify( action_dispatcher.dispatch( - PlayAction(requested_at=datetime(year=2022, month=2, day=2)) + PlayAction( + requested_at=datetime(year=2022, month=2, day=2), deck_configuration=[] + ) ), hardware_api.resume(HardwarePauseType.PAUSE), ) @@ -371,17 +381,25 @@ def test_play_blocked_by_door( ) decoy.when( state_store.commands.validate_action_allowed( - PlayAction(requested_at=datetime(year=2021, month=1, day=1)) + PlayAction( + requested_at=datetime(year=2021, month=1, day=1), deck_configuration=[] + ) ), - ).then_return(PlayAction(requested_at=datetime(year=2022, month=2, day=2))) + ).then_return( + PlayAction( + requested_at=datetime(year=2022, month=2, day=2), deck_configuration=[] + ) + ) decoy.when(state_store.commands.get_is_door_blocking()).then_return(True) - subject.play() + subject.play(deck_configuration=[]) decoy.verify(hardware_api.resume(HardwarePauseType.PAUSE), times=0) decoy.verify( action_dispatcher.dispatch( - PlayAction(requested_at=datetime(year=2022, month=2, day=2)) + PlayAction( + requested_at=datetime(year=2022, month=2, day=2), deck_configuration=[] + ) ), hardware_api.pause(HardwarePauseType.PAUSE), ) @@ -670,18 +688,45 @@ async def test_stop( state_store: StateStore, subject: ProtocolEngine, ) -> None: - """It should be able to stop the engine and halt the hardware.""" + """It should be able to stop the engine and run execution.""" + expected_action = StopAction() + + decoy.when( + state_store.commands.validate_action_allowed(expected_action), + ).then_return(expected_action) + + await subject.stop() + + decoy.verify( + action_dispatcher.dispatch(expected_action), + queue_worker.cancel(), + ) + + +async def test_stop_for_legacy_core_protocols( + decoy: Decoy, + action_dispatcher: ActionDispatcher, + queue_worker: QueueWorker, + hardware_stopper: HardwareStopper, + hardware_api: HardwareControlAPI, + state_store: StateStore, + subject: ProtocolEngine, +) -> None: + """It should be able to stop the engine & run execution and cancel movement tasks.""" expected_action = StopAction() decoy.when( state_store.commands.validate_action_allowed(expected_action), ).then_return(expected_action) + decoy.when(hardware_api.is_movement_execution_taskified()).then_return(True) + await subject.stop() decoy.verify( action_dispatcher.dispatch(expected_action), queue_worker.cancel(), + await hardware_api.cancel_execution_and_running_tasks(), ) @@ -878,6 +923,25 @@ def _stub_get_definition_uri(*args: Any, **kwargs: Any) -> None: assert result == "some/definition/uri" +def test_add_addressable_area( + decoy: Decoy, + action_dispatcher: ActionDispatcher, + subject: ProtocolEngine, +) -> None: + """It should dispatch an AddAddressableArea action.""" + subject.add_addressable_area(addressable_area_name="my_funky_area") + + decoy.verify( + action_dispatcher.dispatch( + AddAddressableAreaAction( + addressable_area=AddressableAreaLocation( + addressableAreaName="my_funky_area" + ) + ) + ) + ) + + def test_add_liquid( decoy: Decoy, action_dispatcher: ActionDispatcher, diff --git a/api/tests/opentrons/protocol_reader/_input_file.py b/api/tests/opentrons/protocol_reader/_input_file.py index 85939ecc0bc..d28d994f981 100644 --- a/api/tests/opentrons/protocol_reader/_input_file.py +++ b/api/tests/opentrons/protocol_reader/_input_file.py @@ -2,7 +2,7 @@ from dataclasses import dataclass from io import BytesIO -from typing import IO +from typing import BinaryIO from opentrons.protocol_reader import AbstractInputFile @@ -12,7 +12,7 @@ class InputFile(AbstractInputFile): """An implementation of AbstractInputFile to use for test input.""" filename: str - file: IO[bytes] + file: BinaryIO @classmethod def make(cls, filename: str, contents: bytes) -> InputFile: diff --git a/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_command_mapper.py b/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_command_mapper.py index c5e381e56a1..5baf821ca91 100644 --- a/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_command_mapper.py +++ b/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_command_mapper.py @@ -36,7 +36,7 @@ async def simulate_and_get_commands(protocol_file: Path) -> List[commands.Comman robot_type="OT-2 Standard", protocol_config=protocol_source.config, ) - result = await subject.run(protocol_source) + result = await subject.run(deck_configuration=[], protocol_source=protocol_source) assert result.state_summary.errors == [] assert result.state_summary.status == EngineStatus.SUCCEEDED return result.commands diff --git a/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_custom_labware.py b/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_custom_labware.py index 32456b98af1..e9c9371fe2a 100644 --- a/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_custom_labware.py +++ b/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_custom_labware.py @@ -56,7 +56,7 @@ async def test_legacy_custom_labware(custom_labware_protocol_files: List[Path]) robot_type="OT-2 Standard", protocol_config=protocol_source.config, ) - result = await subject.run(protocol_source) + result = await subject.run(deck_configuration=[], protocol_source=protocol_source) expected_labware = LoadedLabware.construct( id=matchers.Anything(), diff --git a/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_module_commands.py b/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_module_commands.py index dd7d74885fe..b7f80506593 100644 --- a/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_module_commands.py +++ b/api/tests/opentrons/protocol_runner/smoke_tests/test_legacy_module_commands.py @@ -64,7 +64,7 @@ async def test_runner_with_modules_in_legacy_python( robot_type="OT-2 Standard", protocol_config=protocol_source.config, ) - result = await subject.run(protocol_source) + result = await subject.run(deck_configuration=[], protocol_source=protocol_source) commands_result = result.commands assert len(commands_result) == 6 diff --git a/api/tests/opentrons/protocol_runner/smoke_tests/test_protocol_runner.py b/api/tests/opentrons/protocol_runner/smoke_tests/test_protocol_runner.py index 459361a5972..d1925e3f93c 100644 --- a/api/tests/opentrons/protocol_runner/smoke_tests/test_protocol_runner.py +++ b/api/tests/opentrons/protocol_runner/smoke_tests/test_protocol_runner.py @@ -43,7 +43,7 @@ async def test_runner_with_python( robot_type="OT-2 Standard", protocol_config=protocol_source.config, ) - result = await subject.run(protocol_source) + result = await subject.run(deck_configuration=[], protocol_source=protocol_source) commands_result = result.commands pipettes_result = result.state_summary.pipettes labware_result = result.state_summary.labware @@ -114,7 +114,7 @@ async def test_runner_with_json(json_protocol_file: Path) -> None: subject = await create_simulating_runner( robot_type="OT-2 Standard", protocol_config=protocol_source.config ) - result = await subject.run(protocol_source) + result = await subject.run(deck_configuration=[], protocol_source=protocol_source) commands_result = result.commands pipettes_result = result.state_summary.pipettes @@ -176,7 +176,7 @@ async def test_runner_with_legacy_python(legacy_python_protocol_file: Path) -> N robot_type="OT-2 Standard", protocol_config=protocol_source.config, ) - result = await subject.run(protocol_source) + result = await subject.run(deck_configuration=[], protocol_source=protocol_source) commands_result = result.commands pipettes_result = result.state_summary.pipettes @@ -235,7 +235,7 @@ async def test_runner_with_legacy_json(legacy_json_protocol_file: Path) -> None: subject = await create_simulating_runner( robot_type="OT-2 Standard", protocol_config=protocol_source.config ) - result = await subject.run(protocol_source) + result = await subject.run(deck_configuration=[], protocol_source=protocol_source) commands_result = result.commands pipettes_result = result.state_summary.pipettes diff --git a/api/tests/opentrons/protocol_runner/test_json_translator.py b/api/tests/opentrons/protocol_runner/test_json_translator.py index 57d10ec0176..10669b30047 100644 --- a/api/tests/opentrons/protocol_runner/test_json_translator.py +++ b/api/tests/opentrons/protocol_runner/test_json_translator.py @@ -17,6 +17,7 @@ from opentrons_shared_data.protocol.models import ( protocol_schema_v6, protocol_schema_v7, + protocol_schema_v8, Liquid, Labware, Location, @@ -78,6 +79,21 @@ ), ), ), + protocol_schema_v8.Command( + commandType="aspirate", + key=None, + params=protocol_schema_v8.Params( + pipetteId="pipette-id-1", + labwareId="labware-id-2", + volume=1.23, + flowRate=4.56, + wellName="A1", + wellLocation=SD_WellLocation( + origin="bottom", + offset=OffsetVector(x=0, y=0, z=7.89), + ), + ), + ), pe_commands.AspirateCreate( key=None, params=pe_commands.AspirateParams( @@ -125,6 +141,21 @@ ), ), ), + protocol_schema_v8.Command( + commandType="dispense", + key="dispense-key", + params=protocol_schema_v8.Params( + pipetteId="pipette-id-1", + labwareId="labware-id-2", + volume=1.23, + flowRate=4.56, + wellName="A1", + wellLocation=SD_WellLocation( + origin="bottom", + offset=OffsetVector(x=0, y=0, z=7.89), + ), + ), + ), pe_commands.DispenseCreate( key="dispense-key", params=pe_commands.DispenseParams( @@ -157,6 +188,14 @@ wellName="A1", ), ), + protocol_schema_v8.Command( + commandType="dropTip", + params=protocol_schema_v8.Params( + pipetteId="pipette-id-1", + labwareId="labware-id-2", + wellName="A1", + ), + ), pe_commands.DropTipCreate( params=pe_commands.DropTipParams( pipetteId="pipette-id-1", @@ -186,6 +225,14 @@ wellName="A1", ), ), + protocol_schema_v8.Command( + commandType="pickUpTip", + params=protocol_schema_v8.Params( + pipetteId="pipette-id-1", + labwareId="labware-id-2", + wellName="A1", + ), + ), pe_commands.PickUpTipCreate( params=pe_commands.PickUpTipParams( pipetteId="pipette-id-1", @@ -220,6 +267,18 @@ ), ), ), + protocol_schema_v8.Command( + commandType="touchTip", + params=protocol_schema_v8.Params( + pipetteId="pipette-id-1", + labwareId="labware-id-2", + wellName="A1", + wellLocation=SD_WellLocation( + origin="bottom", + offset=OffsetVector(x=0, y=0, z=-1.23), + ), + ), + ), pe_commands.TouchTipCreate( params=pe_commands.TouchTipParams( pipetteId="pipette-id-1", @@ -243,6 +302,12 @@ pipetteId="pipette-id-1", mount="left", pipetteName="p10_single" ), ), + protocol_schema_v8.Command( + commandType="loadPipette", + params=protocol_schema_v8.Params( + pipetteId="pipette-id-1", mount="left", pipetteName="p10_single" + ), + ), pe_commands.LoadPipetteCreate( params=pe_commands.LoadPipetteParams( pipetteId="pipette-id-1", @@ -267,6 +332,14 @@ location=Location(slotName="3"), ), ), + protocol_schema_v8.Command( + commandType="loadModule", + params=protocol_schema_v8.Params( + moduleId="module-id-1", + model="magneticModuleV2", + location=Location(slotName="3"), + ), + ), pe_commands.LoadModuleCreate( params=pe_commands.LoadModuleParams( model=ModuleModel("magneticModuleV2"), @@ -294,6 +367,17 @@ displayName="Trash", ), ), + protocol_schema_v8.Command( + commandType="loadLabware", + params=protocol_schema_v8.Params( + labwareId="labware-id-2", + version=1, + namespace="example", + loadName="foo_8_plate_33ul", + location=Location(moduleId="temperatureModuleId"), + displayName="Trash", + ), + ), pe_commands.LoadLabwareCreate( params=pe_commands.LoadLabwareParams( loadName="foo_8_plate_33ul", @@ -332,6 +416,19 @@ flowRate=1.23, ), ), + protocol_schema_v8.Command( + commandType="blowout", + params=protocol_schema_v8.Params( + pipetteId="pipette-id-1", + labwareId="labware-id-2", + wellName="A1", + wellLocation=SD_WellLocation( + origin="bottom", + offset=OffsetVector(x=0, y=0, z=7.89), + ), + flowRate=1.23, + ), + ), pe_commands.BlowOutCreate( params=pe_commands.BlowOutParams( pipetteId="pipette-id-1", @@ -354,6 +451,10 @@ commandType="delay", params=protocol_schema_v7.Params(waitForResume=True, message="hello world"), ), + protocol_schema_v8.Command( + commandType="delay", + params=protocol_schema_v8.Params(waitForResume=True, message="hello world"), + ), pe_commands.WaitForResumeCreate( params=pe_commands.WaitForResumeParams(message="hello world") ), @@ -367,6 +468,10 @@ commandType="delay", params=protocol_schema_v7.Params(seconds=12.34, message="hello world"), ), + protocol_schema_v8.Command( + commandType="delay", + params=protocol_schema_v8.Params(seconds=12.34, message="hello world"), + ), pe_commands.WaitForDurationCreate( params=pe_commands.WaitForDurationParams( seconds=12.34, @@ -383,6 +488,10 @@ commandType="waitForResume", params=protocol_schema_v7.Params(message="hello world"), ), + protocol_schema_v8.Command( + commandType="waitForResume", + params=protocol_schema_v8.Params(message="hello world"), + ), pe_commands.WaitForResumeCreate( params=pe_commands.WaitForResumeParams(message="hello world") ), @@ -396,6 +505,10 @@ commandType="waitForDuration", params=protocol_schema_v7.Params(seconds=12.34, message="hello world"), ), + protocol_schema_v8.Command( + commandType="waitForDuration", + params=protocol_schema_v8.Params(seconds=12.34, message="hello world"), + ), pe_commands.WaitForDurationCreate( params=pe_commands.WaitForDurationParams( seconds=12.34, @@ -422,6 +535,15 @@ forceDirect=True, ), ), + protocol_schema_v8.Command( + commandType="moveToCoordinates", + params=protocol_schema_v8.Params( + pipetteId="pipette-id-1", + coordinates=OffsetVector(x=1.1, y=2.2, z=3.3), + minimumZHeight=123.4, + forceDirect=True, + ), + ), pe_commands.MoveToCoordinatesCreate( params=pe_commands.MoveToCoordinatesParams( pipetteId="pipette-id-1", @@ -466,6 +588,23 @@ ], ), ), + protocol_schema_v8.Command( + commandType="thermocycler/runProfile", + params=protocol_schema_v8.Params( + moduleId="module-id-2", + blockMaxVolumeUl=1.11, + profile=[ + ProfileStep( + celsius=2.22, + holdSeconds=3.33, + ), + ProfileStep( + celsius=4.44, + holdSeconds=5.55, + ), + ], + ), + ), pe_commands.thermocycler.RunProfileCreate( params=pe_commands.thermocycler.RunProfileParams( moduleId="module-id-2", @@ -500,6 +639,15 @@ volumeByWell={"A1": 32, "B2": 50}, ), ), + protocol_schema_v8.Command( + commandType="loadLiquid", + key=None, + params=protocol_schema_v8.Params( + labwareId="labware-id-2", + liquidId="liquid-id-555", + volumeByWell={"A1": 32, "B2": 50}, + ), + ), pe_commands.LoadLiquidCreate( key=None, params=pe_commands.LoadLiquidParams( @@ -618,13 +766,47 @@ def _make_v7_json_protocol( ) +def _make_v8_json_protocol( + *, + labware_definitions: Dict[str, LabwareDefinition] = { + "example/plate/1": _load_labware_definition_data(), + "example/trash/1": _load_labware_definition_data(), + }, + commands: List[protocol_schema_v8.Command] = [], + liquids: Dict[str, Liquid] = { + "liquid-id-555": Liquid( + displayName="water", description="water description", displayColor="#F00" + ) + }, +) -> protocol_schema_v8.ProtocolSchemaV8: + """Return a minimal json protocol with the given elements.""" + return protocol_schema_v8.ProtocolSchemaV8( + otSharedSchema="#/protocol/schemas/8", + schemaVersion=8, + metadata=SD_Metadata(), + robot=Robot( + model="OT-2 Standard", + deckId="ot2_standard", + ), + labwareDefinitions=labware_definitions, + labwareDefinitionSchemaId="opentronsLabwareSchemaV2", + commandSchemaId="opentronsCommandSchemaV8", + commands=commands, + liquidSchemaId="opentronsLiquidSchemaV1", + liquids=liquids, + commandAnnotationSchemaId="opentronsCommandAnnotationSchemaV1", + commandAnnotations=[], + ) + + @pytest.mark.parametrize( - "test_v6_input, test_v7_input,expected_output", VALID_TEST_PARAMS + "test_v6_input,test_v7_input,test_v8_input,expected_output", VALID_TEST_PARAMS ) def test_load_command( subject: JsonTranslator, test_v6_input: protocol_schema_v6.Command, test_v7_input: protocol_schema_v7.Command, + test_v8_input: protocol_schema_v8.Command, expected_output: pe_commands.CommandCreate, ) -> None: """Test translating v6 commands to protocol engine commands.""" @@ -634,8 +816,12 @@ def test_load_command( v7_output = subject.translate_commands( _make_v7_json_protocol(commands=[test_v7_input]) ) + v8_output = subject.translate_commands( + _make_v8_json_protocol(commands=[test_v8_input]) + ) assert v6_output == [expected_output] assert v7_output == [expected_output] + assert v8_output == [expected_output] def test_load_liquid( diff --git a/api/tests/opentrons/protocol_runner/test_legacy_context_plugin.py b/api/tests/opentrons/protocol_runner/test_legacy_context_plugin.py index bb7ae8ec427..e86f959ff2e 100644 --- a/api/tests/opentrons/protocol_runner/test_legacy_context_plugin.py +++ b/api/tests/opentrons/protocol_runner/test_legacy_context_plugin.py @@ -5,14 +5,14 @@ from datetime import datetime from typing import Callable -from opentrons.broker import Broker -from opentrons.equipment_broker import EquipmentBroker from opentrons.commands.types import CommandMessage as LegacyCommand, PauseMessage from opentrons.protocol_engine import ( StateView, actions as pe_actions, commands as pe_commands, ) +from opentrons.legacy_broker import LegacyBroker +from opentrons.util.broker import ReadOnlyBroker from opentrons.protocol_runner.legacy_command_mapper import LegacyCommandMapper from opentrons.protocol_runner.legacy_context_plugin import LegacyContextPlugin @@ -29,15 +29,15 @@ @pytest.fixture -def mock_broker(decoy: Decoy) -> Broker: - """Get a mocked out LegacyProtocolContext dependency.""" - return decoy.mock(cls=Broker) +def mock_legacy_broker(decoy: Decoy) -> LegacyBroker: + """Get a mocked out `broker: LegacyBroker` dependency.""" + return decoy.mock(cls=LegacyBroker) @pytest.fixture -def mock_equipment_broker(decoy: Decoy) -> EquipmentBroker[LegacyLoadInfo]: - """Get a mocked out LegacyProtocolContext dependency.""" - return decoy.mock(cls=EquipmentBroker) +def mock_equipment_broker(decoy: Decoy) -> ReadOnlyBroker[LegacyLoadInfo]: + """Get a mocked out `equipment_broker: Broker` dependency.""" + return decoy.mock(cls=ReadOnlyBroker[LegacyLoadInfo]) @pytest.fixture @@ -60,15 +60,15 @@ def mock_action_dispatcher(decoy: Decoy) -> pe_actions.ActionDispatcher: @pytest.fixture def subject( - mock_broker: Broker, - mock_equipment_broker: EquipmentBroker[LegacyLoadInfo], + mock_legacy_broker: LegacyBroker, + mock_equipment_broker: ReadOnlyBroker[LegacyLoadInfo], mock_legacy_command_mapper: LegacyCommandMapper, mock_state_view: StateView, mock_action_dispatcher: pe_actions.ActionDispatcher, ) -> LegacyContextPlugin: """Get a configured LegacyContextPlugin with its dependencies mocked out.""" plugin = LegacyContextPlugin( - broker=mock_broker, + broker=mock_legacy_broker, equipment_broker=mock_equipment_broker, legacy_command_mapper=mock_legacy_command_mapper, ) @@ -76,35 +76,53 @@ def subject( return plugin +class _ContextManager: + """A placeholder in the shape of a context manager, to pass as a template to `decoy.mock()`.""" + + def __enter__(self) -> None: + raise NotImplementedError() + + def __exit__(self, type: object, value: object, traceback: object) -> None: + raise NotImplementedError() + + async def test_broker_subscribe_unsubscribe( decoy: Decoy, - mock_broker: Broker, - mock_equipment_broker: EquipmentBroker[LegacyLoadInfo], + mock_legacy_broker: LegacyBroker, + mock_equipment_broker: ReadOnlyBroker[LegacyLoadInfo], subject: LegacyContextPlugin, ) -> None: """It should subscribe to the brokers on setup and unsubscribe on teardown.""" - command_broker_unsubscribe: Callable[[], None] = decoy.mock() - equipment_broker_unsubscribe: Callable[[], None] = decoy.mock() + command_broker_unsubscribe: Callable[[], None] = decoy.mock( + name="command_broker_unsubscribe" + ) + equipment_broker_subscription_context = decoy.mock(cls=_ContextManager) decoy.when( - mock_broker.subscribe(topic="command", handler=matchers.Anything()) + mock_legacy_broker.subscribe(topic="command", handler=matchers.Anything()) ).then_return(command_broker_unsubscribe) decoy.when( - mock_equipment_broker.subscribe(callback=matchers.Anything()) - ).then_return(equipment_broker_unsubscribe) + mock_equipment_broker.subscribed(callback=matchers.Anything()) + ).then_return(equipment_broker_subscription_context) subject.setup() await subject.teardown() decoy.verify(command_broker_unsubscribe()) - decoy.verify(equipment_broker_unsubscribe()) + + decoy.verify( + [ + equipment_broker_subscription_context.__enter__(), # type: ignore[func-returns-value] + equipment_broker_subscription_context.__exit__(None, None, None), # type: ignore[func-returns-value] + ] + ) async def test_command_broker_messages( decoy: Decoy, - mock_broker: Broker, - mock_equipment_broker: EquipmentBroker[LegacyLoadInfo], + mock_legacy_broker: LegacyBroker, + mock_equipment_broker: ReadOnlyBroker[LegacyLoadInfo], mock_legacy_command_mapper: LegacyCommandMapper, mock_action_dispatcher: pe_actions.ActionDispatcher, subject: LegacyContextPlugin, @@ -115,11 +133,11 @@ async def test_command_broker_messages( # (instead of Decoy's default `None`) so subject.teardown() works. command_handler_captor = matchers.Captor() decoy.when( - mock_broker.subscribe(topic="command", handler=command_handler_captor) - ).then_return(decoy.mock()) + mock_legacy_broker.subscribe(topic="command", handler=command_handler_captor) + ).then_return(decoy.mock(name="command_broker_unsubscribe")) decoy.when( - mock_equipment_broker.subscribe(callback=matchers.Anything()) - ).then_return(decoy.mock()) + mock_equipment_broker.subscribed(callback=matchers.Anything()) + ).then_enter_with(None) subject.setup() @@ -157,8 +175,8 @@ async def test_command_broker_messages( async def test_equipment_broker_messages( decoy: Decoy, - mock_broker: Broker, - mock_equipment_broker: EquipmentBroker[LegacyLoadInfo], + mock_legacy_broker: LegacyBroker, + mock_equipment_broker: ReadOnlyBroker[LegacyLoadInfo], mock_legacy_command_mapper: LegacyCommandMapper, mock_action_dispatcher: pe_actions.ActionDispatcher, subject: LegacyContextPlugin, @@ -166,15 +184,13 @@ async def test_equipment_broker_messages( ) -> None: """It should dispatch commands from equipment broker messages.""" # Capture the function that the plugin sets up as its labware load callback. - # Also, ensure that all subscribe calls return an actual unsubscribe callable - # (instead of Decoy's default `None`) so subject.teardown() works. labware_handler_captor = matchers.Captor() decoy.when( - mock_broker.subscribe(topic="command", handler=matchers.Anything()) - ).then_return(decoy.mock()) + mock_legacy_broker.subscribe(topic="command", handler=matchers.Anything()) + ).then_return(decoy.mock(name="command_broker_unsubscribe")) decoy.when( - mock_equipment_broker.subscribe(callback=labware_handler_captor) - ).then_return(decoy.mock()) + mock_equipment_broker.subscribed(callback=labware_handler_captor) + ).then_enter_with(None) subject.setup() diff --git a/api/tests/opentrons/protocol_runner/test_protocol_runner.py b/api/tests/opentrons/protocol_runner/test_protocol_runner.py index aa9e36d5740..1a37c05b82a 100644 --- a/api/tests/opentrons/protocol_runner/test_protocol_runner.py +++ b/api/tests/opentrons/protocol_runner/test_protocol_runner.py @@ -1,23 +1,24 @@ """Tests for the PythonAndLegacyRunner, JsonRunner & LiveRunner classes.""" import pytest -from pytest_lazyfixture import lazy_fixture # type: ignore[import] +from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] from decoy import Decoy, matchers from pathlib import Path from typing import List, cast, Optional, Union, Type +from opentrons_shared_data.labware.labware_definition import LabwareDefinition +from opentrons_shared_data.protocol.models import ProtocolSchemaV6, ProtocolSchemaV7 from opentrons_shared_data.protocol.dev_types import ( JsonProtocol as LegacyJsonProtocolDict, ) -from opentrons.broker import Broker -from opentrons.equipment_broker import EquipmentBroker from opentrons.hardware_control import API as HardwareAPI +from opentrons.legacy_broker import LegacyBroker from opentrons.protocol_engine.types import PostRunHardwareState from opentrons.protocols.api_support.types import APIVersion from opentrons.protocols.parse import PythonParseMode -from opentrons_shared_data.protocol.models import ProtocolSchemaV6, ProtocolSchemaV7 -from opentrons_shared_data.labware.labware_definition import LabwareDefinition -from opentrons.protocol_engine import ProtocolEngine, Liquid, commands as pe_commands +from opentrons.util.broker import Broker + from opentrons import protocol_reader +from opentrons.protocol_engine import ProtocolEngine, Liquid, commands as pe_commands from opentrons.protocol_reader import ( ProtocolSource, JsonProtocolConfig, @@ -209,9 +210,9 @@ async def test_play_starts_run( subject: AnyRunner, ) -> None: """It should start a protocol run with play.""" - subject.play() + subject.play(deck_configuration=[]) - decoy.verify(protocol_engine.play(), times=1) + decoy.verify(protocol_engine.play(deck_configuration=[]), times=1) @pytest.mark.parametrize( @@ -298,11 +299,11 @@ async def test_run_json_runner( ) assert json_runner_subject.was_started() is False - await json_runner_subject.run() + await json_runner_subject.run(deck_configuration=[]) assert json_runner_subject.was_started() is True decoy.verify( - protocol_engine.play(), + protocol_engine.play(deck_configuration=[]), task_queue.start(), await task_queue.join(), ) @@ -443,11 +444,12 @@ async def test_load_legacy_python( python_parse_mode=PythonParseMode.ALLOW_LEGACY_METADATA_AND_REQUIREMENTS, ) ).then_return(legacy_protocol) + broker_captor = matchers.Captor() decoy.when( legacy_context_creator.create( protocol=legacy_protocol, - broker=matchers.IsA(Broker), - equipment_broker=matchers.IsA(EquipmentBroker), + broker=broker_captor, + equipment_broker=matchers.IsA(Broker), ) ).then_return(legacy_context) @@ -468,6 +470,7 @@ async def test_load_legacy_python( context=legacy_context, ), ) + assert broker_captor.value is legacy_python_runner_subject.broker async def test_load_python_with_pe_papi_core( @@ -513,9 +516,10 @@ async def test_load_python_with_pe_papi_core( python_parse_mode=PythonParseMode.ALLOW_LEGACY_METADATA_AND_REQUIREMENTS, ) ).then_return(legacy_protocol) + broker_captor = matchers.Captor() decoy.when( legacy_context_creator.create( - protocol=legacy_protocol, broker=None, equipment_broker=None + protocol=legacy_protocol, broker=broker_captor, equipment_broker=None ) ).then_return(legacy_context) @@ -525,6 +529,7 @@ async def test_load_python_with_pe_papi_core( ) decoy.verify(protocol_engine.add_plugin(matchers.IsA(LegacyContextPlugin)), times=0) + assert broker_captor.value is legacy_python_runner_subject.broker async def test_load_legacy_json( @@ -574,8 +579,8 @@ async def test_load_legacy_json( decoy.when( legacy_context_creator.create( legacy_protocol, - broker=matchers.IsA(Broker), - equipment_broker=matchers.IsA(EquipmentBroker), + broker=matchers.IsA(LegacyBroker), + equipment_broker=matchers.IsA(Broker), ) ).then_return(legacy_context) @@ -611,11 +616,11 @@ async def test_run_python_runner( ) assert legacy_python_runner_subject.was_started() is False - await legacy_python_runner_subject.run() + await legacy_python_runner_subject.run(deck_configuration=[]) assert legacy_python_runner_subject.was_started() is True decoy.verify( - protocol_engine.play(), + protocol_engine.play(deck_configuration=[]), task_queue.start(), await task_queue.join(), ) @@ -634,12 +639,12 @@ async def test_run_live_runner( ) assert live_runner_subject.was_started() is False - await live_runner_subject.run() + await live_runner_subject.run(deck_configuration=[]) assert live_runner_subject.was_started() is True decoy.verify( await hardware_api.home(), - protocol_engine.play(), + protocol_engine.play(deck_configuration=[]), task_queue.start(), await task_queue.join(), ) diff --git a/api/tests/opentrons/protocol_runner/test_task_queue.py b/api/tests/opentrons/protocol_runner/test_task_queue.py index 0359a0eb50b..6bf5cb90c7a 100644 --- a/api/tests/opentrons/protocol_runner/test_task_queue.py +++ b/api/tests/opentrons/protocol_runner/test_task_queue.py @@ -6,26 +6,28 @@ async def test_set_run_func(decoy: Decoy) -> None: """It should be able to add a task for the "run" phase.""" - run_func = decoy.mock(is_async=True) - cleanup_func = decoy.mock(is_async=True) + run_func = decoy.mock(name="run_func", is_async=True) + cleanup_func = decoy.mock(name="cleanup_func", is_async=True) - subject = TaskQueue(cleanup_func=cleanup_func) + subject = TaskQueue() # cleanup_func=cleanup_func) + subject.set_cleanup_func(func=cleanup_func) subject.set_run_func(func=run_func) subject.start() await subject.join() decoy.verify( await run_func(), - await cleanup_func(error=None), + await cleanup_func(None), ) async def test_passes_args(decoy: Decoy) -> None: """It should pass kwargs to the run phase function.""" - run_func = decoy.mock(is_async=True) - cleanup_func = decoy.mock(is_async=True) + run_func = decoy.mock(name="run_func", is_async=True) + cleanup_func = decoy.mock(name="cleanup_func", is_async=True) - subject = TaskQueue(cleanup_func=cleanup_func) + subject = TaskQueue() # cleanup_func=cleanup_func) + subject.set_cleanup_func(func=cleanup_func) subject.set_run_func(func=run_func, hello="world") subject.start() await subject.join() @@ -35,24 +37,26 @@ async def test_passes_args(decoy: Decoy) -> None: async def test_cleanup_gets_run_error(decoy: Decoy) -> None: """It should verify "cleanup" func gets error raised in "run" func.""" - run_func = decoy.mock(is_async=True) - cleanup_func = decoy.mock(is_async=True) + run_func = decoy.mock(name="run_func", is_async=True) + cleanup_func = decoy.mock(name="cleanup_func", is_async=True) error = RuntimeError("Oh no!") decoy.when(await run_func()).then_raise(error) - subject = TaskQueue(cleanup_func=cleanup_func) + subject = TaskQueue() # cleanup_func=cleanup_func) + subject.set_cleanup_func(func=cleanup_func) subject.set_run_func(func=run_func) subject.start() await subject.join() - decoy.verify(await cleanup_func(error=error)) + decoy.verify(await cleanup_func(error)) async def test_join_waits_for_start(decoy: Decoy) -> None: """It should wait until the queue is started when join is called.""" - cleanup_func = decoy.mock(is_async=True) - subject = TaskQueue(cleanup_func=cleanup_func) + cleanup_func = decoy.mock(name="cleanup_func", is_async=True) + subject = TaskQueue() # cleanup_func=cleanup_func) + subject.set_cleanup_func(func=cleanup_func) join_task = asyncio.create_task(subject.join()) await asyncio.sleep(0) @@ -64,14 +68,15 @@ async def test_join_waits_for_start(decoy: Decoy) -> None: async def test_start_runs_stuff_once(decoy: Decoy) -> None: """Calling `start` should no-op if already started.""" - run_func = decoy.mock(is_async=True) - cleanup_func = decoy.mock(is_async=True) + run_func = decoy.mock(name="run_func", is_async=True) + cleanup_func = decoy.mock(name="cleanup_func", is_async=True) - subject = TaskQueue(cleanup_func=cleanup_func) + subject = TaskQueue() # leanup_func=cleanup_func) + subject.set_cleanup_func(func=cleanup_func) subject.set_run_func(func=run_func) subject.start() subject.start() await subject.join() decoy.verify(await run_func(), times=1) - decoy.verify(await cleanup_func(error=None), times=1) + decoy.verify(await cleanup_func(None), times=1) diff --git a/api/tests/opentrons/protocols/advanced_control/test_transfers.py b/api/tests/opentrons/protocols/advanced_control/test_transfers.py index 71237286af7..21f6c30dae9 100644 --- a/api/tests/opentrons/protocols/advanced_control/test_transfers.py +++ b/api/tests/opentrons/protocols/advanced_control/test_transfers.py @@ -796,6 +796,81 @@ def test_all_options(_instr_labware): assert xfer_plan_list == exp1 +def test_invalid_air_gap_disposal_sum_distribute(_instr_labware): + _instr_labware["ctx"].home() + lw1 = _instr_labware["lw1"] + lw2 = _instr_labware["lw2"] + # Supply the disposal volume assessment with the instrument followed by a disposal value equal to the max volume + + options = tx.TransferOptions( + transfer=tx.Transfer( + disposal_volume=_instr_labware["instr"].max_volume / 2, + air_gap=_instr_labware["instr"].max_volume / 2, + ) + ) + with pytest.raises(ValueError): + plan = tx.TransferPlan( + 700, + lw1.columns()[0][0], + lw2.rows()[0][1:3], + _instr_labware["instr"], + max_volume=_instr_labware["instr"].hw_pipette["max_volume"], + api_version=_instr_labware["ctx"].api_version, + mode="distribute", + options=options, + ) + # Exhaust the iterator in case it raises the expected exception lazily. + list(plan) + + +def test_invalid_air_gap_distribute(_instr_labware): + _instr_labware["ctx"].home() + lw1 = _instr_labware["lw1"] + lw2 = _instr_labware["lw2"] + # Supply the disposal volume assessment with the instrument followed by a disposal value equal to the max volume + + options = tx.TransferOptions( + transfer=tx.Transfer(air_gap=_instr_labware["instr"].max_volume) + ) + with pytest.raises(ValueError): + plan = tx.TransferPlan( + 700, + lw1.columns()[0][0], + lw2.rows()[0][1:3], + _instr_labware["instr"], + max_volume=_instr_labware["instr"].hw_pipette["max_volume"], + api_version=_instr_labware["ctx"].api_version, + mode="distribute", + options=options, + ) + # Exhaust the iterator in case it raises the expected exception lazily. + list(plan) + + +def test_invalid_disposal_volume_distribute(_instr_labware): + _instr_labware["ctx"].home() + lw1 = _instr_labware["lw1"] + lw2 = _instr_labware["lw2"] + # Supply the disposal volume assessment with the instrument followed by a disposal value equal to the max volume + + options = tx.TransferOptions( + transfer=tx.Transfer(disposal_volume=_instr_labware["instr"].max_volume) + ) + with pytest.raises(ValueError): + plan = tx.TransferPlan( + 700, + lw1.columns()[0][0], + lw2.rows()[0][1:3], + _instr_labware["instr"], + max_volume=_instr_labware["instr"].hw_pipette["max_volume"], + api_version=_instr_labware["ctx"].api_version, + mode="distribute", + options=options, + ) + # Exhaust the iterator in case it raises the expected exception lazily. + list(plan) + + def test_oversized_distribute(_instr_labware): _instr_labware["ctx"].home() lw1 = _instr_labware["lw1"] diff --git a/api/tests/opentrons/protocols/execution/test_execute_python.py b/api/tests/opentrons/protocols/execution/test_execute_python.py index fa84be9a7e7..cc8e7e9b306 100644 --- a/api/tests/opentrons/protocols/execution/test_execute_python.py +++ b/api/tests/opentrons/protocols/execution/test_execute_python.py @@ -35,6 +35,7 @@ def starargs(*args): execute_python._runfunc_ok(starargs) +@pytest.mark.ot2_only @pytest.mark.parametrize("protocol_file", ["testosaur_v2.py"]) def test_execute_ok(protocol, protocol_file, ctx): proto = parse(protocol.text, protocol.filename) diff --git a/api/tests/opentrons/protocols/test_parse.py b/api/tests/opentrons/protocols/test_parse.py index 54899de6117..cc86621601a 100644 --- a/api/tests/opentrons/protocols/test_parse.py +++ b/api/tests/opentrons/protocols/test_parse.py @@ -426,14 +426,19 @@ def test_parse_python_details( assert parsed.text == protocol_source assert isinstance(parsed.text, str) - fname = filename if filename is not None else "" - - assert parsed.filename == fname + assert parsed.filename == filename + assert parsed.contents.co_filename == ( + filename if filename is not None else "" + ) assert parsed.api_level == expected_api_level assert expected_robot_type == expected_robot_type assert parsed.metadata == expected_metadata - assert parsed.contents == compile(protocol_source, filename=fname, mode="exec") + assert parsed.contents == compile( + protocol_source, + filename="", + mode="exec", + ) @pytest.mark.parametrize( @@ -481,7 +486,7 @@ def test_parse_bundle_details(get_bundle_fixture: Callable[..., Any]) -> None: parsed = parse(fixture["binary_zipfile"], filename) assert isinstance(parsed, PythonProtocol) - assert parsed.filename == "protocol.ot2.py" + assert parsed.filename == filename assert parsed.bundled_labware == fixture["bundled_labware"] assert parsed.bundled_python == fixture["bundled_python"] assert parsed.bundled_data == fixture["bundled_data"] diff --git a/api/tests/opentrons/system/test_wifi.py b/api/tests/opentrons/system/test_wifi.py index b6b3a994d68..da807cb2bdb 100644 --- a/api/tests/opentrons/system/test_wifi.py +++ b/api/tests/opentrons/system/test_wifi.py @@ -190,16 +190,16 @@ async def test_key_lifecycle(wifi_keys_tempdir): f.write(str(random.getrandbits(2048))) # TODO(mc, 2021-09-12): use pathlib - with open(path, "rb") as f: # type: ignore[assignment] - add_response = wifi.add_key(fn, f.read()) # type: ignore[arg-type] + with open(path, "rb") as f: + add_response = wifi.add_key(fn, f.read()) assert add_response.created is True assert add_response.key.file == fn results[fn] = add_response # We should not be able to upload a duplicate # TODO(mc, 2021-09-12): use pathlib - with open(os.path.join(source_td, "test1.pem"), "rb") as f: # type: ignore[assignment] - add_response = wifi.add_key("test1.pem", f.read()) # type: ignore[arg-type] + with open(os.path.join(source_td, "test1.pem"), "rb") as f: + add_response = wifi.add_key("test1.pem", f.read()) assert add_response.created is False # We should be able to see them all diff --git a/api/tests/opentrons/test_execute.py b/api/tests/opentrons/test_execute.py index e986fc1ed7c..77563083337 100644 --- a/api/tests/opentrons/test_execute.py +++ b/api/tests/opentrons/test_execute.py @@ -6,9 +6,10 @@ import textwrap import mock from pathlib import Path -from typing import TYPE_CHECKING, Any, Callable, Generator, TextIO, cast +from typing import TYPE_CHECKING, Any, Callable, Generator, List, TextIO, cast import pytest +from _pytest.fixtures import SubRequest from opentrons_shared_data import get_shared_data_root, load_shared_data from opentrons_shared_data.pipette.dev_types import PipetteModel @@ -21,6 +22,7 @@ from opentrons.hardware_control import Controller, api from opentrons.protocol_api.core.engine import ENGINE_CORE_API_VERSION from opentrons.protocols.api_support.types import APIVersion +from opentrons.util import entrypoint_util if TYPE_CHECKING: from tests.opentrons.conftest import Bundle, Protocol @@ -30,13 +32,13 @@ @pytest.fixture(params=[APIVersion(2, 0), ENGINE_CORE_API_VERSION]) -def api_version(request: pytest.FixtureRequest) -> APIVersion: +def api_version(request: SubRequest) -> APIVersion: """Return an API version to test with. Newer API versions execute through Protocol Engine, and older API versions don't. The two codepaths are very different, so we need to test them both. """ - return request.param # type: ignore[attr-defined,no-any-return] + return cast(APIVersion, request.param) @pytest.fixture @@ -59,23 +61,32 @@ async def dummy_delay(self: Any, duration_s: float) -> None: @pytest.mark.parametrize( - ("protocol_file", "expect_run_log"), + ("protocol_file", "expected_entries"), [ - ("testosaur_v2.py", True), - ("testosaur_v2_14.py", False), - # FIXME(mm, 2023-07-20): Support printing the run log when executing new protocols. - # Then, remove this expect_run_log parametrization (it should always be True). - pytest.param( + ( + "testosaur_v2.py", + [ + "Picking up tip from A1 of Opentrons OT-2 96 Tip Rack 1000 µL on 1", + "Aspirating 100.0 uL from A1 of Corning 96 Well Plate 360 µL Flat on 2 at 500.0 uL/sec", + "Dispensing 100.0 uL into B1 of Corning 96 Well Plate 360 µL Flat on 2 at 1000.0 uL/sec", + "Dropping tip into H12 of Opentrons OT-2 96 Tip Rack 1000 µL on 1", + ], + ), + ( "testosaur_v2_14.py", - True, - marks=pytest.mark.xfail(strict=True, raises=NotImplementedError), + [ + "Picking up tip from A1 of Opentrons OT-2 96 Tip Rack 1000 µL on slot 1", + "Aspirating 100.0 uL from A1 of Corning 96 Well Plate 360 µL Flat on slot 2 at 500.0 uL/sec", + "Dispensing 100.0 uL into B1 of Corning 96 Well Plate 360 µL Flat on slot 2 at 1000.0 uL/sec", + "Dropping tip into H12 of Opentrons OT-2 96 Tip Rack 1000 µL on slot 1", + ], ), ], ) def test_execute_function_apiv2( protocol: Protocol, protocol_file: str, - expect_run_log: bool, + expected_entries: List[str], virtual_smoothie_env: None, mock_get_attached_instr: mock.AsyncMock, ) -> None: @@ -109,21 +120,11 @@ def emit_runlog(entry: Any) -> None: nonlocal entries entries.append(entry) - execute.execute( - protocol.filelike, - protocol.filename, - emit_runlog=(emit_runlog if expect_run_log else None), - ) + execute.execute(protocol.filelike, protocol.filename, emit_runlog=emit_runlog) - if expect_run_log: - assert [ - item["payload"]["text"] for item in entries if item["$"] == "before" - ] == [ - "Picking up tip from A1 of Opentrons 96 Tip Rack 1000 µL on 1", - "Aspirating 100.0 uL from A1 of Corning 96 Well Plate 360 µL Flat on 2 at 500.0 uL/sec", - "Dispensing 100.0 uL into B1 of Corning 96 Well Plate 360 µL Flat on 2 at 1000.0 uL/sec", - "Dropping tip into H12 of Opentrons 96 Tip Rack 1000 µL on 1", - ] + assert [ + item["payload"]["text"] for item in entries if item["$"] == "before" + ] == expected_entries def test_execute_function_json_v3( @@ -273,17 +274,17 @@ def emit_runlog(entry: Any) -> None: ) assert [item["payload"]["text"] for item in entries if item["$"] == "before"] == [ "Transferring 1.0 from A1 of FAKE example labware on 1 to A4 of FAKE example labware on 1", - "Picking up tip from A1 of Opentrons 96 Tip Rack 10 µL on 3", + "Picking up tip from A1 of Opentrons OT-2 96 Tip Rack 10 µL on 3", "Aspirating 1.0 uL from A1 of FAKE example labware on 1 at" " 5.0 uL/sec", "Dispensing 1.0 uL into A4 of FAKE example labware on 1 at" " 10.0 uL/sec", "Dropping tip into A1 of Opentrons Fixed Trash on 12", "Transferring 2.0 from A1 of FAKE example labware on 1 to A4 of FAKE example labware on 1", - "Picking up tip from B1 of Opentrons 96 Tip Rack 10 µL on 3", + "Picking up tip from B1 of Opentrons OT-2 96 Tip Rack 10 µL on 3", "Aspirating 2.0 uL from A1 of FAKE example labware on 1 at 5.0 uL/sec", "Dispensing 2.0 uL into A4 of FAKE example labware on 1 at" " 10.0 uL/sec", "Dropping tip into A1 of Opentrons Fixed Trash on 12", "Transferring 3.0 from A1 of FAKE example labware on 1 to A4 of FAKE example labware on 1", - "Picking up tip from C1 of Opentrons 96 Tip Rack 10 µL on 3", + "Picking up tip from C1 of Opentrons OT-2 96 Tip Rack 10 µL on 3", "Aspirating 3.0 uL from A1 of FAKE example labware on 1 at 5.0 uL/sec", "Dispensing 3.0 uL into A4 of FAKE example labware on 1 at" " 10.0 uL/sec", "Dropping tip into A1 of Opentrons Fixed Trash on 12", @@ -358,8 +359,12 @@ def test_jupyter( monkeypatch: pytest.MonkeyPatch, ) -> None: """Putting labware in the Jupyter directory should make it available.""" - monkeypatch.setattr(execute, "IS_ROBOT", True) - monkeypatch.setattr(execute, "JUPYTER_NOTEBOOK_LABWARE_DIR", self.LW_DIR) + # TODO(mm, 2023-10-06): This is monkeypatching a dependency of a dependency, + # which is too deep. + monkeypatch.setattr(entrypoint_util, "IS_ROBOT", True) + monkeypatch.setattr( + entrypoint_util, "JUPYTER_NOTEBOOK_LABWARE_DIR", self.LW_DIR + ) execute.execute(protocol_file=protocol_filelike, protocol_name=protocol_name) @pytest.mark.xfail( @@ -372,8 +377,12 @@ def test_jupyter_override( monkeypatch: pytest.MonkeyPatch, ) -> None: """Passing any custom_labware_paths should prevent searching the Jupyter directory.""" - monkeypatch.setattr(execute, "IS_ROBOT", True) - monkeypatch.setattr(execute, "JUPYTER_NOTEBOOK_LABWARE_DIR", self.LW_DIR) + # TODO(mm, 2023-10-06): This is monkeypatching a dependency of a dependency, + # which is too deep. + monkeypatch.setattr(entrypoint_util, "IS_ROBOT", True) + monkeypatch.setattr( + entrypoint_util, "JUPYTER_NOTEBOOK_LABWARE_DIR", self.LW_DIR + ) with pytest.raises(Exception, match="Labware .+ not found"): execute.execute( protocol_file=protocol_filelike, @@ -388,9 +397,11 @@ def test_jupyter_not_on_filesystem( monkeypatch: pytest.MonkeyPatch, ) -> None: """It should tolerate the Jupyter labware directory not existing on the filesystem.""" - monkeypatch.setattr(execute, "IS_ROBOT", True) + # TODO(mm, 2023-10-06): This is monkeypatching a dependency of a dependency, + # which is too deep. + monkeypatch.setattr(entrypoint_util, "IS_ROBOT", True) monkeypatch.setattr( - execute, "JUPYTER_NOTEBOOK_LABWARE_DIR", HERE / "nosuchdirectory" + entrypoint_util, "JUPYTER_NOTEBOOK_LABWARE_DIR", HERE / "nosuchdirectory" ) with pytest.raises(Exception, match="Labware .+ not found"): execute.execute( @@ -436,9 +447,11 @@ def test_jupyter( self, api_version: APIVersion, monkeypatch: pytest.MonkeyPatch ) -> None: """Putting labware in the Jupyter directory should make it available.""" - monkeypatch.setattr(execute, "IS_ROBOT", True) + # TODO(mm, 2023-10-06): This is monkeypatching a dependency of a dependency, + # which is too deep. + monkeypatch.setattr(entrypoint_util, "IS_ROBOT", True) monkeypatch.setattr( - execute, + entrypoint_util, "JUPYTER_NOTEBOOK_LABWARE_DIR", get_shared_data_root() / self.LW_FIXTURE_DIR, ) @@ -447,20 +460,19 @@ def test_jupyter( load_name=self.LW_LOAD_NAME, location=1, namespace=self.LW_NAMESPACE ) - @pytest.mark.xfail( - strict=True, raises=pytest.fail.Exception - ) # TODO(mm, 2023-07-14): Fix this bug. def test_jupyter_override( self, api_version: APIVersion, monkeypatch: pytest.MonkeyPatch ) -> None: """Passing any extra_labware should prevent searching the Jupyter directory.""" - monkeypatch.setattr(execute, "IS_ROBOT", True) + # TODO(mm, 2023-10-06): This is monkeypatching a dependency of a dependency, + # which is too deep. + monkeypatch.setattr(entrypoint_util, "IS_ROBOT", True) monkeypatch.setattr( - execute, + entrypoint_util, "JUPYTER_NOTEBOOK_LABWARE_DIR", get_shared_data_root() / self.LW_FIXTURE_DIR, ) - context = execute.get_protocol_api(api_version) + context = execute.get_protocol_api(api_version, extra_labware={}) with pytest.raises(Exception, match="Labware .+ not found"): context.load_labware( load_name=self.LW_LOAD_NAME, location=1, namespace=self.LW_NAMESPACE @@ -470,8 +482,11 @@ def test_jupyter_not_on_filesystem( self, api_version: APIVersion, monkeypatch: pytest.MonkeyPatch ) -> None: """It should tolerate the Jupyter labware directory not existing on the filesystem.""" + # TODO(mm, 2023-10-06): This is monkeypatching a dependency of a dependency, + # which is too deep. + monkeypatch.setattr(entrypoint_util, "IS_ROBOT", True) monkeypatch.setattr( - execute, "JUPYTER_NOTEBOOK_LABWARE_DIR", HERE / "nosuchdirectory" + entrypoint_util, "JUPYTER_NOTEBOOK_LABWARE_DIR", HERE / "nosuchdirectory" ) with_nonexistent_jupyter_extra_labware = execute.get_protocol_api(api_version) with pytest.raises(Exception, match="Labware .+ not found"): diff --git a/api/tests/opentrons/broker/test_broker.py b/api/tests/opentrons/test_legacy_broker.py similarity index 83% rename from api/tests/opentrons/broker/test_broker.py rename to api/tests/opentrons/test_legacy_broker.py index 70356e052ce..2351f73e348 100644 --- a/api/tests/opentrons/broker/test_broker.py +++ b/api/tests/opentrons/test_legacy_broker.py @@ -1,10 +1,12 @@ +"""Tests for `LegacyBroker`.""" + from typing import List, NamedTuple, cast from opentrons.commands.types import CommandMessage from opentrons.commands.publisher import CommandPublisher, publish -def my_command(arg1: int, arg2: str = "", arg3: str = "") -> CommandMessage: +def _my_command(arg1: int, arg2: str = "", arg3: str = "") -> CommandMessage: return cast( CommandMessage, { @@ -19,29 +21,30 @@ class _Call(NamedTuple): description: str -class FakeClass(CommandPublisher): +class _FakeClass(CommandPublisher): def __init__(self) -> None: super().__init__(None) - @publish(command=my_command) + @publish(command=_my_command) def method_a(self, arg1: int, arg2: str, arg3: str = "foo") -> int: self.method_b(0) return 100 - @publish(command=my_command) + @publish(command=_my_command) def method_b(self, arg1: int) -> None: return None - @publish(command=my_command) + @publish(command=_my_command) def method_c(self, arg1: int, arg2: str, arg3: str = "bar") -> int: self.method_b(0) return 100 -def test_add_listener() -> None: +def test_legacy_broker() -> None: + """Test subscribing, emitting, receiving, and unsubscribing.""" stack: List[CommandMessage] = [] calls: List[_Call] = [] - fake_obj = FakeClass() + fake_obj = _FakeClass() def on_notify(message: CommandMessage) -> None: assert message["name"] == "command" # type: ignore[comparison-overlap] diff --git a/api/tests/opentrons/test_simulate.py b/api/tests/opentrons/test_simulate.py index 93df57651a9..b4a51838cce 100644 --- a/api/tests/opentrons/test_simulate.py +++ b/api/tests/opentrons/test_simulate.py @@ -5,16 +5,19 @@ import json import textwrap from pathlib import Path -from typing import TYPE_CHECKING, Callable, Generator, TextIO, cast +from typing import TYPE_CHECKING, Callable, Generator, List, TextIO, cast import pytest +from _pytest.fixtures import SubRequest from opentrons_shared_data import get_shared_data_root, load_shared_data from opentrons import simulate, protocols +from opentrons.protocol_api.core.engine import ENGINE_CORE_API_VERSION from opentrons.protocols.types import ApiDeprecationError from opentrons.protocols.api_support.types import APIVersion from opentrons.protocols.execution.errors import ExceptionInProtocolError +from opentrons.util import entrypoint_util if TYPE_CHECKING: from tests.opentrons.conftest import Bundle, Protocol @@ -23,48 +26,80 @@ HERE = Path(__file__).parent -@pytest.fixture( - params=[ - APIVersion(2, 0), - # TODO(mm, 2023-07-14): Enable this for https://opentrons.atlassian.net/browse/RSS-268. - # ENGINE_CORE_API_VERSION, - ] -) -def api_version(request: pytest.FixtureRequest) -> APIVersion: +@pytest.fixture(params=[APIVersion(2, 0), ENGINE_CORE_API_VERSION]) +def api_version(request: SubRequest) -> APIVersion: """Return an API version to test with. Newer API versions execute through Protocol Engine, and older API versions don't. The two codepaths are very different, so we need to test them both. """ - return request.param # type: ignore[attr-defined,no-any-return] + return cast(APIVersion, request.param) @pytest.mark.parametrize( "protocol_file", [ "testosaur_v2.py", - # TODO(mm, 2023-07-14): Resolve this xfail. https://opentrons.atlassian.net/browse/RSS-268 pytest.param( "testosaur_v2_14.py", - marks=pytest.mark.xfail(strict=True, raises=NotImplementedError), + marks=pytest.mark.xfail( + strict=True, + reason=( + "We can't currently get bundle contents" + " from protocols run through Protocol Engine." + ), + ), ), ], ) -def test_simulate_function_apiv2( +def test_simulate_function_apiv2_bundle( protocol: Protocol, protocol_file: str, monkeypatch: pytest.MonkeyPatch, ) -> None: - """Test `simulate()` with a Python file.""" + """Test that `simulate()` returns the expected bundle contents from a Python file.""" monkeypatch.setenv("OT_API_FF_allowBundleCreation", "1") - runlog, bundle = simulate.simulate(protocol.filelike, protocol.filename) - assert isinstance(bundle, protocols.types.BundleContents) - assert [item["payload"]["text"] for item in runlog] == [ - "Picking up tip from A1 of Opentrons 96 Tip Rack 1000 µL on 1", - "Aspirating 100.0 uL from A1 of Corning 96 Well Plate 360 µL Flat on 2 at 500.0 uL/sec", - "Dispensing 100.0 uL into B1 of Corning 96 Well Plate 360 µL Flat on 2 at 1000.0 uL/sec", - "Dropping tip into H12 of Opentrons 96 Tip Rack 1000 µL on 1", - ] + _, bundle_contents = simulate.simulate(protocol.filelike, protocol.filename) + assert isinstance(bundle_contents, protocols.types.BundleContents) + + +@pytest.mark.parametrize("protocol_file", ["testosaur_v2.py", "testosaur_v2_14.py"]) +def test_simulate_without_filename(protocol: Protocol, protocol_file: str) -> None: + """`simulate()` should accept a protocol without a filename.""" + simulate.simulate(protocol.filelike) # Should not raise. + + +@pytest.mark.parametrize( + ("protocol_file", "expected_entries"), + [ + ( + "testosaur_v2.py", + [ + "Picking up tip from A1 of Opentrons OT-2 96 Tip Rack 1000 µL on 1", + "Aspirating 100.0 uL from A1 of Corning 96 Well Plate 360 µL Flat on 2 at 500.0 uL/sec", + "Dispensing 100.0 uL into B1 of Corning 96 Well Plate 360 µL Flat on 2 at 1000.0 uL/sec", + "Dropping tip into H12 of Opentrons OT-2 96 Tip Rack 1000 µL on 1", + ], + ), + ( + "testosaur_v2_14.py", + [ + "Picking up tip from A1 of Opentrons OT-2 96 Tip Rack 1000 µL on slot 1", + "Aspirating 100.0 uL from A1 of Corning 96 Well Plate 360 µL Flat on slot 2 at 500.0 uL/sec", + "Dispensing 100.0 uL into B1 of Corning 96 Well Plate 360 µL Flat on slot 2 at 1000.0 uL/sec", + "Dropping tip into H12 of Opentrons OT-2 96 Tip Rack 1000 µL on slot 1", + ], + ), + ], +) +def test_simulate_function_apiv2_run_log( + protocol: Protocol, + protocol_file: str, + expected_entries: List[str], +) -> None: + """Test that `simulate()` returns the expected run log from a Python file.""" + run_log, _ = simulate.simulate(protocol.filelike, protocol.filename) + assert [item["payload"]["text"] for item in run_log] == expected_entries def test_simulate_function_json( @@ -99,17 +134,17 @@ def test_simulate_function_bundle_apiv2( assert bundle is None assert [item["payload"]["text"] for item in runlog] == [ "Transferring 1.0 from A1 of FAKE example labware on 1 to A4 of FAKE example labware on 1", - "Picking up tip from A1 of Opentrons 96 Tip Rack 10 µL on 3", + "Picking up tip from A1 of Opentrons OT-2 96 Tip Rack 10 µL on 3", "Aspirating 1.0 uL from A1 of FAKE example labware on 1 at 5.0 uL/sec", "Dispensing 1.0 uL into A4 of FAKE example labware on 1 at" " 10.0 uL/sec", "Dropping tip into A1 of Opentrons Fixed Trash on 12", "Transferring 2.0 from A1 of FAKE example labware on 1 to A4 of FAKE example labware on 1", - "Picking up tip from B1 of Opentrons 96 Tip Rack 10 µL on 3", + "Picking up tip from B1 of Opentrons OT-2 96 Tip Rack 10 µL on 3", "Aspirating 2.0 uL from A1 of FAKE example labware on 1 at 5.0 uL/sec", "Dispensing 2.0 uL into A4 of FAKE example labware on 1 at" " 10.0 uL/sec", "Dropping tip into A1 of Opentrons Fixed Trash on 12", "Transferring 3.0 from A1 of FAKE example labware on 1 to A4 of FAKE example labware on 1", - "Picking up tip from C1 of Opentrons 96 Tip Rack 10 µL on 3", + "Picking up tip from C1 of Opentrons OT-2 96 Tip Rack 10 µL on 3", "Aspirating 3.0 uL from A1 of FAKE example labware on 1 at 5.0 uL/sec", "Dispensing 3.0 uL into A4 of FAKE example labware on 1 at" " 10.0 uL/sec", "Dropping tip into A1 of Opentrons Fixed Trash on 12", @@ -195,8 +230,12 @@ def test_jupyter( monkeypatch: pytest.MonkeyPatch, ) -> None: """Putting labware in the Jupyter directory should make it available.""" - monkeypatch.setattr(simulate, "IS_ROBOT", True) - monkeypatch.setattr(simulate, "JUPYTER_NOTEBOOK_LABWARE_DIR", self.LW_DIR) + # TODO(mm, 2023-10-06): This is monkeypatching a dependency of a dependency, + # which is too deep. + monkeypatch.setattr(entrypoint_util, "IS_ROBOT", True) + monkeypatch.setattr( + entrypoint_util, "JUPYTER_NOTEBOOK_LABWARE_DIR", self.LW_DIR + ) simulate.simulate(protocol_file=protocol_filelike, file_name=file_name) @pytest.mark.xfail( @@ -209,8 +248,12 @@ def test_jupyter_override( monkeypatch: pytest.MonkeyPatch, ) -> None: """Passing any custom_labware_paths should prevent searching the Jupyter directory.""" - monkeypatch.setattr(simulate, "IS_ROBOT", True) - monkeypatch.setattr(simulate, "JUPYTER_NOTEBOOK_LABWARE_DIR", self.LW_DIR) + # TODO(mm, 2023-10-06): This is monkeypatching a dependency of a dependency, + # which is too deep. + monkeypatch.setattr(entrypoint_util, "IS_ROBOT", True) + monkeypatch.setattr( + entrypoint_util, "JUPYTER_NOTEBOOK_LABWARE_DIR", self.LW_DIR + ) with pytest.raises(Exception, match="Labware .+ not found"): simulate.simulate( protocol_file=protocol_filelike, @@ -225,14 +268,27 @@ def test_jupyter_not_on_filesystem( monkeypatch: pytest.MonkeyPatch, ) -> None: """It should tolerate the Jupyter labware directory not existing on the filesystem.""" - monkeypatch.setattr(simulate, "IS_ROBOT", True) + # TODO(mm, 2023-10-06): This is monkeypatching a dependency of a dependency, + # which is too deep. + monkeypatch.setattr(entrypoint_util, "IS_ROBOT", True) monkeypatch.setattr( - simulate, "JUPYTER_NOTEBOOK_LABWARE_DIR", HERE / "nosuchdirectory" + entrypoint_util, "JUPYTER_NOTEBOOK_LABWARE_DIR", HERE / "nosuchdirectory" ) with pytest.raises(Exception, match="Labware .+ not found"): simulate.simulate(protocol_file=protocol_filelike, file_name=file_name) +def test_get_protocol_api_usable_without_homing(api_version: APIVersion) -> None: + """You should be able to move the simulated hardware without having to home explicitly. + + https://opentrons.atlassian.net/browse/RQA-1801 + """ + protocol = simulate.get_protocol_api(api_version) + pipette = protocol.load_instrument("p300_single_gen2", mount="left") + tip_rack = protocol.load_labware("opentrons_96_tiprack_300ul", 1) + pipette.pick_up_tip(tip_rack["A1"]) # Should not raise. + + class TestGetProtocolAPILabware: """Tests for making sure get_protocol_api() handles extra labware correctly.""" @@ -268,9 +324,11 @@ def test_jupyter( self, api_version: APIVersion, monkeypatch: pytest.MonkeyPatch ) -> None: """Putting labware in the Jupyter directory should make it available.""" - monkeypatch.setattr(simulate, "IS_ROBOT", True) + # TODO(mm, 2023-10-06): This is monkeypatching a dependency of a dependency, + # which is too deep. + monkeypatch.setattr(entrypoint_util, "IS_ROBOT", True) monkeypatch.setattr( - simulate, + entrypoint_util, "JUPYTER_NOTEBOOK_LABWARE_DIR", get_shared_data_root() / self.LW_FIXTURE_DIR, ) @@ -279,20 +337,19 @@ def test_jupyter( load_name=self.LW_LOAD_NAME, location=1, namespace=self.LW_NAMESPACE ) - @pytest.mark.xfail( - strict=True, raises=pytest.fail.Exception - ) # TODO(mm, 2023-07-14): Fix this bug. def test_jupyter_override( self, api_version: APIVersion, monkeypatch: pytest.MonkeyPatch ) -> None: """Passing any extra_labware should prevent searching the Jupyter directory.""" - monkeypatch.setattr(simulate, "IS_ROBOT", True) + # TODO(mm, 2023-10-06): This is monkeypatching a dependency of a dependency, + # which is too deep. + monkeypatch.setattr(entrypoint_util, "IS_ROBOT", True) monkeypatch.setattr( - simulate, + entrypoint_util, "JUPYTER_NOTEBOOK_LABWARE_DIR", get_shared_data_root() / self.LW_FIXTURE_DIR, ) - context = simulate.get_protocol_api(api_version) + context = simulate.get_protocol_api(api_version, extra_labware={}) with pytest.raises(Exception, match="Labware .+ not found"): context.load_labware( load_name=self.LW_LOAD_NAME, location=1, namespace=self.LW_NAMESPACE @@ -302,8 +359,11 @@ def test_jupyter_not_on_filesystem( self, api_version: APIVersion, monkeypatch: pytest.MonkeyPatch ) -> None: """It should tolerate the Jupyter labware directory not existing on the filesystem.""" + # TODO(mm, 2023-10-06): This is monkeypatching a dependency of a dependency, + # which is too deep. + monkeypatch.setattr(entrypoint_util, "IS_ROBOT", True) monkeypatch.setattr( - simulate, "JUPYTER_NOTEBOOK_LABWARE_DIR", HERE / "nosuchdirectory" + entrypoint_util, "JUPYTER_NOTEBOOK_LABWARE_DIR", HERE / "nosuchdirectory" ) with_nonexistent_jupyter_extra_labware = simulate.get_protocol_api(api_version) with pytest.raises(Exception, match="Labware .+ not found"): diff --git a/api/tests/opentrons/util/__init__.py b/api/tests/opentrons/util/__init__.py index e69de29bb2d..4109783706b 100644 --- a/api/tests/opentrons/util/__init__.py +++ b/api/tests/opentrons/util/__init__.py @@ -0,0 +1 @@ +"""Tests for `opentrons.util`.""" diff --git a/api/tests/opentrons/util/test_async_helpers.py b/api/tests/opentrons/util/test_async_helpers.py index 14f9e1a0436..d33293eb75e 100644 --- a/api/tests/opentrons/util/test_async_helpers.py +++ b/api/tests/opentrons/util/test_async_helpers.py @@ -85,7 +85,7 @@ async def __aexit__( ).result() # The loop should be closed and unusable now that the context manager has exited. - assert loop_in_thread.is_closed + assert loop_in_thread.is_closed() with pytest.raises(RuntimeError, match="Event loop is closed"): loop_in_thread.call_soon_threadsafe(lambda: None) diff --git a/api/tests/opentrons/util/test_broker.py b/api/tests/opentrons/util/test_broker.py new file mode 100644 index 00000000000..35eca32d500 --- /dev/null +++ b/api/tests/opentrons/util/test_broker.py @@ -0,0 +1,58 @@ +"""Unit tests for `opentrons.util.broker`.""" + + +from typing import List + +from opentrons.util.broker import Broker + + +def test_context_manager_subscriptions() -> None: + """Test subscribing, receiving messages, and unsubscribing.""" + subject = Broker[int]() + + received_by_a: List[int] = [] + received_by_b: List[int] = [] + + def callback_a(message: int) -> None: + received_by_a.append(message) + + def callback_b(message: int) -> None: + received_by_b.append(message) + + subject.publish(1) + with subject.subscribed(callback_a): + subject.publish(2) + with subject.subscribed(callback_b): + subject.publish(3) + subject.publish(4) + subject.publish(5) + + assert received_by_a == [2, 3, 4] + assert received_by_b == [3] + + +def test_non_context_manager_subscriptions() -> None: + """Test subscribing, receiving messages, and unsubscribing.""" + subject = Broker[int]() + + received_by_a: List[int] = [] + received_by_b: List[int] = [] + + def callback_a(message: int) -> None: + received_by_a.append(message) + + def callback_b(message: int) -> None: + received_by_b.append(message) + + subject.publish(1) + unsubscribe_a = subject.subscribe(callback_a) + subject.publish(2) + unsubscribe_b = subject.subscribe(callback_b) + subject.publish(3) + unsubscribe_b() + subject.publish(4) + unsubscribe_a() + subject.publish(5) + + assert received_by_a == [2, 3, 4] + assert received_by_b == [3] diff --git a/api/tests/opentrons/util/test_entrypoint_util.py b/api/tests/opentrons/util/test_entrypoint_util.py index 4e82ce0e80f..c30351dec3b 100644 --- a/api/tests/opentrons/util/test_entrypoint_util.py +++ b/api/tests/opentrons/util/test_entrypoint_util.py @@ -1,17 +1,13 @@ -import io import json import os from pathlib import Path from typing import Callable -import pytest - from opentrons_shared_data.labware.dev_types import LabwareDefinition as LabwareDefDict from opentrons.util.entrypoint_util import ( FoundLabware, labware_from_paths, datafiles_from_paths, - copy_file_like, ) @@ -79,70 +75,3 @@ def test_datafiles_from_paths(tmp_path: Path) -> None: "test1": "wait theres a second file???".encode(), "test-file": "this isnt even in a directory".encode(), } - - -class TestCopyFileLike: - """Tests for `copy_file_like()`.""" - - @pytest.fixture(params=["abc", "µ"]) - def source_text(self, request: pytest.FixtureRequest) -> str: - return request.param # type: ignore[attr-defined,no-any-return] - - @pytest.fixture - def source_bytes(self, source_text: str) -> bytes: - return b"\x00\x01\x02\x03\x04" - - @pytest.fixture - def source_path(self, tmp_path: Path) -> Path: - return tmp_path / "source" - - @pytest.fixture - def destination_path(self, tmp_path: Path) -> Path: - return tmp_path / "destination" - - def test_from_text_file( - self, - source_text: str, - source_path: Path, - destination_path: Path, - ) -> None: - """Test that it correctly copies from a text-mode `open()`.""" - source_path.write_text(source_text) - - with open( - source_path, - mode="rt", - ) as source_file: - copy_file_like(source=source_file, destination=destination_path) - - assert destination_path.read_text() == source_text - - def test_from_binary_file( - self, - source_bytes: bytes, - source_path: Path, - destination_path: Path, - ) -> None: - """Test that it correctly copies from a binary-mode `open()`.""" - source_path.write_bytes(source_bytes) - - with open(source_path, mode="rb") as source_file: - copy_file_like(source=source_file, destination=destination_path) - - assert destination_path.read_bytes() == source_bytes - - def test_from_stringio(self, source_text: str, destination_path: Path) -> None: - """Test that it correctly copies from an `io.StringIO`.""" - stringio = io.StringIO(source_text) - - copy_file_like(source=stringio, destination=destination_path) - - assert destination_path.read_text() == source_text - - def test_from_bytesio(self, source_bytes: bytes, destination_path: Path) -> None: - """Test that it correctly copies from an `io.BytesIO`.""" - bytesio = io.BytesIO(source_bytes) - - copy_file_like(source=bytesio, destination=destination_path) - - assert destination_path.read_bytes() == source_bytes diff --git a/api/tests/opentrons/util/test_linal.py b/api/tests/opentrons/util/test_linal.py index fa90bfe9a90..5c186d20903 100755 --- a/api/tests/opentrons/util/test_linal.py +++ b/api/tests/opentrons/util/test_linal.py @@ -2,6 +2,7 @@ from opentrons.util.linal import solve, add_z, apply_transform, solve_attitude from numpy.linalg import inv import numpy as np +from numpy.typing import NDArray def test_solve() -> None: @@ -22,10 +23,10 @@ def test_solve() -> None: X = solve(expected, actual) - expected2 = np.array( + expected2: NDArray[np.double] = np.array( [cos(theta + pi / 2) * scale + 0.5, sin(theta + pi / 2) * scale + 0.25, 1] ) - result = np.dot(X, np.array([[0], [1], [1]])).transpose() # type: ignore[no-untyped-call] + result = np.dot(X, np.array([[0], [1], [1]])).transpose() assert np.isclose(expected2, result).all() @@ -35,9 +36,11 @@ def test_add_z() -> None: y = 10 z = 20 - xy_array = np.array([[1, 0, x], [0, 1, y], [0, 0, 1]]) + xy_array: NDArray[np.double] = np.array([[1, 0, x], [0, 1, y], [0, 0, 1]]) - expected = np.array([[1, 0, 0, x], [0, 1, 0, y], [0, 0, 1, z], [0, 0, 0, 1]]) + expected: NDArray[np.double] = np.array( + [[1, 0, 0, x], [0, 1, 0, y], [0, 0, 1, z], [0, 0, 0, 1]] + ) result = add_z(xy_array, z) assert (result == expected).all() @@ -61,5 +64,5 @@ def test_apply_transform() -> None: expected = (round(x - x_delta, 2), round(y - y_delta, 2), round(z)) - result = apply_transform(inv(transform), (1, 2, 3)) # type: ignore[no-untyped-call] + result = apply_transform(inv(transform), (1, 2, 3)) assert np.isclose(result, expected, atol=0.1).all() diff --git a/app-shell-odd/Makefile b/app-shell-odd/Makefile index 5dd7ca92736..60438b05529 100644 --- a/app-shell-odd/Makefile +++ b/app-shell-odd/Makefile @@ -24,7 +24,7 @@ ssh_opts ?= $(default_ssh_opts) builder := yarn electron-builder \ --config electron-builder.config.js \ --publish never - + electron := yarn electron . \ --devtools \ --log.level.console="debug" \ @@ -48,7 +48,7 @@ setup: .PHONY: clean clean: - shx rm -rf lib dist + shx rm -rf lib dist opentrons-robot-app.tar.gz # artifacts ##################################################################### @@ -56,7 +56,7 @@ clean: .PHONY: lib lib: export NODE_ENV := production lib: - OPENTRONS_PROJECT=$(OPENTRONS_PROJECT) webpack --profile + OPENTRONS_PROJECT=$(OPENTRONS_PROJECT) NODE_OPTIONS=--openssl-legacy-provider webpack --profile .PHONY: deps deps: @@ -75,7 +75,7 @@ push-ot3: dist-ot3 scp $(if $(ssh_key),-i $(ssh_key)) $(ssh_opts) -r ./opentrons-robot-app.tar.gz root@$(host): ssh $(if $(ssh_key),-i $(ssh_key)) $(ssh_opts) root@$(host) "mount -o remount,rw / && systemctl stop opentrons-robot-app && rm -rf /opt/opentrons-app && mkdir -p /opt/opentrons-app" ssh $(if $(ssh_key),-i $(ssh_key)) $(ssh_opts) root@$(host) "tar -xvf opentrons-robot-app.tar.gz -C /opt/opentrons-app/ && mount -o remount,ro / && systemctl start opentrons-robot-app && rm -rf opentrons-robot-app.tar.gz" - rm -rf opentrons-robot-app.tar.gz + # development ##################################################################### @@ -83,5 +83,9 @@ push-ot3: dist-ot3 .PHONY: dev dev: export NODE_ENV := development dev: - webpack + NODE_OPTIONS=--openssl-legacy-provider webpack $(electron) + +.PHONY: test +test: + $(MAKE) -C .. test-js-app-shell-odd diff --git a/app-shell-odd/electron-builder.config.js b/app-shell-odd/electron-builder.config.js index 491e9ddcba7..8613efeb97d 100644 --- a/app-shell-odd/electron-builder.config.js +++ b/app-shell-odd/electron-builder.config.js @@ -2,7 +2,7 @@ module.exports = { appId: 'com.opentrons.odd', - electronVersion: '21.3.1', + electronVersion: '23.3.13', npmRebuild: false, files: [ '**/*', diff --git a/app-shell-odd/package.json b/app-shell-odd/package.json index bf0191b8c48..10e459468b4 100644 --- a/app-shell-odd/package.json +++ b/app-shell-odd/package.json @@ -52,6 +52,7 @@ "get-stream": "5.1.0", "lodash": "4.17.21", "merge-options": "1.0.1", + "mqtt": "4.3.8", "node-fetch": "2.6.7", "node-stream-zip": "1.8.2", "pump": "3.0.0", diff --git a/app-shell-odd/src/config/__fixtures__/index.ts b/app-shell-odd/src/config/__fixtures__/index.ts index b6f6d211253..5e26ddc99ef 100644 --- a/app-shell-odd/src/config/__fixtures__/index.ts +++ b/app-shell-odd/src/config/__fixtures__/index.ts @@ -7,6 +7,8 @@ import type { ConfigV17, ConfigV18, ConfigV19, + ConfigV20, + ConfigV21, } from '@opentrons/app/src/redux/config/types' export const MOCK_CONFIG_V12: ConfigV12 = { @@ -118,3 +120,18 @@ export const MOCK_CONFIG_V19: ConfigV19 = { hasJustUpdated: false, }, } + +export const MOCK_CONFIG_V20: ConfigV20 = { + ...MOCK_CONFIG_V19, + version: 20, + robotSystemUpdate: { + manifestUrls: { + OT2: 'not-used-on-ODD', + }, + }, +} + +export const MOCK_CONFIG_V21: ConfigV21 = { + ...MOCK_CONFIG_V20, + version: 21, +} diff --git a/app-shell-odd/src/config/__tests__/migrate.test.ts b/app-shell-odd/src/config/__tests__/migrate.test.ts index bb197986621..fed83811ce2 100644 --- a/app-shell-odd/src/config/__tests__/migrate.test.ts +++ b/app-shell-odd/src/config/__tests__/migrate.test.ts @@ -8,10 +8,12 @@ import { MOCK_CONFIG_V17, MOCK_CONFIG_V18, MOCK_CONFIG_V19, + MOCK_CONFIG_V20, + MOCK_CONFIG_V21, } from '../__fixtures__' import { migrate } from '../migrate' -const NEWEST_VERSION = 19 +const NEWEST_VERSION = 21 describe('config migration', () => { it('should migrate version 12 to latest', () => { @@ -19,7 +21,7 @@ describe('config migration', () => { const result = migrate(v12Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 13 to latest', () => { @@ -27,7 +29,7 @@ describe('config migration', () => { const result = migrate(v13Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 14 to latest', () => { @@ -35,7 +37,7 @@ describe('config migration', () => { const result = migrate(v14Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 15 to latest', () => { @@ -43,7 +45,7 @@ describe('config migration', () => { const result = migrate(v15Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 16 to latest', () => { @@ -51,7 +53,7 @@ describe('config migration', () => { const result = migrate(v16Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 17 to latest', () => { @@ -59,22 +61,37 @@ describe('config migration', () => { const result = migrate(v17Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) - it('should keep version 18', () => { + it('should migration version 18 to latest', () => { const v18Config = MOCK_CONFIG_V18 const result = migrate(v18Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) - it('should keep version 19', () => { + it('should migration version 19 to latest', () => { const v19Config = MOCK_CONFIG_V19 const result = migrate(v19Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(v19Config) + expect(result).toEqual(MOCK_CONFIG_V21) + }) + + it('should migration version 20 to latest', () => { + const v20Config = MOCK_CONFIG_V20 + const result = migrate(v20Config) + + expect(result.version).toBe(NEWEST_VERSION) + expect(result).toEqual(MOCK_CONFIG_V21) + }) + it('should keep version 21', () => { + const v21Config = MOCK_CONFIG_V21 + const result = migrate(v21Config) + + expect(result.version).toBe(NEWEST_VERSION) + expect(result).toEqual(v21Config) }) }) diff --git a/app-shell-odd/src/config/migrate.ts b/app-shell-odd/src/config/migrate.ts index 48d45f5cc3c..d760ab3db1d 100644 --- a/app-shell-odd/src/config/migrate.ts +++ b/app-shell-odd/src/config/migrate.ts @@ -13,6 +13,8 @@ import type { ConfigV17, ConfigV18, ConfigV19, + ConfigV20, + ConfigV21, } from '@opentrons/app/src/redux/config/types' // format // base config v12 defaults @@ -156,6 +158,33 @@ const toVersion19 = (prevConfig: ConfigV18): ConfigV19 => { return nextConfig } +const toVersion20 = (prevConfig: ConfigV19): ConfigV20 => { + return { + ...prevConfig, + version: 20 as const, + robotSystemUpdate: { + manifestUrls: { + OT2: 'not-used-on-ODD', + }, + }, + } +} + +const toVersion21 = (prevConfig: ConfigV20): ConfigV21 => { + return { + ...prevConfig, + version: 21 as const, + onDeviceDisplaySettings: { + ...prevConfig.onDeviceDisplaySettings, + unfinishedUnboxingFlowRoute: + prevConfig.onDeviceDisplaySettings.unfinishedUnboxingFlowRoute === + '/dashboard' + ? null + : prevConfig.onDeviceDisplaySettings.unfinishedUnboxingFlowRoute, + }, + } +} + const MIGRATIONS: [ (prevConfig: ConfigV12) => ConfigV13, (prevConfig: ConfigV13) => ConfigV14, @@ -163,7 +192,9 @@ const MIGRATIONS: [ (prevConfig: ConfigV15) => ConfigV16, (prevConfig: ConfigV16) => ConfigV17, (prevConfig: ConfigV17) => ConfigV18, - (prevConfig: ConfigV18) => ConfigV19 + (prevConfig: ConfigV18) => ConfigV19, + (prevConfig: ConfigV19) => ConfigV20, + (prevConfig: ConfigV20) => ConfigV21 ] = [ toVersion13, toVersion14, @@ -172,6 +203,8 @@ const MIGRATIONS: [ toVersion17, toVersion18, toVersion19, + toVersion20, + toVersion21, ] export const DEFAULTS: Config = migrate(DEFAULTS_V12) @@ -186,6 +219,8 @@ export function migrate( | ConfigV17 | ConfigV18 | ConfigV19 + | ConfigV20 + | ConfigV21 ): Config { let result = prevConfig // loop through the migrations, skipping any migrations that are unnecessary diff --git a/app-shell-odd/src/http.ts b/app-shell-odd/src/http.ts index 28c1f7ae148..a1594465dc4 100644 --- a/app-shell-odd/src/http.ts +++ b/app-shell-odd/src/http.ts @@ -90,20 +90,28 @@ export function postFile( name: string, source: string ): Promise { - return createReadStream(source).then(readStream => { - const body = new FormData() - body.append(name, readStream) - return fetch(input, { body, method: 'POST' }) + return new Promise((resolve, reject) => { + createReadStream(source, reject).then(readStream => + new Promise(resolve => { + const body = new FormData() + body.append(name, readStream) + resolve(fetch(input, { body, method: 'POST' })) + }).then(resolve) + ) }) } // create a read stream, handling errors that `fetch` is unable to catch -function createReadStream(source: string): Promise { +function createReadStream( + source: string, + onError: (error: unknown) => unknown +): Promise { return new Promise((resolve, reject) => { const readStream = fs.createReadStream(source) const scheduledResolve = setTimeout(handleSuccess, 0) readStream.once('error', handleError) + readStream.once('error', onError) function handleSuccess(): void { readStream.removeListener('error', handleError) diff --git a/app-shell-odd/src/main.ts b/app-shell-odd/src/main.ts index 63c218b56ef..e456652b24c 100644 --- a/app-shell-odd/src/main.ts +++ b/app-shell-odd/src/main.ts @@ -1,5 +1,6 @@ // electron main entry point import { app, ipcMain } from 'electron' +import dns from 'dns' import fse from 'fs-extra' import path from 'path' import { createUi } from './ui' @@ -21,10 +22,21 @@ import { ODD_DIR, } from './config' import systemd from './systemd' +import { watchForMassStorage } from './usb' +import { registerNotify, closeAllNotifyConnections } from './notify' import type { BrowserWindow } from 'electron' import type { Dispatch, Logger } from './types' +/** + * node 17 introduced a change to default IP resolving to prefer IPv6 which causes localhost requests to fail + * setting the default to IPv4 fixes the issue + * https://github.com/node-fetch/node-fetch/issues/1624 + */ +// TODO(bh, 2024-1-30): @types/node needs to be updated to address this type error. updating @types/node will also require updating our typescript version +// @ts-expect-error +dns.setDefaultResultOrder('ipv4first') + systemd.sendStatus('starting app') const config = getConfig() const log = createLogger('main') @@ -48,7 +60,14 @@ if (config.devtools) app.once('ready', installDevtools) app.once('window-all-closed', () => { log.debug('all windows closed, quitting the app') - app.quit() + closeAllNotifyConnections() + .then(() => { + app.quit() + }) + .catch(error => { + log.warn('Failed to properly close MQTT connections:', error) + app.quit() + }) }) function startUp(): void { @@ -94,6 +113,7 @@ function startUp(): void { registerRobotSystemUpdate(dispatch), registerAppRestart(), registerUpdateBrightness(), + registerNotify(dispatch, mainWindow), ] ipcMain.on('dispatch', (_, action) => { @@ -106,6 +126,8 @@ function startUp(): void { ipcMain.once('dispatch', () => { systemd.sendStatus('started') systemd.ready() + const stopWatching = watchForMassStorage(dispatch) + ipcMain.once('quit', stopWatching) }) } diff --git a/app-shell-odd/src/notify.ts b/app-shell-odd/src/notify.ts new file mode 100644 index 00000000000..69aea75e39b --- /dev/null +++ b/app-shell-odd/src/notify.ts @@ -0,0 +1,370 @@ +/* eslint-disable @typescript-eslint/no-dynamic-delete */ +import mqtt from 'mqtt' + +import { createLogger } from './log' + +import type { BrowserWindow } from 'electron' +import type { NotifyTopic } from '@opentrons/app/src/redux/shell/types' +import type { Action, Dispatch } from './types' + +// TODO(jh, 2024-01-22): refactor the ODD connection store to manage a single client only. + +// Manages MQTT broker connections via a connection store, establishing a connection to the broker only if a connection does not +// already exist, and disconnects from the broker when the app is not subscribed to any topics for the given broker. +// A redundant connection to the same broker results in the older connection forcibly closing, which we want to avoid. +// However, redundant subscriptions are permitted and result in the broker sending the retained message for that topic. +// To mitigate redundant connections, the connection manager eagerly adds the host, removing the host if the connection fails. + +interface ConnectionStore { + [hostname: string]: { + client: mqtt.MqttClient | null + subscriptions: Record + } +} + +const connectionStore: ConnectionStore = {} +const log = createLogger('notify') +// MQTT is somewhat particular about the clientId format and will connect erratically if an unexpected string is supplied. +// This clientId is derived from the mqttjs library. +const CLIENT_ID = 'odd-' + Math.random().toString(16).slice(2, 8) + +const connectOptions: mqtt.IClientOptions = { + clientId: CLIENT_ID, + port: 1883, + keepalive: 60, + protocolVersion: 5, + reconnectPeriod: 1000, + connectTimeout: 30 * 1000, + clean: true, + resubscribe: true, +} + +/** + * @property {number} qos: "Quality of Service", "at least once". Because we use React Query, which does not trigger + a render update event if duplicate data is received, we can avoid the additional overhead + to guarantee "exactly once" delivery. + */ +const subscribeOptions: mqtt.IClientSubscribeOptions = { + qos: 1, +} + +export function registerNotify( + dispatch: Dispatch, + mainWindow: BrowserWindow +): (action: Action) => unknown { + return function handleAction(action: Action) { + switch (action.type) { + case 'shell:NOTIFY_SUBSCRIBE': + return subscribe({ + ...action.payload, + browserWindow: mainWindow, + hostname: '127.0.0.1', + }) + + case 'shell:NOTIFY_UNSUBSCRIBE': + return unsubscribe({ + ...action.payload, + browserWindow: mainWindow, + hostname: '127.0.0.1', + }) + } + } +} + +interface NotifyParams { + browserWindow: BrowserWindow + hostname: string + topic: NotifyTopic +} + +function subscribe(notifyParams: NotifyParams): Promise { + const { hostname, topic, browserWindow } = notifyParams + // true if no subscription (and therefore connection) to host exists + if (connectionStore[hostname] == null) { + connectionStore[hostname] = { + client: null, + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + subscriptions: { [topic]: 1 } as Record, + } + return connectAsync(`mqtt://${hostname}`) + .then(client => { + log.info(`Successfully connected to ${hostname}`) + connectionStore[hostname].client = client + establishListeners({ ...notifyParams, client }) + return new Promise(() => + client.subscribe(topic, subscribeOptions, subscribeCb) + ) + }) + .catch((error: Error) => { + log.warn( + `Failed to connect to ${hostname} - ${error.name}: ${error.message} ` + ) + const failureMessage = error.message.includes('ECONNREFUSED') + ? 'ECONNREFUSED' + : 'ECONNFAILED' + + sendToBrowserDeserialized({ + browserWindow, + hostname, + topic, + message: failureMessage, + }) + if (hostname in connectionStore) delete connectionStore[hostname] + }) + } + // true if the connection store has an entry for the hostname. + else { + const subscriptions = connectionStore[hostname]?.subscriptions + if (subscriptions && subscriptions[topic] > 0) { + subscriptions[topic] += 1 + return Promise.resolve() + } else { + if (subscriptions) { + subscriptions[topic] = 1 + } + return new Promise(() => checkIfClientConnected()).catch(() => { + log.warn(`Failed to subscribe on ${hostname} to topic: ${topic}`) + sendToBrowserDeserialized({ + browserWindow, + hostname, + topic, + message: 'ECONNFAILED', + }) + handleDecrementSubscriptionCount(hostname, topic) + }) + } + } + + function subscribeCb(error: Error, result: mqtt.ISubscriptionGrant[]): void { + if (error != null) { + log.warn(`Failed to subscribe on ${hostname} to topic: ${topic}`) + sendToBrowserDeserialized({ + browserWindow, + hostname, + topic, + message: 'ECONNFAILED', + }) + handleDecrementSubscriptionCount(hostname, topic) + } else { + log.info(`Successfully subscribed on ${hostname} to topic: ${topic}`) + } + } + + // Check every 500ms for 2 seconds before failing. + function checkIfClientConnected(): void { + const MAX_RETRIES = 4 + let counter = 0 + const intervalId = setInterval(() => { + const client = connectionStore[hostname]?.client + if (client != null) { + clearInterval(intervalId) + new Promise(() => + client.subscribe(topic, subscribeOptions, subscribeCb) + ) + .then(() => Promise.resolve()) + .catch(() => + Promise.reject( + new Error( + `Maximum number of subscription retries reached for hostname: ${hostname}` + ) + ) + ) + } + + counter++ + if (counter === MAX_RETRIES) { + clearInterval(intervalId) + Promise.reject( + new Error( + `Maximum number of subscription retries reached for hostname: ${hostname}` + ) + ) + } + }, 500) + } +} + +function unsubscribe(notifyParams: NotifyParams): Promise { + const { hostname, topic } = notifyParams + return new Promise(() => { + if (hostname in connectionStore) { + const { client } = connectionStore[hostname] + const subscriptions = connectionStore[hostname]?.subscriptions + const isLastSubscription = subscriptions[topic] <= 1 + + if (isLastSubscription) { + client?.unsubscribe(topic, {}, (error, result) => { + if (error != null) { + log.warn( + `Failed to unsubscribe on ${hostname} from topic: ${topic}` + ) + } else { + log.info( + `Successfully unsubscribed on ${hostname} from topic: ${topic}` + ) + handleDecrementSubscriptionCount(hostname, topic) + } + }) + } else { + subscriptions[topic] -= 1 + } + } else { + log.info( + `Attempted to unsubscribe from unconnected hostname: ${hostname}` + ) + } + }) +} + +function connectAsync(brokerURL: string): Promise { + const client = mqtt.connect(brokerURL, connectOptions) + + return new Promise((resolve, reject) => { + // Listeners added to client to trigger promise resolution + const promiseListeners: { + [key: string]: (...args: any[]) => void + } = { + connect: () => { + removePromiseListeners() + return resolve(client) + }, + // A connection error event will close the connection without a retry. + error: (error: Error | string) => { + removePromiseListeners() + const clientEndPromise = new Promise((resolve, reject) => + client.end(true, {}, () => resolve(error)) + ) + return clientEndPromise.then(() => reject(error)) + }, + end: () => promiseListeners.error(`Couldn't connect to ${brokerURL}`), + } + + function removePromiseListeners(): void { + Object.keys(promiseListeners).forEach(eventName => { + client.removeListener(eventName, promiseListeners[eventName]) + }) + } + + Object.keys(promiseListeners).forEach(eventName => { + client.on(eventName, promiseListeners[eventName]) + }) + }) +} + +function handleDecrementSubscriptionCount( + hostname: string, + topic: NotifyTopic +): void { + const { client, subscriptions } = connectionStore[hostname] + if (topic in subscriptions) { + subscriptions[topic] -= 1 + if (subscriptions[topic] <= 0) { + delete subscriptions[topic] + } + } + + if (Object.keys(subscriptions).length <= 0) { + client?.end() + } +} + +interface ListenerParams { + client: mqtt.MqttClient + browserWindow: BrowserWindow + topic: NotifyTopic + hostname: string +} + +function establishListeners({ + client, + browserWindow, + hostname, + topic, +}: ListenerParams): void { + client.on( + 'message', + (topic: NotifyTopic, message: Buffer, packet: mqtt.IPublishPacket) => { + sendToBrowserDeserialized({ + browserWindow, + hostname, + topic, + message: message.toString(), + }) + } + ) + + client.on('reconnect', () => { + log.info(`Attempting to reconnect to ${hostname}`) + }) + // handles transport layer errors only + client.on('error', error => { + log.warn(`Error - ${error.name}: ${error.message}`) + sendToBrowserDeserialized({ + browserWindow, + hostname, + topic, + message: 'ECONNFAILED', + }) + client.end() + }) + + client.on('end', () => { + log.info(`Closed connection to ${hostname}`) + if (hostname in connectionStore) delete connectionStore[hostname] + }) + + client.on('disconnect', packet => + log.warn( + `Disconnected from ${hostname} with code ${ + packet.reasonCode ?? 'undefined' + }` + ) + ) +} + +export function closeAllNotifyConnections(): Promise { + return new Promise((resolve, reject) => { + setTimeout(() => { + reject(Error('Failed to close all connections within the time limit.')) + }, 2000) + + log.debug('Stopping notify service connections') + const closeConnections = Object.values(connectionStore).map( + ({ client }) => { + return new Promise((resolve, reject) => { + client?.end(true, {}, () => resolve(null)) + }) + } + ) + Promise.all(closeConnections).then(resolve).catch(reject) + }) +} + +interface SendToBrowserParams { + browserWindow: BrowserWindow + hostname: string + topic: NotifyTopic + message: string +} + +function sendToBrowserDeserialized({ + browserWindow, + hostname, + topic, + message, +}: SendToBrowserParams): void { + let deserializedMessage: string | Object + + try { + deserializedMessage = JSON.parse(message) + } catch { + deserializedMessage = message + } + + log.info('Received notification data from main via IPC', { + hostname, + topic, + }) + + browserWindow.webContents.send('notify', hostname, topic, deserializedMessage) +} diff --git a/app-shell-odd/src/system-update/index.ts b/app-shell-odd/src/system-update/index.ts index d7d3aa7660d..15f64186e0d 100644 --- a/app-shell-odd/src/system-update/index.ts +++ b/app-shell-odd/src/system-update/index.ts @@ -2,6 +2,8 @@ import path from 'path' import { ensureDir } from 'fs-extra' import { readFile } from 'fs/promises' +import StreamZip from 'node-stream-zip' +import Semver from 'semver' import { UI_INITIALIZED } from '@opentrons/app/src/redux/shell/actions' import { createLogger } from '../log' import { @@ -23,20 +25,25 @@ import type { Action, Dispatch } from '../types' import type { ReleaseSetFilepaths } from './types' const log = createLogger('systemUpdate/index') +const REASONABLE_VERSION_FILE_SIZE_B = 4096 let isGettingLatestSystemFiles = false -let updateSet: ReleaseSetFilepaths | null = null +const isGettingMassStorageUpdatesFrom: Set = new Set() +let massStorageUpdateSet: ReleaseSetFilepaths | null = null +let systemUpdateSet: ReleaseSetFilepaths | null = null const readFileInfoAndDispatch = ( dispatch: Dispatch, - fileName: string -): Promise => + fileName: string, + isManualFile: boolean = false +): Promise => readUserFileInfo(fileName) .then(fileInfo => ({ type: 'robotUpdate:FILE_INFO' as const, payload: { systemFile: fileInfo.systemFile, version: fileInfo.versionInfo.opentrons_api_version, + isManualFile, }, })) .catch((error: Error) => ({ @@ -46,6 +53,7 @@ const readFileInfoAndDispatch = ( .then(dispatch) export function registerRobotSystemUpdate(dispatch: Dispatch): Dispatch { + log.info(`Running robot system updates storing to ${getSystemUpdateDir()}`) return function handleAction(action: Action) { switch (action.type) { case UI_INITIALIZED: @@ -99,11 +107,12 @@ export function registerRobotSystemUpdate(dispatch: Dispatch): Dispatch { case 'robotUpdate:READ_USER_FILE': { const { systemFile } = action.payload as { systemFile: string } // eslint-disable-next-line @typescript-eslint/no-floating-promises - readFileInfoAndDispatch(dispatch, systemFile) + readFileInfoAndDispatch(dispatch, systemFile, true) break } case 'robotUpdate:READ_SYSTEM_FILE': { - const systemFile = updateSet?.system + const systemFile = + massStorageUpdateSet?.system ?? systemUpdateSet?.system if (systemFile == null) { return dispatch({ type: 'robotUpdate:UNEXPECTED_ERROR', @@ -112,11 +121,156 @@ export function registerRobotSystemUpdate(dispatch: Dispatch): Dispatch { } // eslint-disable-next-line @typescript-eslint/no-floating-promises readFileInfoAndDispatch(dispatch, systemFile) + break } + case 'shell:ROBOT_MASS_STORAGE_DEVICE_ENUMERATED': + if (isGettingMassStorageUpdatesFrom.has(action.payload.rootPath)) { + return + } + isGettingMassStorageUpdatesFrom.add(action.payload.rootPath) + getLatestMassStorageUpdateFiles(action.payload.filePaths, dispatch) + .then(() => { + isGettingMassStorageUpdatesFrom.delete(action.payload.rootPath) + }) + .catch(() => { + isGettingMassStorageUpdatesFrom.delete(action.payload.rootPath) + }) + break + case 'shell:ROBOT_MASS_STORAGE_DEVICE_REMOVED': + if ( + massStorageUpdateSet !== null && + massStorageUpdateSet.system.startsWith(action.payload.rootPath) + ) { + console.log( + `Mass storage device ${action.payload.rootPath} removed, reverting to non-usb updates` + ) + massStorageUpdateSet = null + getCachedSystemUpdateFiles(dispatch) + } else { + console.log( + `Mass storage device ${action.payload.rootPath} removed but this was not an update source` + ) + } + break } } } +const getVersionFromOpenedZipIfValid = (zip: StreamZip): Promise => + new Promise((resolve, reject) => + Object.values(zip.entries()).forEach(entry => { + if ( + entry.isFile && + entry.name === 'VERSION.json' && + entry.size < REASONABLE_VERSION_FILE_SIZE_B + ) { + const contents = zip.entryDataSync(entry.name).toString('ascii') + try { + const parsedContents = JSON.parse(contents) + if (parsedContents?.robot_type !== 'OT-3 Standard') { + reject(new Error('not a Flex release file')) + } + const fileVersion = parsedContents?.opentrons_api_version + const version = Semver.valid(fileVersion) + if (version === null) { + reject(new Error(`${fileVersion} is not a valid version`)) + } else { + resolve(version) + } + } catch (error) { + reject(error) + } + } + }) + ) + +interface FileDetails { + path: string + version: string +} + +const getVersionFromZipIfValid = (path: string): Promise => + new Promise((resolve, reject) => { + const zip = new StreamZip({ file: path, storeEntries: true }) + zip.on('ready', () => { + getVersionFromOpenedZipIfValid(zip) + .then(version => { + zip.close() + resolve({ version, path }) + }) + .catch(err => { + zip.close() + reject(err) + }) + }) + zip.on('error', err => { + zip.close() + reject(err) + }) + }) + +const fakeReleaseNotesForMassStorage = (version: string): string => ` +# Opentrons Robot Software Version ${version} + +This update is from a USB mass storage device connected to your Flex, and release notes cannot be shown. + +Don't remove the USB mass storage device while the update is in progress. +` + +export const getLatestMassStorageUpdateFiles = ( + filePaths: string[], + dispatch: Dispatch +): Promise => + Promise.all( + filePaths.map(path => + path.endsWith('.zip') + ? getVersionFromZipIfValid(path).catch(() => null) + : new Promise(resolve => { + resolve(null) + }) + ) + ).then(values => { + const update = values.reduce( + (prev, current) => + prev === null + ? current === null + ? prev + : current + : current === null + ? prev + : Semver.gt(current.version, prev.version) + ? current + : prev, + null + ) + if (update === null) { + console.log('no updates found in mass storage device') + } else { + console.log(`found update to version ${update.version} on mass storage`) + const releaseNotes = fakeReleaseNotesForMassStorage(update.version) + massStorageUpdateSet = { system: update.path, releaseNotes } + dispatchUpdateInfo( + { version: update.version, releaseNotes, force: true }, + dispatch + ) + } + }) + +const dispatchUpdateInfo = ( + info: { version: string | null; releaseNotes: string | null; force: boolean }, + dispatch: Dispatch +): void => { + const { version, releaseNotes, force } = info + dispatch({ + type: 'robotUpdate:UPDATE_INFO', + payload: { releaseNotes, version, force, target: 'flex' }, + }) + dispatch({ + type: 'robotUpdate:UPDATE_VERSION', + payload: { version, force, target: 'flex' }, + }) +} + // Get latest system update version // 1. Ensure the system update directory exists // 2. Get the manifest file from the local cache @@ -127,9 +281,12 @@ export function registerRobotSystemUpdate(dispatch: Dispatch): Dispatch { export function getLatestSystemUpdateFiles( dispatch: Dispatch ): Promise { - const fileDownloadDir = path.join(getSystemUpdateDir(), getLatestVersion()) + const fileDownloadDir = path.join( + getSystemUpdateDir(), + 'robot-system-updates' + ) - return ensureDir(fileDownloadDir) + return ensureDir(getSystemUpdateDir()) .then(() => getLatestSystemUpdateUrls()) .then(urls => { if (urls === null) { @@ -149,11 +306,13 @@ export function getLatestSystemUpdateFiles( if (size !== null) { const percentDone = Math.round((downloaded / size) * 100) if (Math.abs(percentDone - prevPercentDone) > 0) { - dispatch({ - // TODO: change this action type to 'systemUpdate:DOWNLOAD_PROGRESS' - type: 'robotUpdate:DOWNLOAD_PROGRESS', - payload: { progress: percentDone, target: 'flex' }, - }) + if (massStorageUpdateSet === null) { + dispatch({ + // TODO: change this action type to 'systemUpdate:DOWNLOAD_PROGRESS' + type: 'robotUpdate:DOWNLOAD_PROGRESS', + payload: { progress: percentDone, target: 'flex' }, + }) + } prevPercentDone = percentDone } } @@ -163,16 +322,11 @@ export function getLatestSystemUpdateFiles( .then(filepaths => { return cacheUpdateSet(filepaths) }) - .then(({ version, releaseNotes }) => { - dispatch({ - type: 'robotUpdate:UPDATE_INFO', - payload: { releaseNotes, version, target: 'flex' }, - }) - dispatch({ - type: 'robotUpdate:UPDATE_VERSION', - payload: { version, target: 'flex' }, - }) - }) + .then( + updateInfo => + massStorageUpdateSet === null && + dispatchUpdateInfo({ force: false, ...updateInfo }, dispatch) + ) .catch((error: Error) => { return dispatch({ type: 'robotUpdate:DOWNLOAD_ERROR', @@ -180,7 +334,7 @@ export function getLatestSystemUpdateFiles( }) }) .then(() => - cleanupReleaseFiles(getSystemUpdateDir(), getLatestVersion()) + cleanupReleaseFiles(getSystemUpdateDir(), 'robot-system-updates') ) .catch((error: Error) => { log.warn('Unable to cleanup old release files', { error }) @@ -188,12 +342,42 @@ export function getLatestSystemUpdateFiles( }) } +export function getCachedSystemUpdateFiles( + dispatch: Dispatch +): Promise { + if (systemUpdateSet) { + return getInfoFromUpdateSet(systemUpdateSet) + .then(updateInfo => + dispatchUpdateInfo({ force: false, ...updateInfo }, dispatch) + ) + .catch(err => console.log(`Could not get info from update set: ${err}`)) + } else { + dispatchUpdateInfo( + { version: null, releaseNotes: null, force: false }, + dispatch + ) + return new Promise(resolve => resolve('no files')) + } +} + +function getInfoFromUpdateSet( + filepaths: ReleaseSetFilepaths +): Promise<{ version: string; releaseNotes: string | null }> { + const version = getLatestVersion() + const releaseNotesContentPromise = filepaths.releaseNotes + ? readFile(filepaths.releaseNotes, 'utf8') + : new Promise(resolve => resolve(null)) + return releaseNotesContentPromise + .then(releaseNotes => ({ + version: version, + releaseNotes, + })) + .catch(() => ({ version: version, releaseNotes: '' })) +} + function cacheUpdateSet( filepaths: ReleaseSetFilepaths -): Promise<{ version: string; releaseNotes: string }> { - updateSet = filepaths - return readFile(updateSet.releaseNotes, 'utf8').then(releaseNotes => ({ - version: getLatestVersion(), - releaseNotes, - })) +): Promise<{ version: string; releaseNotes: string | null }> { + systemUpdateSet = filepaths + return getInfoFromUpdateSet(systemUpdateSet) } diff --git a/app-shell-odd/src/system-update/release-files.ts b/app-shell-odd/src/system-update/release-files.ts index 131600f7970..d9e9903b34e 100644 --- a/app-shell-odd/src/system-update/release-files.ts +++ b/app-shell-odd/src/system-update/release-files.ts @@ -55,8 +55,6 @@ export function downloadReleaseFiles( onProgress: (progress: DownloadProgress) => unknown ): Promise { const tempDir: string = tempy.directory() - // @ts-expect-error delete this when the OT-3 manifest has release notes - urls.releaseNotes = null const tempSystemPath = outPath(tempDir, urls.system) const tempNotesPath = outPath(tempDir, urls.releaseNotes ?? '') @@ -67,12 +65,14 @@ export function downloadReleaseFiles( const systemReq = fetchToFile(urls.system, tempSystemPath, { onProgress }) const notesReq = urls.releaseNotes ? fetchToFile(urls.releaseNotes, tempNotesPath) - : Promise.resolve('') + : Promise.resolve(null) return Promise.all([systemReq, notesReq]).then(results => { const [systemTemp, releaseNotesTemp] = results const systemPath = outPath(directory, systemTemp) - const notesPath = outPath(directory, releaseNotesTemp) + const notesPath = releaseNotesTemp + ? outPath(directory, releaseNotesTemp) + : null log.debug('renaming directory', { from: tempDir, to: directory }) diff --git a/app-shell-odd/src/system-update/types.ts b/app-shell-odd/src/system-update/types.ts index 67ae4e5ef03..8555d980791 100644 --- a/app-shell-odd/src/system-update/types.ts +++ b/app-shell-odd/src/system-update/types.ts @@ -13,7 +13,7 @@ export interface ReleaseManifest { export interface ReleaseSetFilepaths { system: string - releaseNotes: string + releaseNotes: string | null } // shape of VERSION.json in update file diff --git a/app-shell-odd/src/types.ts b/app-shell-odd/src/types.ts index 855aaea95e6..0b04485ee0f 100644 --- a/app-shell-odd/src/types.ts +++ b/app-shell-odd/src/types.ts @@ -3,7 +3,6 @@ import type { Action, Error as PlainError, } from '@opentrons/app/src/redux/types' - import type { Logger } from '@opentrons/app/src/logger' export type { Action, PlainError } diff --git a/app-shell-odd/src/ui.ts b/app-shell-odd/src/ui.ts index ec5f3e1ae0a..fdae0e8a54d 100644 --- a/app-shell-odd/src/ui.ts +++ b/app-shell-odd/src/ui.ts @@ -59,11 +59,13 @@ export function createUi(dispatch: Dispatch): BrowserWindow { mainWindow.loadURL(url, { extraHeaders: 'pragma: no-cache\n' }) // open new windows ( { - log.debug('Opening external link', { url }) - event.preventDefault() - // eslint-disable-next-line @typescript-eslint/no-floating-promises - shell.openExternal(url) + mainWindow.webContents.setWindowOpenHandler(({ url, disposition }) => { + if (disposition === 'new-window' && url === 'about:blank') { + shell.openExternal(url) + return { action: 'deny' } + } else { + return { action: 'allow' } + } }) return mainWindow diff --git a/app-shell-odd/src/update.ts b/app-shell-odd/src/update.ts index 9a68c5269c8..b59670f8c2b 100644 --- a/app-shell-odd/src/update.ts +++ b/app-shell-odd/src/update.ts @@ -58,11 +58,13 @@ export const updateLatestVersion = (): Promise => { return -1 }) .find(verson => channelFinder(verson, channel)) - + const changed = LATEST_OT_SYSTEM_VERSION !== latestAvailableVersion LATEST_OT_SYSTEM_VERSION = latestAvailableVersion ?? _PKG_VERSION_ - log.info( - `Update: latest version available from ${FLEX_MANIFEST_URL} is ${latestAvailableVersion}` - ) + if (changed) { + log.info( + `Update: latest version available from ${FLEX_MANIFEST_URL} is ${latestAvailableVersion}` + ) + } return LATEST_OT_SYSTEM_VERSION }) .catch((e: Error) => { diff --git a/app-shell-odd/src/usb.ts b/app-shell-odd/src/usb.ts new file mode 100644 index 00000000000..1d84abb733c --- /dev/null +++ b/app-shell-odd/src/usb.ts @@ -0,0 +1,156 @@ +import * as fs from 'fs' +import * as fsPromises from 'fs/promises' +import { join } from 'path' +import { flatten } from 'lodash' +import type { Dispatch } from './types' +import { + robotMassStorageDeviceAdded, + robotMassStorageDeviceEnumerated, + robotMassStorageDeviceRemoved, +} from '@opentrons/app/src/redux/shell/actions' +const FLEX_USB_MOUNT_DIR = '/media/' +const FLEX_USB_DEVICE_DIR = '/dev/' +const FLEX_USB_MOUNT_FILTER = /sd[a-z]+[0-9]+$/ +const MOUNT_ENUMERATION_DELAY_MS = 1000 + +// These directories are generated by OSX and contain entries for all +// the files that were deleted from a mass storage device, or search index +// data +const isWeirdDirectoryAndShouldSkip = (dirName: string): boolean => + ['.Trashes', '.Spotlight'] + .map(keyword => dirName.includes(keyword)) + .reduce((prev, current) => prev || current, false) + +const enumerateMassStorage = (path: string): Promise => + fsPromises + .readdir(path) + .then(entries => + entries.length === 0 + ? new Promise(resolve => + setTimeout(resolve, MOUNT_ENUMERATION_DELAY_MS) + ) + : new Promise(resolve => resolve()) + ) + .then(() => fsPromises.readdir(path, { withFileTypes: true })) + .then(entries => + Promise.all( + entries.map(entry => + entry.isDirectory() && !isWeirdDirectoryAndShouldSkip(entry.name) + ? enumerateMassStorage(join(path, entry.name)) + : new Promise(resolve => + resolve([join(path, entry.name)]) + ) + ) + ) + ) + .catch(() => []) + .then(flatten) + +export function watchForMassStorage(dispatch: Dispatch): () => void { + console.log('watching for mass storage') + let prevDirs: string[] = [] + const handleNewlyPresent = (path: string): Promise => { + dispatch(robotMassStorageDeviceAdded(path)) + return enumerateMassStorage(path) + .then(contents => { + dispatch(robotMassStorageDeviceEnumerated(path, contents)) + }) + .then(() => path) + } + + const rescan = (dispatch: Dispatch): Promise => + fsPromises + .readdir(FLEX_USB_MOUNT_DIR) + .then(entries => { + const sortedEntries = entries.sort() + const newlyPresent = sortedEntries.filter( + entry => !prevDirs.includes(entry) + ) + const newlyAbsent = prevDirs.filter( + entry => !sortedEntries.includes(entry) + ) + return Promise.all([ + ...newlyAbsent.map(entry => { + if (entry.match(FLEX_USB_MOUNT_FILTER)) { + dispatch( + robotMassStorageDeviceRemoved(join(FLEX_USB_MOUNT_DIR, entry)) + ) + } + return null + }), + ...newlyPresent.map(entry => { + if (entry.match(FLEX_USB_MOUNT_FILTER)) { + return handleNewlyPresent(join(FLEX_USB_MOUNT_DIR, entry)) + } + return null + }), + ]) + }) + .then(present => { + prevDirs = present.filter((entry): entry is string => entry !== null) + }) + + const mediaWatcher = fs.watch( + FLEX_USB_MOUNT_DIR, + { persistent: true }, + (event, fileName) => { + if (!!!fileName) { + rescan(dispatch) + return + } + if (!fileName.match(FLEX_USB_MOUNT_FILTER)) { + return + } + const fullPath = join(FLEX_USB_MOUNT_DIR, fileName) + fsPromises + .stat(fullPath) + .then(info => { + if (!info.isDirectory) { + return + } + if (prevDirs.includes(fullPath)) { + return + } + console.log(`New mass storage device ${fileName} detected`) + prevDirs.push(fullPath) + return handleNewlyPresent(fullPath) + }) + .catch(() => { + if (prevDirs.includes(fullPath)) { + console.log(`Mass storage device at ${fileName} removed`) + prevDirs = prevDirs.filter(entry => entry !== fullPath) + dispatch(robotMassStorageDeviceRemoved(fullPath)) + } + }) + } + ) + + const devWatcher = fs.watch( + FLEX_USB_DEVICE_DIR, + { persistent: true }, + (event, fileName) => { + if (!!!fileName) return + if (!fileName.match(FLEX_USB_MOUNT_FILTER)) return + const fullPath = join(FLEX_USB_DEVICE_DIR, fileName) + const mountPath = join(FLEX_USB_MOUNT_DIR, fileName) + fsPromises.stat(fullPath).catch(() => { + if (prevDirs.includes(mountPath)) { + console.log(`Mass storage device at ${fileName} removed`) + prevDirs = prevDirs.filter(entry => entry !== mountPath) + dispatch( + robotMassStorageDeviceRemoved(join(FLEX_USB_MOUNT_DIR, fileName)) + ) + // we don't care if this fails because it's racing the system removing + // the mount dir in the common case + fsPromises.unlink(mountPath).catch(() => {}) + } + }) + } + ) + + rescan(dispatch) + return () => { + mediaWatcher.close() + devWatcher.close() + } +} diff --git a/app-shell/Makefile b/app-shell/Makefile index c8bd9be4e14..6082ed2bf75 100644 --- a/app-shell/Makefile +++ b/app-shell/Makefile @@ -15,6 +15,9 @@ PORT ?= 8090 # TODO(mc, 2018-08-07): figure out a better way to do this ui_dir := ../app +# Path of source package +SRC_PATH = app-shell + # cross-platform noop command noop := cd . @@ -23,6 +26,14 @@ dist_files = $(if $(filter $(1),robot-stack),"dist/**/Opentrons-*","dist/**/Open update_files := "dist/@(alpha|beta|latest)*.@(yml|json)" publish_dir := dist/publish +# These variables can be overriden when make is invoked to customize the +# behavior of jest. For instance, +# make test tests=src/__tests__/http.test.ts would run only the +# specified test +tests ?= $(SRC_PATH)/src +cov_opts ?= --coverage=true --ci=true --collectCoverageFrom='app-shell/src/**/*.(js|ts|tsx)' +test_opts ?= + # Other SSH args for robot ssh_opts ?= $(default_ssh_opts) @@ -48,7 +59,7 @@ no_python_bundle ?= builder := yarn electron-builder \ --config electron-builder.config.js \ - --config.electronVersion=21.3.1 \ + --config.electronVersion=23.3.13 \ --publish never @@ -86,7 +97,7 @@ clean: .PHONY: lib lib: export NODE_ENV := production lib: - webpack --profile + NODE_OPTIONS=--openssl-legacy-provider webpack --profile .PHONY: deps deps: @@ -171,5 +182,9 @@ dev-app-update.yml: dev: export NODE_ENV := development dev: export OPENTRONS_PROJECT := $(OPENTRONS_PROJECT) dev: clean-dev-autoupdate ./dev-app-update.yml - webpack + NODE_OPTIONS=--openssl-legacy-provider webpack $(electron) + +.PHONY: test +test: + $(MAKE) -C .. test-js-app-shell diff --git a/app-shell/build/release-notes-internal.md b/app-shell/build/release-notes-internal.md index 08663572808..a15d877c0ab 100644 --- a/app-shell/build/release-notes-internal.md +++ b/app-shell/build/release-notes-internal.md @@ -3,26 +3,21 @@ For more details about this release, please see the full [technical changelog][] --- -# Internal Release 0.14.0 +# Internal Release 1.1.0 -This is 0.14.0, an internal release for the app supporting the Opentrons Flex. +This is 1.0.0, an internal release for the app supporting the Opentrons Flex. This is still pretty early in the process, so some things are known not to work, and are listed below. Some things that may surprise you do work, and are also listed below. There may also be some littler things of note, and those are at the bottom. ## New Stuff In This Release -- All instrument flows should display errors properly now -- Update robot flows don't say OT-2s anymore -- There should be fewer surprise scroll bars on Windows -- The configuration of the on-device display can be factory-reset, which lets you go back to the first-time setup flow +- There is now UI for configuring the loaded deck fixtures such as trash chutes on your Flex. +- Support for analyzing python protocol API 2.16 and JSON protocol V8 +- Labware position check now uses the calibration (the same one used for pipette and module calibration) instead of a tip; this should increase the accuracy of LPC. +- Connecting a Flex to a wifi network while the app is connected to it with USB should work now +- The app should generally be better about figuring out what kind of robot a protocol is for, and displaying the correct deck layout accordingly +## Known Issues -## Big Things That Do Work Please Do Report Bugs About Them -- Connecting to a Flex, including via USB -- Running protocols on those Flexs including simulate, play/pause, labware position check - - Except for gripper; no LPC for gripper -- Attach, detach, and calibration flows for pipettes and gripper when started from the device page -- Automatic updates of app and robot when new internal-releases are created - - +- Labware Renders are slightly askew towards the top right. diff --git a/app-shell/build/release-notes.md b/app-shell/build/release-notes.md index 90e1aa8d85f..3a6aca40055 100644 --- a/app-shell/build/release-notes.md +++ b/app-shell/build/release-notes.md @@ -6,6 +6,63 @@ log][]. For a list of currently known issues, please see the [Opentrons issue tr --- +## Opentrons App Changes in 7.1.1 + +Welcome to the v7.1.1 release of the Opentrons App! + +### Bug Fixes + +- The app properly displays Flex 1-Channel 1000 µL pipettes. + +--- + +## Opentrons App Changes in 7.1.0 + +Welcome to the v7.1.0 release of the Opentrons App! This release includes new deck and pipette functionality for Opentrons Flex, a new workflow for dropping tips after a protocol is canceled, and other improvements. + +### New Features + +- Specify the deck configuration of Flex, including the movable trash bin, waste chute, and staging area slots. +- Resolve conflicts between the hardware a protocol requires and the current deck configuration as part of run setup. +- Run protocols that use the Flex 96-Channel Pipette, including partial tip pickup. +- Choose where to dispense liquid and drop tips held by a pipette when a protocol is canceled. + +### Improved Features + +- Labware Position Check on Flex uses the pipette calibration probe, instead of a tip, for greater accuracy. + +### Bug Fixes + +- Labware Position Check no longer tries to check the same labware in the same position twice, which was leading to errors. + +--- + +## Opentrons App Changes in 7.0.2 + +Welcome to the v7.0.2 release of the Opentrons App! + +### Bug Fixes + +- Fixes an issue where robot system updates over USB were stalling +- Fixes an issue where app protocol analysis would fail if you had Python 3.10 installed on your computer and installed the opentrons package there + +--- + +## Opentrons App Changes in 7.0.1 + +Welcome to the v7.0.1 release of the Opentrons App! This release builds on the major release that added support for Opentrons Flex. + +### Improved Features + +- Pipettes move higher during Labware Position Check to avoid crashes in all deck slots, not just those with labware loaded in the protocol. + +### Bug Fixes + +- The app no longer blocks running valid protocols due to "not valid JSON" or "apiLevel not declared" errors. +- Robot commands, like turning the lights on or off, no longer take a long time to execute. + +--- + ## Opentrons App Changes in 7.0.0 Welcome to the v7.0.0 release of the Opentrons App! This release adds support for the Opentrons Flex robot, instruments, modules, and labware. diff --git a/app-shell/dev-app-update-robot-stack.yml b/app-shell/dev-app-update-robot-stack.yml index c3a1acffd6d..9edb1ccde11 100644 --- a/app-shell/dev-app-update-robot-stack.yml +++ b/app-shell/dev-app-update-robot-stack.yml @@ -1,4 +1,3 @@ -provider: s3 -bucket: opentrons-app -path: builds +provider: generic +bucket: https://builds.opentrons.com/app/ channel: latest diff --git a/app-shell/electron-builder.config.js b/app-shell/electron-builder.config.js index b214d05e5dd..a48e3a8b6b2 100644 --- a/app-shell/electron-builder.config.js +++ b/app-shell/electron-builder.config.js @@ -2,12 +2,19 @@ const path = require('path') const { versionForProject } = require('../scripts/git-version') -const { OT_APP_DEPLOY_BUCKET, OT_APP_DEPLOY_FOLDER } = process.env +const { + OT_APP_DEPLOY_BUCKET, + OT_APP_DEPLOY_FOLDER, + APPLE_TEAM_ID, +} = process.env const DEV_MODE = process.env.NODE_ENV !== 'production' const USE_PYTHON = process.env.NO_PYTHON !== 'true' const project = process.env.OPENTRONS_PROJECT ?? 'robot-stack' -const ot3PublishConfig = +// this will generate either +// https://builds.opentrons.com/app/ or https://ot3-development.builds.opentrons.com/app/ +// because these environment variables are provided by ci +const publishConfig = OT_APP_DEPLOY_BUCKET && OT_APP_DEPLOY_FOLDER ? { provider: 'generic', @@ -15,19 +22,10 @@ const ot3PublishConfig = } : null -const robotStackPublishConfig = - OT_APP_DEPLOY_BUCKET && OT_APP_DEPLOY_FOLDER - ? { - provider: 's3', - bucket: OT_APP_DEPLOY_BUCKET, - path: OT_APP_DEPLOY_FOLDER, - } - : null - module.exports = async () => ({ appId: project === 'robot-stack' ? 'com.opentrons.app' : 'com.opentrons.appot3', - electronVersion: '21.3.1', + electronVersion: '23.3.13', npmRebuild: false, releaseInfo: { releaseNotesFile: @@ -62,6 +60,9 @@ module.exports = async () => ({ icon: project === 'robot-stack' ? 'build/icon.icns' : 'build/three.icns', forceCodeSigning: !DEV_MODE, gatekeeperAssess: true, + notarize: { + teamId: APPLE_TEAM_ID, + }, }, dmg: { icon: null, @@ -80,7 +81,7 @@ module.exports = async () => ({ category: 'Science', icon: project === 'robot-stack' ? 'build/icon.icns' : 'build/three.icns', }, - publish: project === 'ot3' ? ot3PublishConfig : robotStackPublishConfig, + publish: publishConfig, generateUpdatesFilesForAllChannels: true, beforePack: path.join(__dirname, './scripts/before-pack.js'), }) diff --git a/app-shell/package.json b/app-shell/package.json index abe24f5da46..fff04109769 100644 --- a/app-shell/package.json +++ b/app-shell/package.json @@ -45,7 +45,7 @@ "@types/uuid": "^3.4.7", "ajv": "6.12.3", "dateformat": "3.0.3", - "electron-context-menu": "^3.5.0", + "electron-context-menu": "3.6.1", "electron-debug": "3.0.1", "electron-devtools-installer": "3.2.0", "electron-store": "5.1.1", @@ -55,17 +55,16 @@ "fs-extra": "10.0.0", "get-stream": "5.1.0", "merge-options": "1.0.1", + "mqtt": "4.3.8", "node-fetch": "2.6.7", "node-stream-zip": "1.8.2", "pump": "3.0.0", "semver": "5.5.0", "serialport": "10.5.0", "tempy": "1.0.1", + "usb": "^2.11.0", "uuid": "3.2.1", "winston": "3.1.0", "yargs-parser": "13.1.2" - }, - "optionalDependencies": { - "usb-detection": "4.14.1" } } diff --git a/app-shell/scripts/before-pack.js b/app-shell/scripts/before-pack.js index 4851f62d17c..6e96609786f 100644 --- a/app-shell/scripts/before-pack.js +++ b/app-shell/scripts/before-pack.js @@ -124,7 +124,7 @@ module.exports = function beforeBuild(context) { 'install', `--target=${path.join(PYTHON_DESTINATION, sitePackages)}`, path.join(__dirname, '../../shared-data/python'), - path.join(__dirname, '../../hardware'), + path.join(__dirname, '../../hardware[flex]'), path.join(__dirname, '../../api'), 'pandas==1.4.3', ]) diff --git a/app-shell/src/config/__fixtures__/index.ts b/app-shell/src/config/__fixtures__/index.ts index 5225d825c74..640fa1df429 100644 --- a/app-shell/src/config/__fixtures__/index.ts +++ b/app-shell/src/config/__fixtures__/index.ts @@ -19,6 +19,8 @@ import type { ConfigV17, ConfigV18, ConfigV19, + ConfigV20, + ConfigV21, } from '@opentrons/app/src/redux/config/types' export const MOCK_CONFIG_V0: ConfigV0 = { @@ -250,3 +252,19 @@ export const MOCK_CONFIG_V19: ConfigV19 = { hasJustUpdated: false, }, } + +export const MOCK_CONFIG_V20: ConfigV20 = { + ...MOCK_CONFIG_V19, + version: 20, + robotSystemUpdate: { + manifestUrls: { + OT2: + 'https://opentrons-buildroot-ci.s3.us-east-2.amazonaws.com/releases.json', + }, + }, +} + +export const MOCK_CONFIG_V21: ConfigV21 = { + ...MOCK_CONFIG_V20, + version: 21, +} diff --git a/app-shell/src/config/__tests__/migrate.test.ts b/app-shell/src/config/__tests__/migrate.test.ts index 0287fbb9e20..7a4ec4b78be 100644 --- a/app-shell/src/config/__tests__/migrate.test.ts +++ b/app-shell/src/config/__tests__/migrate.test.ts @@ -20,10 +20,12 @@ import { MOCK_CONFIG_V17, MOCK_CONFIG_V18, MOCK_CONFIG_V19, + MOCK_CONFIG_V20, + MOCK_CONFIG_V21, } from '../__fixtures__' import { migrate } from '../migrate' -const NEWEST_VERSION = 19 +const NEWEST_VERSION = 21 describe('config migration', () => { it('should migrate version 0 to latest', () => { @@ -31,7 +33,7 @@ describe('config migration', () => { const result = migrate(v0Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 1 to latest', () => { @@ -39,7 +41,7 @@ describe('config migration', () => { const result = migrate(v1Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 2 to latest', () => { @@ -47,7 +49,7 @@ describe('config migration', () => { const result = migrate(v2Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 3 to latest', () => { @@ -55,7 +57,7 @@ describe('config migration', () => { const result = migrate(v3Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 4 to latest', () => { @@ -63,7 +65,7 @@ describe('config migration', () => { const result = migrate(v4Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 5 to latest', () => { @@ -71,7 +73,7 @@ describe('config migration', () => { const result = migrate(v5Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 6 to latest', () => { @@ -79,7 +81,7 @@ describe('config migration', () => { const result = migrate(v6Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 7 to latest', () => { @@ -87,7 +89,7 @@ describe('config migration', () => { const result = migrate(v7Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 8 to latest', () => { @@ -95,7 +97,7 @@ describe('config migration', () => { const result = migrate(v8Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 9 to latest', () => { @@ -103,7 +105,7 @@ describe('config migration', () => { const result = migrate(v9Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 10 to latest', () => { @@ -111,7 +113,7 @@ describe('config migration', () => { const result = migrate(v10Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 11 to latest', () => { @@ -119,7 +121,7 @@ describe('config migration', () => { const result = migrate(v11Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 12 to latest', () => { @@ -127,7 +129,7 @@ describe('config migration', () => { const result = migrate(v12Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 13 to latest', () => { @@ -135,7 +137,7 @@ describe('config migration', () => { const result = migrate(v13Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 14 to latest', () => { @@ -143,7 +145,7 @@ describe('config migration', () => { const result = migrate(v14Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 15 to latest', () => { @@ -151,7 +153,7 @@ describe('config migration', () => { const result = migrate(v15Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 16 to latest', () => { @@ -159,7 +161,7 @@ describe('config migration', () => { const result = migrate(v16Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 17 to latest', () => { @@ -167,20 +169,34 @@ describe('config migration', () => { const result = migrate(v17Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) it('should migrate version 18 to latest', () => { const v18Config = MOCK_CONFIG_V18 const result = migrate(v18Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(MOCK_CONFIG_V19) + expect(result).toEqual(MOCK_CONFIG_V21) }) - it('should keep version 19', () => { + it('should keep migrate version 19 to latest', () => { const v19Config = MOCK_CONFIG_V19 const result = migrate(v19Config) expect(result.version).toBe(NEWEST_VERSION) - expect(result).toEqual(v19Config) + expect(result).toEqual(MOCK_CONFIG_V21) + }) + it('should migration version 20 to latest', () => { + const v20Config = MOCK_CONFIG_V20 + const result = migrate(v20Config) + + expect(result.version).toBe(NEWEST_VERSION) + expect(result).toEqual(MOCK_CONFIG_V21) + }) + it('should keep version 21', () => { + const v21Config = MOCK_CONFIG_V21 + const result = migrate(v21Config) + + expect(result.version).toBe(NEWEST_VERSION) + expect(result).toEqual(v21Config) }) }) diff --git a/app-shell/src/config/migrate.ts b/app-shell/src/config/migrate.ts index 0a4616e7b14..d08e0ecc5c2 100644 --- a/app-shell/src/config/migrate.ts +++ b/app-shell/src/config/migrate.ts @@ -25,6 +25,8 @@ import type { ConfigV17, ConfigV18, ConfigV19, + ConfigV20, + ConfigV21, } from '@opentrons/app/src/redux/config/types' // format // base config v0 defaults @@ -42,7 +44,9 @@ export const DEFAULTS_V0: ConfigV0 = { }, buildroot: { - manifestUrl: 'not-used', + // do not rely on this value; it is present only for back compatibility + manifestUrl: + 'https://opentrons-buildroot-ci.s3.us-east-2.amazonaws.com/releases.json', }, // logging config @@ -258,7 +262,9 @@ const toVersion12 = (prevConfig: ConfigV11): ConfigV12 => { version: 12 as const, robotSystemUpdate: { manifestUrls: { - OT2: 'not-used', + // do not rely on this value; it is present only for back compatibility + OT2: + 'https://opentrons-buildroot-ci.s3.us-east-2.amazonaws.com/releases.json', OT3: 'not-used', }, }, @@ -354,6 +360,35 @@ const toVersion19 = (prevConfig: ConfigV18): ConfigV19 => { return nextConfig } +const toVersion20 = (prevConfig: ConfigV19): ConfigV20 => { + const nextConfig = { + ...prevConfig, + version: 20 as const, + robotSystemUpdate: { + manifestUrls: { + // do not rely on this value; it is present only for back compatibility + OT2: + 'https://opentrons-buildroot-ci.s3.us-east-2.amazonaws.com/releases.json', + }, + }, + } + return nextConfig +} +const toVersion21 = (prevConfig: ConfigV20): ConfigV21 => { + return { + ...prevConfig, + version: 21 as const, + onDeviceDisplaySettings: { + ...prevConfig.onDeviceDisplaySettings, + unfinishedUnboxingFlowRoute: + prevConfig.onDeviceDisplaySettings.unfinishedUnboxingFlowRoute === + '/dashboard' + ? null + : prevConfig.onDeviceDisplaySettings.unfinishedUnboxingFlowRoute, + }, + } +} + const MIGRATIONS: [ (prevConfig: ConfigV0) => ConfigV1, (prevConfig: ConfigV1) => ConfigV2, @@ -373,7 +408,9 @@ const MIGRATIONS: [ (prevConfig: ConfigV15) => ConfigV16, (prevConfig: ConfigV16) => ConfigV17, (prevConfig: ConfigV17) => ConfigV18, - (prevConfig: ConfigV18) => ConfigV19 + (prevConfig: ConfigV18) => ConfigV19, + (prevConfig: ConfigV19) => ConfigV20, + (prevConfig: ConfigV20) => ConfigV21 ] = [ toVersion1, toVersion2, @@ -394,6 +431,8 @@ const MIGRATIONS: [ toVersion17, toVersion18, toVersion19, + toVersion20, + toVersion21, ] export const DEFAULTS: Config = migrate(DEFAULTS_V0) @@ -420,6 +459,8 @@ export function migrate( | ConfigV17 | ConfigV18 | ConfigV19 + | ConfigV20 + | ConfigV21 ): Config { const prevVersion = prevConfig.version let result = prevConfig diff --git a/app-shell/src/dialogs/index.ts b/app-shell/src/dialogs/index.ts index 5b2ef9f2b24..92e59defb39 100644 --- a/app-shell/src/dialogs/index.ts +++ b/app-shell/src/dialogs/index.ts @@ -11,6 +11,17 @@ interface BaseDialogOptions { interface FileDialogOptions extends BaseDialogOptions { filters: Array<{ name: string; extensions: string[] }> + properties: Array< + | 'openDirectory' + | 'createDirectory' + | 'openFile' + | 'multiSelections' + | 'showHiddenFiles' + | 'promptToCreate' + | 'noResolveAliases' + | 'treatPackageAsDirectory' + | 'dontAddToRecent' + > } const BASE_DIRECTORY_OPTS = { @@ -55,6 +66,13 @@ export function showOpenFileDialog( openDialogOpts = { ...openDialogOpts, filters: options.filters } } + if (options.properties != null) { + openDialogOpts = { + ...openDialogOpts, + properties: [...(openDialogOpts.properties ?? []), ...options.properties], + } + } + return dialog .showOpenDialog(browserWindow, openDialogOpts) .then((result: OpenDialogReturnValue) => { diff --git a/app-shell/src/http.ts b/app-shell/src/http.ts index dfa4e6fab3c..02fe50da3e1 100644 --- a/app-shell/src/http.ts +++ b/app-shell/src/http.ts @@ -1,5 +1,6 @@ // fetch wrapper to throw if response is not ok import fs from 'fs' +import fsPromises from 'fs/promises' import { Transform, Readable } from 'stream' import pump from 'pump' import _fetch from 'node-fetch' @@ -86,31 +87,74 @@ export function postFile( input: RequestInput, name: string, source: string, - init?: RequestInit + init?: RequestInit, + progress?: (progress: number) => void ): Promise { - return createReadStream(source).then(readStream => { - const body = new FormData() - body.append(name, readStream) - return fetch(input, { ...init, body, method: 'POST' }) + return new Promise((resolve, reject) => { + createReadStream(source, progress ?? null, reject).then(readStream => { + return new Promise(resolve => { + const body = new FormData() + body.append(name, readStream) + resolve(fetch(input, { ...init, body, method: 'POST' })) + }).then(resolve) + }) }) } -// create a read stream, handling errors that `fetch` is unable to catch -function createReadStream(source: string): Promise { +function createReadStreamWithSize( + source: string, + size: number, + progress: ((progress: number) => void) | null, + onError: (error: unknown) => unknown +): Promise { return new Promise((resolve, reject) => { const readStream = fs.createReadStream(source) const scheduledResolve = setTimeout(handleSuccess, 0) + let seenDataLength = 0 + let notifiedDataLength = 0 + + const onData = (chunk: Buffer): void => { + seenDataLength += chunk.length + if ( + size !== Infinity && + seenDataLength / size > notifiedDataLength / size + 0.01 + ) { + progress?.(seenDataLength / size) + notifiedDataLength = seenDataLength + } + + if (seenDataLength === size) { + readStream.removeListener('data', onData) + readStream.removeListener('error', handleError) + } + } readStream.once('error', handleError) + readStream.once('error', onError) function handleSuccess(): void { - readStream.removeListener('error', handleError) resolve(readStream) + readStream.removeListener('error', handleError) } function handleError(error: Error): void { clearTimeout(scheduledResolve) + readStream.removeListener('data', onData) reject(error) } }) } + +// create a read stream, handling errors that `fetch` is unable to catch +function createReadStream( + source: string, + progress: ((progress: number) => void) | null, + onError: (error: unknown) => unknown +): Promise { + return fsPromises + .stat(source) + .then(filestats => + createReadStreamWithSize(source, filestats.size, progress, onError) + ) + .catch(() => createReadStreamWithSize(source, Infinity, progress, onError)) +} diff --git a/app-shell/src/labware/__tests__/dispatch.test.ts b/app-shell/src/labware/__tests__/dispatch.test.ts index c7a8e9198d5..f88f271956d 100644 --- a/app-shell/src/labware/__tests__/dispatch.test.ts +++ b/app-shell/src/labware/__tests__/dispatch.test.ts @@ -229,7 +229,13 @@ describe('labware module dispatches', () => { return flush().then(() => { expect(showOpenFileDialog).toHaveBeenCalledWith(mockMainWindow, { defaultPath: '__mock-app-path__', - filters: [{ name: 'JSON Labware Definitions', extensions: ['json'] }], + filters: [ + { + name: 'JSON Labware Definitions', + extensions: ['json'], + }, + ], + properties: ['multiSelections'], }) expect(dispatch).not.toHaveBeenCalled() }) diff --git a/app-shell/src/labware/index.ts b/app-shell/src/labware/index.ts index e7adcc1e4ae..f46f9134527 100644 --- a/app-shell/src/labware/index.ts +++ b/app-shell/src/labware/index.ts @@ -158,6 +158,7 @@ export function registerLabware( filters: [ { name: 'JSON Labware Definitions', extensions: ['json'] }, ], + properties: ['multiSelections' as const], } addLabwareTask = showOpenFileDialog(mainWindow, dialogOptions).then( diff --git a/app-shell/src/main.ts b/app-shell/src/main.ts index b1ef492b949..b90fcf6b5c7 100644 --- a/app-shell/src/main.ts +++ b/app-shell/src/main.ts @@ -1,8 +1,10 @@ // electron main entry point import { app, ipcMain } from 'electron' +import dns from 'dns' import contextMenu from 'electron-context-menu' +import { webusb } from 'usb' -import { createUi } from './ui' +import { createUi, registerReloadUi } from './ui' import { initializeMenu } from './menu' import { createLogger } from './log' import { registerProtocolAnalysis } from './protocol-analysis' @@ -14,10 +16,21 @@ import { registerSystemInfo } from './system-info' import { registerProtocolStorage } from './protocol-storage' import { getConfig, getStore, getOverrides, registerConfig } from './config' import { registerUsb } from './usb' +import { createUsbDeviceMonitor } from './system-info/usb-devices' +import { registerNotify, closeAllNotifyConnections } from './notify' import type { BrowserWindow } from 'electron' import type { Dispatch, Logger } from './types' +/** + * node 17 introduced a change to default IP resolving to prefer IPv6 which causes localhost requests to fail + * setting the default to IPv4 fixes the issue + * https://github.com/node-fetch/node-fetch/issues/1624 + */ +// TODO(bh, 2024-1-30): @types/node needs to be updated to address this type error. updating @types/node will also require updating our typescript version +// @ts-expect-error +dns.setDefaultResultOrder('ipv4first') + const config = getConfig() const log = createLogger('main') @@ -44,7 +57,17 @@ if (config.devtools) app.once('ready', installDevtools) app.once('window-all-closed', () => { log.debug('all windows closed, quitting the app') + webusb.removeEventListener('connect', () => createUsbDeviceMonitor()) + webusb.removeEventListener('disconnect', () => createUsbDeviceMonitor()) app.quit() + closeAllNotifyConnections() + .then(() => { + app.quit() + }) + .catch(error => { + log.warn('Failed to properly close MQTT connections:', error) + app.quit() + }) }) function startUp(): void { @@ -54,6 +77,8 @@ function startUp(): void { log.error('Uncaught Promise rejection: ', { reason }) ) + webusb.addEventListener('connect', () => createUsbDeviceMonitor()) + webusb.addEventListener('disconnect', () => createUsbDeviceMonitor()) mainWindow = createUi() rendererLogger = createRendererLogger() @@ -88,6 +113,8 @@ function startUp(): void { registerSystemInfo(dispatch), registerProtocolStorage(dispatch), registerUsb(dispatch), + registerNotify(dispatch, mainWindow), + registerReloadUi(mainWindow), ] ipcMain.on('dispatch', (_, action) => { diff --git a/app-shell/src/notify.ts b/app-shell/src/notify.ts new file mode 100644 index 00000000000..822dcebd084 --- /dev/null +++ b/app-shell/src/notify.ts @@ -0,0 +1,366 @@ +/* eslint-disable @typescript-eslint/no-dynamic-delete */ +import mqtt from 'mqtt' + +import { createLogger } from './log' + +import type { BrowserWindow } from 'electron' +import type { NotifyTopic } from '@opentrons/app/src/redux/shell/types' +import type { Action, Dispatch } from './types' + +// Manages MQTT broker connections via a connection store, establishing a connection to the broker only if a connection does not +// already exist, and disconnects from the broker when the app is not subscribed to any topics for the given broker. +// A redundant connection to the same broker results in the older connection forcibly closing, which we want to avoid. +// However, redundant subscriptions are permitted and result in the broker sending the retained message for that topic. +// To mitigate redundant connections, the connection manager eagerly adds the host, removing the host if the connection fails. + +interface ConnectionStore { + [hostname: string]: { + client: mqtt.MqttClient | null + subscriptions: Record + } +} + +const connectionStore: ConnectionStore = {} +const log = createLogger('notify') +// MQTT is somewhat particular about the clientId format and will connect erratically if an unexpected string is supplied. +// This clientId is derived from the mqttjs library. +const CLIENT_ID = 'app-' + Math.random().toString(16).slice(2, 8) + +const connectOptions: mqtt.IClientOptions = { + clientId: CLIENT_ID, + port: 1883, + keepalive: 60, + protocolVersion: 5, + reconnectPeriod: 1000, + connectTimeout: 30 * 1000, + clean: true, + resubscribe: true, +} + +/** + * @property {number} qos: "Quality of Service", "at least once". Because we use React Query, which does not trigger + a render update event if duplicate data is received, we can avoid the additional overhead + to guarantee "exactly once" delivery. + */ +const subscribeOptions: mqtt.IClientSubscribeOptions = { + qos: 1, +} + +export function registerNotify( + dispatch: Dispatch, + mainWindow: BrowserWindow +): (action: Action) => unknown { + return function handleAction(action: Action) { + switch (action.type) { + case 'shell:NOTIFY_SUBSCRIBE': + return subscribe({ + ...action.payload, + browserWindow: mainWindow, + }) + + case 'shell:NOTIFY_UNSUBSCRIBE': + return unsubscribe({ + ...action.payload, + browserWindow: mainWindow, + }) + } + } +} + +interface NotifyParams { + browserWindow: BrowserWindow + hostname: string + topic: NotifyTopic +} + +function subscribe(notifyParams: NotifyParams): Promise { + const { hostname, topic, browserWindow } = notifyParams + // true if no subscription (and therefore connection) to host exists + if (connectionStore[hostname] == null) { + connectionStore[hostname] = { + client: null, + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + subscriptions: { [topic]: 1 } as Record, + } + return connectAsync(`mqtt://${hostname}`) + .then(client => { + log.info(`Successfully connected to ${hostname}`) + connectionStore[hostname].client = client + establishListeners({ ...notifyParams, client }) + return new Promise(() => + client.subscribe(topic, subscribeOptions, subscribeCb) + ) + }) + .catch((error: Error) => { + log.warn( + `Failed to connect to ${hostname} - ${error.name}: ${error.message} ` + ) + const failureMessage = error.message.includes('ECONNREFUSED') + ? 'ECONNREFUSED' + : 'ECONNFAILED' + + sendToBrowserDeserialized({ + browserWindow, + hostname, + topic, + message: failureMessage, + }) + if (hostname in connectionStore) delete connectionStore[hostname] + }) + } + // true if the connection store has an entry for the hostname. + else { + const subscriptions = connectionStore[hostname]?.subscriptions + if (subscriptions && subscriptions[topic] > 0) { + subscriptions[topic] += 1 + return Promise.resolve() + } else { + if (subscriptions) { + subscriptions[topic] = 1 + } + return new Promise(() => checkIfClientConnected()).catch(() => { + log.warn(`Failed to subscribe on ${hostname} to topic: ${topic}`) + sendToBrowserDeserialized({ + browserWindow, + hostname, + topic, + message: 'ECONNFAILED', + }) + handleDecrementSubscriptionCount(hostname, topic) + }) + } + } + + function subscribeCb(error: Error, result: mqtt.ISubscriptionGrant[]): void { + if (error != null) { + log.warn(`Failed to subscribe on ${hostname} to topic: ${topic}`) + sendToBrowserDeserialized({ + browserWindow, + hostname, + topic, + message: 'ECONNFAILED', + }) + handleDecrementSubscriptionCount(hostname, topic) + } else { + log.info(`Successfully subscribed on ${hostname} to topic: ${topic}`) + } + } + + // Check every 500ms for 2 seconds before failing. + function checkIfClientConnected(): void { + const MAX_RETRIES = 4 + let counter = 0 + const intervalId = setInterval(() => { + const client = connectionStore[hostname]?.client + if (client != null) { + clearInterval(intervalId) + new Promise(() => + client.subscribe(topic, subscribeOptions, subscribeCb) + ) + .then(() => Promise.resolve()) + .catch(() => + Promise.reject( + new Error( + `Maximum number of subscription retries reached for hostname: ${hostname}` + ) + ) + ) + } + + counter++ + if (counter === MAX_RETRIES) { + clearInterval(intervalId) + Promise.reject( + new Error( + `Maximum number of subscription retries reached for hostname: ${hostname}` + ) + ) + } + }, 500) + } +} + +function unsubscribe(notifyParams: NotifyParams): Promise { + const { hostname, topic } = notifyParams + return new Promise(() => { + if (hostname in connectionStore) { + const { client } = connectionStore[hostname] + const subscriptions = connectionStore[hostname]?.subscriptions + const isLastSubscription = subscriptions[topic] <= 1 + + if (isLastSubscription) { + client?.unsubscribe(topic, {}, (error, result) => { + if (error != null) { + log.warn( + `Failed to unsubscribe on ${hostname} from topic: ${topic}` + ) + } else { + log.info( + `Successfully unsubscribed on ${hostname} from topic: ${topic}` + ) + handleDecrementSubscriptionCount(hostname, topic) + } + }) + } else { + subscriptions[topic] -= 1 + } + } else { + log.info( + `Attempted to unsubscribe from unconnected hostname: ${hostname}` + ) + } + }) +} + +function connectAsync(brokerURL: string): Promise { + const client = mqtt.connect(brokerURL, connectOptions) + + return new Promise((resolve, reject) => { + // Listeners added to client to trigger promise resolution + const promiseListeners: { + [key: string]: (...args: any[]) => void + } = { + connect: () => { + removePromiseListeners() + return resolve(client) + }, + // A connection error event will close the connection without a retry. + error: (error: Error | string) => { + removePromiseListeners() + const clientEndPromise = new Promise((resolve, reject) => + client.end(true, {}, () => resolve(error)) + ) + return clientEndPromise.then(() => reject(error)) + }, + end: () => promiseListeners.error(`Couldn't connect to ${brokerURL}`), + } + + function removePromiseListeners(): void { + Object.keys(promiseListeners).forEach(eventName => { + client.removeListener(eventName, promiseListeners[eventName]) + }) + } + + Object.keys(promiseListeners).forEach(eventName => { + client.on(eventName, promiseListeners[eventName]) + }) + }) +} + +function handleDecrementSubscriptionCount( + hostname: string, + topic: NotifyTopic +): void { + const { client, subscriptions } = connectionStore[hostname] + if (topic in subscriptions) { + subscriptions[topic] -= 1 + if (subscriptions[topic] <= 0) { + delete subscriptions[topic] + } + } + + if (Object.keys(subscriptions).length <= 0) { + client?.end() + } +} + +interface ListenerParams { + client: mqtt.MqttClient + browserWindow: BrowserWindow + topic: NotifyTopic + hostname: string +} + +function establishListeners({ + client, + browserWindow, + hostname, + topic, +}: ListenerParams): void { + client.on( + 'message', + (topic: NotifyTopic, message: Buffer, packet: mqtt.IPublishPacket) => { + sendToBrowserDeserialized({ + browserWindow, + hostname, + topic, + message: message.toString(), + }) + } + ) + + client.on('reconnect', () => { + log.info(`Attempting to reconnect to ${hostname}`) + }) + // handles transport layer errors only + client.on('error', error => { + log.warn(`Error - ${error.name}: ${error.message}`) + sendToBrowserDeserialized({ + browserWindow, + hostname, + topic, + message: 'ECONNFAILED', + }) + client.end() + }) + + client.on('end', () => { + log.info(`Closed connection to ${hostname}`) + if (hostname in connectionStore) delete connectionStore[hostname] + }) + + client.on('disconnect', packet => + log.warn( + `Disconnected from ${hostname} with code ${ + packet.reasonCode ?? 'undefined' + }` + ) + ) +} + +export function closeAllNotifyConnections(): Promise { + return new Promise((resolve, reject) => { + setTimeout(() => { + reject(Error('Failed to close all connections within the time limit.')) + }, 2000) + + log.debug('Stopping notify service connections') + const closeConnections = Object.values(connectionStore).map( + ({ client }) => { + return new Promise((resolve, reject) => { + client?.end(true, {}, () => resolve(null)) + }) + } + ) + Promise.all(closeConnections).then(resolve).catch(reject) + }) +} + +interface SendToBrowserParams { + browserWindow: BrowserWindow + hostname: string + topic: NotifyTopic + message: string +} + +function sendToBrowserDeserialized({ + browserWindow, + hostname, + topic, + message, +}: SendToBrowserParams): void { + let deserializedMessage: string | Object + + try { + deserializedMessage = JSON.parse(message) + } catch { + deserializedMessage = message + } + + log.info('Received notification data from main via IPC', { + hostname, + topic, + }) + + browserWindow.webContents.send('notify', hostname, topic, deserializedMessage) +} diff --git a/app-shell/src/protocol-analysis/executeAnalyzeCli.ts b/app-shell/src/protocol-analysis/executeAnalyzeCli.ts index 80167e301a9..83b2ae299ba 100644 --- a/app-shell/src/protocol-analysis/executeAnalyzeCli.ts +++ b/app-shell/src/protocol-analysis/executeAnalyzeCli.ts @@ -9,6 +9,7 @@ export function executeAnalyzeCli( sourcePaths: string[] ): Promise { return execa(pythonPath, [ + '-I', '-m', 'opentrons.cli', 'analyze', diff --git a/app-shell/src/protocol-storage/file-system.ts b/app-shell/src/protocol-storage/file-system.ts index cf3c36f3c5f..0dbbf290860 100644 --- a/app-shell/src/protocol-storage/file-system.ts +++ b/app-shell/src/protocol-storage/file-system.ts @@ -24,13 +24,11 @@ import { analyzeProtocolSource } from '../protocol-analysis' * │ ├─ analysis/ * │ │ ├─ 1646303906.json */ -// TODO(jh, 2023-09-11): remove OLD_PROTOCOLS_DIRECTORY_PATH after -// OT-2 parity work is completed and move all protocols back to "protocols" directory. -export const OLD_PROTOCOLS_DIRECTORY_PATH = path.join( +export const PRE_V7_PARITY_DIRECTORY_PATH = path.join( app.getPath('userData'), - 'protocols' + 'protocols_v7.0-supported' ) -export const PROTOCOLS_DIRECTORY_NAME = 'protocols_v7.0-supported' +export const PROTOCOLS_DIRECTORY_NAME = 'protocols' export const PROTOCOLS_DIRECTORY_PATH = path.join( app.getPath('userData'), PROTOCOLS_DIRECTORY_NAME diff --git a/app-shell/src/protocol-storage/index.ts b/app-shell/src/protocol-storage/index.ts index a195ff2900f..0d7d30df24f 100644 --- a/app-shell/src/protocol-storage/index.ts +++ b/app-shell/src/protocol-storage/index.ts @@ -20,13 +20,15 @@ export const getUnixTimeFromAnalysisPath = (analysisPath: string): number => export const getParsedAnalysisFromPath = ( analysisPath: string -): ProtocolAnalysisOutput => { +): ProtocolAnalysisOutput | undefined => { try { return fse.readJsonSync(analysisPath) } catch (error) { - return createFailedAnalysis( - error?.message ?? 'protocol analysis file cannot be parsed' - ) + const errorMessage = + error instanceof Error && error?.message != null + ? error.message + : 'protocol analysis file cannot be parsed' + return createFailedAnalysis(errorMessage) } } @@ -42,25 +44,35 @@ export const getProtocolSrcFilePaths = ( }) } -// TODO(jh, 2023-09-11): remove migrateProtocolsToNewDirectory after -// OT-2 parity work is completed. -const migrateProtocols = migrateProtocolsToNewDirectory() -function migrateProtocolsToNewDirectory(): () => Promise { +// Revert a v7.0.0 pre-parity stop-gap solution. +const migrateProtocolsFromTempDirectory = preParityMigrateProtocolsFrom( + FileSystem.PRE_V7_PARITY_DIRECTORY_PATH, + FileSystem.PROTOCOLS_DIRECTORY_PATH +) +export function preParityMigrateProtocolsFrom( + src: string, + dest: string +): () => Promise { let hasCheckedForMigration = false + return function (): Promise { return new Promise((resolve, reject) => { if (hasCheckedForMigration) resolve() hasCheckedForMigration = true - console.log( - `Performing protocol migration to ${FileSystem.PROTOCOLS_DIRECTORY_NAME}...` - ) - copyProtocols( - FileSystem.OLD_PROTOCOLS_DIRECTORY_PATH, - FileSystem.PROTOCOLS_DIRECTORY_PATH - ) - .then(() => { - console.log('Protocol migration complete.') - resolve() + + fse + .stat(src) + .then(doesSrcExist => { + if (!doesSrcExist.isDirectory()) resolve() + + console.log( + `Performing protocol migration to ${FileSystem.PROTOCOLS_DIRECTORY_NAME}...` + ) + + return migrateProtocols(src, dest).then(() => { + console.log('Protocol migration complete.') + resolve() + }) }) .catch(e => { console.log( @@ -71,27 +83,27 @@ function migrateProtocolsToNewDirectory(): () => Promise { }) } - function copyProtocols(src: string, dest: string): Promise { + function migrateProtocols(src: string, dest: string): Promise { return fse - .stat(src) - .then(doesSrcExist => { - if (!doesSrcExist.isDirectory()) return Promise.resolve() - - return fse.readdir(src).then(items => { - const protocols = items.map(item => { - const srcItem = path.join(src, item) - const destItem = path.join(dest, item) - - return fse.copy(srcItem, destItem, { - overwrite: false, - }) + .readdir(src) + .then(items => { + const protocols = items.map(item => { + const srcItem = path.join(src, item) + const destItem = path.join(dest, item) + + return fse.copy(srcItem, destItem, { + overwrite: false, }) - return Promise.all(protocols).then(() => Promise.resolve()) }) + // Delete the tmp directory. + return Promise.all(protocols).then(() => + fse.rm(src, { + recursive: true, + force: true, + }) + ) }) - .catch(e => { - return Promise.reject(e) - }) + .catch(e => Promise.reject(e)) } } @@ -100,7 +112,7 @@ export const fetchProtocols = ( source: ListSource ): Promise => { return ensureDir(FileSystem.PROTOCOLS_DIRECTORY_PATH) - .then(() => migrateProtocols()) + .then(() => migrateProtocolsFromTempDirectory()) .then(() => FileSystem.readDirectoriesWithinDirectory( FileSystem.PROTOCOLS_DIRECTORY_PATH @@ -125,7 +137,7 @@ export const fetchProtocols = ( }, null) const mostRecentAnalysis = mostRecentAnalysisFilePath != null - ? getParsedAnalysisFromPath(mostRecentAnalysisFilePath) + ? getParsedAnalysisFromPath(mostRecentAnalysisFilePath) ?? null : null return { @@ -201,22 +213,14 @@ export function registerProtocolStorage(dispatch: Dispatch): Dispatch { }) break } - // TODO(jh, 2023-09-15): remove the secondary removeProtocolByKey() after - // OT-2 parity work is completed. + case ProtocolStorageActions.REMOVE_PROTOCOL: { FileSystem.removeProtocolByKey( action.payload.protocolKey, FileSystem.PROTOCOLS_DIRECTORY_PATH + ).then(() => + fetchProtocols(dispatch, ProtocolStorageActions.PROTOCOL_ADDITION) ) - .then(() => - fetchProtocols(dispatch, ProtocolStorageActions.PROTOCOL_ADDITION) - ) - .then(() => - FileSystem.removeProtocolByKey( - action.payload.protocolKey, - FileSystem.OLD_PROTOCOLS_DIRECTORY_PATH - ) - ) break } diff --git a/app-shell/src/robot-update/index.ts b/app-shell/src/robot-update/index.ts index cc222fa1ef0..03ec72c3078 100644 --- a/app-shell/src/robot-update/index.ts +++ b/app-shell/src/robot-update/index.ts @@ -27,7 +27,6 @@ import type { RobotUpdateAction, RobotUpdateTarget, } from '@opentrons/app/src/redux/robot-update/types' -import type { RobotHost } from '@opentrons/app/src/redux/robot-api/types' const log = createLogger('robot-update/index') @@ -41,7 +40,8 @@ const updateSet: Record = { const readFileAndDispatchInfo = ( dispatch: Dispatch, - filename: string + filename: string, + isManualFile: boolean = false ): Promise => readUpdateFileInfo(filename) .then(fileInfo => ({ @@ -49,6 +49,7 @@ const readFileAndDispatchInfo = ( payload: { systemFile: fileInfo.systemFile, version: fileInfo.versionInfo.opentrons_api_version, + isManualFile, }, })) .catch((error: Error) => ({ @@ -70,7 +71,7 @@ export function registerRobotUpdate(dispatch: Dispatch): Dispatch { break case 'robotUpdate:START_PREMIGRATION': { - const robot = action.payload as RobotHost + const robot = action.payload log.info('Starting robot premigration', { robot }) @@ -104,7 +105,12 @@ export function registerRobotUpdate(dispatch: Dispatch): Dispatch { } // eslint-disable-next-line @typescript-eslint/no-floating-promises - uploadSystemFile(host, path, systemFile) + uploadSystemFile(host, path, systemFile, progress => + dispatch({ + type: 'robotUpdate:FILE_UPLOAD_PROGRESS', + payload: progress, + }) + ) .then(() => ({ type: 'robotUpdate:FILE_UPLOAD_DONE' as const, payload: host.name, @@ -130,20 +136,28 @@ export function registerRobotUpdate(dispatch: Dispatch): Dispatch { case 'robotUpdate:READ_USER_FILE': { const { systemFile } = action.payload as { systemFile: string } - readFileAndDispatchInfo(dispatch, systemFile) - break + return readFileAndDispatchInfo(dispatch, systemFile, true) } case 'robotUpdate:READ_SYSTEM_FILE': { const { target } = action.payload const filename = updateSet[target]?.system + if (filename == null) { - return dispatch({ - type: 'robotUpdate:UNEXPECTED_ERROR', - payload: { message: 'Robot update file not downloaded' }, - }) + if (checkingForUpdates) { + dispatch({ + type: 'robotUpdate:CHECKING_FOR_UPDATE', + payload: target, + }) + } else { + // If the file was downloaded but deleted from robot-update-cache. + dispatch({ + type: 'robotUpdate:UNEXPECTED_ERROR', + payload: { message: 'Robot update file not downloaded' }, + }) + } } else { - readFileAndDispatchInfo(dispatch, filename) + return readFileAndDispatchInfo(dispatch, filename) } } } @@ -165,12 +179,12 @@ export function getRobotSystemUpdateUrls( .then(manifest => { const urls = getReleaseSet(manifest, CURRENT_VERSION) - if (urls === null) { - log.warn('No release files in manifest', { - version: CURRENT_VERSION, - manifest, - }) - } + // if (urls === null) { + // log.warn('No release files in manifest', { + // version: CURRENT_VERSION, + // manifest, + // }) + // } return urls }) @@ -206,7 +220,7 @@ export function checkForRobotUpdate( const handleProgress = (progress: DownloadProgress): void => { const { downloaded, size } = progress if (size !== null) { - const percentDone = Math.round(downloaded / size) * 100 + const percentDone = Math.round((downloaded / size) * 100) if (percentDone - prevPercentDone > 0) { dispatch({ type: 'robotUpdate:DOWNLOAD_PROGRESS', @@ -220,7 +234,15 @@ export function checkForRobotUpdate( const targetDownloadDir = cacheDirForMachineFiles(target) return ensureDir(targetDownloadDir) - .then(() => getReleaseFiles(urls, targetDownloadDir, handleProgress)) + .then(() => + getReleaseFiles( + urls, + targetDownloadDir, + dispatch, + target, + handleProgress + ) + ) .then(filepaths => cacheUpdateSet(filepaths, target)) .then(updateInfo => dispatch({ type: 'robotUpdate:UPDATE_INFO', payload: updateInfo }) diff --git a/app-shell/src/robot-update/release-files.ts b/app-shell/src/robot-update/release-files.ts index d2d9d6b47cc..0c84634eb59 100644 --- a/app-shell/src/robot-update/release-files.ts +++ b/app-shell/src/robot-update/release-files.ts @@ -3,12 +3,17 @@ import assert from 'assert' import path from 'path' import { promisify } from 'util' import tempy from 'tempy' -import { move, readdir, remove } from 'fs-extra' +import { move, readdir, remove, readFile } from 'fs-extra' import StreamZip from 'node-stream-zip' import getStream from 'get-stream' +import { RobotUpdateTarget } from '@opentrons/app/src/redux/robot-update/types' + import { createLogger } from '../log' import { fetchToFile } from '../http' +import { Dispatch } from '../types' +import { CURRENT_VERSION } from '../update' + import type { DownloadProgress } from '../http' import type { ReleaseSetUrls, ReleaseSetFilepaths, UserFileInfo } from './types' @@ -23,6 +28,8 @@ const outPath = (dir: string, url: string): string => export function getReleaseFiles( urls: ReleaseSetUrls, directory: string, + dispatch: Dispatch, + target: RobotUpdateTarget, onProgress: (progress: DownloadProgress) => unknown ): Promise { return readdir(directory) @@ -44,41 +51,65 @@ export function getReleaseFiles( return { system, releaseNotes } } - return downloadReleaseFiles(urls, directory, onProgress) + return Promise.all([ + downloadAndNotify(true, urls.releaseNotes, directory, dispatch, target), + downloadAndNotify( + false, + urls.system, + directory, + dispatch, + target, + onProgress + ), + ]).then(([releaseNotes, system]) => ({ releaseNotes, system })) }) } -// downloads the entire release set to a temporary directory, and once they're -// all successfully downloaded, renames the directory to `directory` +// downloads robot update files to a temporary directory, and once +// successfully downloaded, renames the directory to `directory` // TODO(mc, 2019-07-09): DRY this up if/when more than 2 files are required -export function downloadReleaseFiles( - urls: ReleaseSetUrls, +export function downloadAndNotify( + isReleaseNotesDownload: boolean, + url: ReleaseSetUrls['releaseNotes' | 'system'], directory: string, + dispatch: Dispatch, + target: RobotUpdateTarget, // `onProgress` will be called with download progress as the files are read - onProgress: (progress: DownloadProgress) => unknown -): Promise { + onProgress?: (progress: DownloadProgress) => unknown +): Promise { const tempDir: string = tempy.directory() - const tempSystemPath = outPath(tempDir, urls.system) - const tempNotesPath = outPath(tempDir, urls.releaseNotes) + const tempPath = outPath(tempDir, url) + const path = outPath(directory, tempPath) + const logMessage = isReleaseNotesDownload ? 'release notes' : 'system files' - log.debug('directory created for robot update downloads', { tempDir }) + log.debug('directory created for ' + logMessage, { tempDir }) // downloads are streamed directly to the filesystem to avoid loading them // all into memory simultaneously - const systemReq = fetchToFile(urls.system, tempSystemPath, { onProgress }) - const notesReq = fetchToFile(urls.releaseNotes, tempNotesPath) - - return Promise.all([systemReq, notesReq]).then(results => { - const [systemTemp, releaseNotesTemp] = results - const systemPath = outPath(directory, systemTemp) - const notesPath = outPath(directory, releaseNotesTemp) - - log.debug('renaming directory', { from: tempDir, to: directory }) + const req = fetchToFile(url, tempPath, { + onProgress, + }) - return move(tempDir, directory, { overwrite: true }).then(() => ({ - system: systemPath, - releaseNotes: notesPath, - })) + return req.then(() => { + return move(tempPath, path, { overwrite: true }) + .then(() => { + if (isReleaseNotesDownload) { + return readFile(path, 'utf8').then(releaseNotes => + dispatch({ + type: 'robotUpdate:UPDATE_INFO', + payload: { releaseNotes, target, version: CURRENT_VERSION }, + }) + ) + } + // This action will only have an effect if the user is actively waiting for the download to complete. + else { + return dispatch({ + type: 'robotUpdate:DOWNLOAD_DONE', + payload: target, + }) + } + }) + .then(() => path) }) } diff --git a/app-shell/src/robot-update/update.ts b/app-shell/src/robot-update/update.ts index dccce045f09..f3b0eca15df 100644 --- a/app-shell/src/robot-update/update.ts +++ b/app-shell/src/robot-update/update.ts @@ -62,7 +62,8 @@ export function startPremigration(robot: RobotHost): Promise { export function uploadSystemFile( robot: ViewableRobot, urlPath: string, - file: string + file: string, + progressCallback: (progress: number) => void ): Promise { const isUsbUpload = robot.ip === OPENTRONS_USB @@ -77,6 +78,7 @@ export function uploadSystemFile( ? { agent: serialPortHttpAgent, } - : {} + : {}, + progressCallback ) } diff --git a/app-shell/src/system-info/__tests__/dispatch.test.ts b/app-shell/src/system-info/__tests__/dispatch.test.ts index 00a057900b5..5376367cfc6 100644 --- a/app-shell/src/system-info/__tests__/dispatch.test.ts +++ b/app-shell/src/system-info/__tests__/dispatch.test.ts @@ -4,8 +4,11 @@ import * as Fixtures from '@opentrons/app/src/redux/system-info/__fixtures__' import * as SystemInfo from '@opentrons/app/src/redux/system-info' import { uiInitialized } from '@opentrons/app/src/redux/shell/actions' import * as OS from '../../os' -import * as UsbDevices from '../usb-devices' -import * as NetworkInterfaces from '../network-interfaces' +import { createUsbDeviceMonitor, getWindowsDriverVersion } from '../usb-devices' +import { + getActiveInterfaces, + createNetworkInterfaceMonitor, +} from '../network-interfaces' import { registerSystemInfo } from '..' import type { Dispatch } from '../../types' @@ -16,20 +19,20 @@ jest.mock('../../os') jest.mock('../usb-devices') jest.mock('../network-interfaces') -const createUsbDeviceMonitor = UsbDevices.createUsbDeviceMonitor as jest.MockedFunction< - typeof UsbDevices.createUsbDeviceMonitor +const mockCreateUsbDeviceMonitor = createUsbDeviceMonitor as jest.MockedFunction< + typeof createUsbDeviceMonitor > -const getWindowsDriverVersion = UsbDevices.getWindowsDriverVersion as jest.MockedFunction< - typeof UsbDevices.getWindowsDriverVersion +const mockGetWindowsDriverVersion = getWindowsDriverVersion as jest.MockedFunction< + typeof getWindowsDriverVersion > -const getActiveInterfaces = NetworkInterfaces.getActiveInterfaces as jest.MockedFunction< - typeof NetworkInterfaces.getActiveInterfaces +const mockGetActiveInterfaces = getActiveInterfaces as jest.MockedFunction< + typeof getActiveInterfaces > -const createNetworkInterfaceMonitor = NetworkInterfaces.createNetworkInterfaceMonitor as jest.MockedFunction< - typeof NetworkInterfaces.createNetworkInterfaceMonitor +const mockCreateNetworkInterfaceMonitor = createNetworkInterfaceMonitor as jest.MockedFunction< + typeof createNetworkInterfaceMonitor > const isWindows = OS.isWindows as jest.MockedFunction @@ -45,17 +48,17 @@ describe('app-shell::system-info module action tests', () => { const usbMonitor: UsbDeviceMonitor = { getAllDevices, stop: jest.fn() } const ifaceMonitor: NetworkInterfaceMonitor = { stop: jest.fn() } const { windowsDriverVersion: _, ...notRealtek } = Fixtures.mockUsbDevice - const realtek0 = { ...notRealtek, manufacturer: 'Realtek' } - const realtek1 = { ...notRealtek, manufacturer: 'realtek' } + const realtek0 = { ...notRealtek, manufacturerName: 'Realtek' } + const realtek1 = { ...notRealtek, manufacturerName: 'realtek' } let handler: Dispatch beforeEach(() => { handler = registerSystemInfo(dispatch) isWindows.mockReturnValue(false) - createUsbDeviceMonitor.mockReturnValue(usbMonitor) - createNetworkInterfaceMonitor.mockReturnValue(ifaceMonitor) + mockCreateUsbDeviceMonitor.mockReturnValue(usbMonitor) + mockCreateNetworkInterfaceMonitor.mockReturnValue(ifaceMonitor) getAllDevices.mockResolvedValue([realtek0]) - getActiveInterfaces.mockReturnValue([ + mockGetActiveInterfaces.mockReturnValue([ Fixtures.mockNetworkInterface, Fixtures.mockNetworkInterfaceV6, ]) @@ -75,7 +78,7 @@ describe('app-shell::system-info module action tests', () => { [Fixtures.mockNetworkInterface, Fixtures.mockNetworkInterfaceV6] ) ) - expect(getWindowsDriverVersion).toHaveBeenCalledTimes(0) + expect(mockGetWindowsDriverVersion).toHaveBeenCalledTimes(0) }) }) @@ -85,14 +88,14 @@ describe('app-shell::system-info module action tests', () => { return flush().then(() => { expect(createUsbDeviceMonitor).toHaveBeenCalledTimes(1) - expect(createNetworkInterfaceMonitor).toHaveBeenCalledTimes(1) + expect(mockCreateNetworkInterfaceMonitor).toHaveBeenCalledTimes(1) expect(dispatch).toHaveBeenCalledTimes(2) }) }) it('sends systemInfo:USB_DEVICE_ADDED when device added', () => { handler(uiInitialized()) - const usbMonitorOptions = createUsbDeviceMonitor.mock.calls[0][0] + const usbMonitorOptions = mockCreateUsbDeviceMonitor.mock.calls[0][0] expect(usbMonitorOptions?.onDeviceAdd).toEqual(expect.any(Function)) const onDeviceAdd = usbMonitorOptions?.onDeviceAdd ?? noop @@ -106,7 +109,7 @@ describe('app-shell::system-info module action tests', () => { it('sends systemInfo:USB_DEVICE_REMOVED when device removed', () => { handler(uiInitialized()) - const usbMonitorOptions = createUsbDeviceMonitor.mock.calls[0][0] + const usbMonitorOptions = mockCreateUsbDeviceMonitor.mock.calls[0][0] expect(usbMonitorOptions?.onDeviceRemove).toEqual(expect.any(Function)) const onDeviceRemove = usbMonitorOptions?.onDeviceRemove ?? noop @@ -121,7 +124,7 @@ describe('app-shell::system-info module action tests', () => { it('sends systemInfo:NETWORK_INTERFACES_CHANGED when ifaces change', () => { handler(uiInitialized()) - const ifaceMonitorOpts = createNetworkInterfaceMonitor.mock.calls[0][0] + const ifaceMonitorOpts = mockCreateNetworkInterfaceMonitor.mock.calls[0][0] expect(ifaceMonitorOpts.onInterfaceChange).toEqual(expect.any(Function)) const { onInterfaceChange } = ifaceMonitorOpts @@ -158,7 +161,7 @@ describe('app-shell::system-info module action tests', () => { describe('on windows', () => { beforeEach(() => { isWindows.mockReturnValue(true) - getWindowsDriverVersion.mockResolvedValue('1.2.3') + mockGetWindowsDriverVersion.mockResolvedValue('1.2.3') }) it('should add Windows driver versions to Realtek devices on initialization', () => { @@ -166,8 +169,8 @@ describe('app-shell::system-info module action tests', () => { handler(uiInitialized()) return flush().then(() => { - expect(getWindowsDriverVersion).toHaveBeenCalledWith(realtek0) - expect(getWindowsDriverVersion).toHaveBeenCalledWith(realtek1) + expect(mockGetWindowsDriverVersion).toHaveBeenCalledWith(realtek0) + expect(mockGetWindowsDriverVersion).toHaveBeenCalledWith(realtek1) expect(dispatch).toHaveBeenCalledWith( SystemInfo.initialized( @@ -185,12 +188,12 @@ describe('app-shell::system-info module action tests', () => { it('should add Windows driver versions to Realtek devices on add', () => { getAllDevices.mockResolvedValue([]) handler(uiInitialized()) - const usbMonitorOptions = createUsbDeviceMonitor.mock.calls[0][0] + const usbMonitorOptions = mockCreateUsbDeviceMonitor.mock.calls[0][0] const onDeviceAdd = usbMonitorOptions?.onDeviceAdd ?? noop onDeviceAdd(realtek0) return flush().then(() => { - expect(getWindowsDriverVersion).toHaveBeenCalledWith(realtek0) + expect(mockGetWindowsDriverVersion).toHaveBeenCalledWith(realtek0) expect(dispatch).toHaveBeenCalledWith( SystemInfo.usbDeviceAdded({ diff --git a/app-shell/src/system-info/__tests__/usb-devices.test.ts b/app-shell/src/system-info/__tests__/usb-devices.test.ts index 1c84dda857d..4f2a7dc8fba 100644 --- a/app-shell/src/system-info/__tests__/usb-devices.test.ts +++ b/app-shell/src/system-info/__tests__/usb-devices.test.ts @@ -1,14 +1,14 @@ import execa from 'execa' -import usbDetection from 'usb-detection' +import { webusb } from 'usb' import * as Fixtures from '@opentrons/app/src/redux/system-info/__fixtures__' import { createUsbDeviceMonitor, getWindowsDriverVersion } from '../usb-devices' jest.mock('execa') -jest.mock('usb-detection') +jest.mock('usb') -const usbDetectionFind = usbDetection.find as jest.MockedFunction< - typeof usbDetection.find +const usbGetDeviceList = webusb.getDevices as jest.MockedFunction< + typeof webusb.getDevices > const execaCommand = execa.command as jest.MockedFunction @@ -19,26 +19,14 @@ describe('app-shell::system-info::usb-devices', () => { jest.resetAllMocks() }) - it('can create a usb device monitor', () => { - expect(usbDetection.startMonitoring).toHaveBeenCalledTimes(0) - createUsbDeviceMonitor() - expect(usbDetection.startMonitoring).toHaveBeenCalledTimes(1) - }) - - it('usb device monitor can be stopped', () => { - const monitor = createUsbDeviceMonitor() - monitor.stop() - expect(usbDetection.stopMonitoring).toHaveBeenCalledTimes(1) - }) - it('can return the list of all devices', async () => { const mockDevices = [ { ...mockDevice, deviceName: 'foo' }, { ...mockDevice, deviceName: 'bar' }, { ...mockDevice, deviceName: 'baz' }, - ] + ] as any - usbDetectionFind.mockResolvedValueOnce(mockDevices) + usbGetDeviceList.mockResolvedValueOnce(mockDevices) const monitor = createUsbDeviceMonitor() const result = monitor.getAllDevices() @@ -49,8 +37,8 @@ describe('app-shell::system-info::usb-devices', () => { it('can notify when devices are added', () => { const onDeviceAdd = jest.fn() createUsbDeviceMonitor({ onDeviceAdd }) - - usbDetection.emit('add', mockDevice) + webusb.removeEventListener('connect', onDeviceAdd(mockDevice)) + webusb.addEventListener('connect', onDeviceAdd(mockDevice)) expect(onDeviceAdd).toHaveBeenCalledWith(mockDevice) }) @@ -58,8 +46,8 @@ describe('app-shell::system-info::usb-devices', () => { it('can notify when devices are removed', () => { const onDeviceRemove = jest.fn() createUsbDeviceMonitor({ onDeviceRemove }) - - usbDetection.emit('remove', mockDevice) + webusb.removeEventListener('disconnect', onDeviceRemove(mockDevice)) + webusb.addEventListener('disconnect', onDeviceRemove(mockDevice)) expect(onDeviceRemove).toHaveBeenCalledWith(mockDevice) }) diff --git a/app-shell/src/system-info/index.ts b/app-shell/src/system-info/index.ts index f42cf474f81..73fff4de6cb 100644 --- a/app-shell/src/system-info/index.ts +++ b/app-shell/src/system-info/index.ts @@ -12,7 +12,7 @@ import { import type { UsbDevice } from '@opentrons/app/src/redux/system-info/types' import type { Action, Dispatch } from '../types' -import type { UsbDeviceMonitor, Device } from './usb-devices' +import type { UsbDeviceMonitor } from './usb-devices' import type { NetworkInterface, NetworkInterfaceMonitor, @@ -26,15 +26,36 @@ const IFACE_POLL_INTERVAL_MS = 30000 const log = createLogger('system-info') -const addDriverVersion = (device: Device): Promise => { - if (isWindows() && RE_REALTEK.test(device.manufacturer)) { +// format USBDevice to UsbDevice type +const createUsbDevice = (device: USBDevice): UsbDevice => { + return { + vendorId: device.vendorId, + productId: device.productId, + productName: device.productName != null ? device.productName : 'no name', + manufacturerName: + device.manufacturerName != null + ? device.manufacturerName + : 'no manufacture', + serialNumber: + device.serialNumber != null ? device.serialNumber : 'no serial', + } +} +const createUsbDevices = (devices: USBDevice[]): UsbDevice[] => + devices.map((device: USBDevice) => createUsbDevice(device)) + +const addDriverVersion = (device: UsbDevice): Promise => { + if ( + isWindows() && + device.manufacturerName != null && + RE_REALTEK.test(device.manufacturerName) + ) { return getWindowsDriverVersion(device).then(windowsDriverVersion => ({ ...device, windowsDriverVersion, })) } - return Promise.resolve({ ...device }) + return Promise.resolve(device) } export function registerSystemInfo( @@ -43,13 +64,13 @@ export function registerSystemInfo( let usbMonitor: UsbDeviceMonitor let ifaceMonitor: NetworkInterfaceMonitor - const handleDeviceAdd = (device: Device): void => { + const handleDeviceAdd = (device: UsbDevice): void => { // eslint-disable-next-line @typescript-eslint/no-floating-promises addDriverVersion(device).then(d => dispatch(SystemInfo.usbDeviceAdded(d))) } - const handleDeviceRemove = (d: Device): void => { - dispatch(SystemInfo.usbDeviceRemoved({ ...d })) + const handleDeviceRemove = (d: UsbDevice): void => { + dispatch(SystemInfo.usbDeviceRemoved(d)) } const handleIfacesChanged = (interfaces: NetworkInterface[]): void => { @@ -89,7 +110,9 @@ export function registerSystemInfo( usbMonitor .getAllDevices() - .then(devices => Promise.all(devices.map(addDriverVersion))) + .then(devices => + Promise.all(createUsbDevices(devices).map(addDriverVersion)) + ) .then(devices => { dispatch(SystemInfo.initialized(devices, getActiveInterfaces())) }) diff --git a/app-shell/src/system-info/usb-devices.ts b/app-shell/src/system-info/usb-devices.ts index 6000229ef9c..c9b26dc2dfa 100644 --- a/app-shell/src/system-info/usb-devices.ts +++ b/app-shell/src/system-info/usb-devices.ts @@ -1,50 +1,49 @@ import assert from 'assert' import execa from 'execa' -import usbDetection from 'usb-detection' +import { usb, WebUSB } from 'usb' import { isWindows } from '../os' import { createLogger } from '../log' -import type { Device } from 'usb-detection' - -export type { Device } +import type { UsbDevice } from '@opentrons/app/src/redux/system-info/types' export type UsbDeviceMonitorOptions = Partial<{ - onDeviceAdd?: (device: Device) => unknown - onDeviceRemove?: (device: Device) => unknown + onDeviceAdd?: (device: UsbDevice) => void + onDeviceRemove?: (device: UsbDevice) => void }> export interface UsbDeviceMonitor { - getAllDevices: () => Promise + getAllDevices: () => Promise stop: () => void } const log = createLogger('usb-devices') +const webusb = new WebUSB({ + allowAllDevices: true, +}) export function createUsbDeviceMonitor( options: UsbDeviceMonitorOptions = {} ): UsbDeviceMonitor { const { onDeviceAdd, onDeviceRemove } = options - usbDetection.startMonitoring() if (typeof onDeviceAdd === 'function') { - usbDetection.on('add', onDeviceAdd) + usb.on('attach', device => onDeviceAdd) } if (typeof onDeviceRemove === 'function') { - usbDetection.on('remove', onDeviceRemove) + usb.on('detach', device => onDeviceRemove) } return { - getAllDevices: () => usbDetection.find(), + getAllDevices: () => Promise.resolve(webusb.getDevices()), stop: () => { if (typeof onDeviceAdd === 'function') { - usbDetection.off('add', onDeviceAdd) + usb.removeAllListeners('attach') } if (typeof onDeviceRemove === 'function') { - usbDetection.off('remove', onDeviceRemove) + usb.removeAllListeners('detach') } - usbDetection.stopMonitoring() log.debug('usb detection monitoring stopped') }, } @@ -54,11 +53,17 @@ const decToHex = (number: number): string => number.toString(16).toUpperCase().padStart(4, '0') export function getWindowsDriverVersion( - device: Device + device: UsbDevice ): Promise { + console.log('getWindowsDriverVersion', device) const { vendorId: vidDecimal, productId: pidDecimal, serialNumber } = device const [vid, pid] = [decToHex(vidDecimal), decToHex(pidDecimal)] + // USBDevice serialNumber is string | undefined + if (serialNumber == null) { + return Promise.resolve(null) + } + assert( isWindows() || process.env.NODE_ENV === 'test', `getWindowsDriverVersion cannot be called on ${process.platform}` diff --git a/app-shell/src/ui.ts b/app-shell/src/ui.ts index 6bdd1240edf..6734136fc6e 100644 --- a/app-shell/src/ui.ts +++ b/app-shell/src/ui.ts @@ -1,9 +1,14 @@ // sets up the main window ui import { app, shell, BrowserWindow } from 'electron' import path from 'path' + +import { RELOAD_UI } from '@opentrons/app/src/redux/shell/actions' + import { getConfig } from './config' import { createLogger } from './log' +import type { Action } from './types' + const config = getConfig('ui') const log = createLogger('ui') @@ -52,12 +57,25 @@ export function createUi(): BrowserWindow { mainWindow.loadURL(url, { extraHeaders: 'pragma: no-cache\n' }) // open new windows ( { - log.debug('Opening external link', { url }) - event.preventDefault() - // eslint-disable-next-line @typescript-eslint/no-floating-promises - shell.openExternal(url) + mainWindow.webContents.setWindowOpenHandler(({ url }) => { + // eslint-disable-next-line no-void + void shell.openExternal(url) + return { action: 'deny' } }) return mainWindow } + +export function registerReloadUi( + browserWindow: BrowserWindow +): (action: Action) => unknown { + return function handleAction(action: Action) { + switch (action.type) { + case RELOAD_UI: + log.info(`reloading UI: ${action.payload.message}`) + browserWindow.webContents.reload() + + break + } + } +} diff --git a/app-shell/src/usb.ts b/app-shell/src/usb.ts index b09d1157fa1..14e26891776 100644 --- a/app-shell/src/usb.ts +++ b/app-shell/src/usb.ts @@ -29,30 +29,55 @@ import type { Action, Dispatch } from './types' let usbHttpAgent: SerialPortHttpAgent | undefined const usbLog = createLogger('usb') +let usbFetchInterval: NodeJS.Timeout export function getSerialPortHttpAgent(): SerialPortHttpAgent | undefined { return usbHttpAgent } - -export function createSerialPortHttpAgent(path: string): void { - const serialPortHttpAgent = new SerialPortHttpAgent({ - maxFreeSockets: 1, - maxSockets: 1, - maxTotalSockets: 1, - keepAlive: true, - keepAliveMsecs: 10000, - path, - logger: usbLog, - }) - - usbHttpAgent = serialPortHttpAgent +export function createSerialPortHttpAgent( + path: string, + onComplete: (err: Error | null, agent?: SerialPortHttpAgent) => void +): void { + if (usbHttpAgent != null) { + onComplete( + new Error('Tried to make a USB http agent when one already existed') + ) + } else { + usbHttpAgent = new SerialPortHttpAgent( + { + maxFreeSockets: 1, + maxSockets: 1, + maxTotalSockets: 1, + keepAlive: true, + keepAliveMsecs: Infinity, + path, + logger: usbLog, + timeout: 100000, + }, + (err, agent?) => { + if (err != null) { + usbHttpAgent = undefined + } + onComplete(err, agent) + } + ) + } } -export function destroyUsbHttpAgent(): void { +export function destroyAndStopUsbHttpRequests(dispatch: Dispatch): void { if (usbHttpAgent != null) { usbHttpAgent.destroy() } usbHttpAgent = undefined + ipcMain.removeHandler('usb:request') + dispatch(usbRequestsStop()) + // handle any additional invocations of usb:request + ipcMain.handle('usb:request', () => + Promise.resolve({ + status: 400, + statusText: 'USB robot disconnected', + }) + ) } function isUsbDeviceOt3(device: UsbDevice): boolean { @@ -61,38 +86,36 @@ function isUsbDeviceOt3(device: UsbDevice): boolean { device.vendorId === parseInt(DEFAULT_VENDOR_ID, 16) ) } - async function usbListener( _event: IpcMainInvokeEvent, config: AxiosRequestConfig ): Promise { - try { - // TODO(bh, 2023-05-03): remove mutation - let { data } = config - let formHeaders = {} - - // check for formDataProxy - if (data?.formDataProxy != null) { - // reconstruct FormData - const formData = new FormData() - const { protocolKey } = data.formDataProxy - - const srcFilePaths: string[] = await getProtocolSrcFilePaths(protocolKey) - - // create readable stream from file - srcFilePaths.forEach(srcFilePath => { - const readStream = fs.createReadStream(srcFilePath) - formData.append('files', readStream, path.basename(srcFilePath)) - }) - - formData.append('key', protocolKey) + // TODO(bh, 2023-05-03): remove mutation + let { data } = config + let formHeaders = {} + + // check for formDataProxy + if (data?.formDataProxy != null) { + // reconstruct FormData + const formData = new FormData() + const { protocolKey } = data.formDataProxy + + const srcFilePaths: string[] = await getProtocolSrcFilePaths(protocolKey) + + // create readable stream from file + srcFilePaths.forEach(srcFilePath => { + const readStream = fs.createReadStream(srcFilePath) + formData.append('files', readStream, path.basename(srcFilePath)) + }) - formHeaders = formData.getHeaders() - data = formData - } + formData.append('key', protocolKey) - const usbHttpAgent = getSerialPortHttpAgent() + formHeaders = formData.getHeaders() + data = formData + } + const usbHttpAgent = getSerialPortHttpAgent() + try { const response = await axios.request({ httpAgent: usbHttpAgent, ...config, @@ -100,17 +123,30 @@ async function usbListener( headers: { ...config.headers, ...formHeaders }, }) return { + error: false, data: response.data, status: response.status, statusText: response.statusText, } } catch (e) { - // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - usbLog.debug(`usbListener error ${e?.message ?? 'unknown'}`) + if (e instanceof Error) { + console.log(`axios request error ${e?.message ?? 'unknown'}`) + } } } -function startUsbHttpRequests(dispatch: Dispatch): void { +function pollSerialPortAndCreateAgent(dispatch: Dispatch): void { + // usb poll already initialized + if (usbFetchInterval != null) { + return + } + usbFetchInterval = setInterval(() => { + // already connected to an Opentrons robot via USB + tryCreateAndStartUsbHttpRequests(dispatch) + }, 10000) +} + +function tryCreateAndStartUsbHttpRequests(dispatch: Dispatch): void { fetchSerialPortList() .then((list: PortInfo[]) => { const ot3UsbSerialPort = list.find( @@ -123,19 +159,24 @@ function startUsbHttpRequests(dispatch: Dispatch): void { }) === 0 ) - // retry if no OT-3 serial port found - usb-detection and serialport packages have race condition + // retry if no Flex serial port found - usb-detection and serialport packages have race condition if (ot3UsbSerialPort == null) { - usbLog.debug('no OT-3 serial port found, retrying') - setTimeout(() => startUsbHttpRequests(dispatch), 1000) + usbLog.debug('No Flex serial port found.') return } - - createSerialPortHttpAgent(ot3UsbSerialPort.path) - // remove any existing handler - ipcMain.removeHandler('usb:request') - ipcMain.handle('usb:request', usbListener) - - dispatch(usbRequestsStart()) + if (usbHttpAgent == null) { + createSerialPortHttpAgent(ot3UsbSerialPort.path, (err, agent?) => { + if (err != null) { + const message = err?.message ?? err + usbLog.error(`Failed to create serial port: ${message}`) + } + if (agent) { + ipcMain.removeHandler('usb:request') + ipcMain.handle('usb:request', usbListener) + dispatch(usbRequestsStart()) + } + }) + } }) .catch(e => // eslint-disable-next-line @typescript-eslint/restrict-template-expressions @@ -148,26 +189,18 @@ export function registerUsb(dispatch: Dispatch): (action: Action) => unknown { switch (action.type) { case SYSTEM_INFO_INITIALIZED: if (action.payload.usbDevices.find(isUsbDeviceOt3) != null) { - startUsbHttpRequests(dispatch) + tryCreateAndStartUsbHttpRequests(dispatch) } + pollSerialPortAndCreateAgent(dispatch) break case USB_DEVICE_ADDED: if (isUsbDeviceOt3(action.payload.usbDevice)) { - startUsbHttpRequests(dispatch) + tryCreateAndStartUsbHttpRequests(dispatch) } break case USB_DEVICE_REMOVED: if (isUsbDeviceOt3(action.payload.usbDevice)) { - destroyUsbHttpAgent() - ipcMain.removeHandler('usb:request') - dispatch(usbRequestsStop()) - // handle any additional invocations of usb:request - ipcMain.handle('usb:request', () => - Promise.resolve({ - status: 400, - statusText: 'USB robot disconnected', - }) - ) + destroyAndStopUsbHttpRequests(dispatch) } break } diff --git a/app-shell/typings/usb-detection.d.ts b/app-shell/typings/usb-detection.d.ts index 194cb8cb6fb..783ab4bd1c8 100644 --- a/app-shell/typings/usb-detection.d.ts +++ b/app-shell/typings/usb-detection.d.ts @@ -1,6 +1,6 @@ -import 'usb-detection' +// import 'usb-detection' -declare module 'usb-detection' { - export function off(event: string, handler: unknown): void - export function emit(event: string, payload: unknown): void -} +// declare module 'usb-detection' { +// export function off(event: string, handler: unknown): void +// export function emit(event: string, payload: unknown): void +// } diff --git a/app-testing/.gitignore b/app-testing/.gitignore index 6ba4abe0128..8c771199b29 100644 --- a/app-testing/.gitignore +++ b/app-testing/.gitignore @@ -1,2 +1,3 @@ .env results +analysis_results/*.json diff --git a/app-testing/Makefile b/app-testing/Makefile index f9c3770b66a..40abbc0e7aa 100644 --- a/app-testing/Makefile +++ b/app-testing/Makefile @@ -1,22 +1,22 @@ .PHONY: black black: - pipenv run python -m black . + python -m pipenv run python -m black . .PHONY: black-check black-check: - pipenv run python -m black . --check + python -m pipenv run python -m black . --check .PHONY: ruff ruff: - pipenv run python -m ruff . --fix + python -m pipenv run python -m ruff . --fix --unsafe-fixes .PHONY: ruff-check ruff-check: - pipenv run python -m ruff . + python -m pipenv run python -m ruff . .PHONY: mypy mypy: - pipenv run python -m mypy conftest.py automation tests + python -m pipenv run python -m mypy conftest.py automation tests citools .PHONY: lint lint: @@ -32,15 +32,19 @@ format: .PHONY: test-ci test-ci: - pipenv run python -m pytest -m "emulated_alpha" + python -m pipenv run python -m pytest -m "emulated_alpha" + +.PHONY: test-protocol-analysis +test-protocol-analysis: + pipenv run python -m pytest -v tests/protocol_analyze_test.py .PHONY: setup -setup: - pipenv install +setup: install-pipenv + python -m pipenv install .PHONY: teardown teardown: - pipenv --rm + python -m pipenv --rm .PHONY: format-readme format-readme: @@ -48,4 +52,24 @@ format-readme: .PHONY: print-protocols print-protocols: - pipenv run python print_protocols.py + python -m pipenv run python print_protocols.py + +.PHONY: install-pipenv +install-pipenv: + python -m pip install -U pipenv + +.PHONY: snapshot-test +snapshot-test: + python -m pipenv run pytest -k analyses_snapshot_test -vv + +.PHONY: snapshot-test-update +snapshot-test-update: + python -m pipenv run pytest -k analyses_snapshot_test --snapshot-update + +TARGET ?= edge + +.PHONY: build-opentrons-analysis +build-opentrons-analysis: + @echo "Building docker image for $(TARGET)" + @echo "If you want to build a different version, run 'make build-docker TARGET='" + docker build --build-arg OPENTRONS_VERSION=$(TARGET) -t opentrons-analysis:$(TARGET) citools/. diff --git a/app-testing/Pipfile b/app-testing/Pipfile index 12dfe7880a0..6b584a7fb4a 100644 --- a/app-testing/Pipfile +++ b/app-testing/Pipfile @@ -4,21 +4,24 @@ url = "https://pypi.org/simple" verify_ssl = true [packages] -pytest = "==7.2.0" -black = "==22.12.0" -selenium = "==4.7.2" -importlib-metadata = "==5.0.0" -requests = "==2.28.1" -python-dotenv = "==0.21.0" -pytest-xdist = "==3.0.2" -mypy = "==0.991" -types-requests = "==2.28.11.5" -rich = "==13.0.0" +pytest = "==7.4.3" +black = "==23.11.0" +selenium = "==4.15.2" +importlib-metadata = "==6.8.0" +requests = "==2.31.0" +python-dotenv = "==1.0.0" +pytest-xdist = "==3.5.0" +mypy = "==1.7.1" +types-requests = "==2.31.0.10" +rich = "==13.7.0" atomicwrites = "==1.4.1" pyreadline3 = "==3.4.1" -pydantic = "==1.10.4" -pygithub = "==1.57" -ruff = "==0.0.236" +pydantic = "==2.5.2" +pygithub = "==2.1.1" +ruff = "==0.1.6" +docker = "==6.1.3" +syrupy = "==4.6.0" +pytest-html = "==4.1.1" [requires] -python_version = "3.11" +python_version = "3.12" diff --git a/app-testing/Pipfile.lock b/app-testing/Pipfile.lock index 38341adc09c..e6d0c62ad48 100644 --- a/app-testing/Pipfile.lock +++ b/app-testing/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "34f82d64c90df6aff09f96dc7c22e861d0b7d9826cfbdcea9e1e1eb287aefb1f" + "sha256": "833b9fb969bfaeeae450d8fdff72fe005f8b2857541ba692965d2177ff6004de" }, "pipfile-spec": 6, "requires": { - "python_version": "3.11" + "python_version": "3.12" }, "sources": [ { @@ -16,13 +16,13 @@ ] }, "default": { - "async-generator": { + "annotated-types": { "hashes": [ - "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b", - "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144" + "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43", + "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d" ], - "markers": "python_version >= '3.5'", - "version": "==1.10" + "markers": "python_version >= '3.8'", + "version": "==0.6.0" }, "atomicwrites": { "hashes": [ @@ -33,153 +33,259 @@ }, "attrs": { "hashes": [ - "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", - "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" + "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", + "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" ], - "markers": "python_version >= '3.6'", - "version": "==22.2.0" + "markers": "python_version >= '3.7'", + "version": "==23.1.0" }, "black": { "hashes": [ - "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320", - "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351", - "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350", - "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f", - "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf", - "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148", - "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4", - "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d", - "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc", - "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d", - "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2", - "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f" + "sha256:250d7e60f323fcfc8ea6c800d5eba12f7967400eb6c2d21ae85ad31c204fb1f4", + "sha256:2a9acad1451632021ee0d146c8765782a0c3846e0e0ea46659d7c4f89d9b212b", + "sha256:412f56bab20ac85927f3a959230331de5614aecda1ede14b373083f62ec24e6f", + "sha256:421f3e44aa67138ab1b9bfbc22ee3780b22fa5b291e4db8ab7eee95200726b07", + "sha256:45aa1d4675964946e53ab81aeec7a37613c1cb71647b5394779e6efb79d6d187", + "sha256:4c44b7211a3a0570cc097e81135faa5f261264f4dfaa22bd5ee2875a4e773bd6", + "sha256:4c68855825ff432d197229846f971bc4d6666ce90492e5b02013bcaca4d9ab05", + "sha256:5133f5507007ba08d8b7b263c7aa0f931af5ba88a29beacc4b2dc23fcefe9c06", + "sha256:54caaa703227c6e0c87b76326d0862184729a69b73d3b7305b6288e1d830067e", + "sha256:58e5f4d08a205b11800332920e285bd25e1a75c54953e05502052738fe16b3b5", + "sha256:698c1e0d5c43354ec5d6f4d914d0d553a9ada56c85415700b81dc90125aac244", + "sha256:6c1cac07e64433f646a9a838cdc00c9768b3c362805afc3fce341af0e6a9ae9f", + "sha256:760415ccc20f9e8747084169110ef75d545f3b0932ee21368f63ac0fee86b221", + "sha256:7f622b6822f02bfaf2a5cd31fdb7cd86fcf33dab6ced5185c35f5db98260b055", + "sha256:cf57719e581cfd48c4efe28543fea3d139c6b6f1238b3f0102a9c73992cbb479", + "sha256:d136ef5b418c81660ad847efe0e55c58c8208b77a57a28a503a5f345ccf01394", + "sha256:dbea0bb8575c6b6303cc65017b46351dc5953eea5c0a59d7b7e3a2d2f433a911", + "sha256:fc7f6a44d52747e65a02558e1d807c82df1d66ffa80a601862040a43ec2e3142" ], "index": "pypi", - "version": "==22.12.0" + "markers": "python_version >= '3.8'", + "version": "==23.11.0" }, "certifi": { "hashes": [ - "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", - "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" + "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", + "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" ], "markers": "python_version >= '3.6'", - "version": "==2022.12.7" + "version": "==2023.11.17" }, "cffi": { "hashes": [ - "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", - "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", - "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", - "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", - "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", - "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", - "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", - "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", - "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", - "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", - "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", - "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", - "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", - "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", - "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", - "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", - "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", - "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", - "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", - "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", - "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", - "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", - "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", - "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", - "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", - "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", - "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", - "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", - "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", - "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", - "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", - "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", - "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", - "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", - "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", - "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", - "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", - "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", - "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", - "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", - "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", - "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", - "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", - "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", - "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", - "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", - "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", - "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", - "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", - "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", - "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", - "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", - "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", - "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", - "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", - "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", - "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", - "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", - "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", - "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", - "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", - "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", - "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", - "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" - ], - "version": "==1.15.1" + "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", + "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", + "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", + "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", + "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", + "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", + "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", + "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", + "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", + "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", + "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", + "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", + "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", + "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", + "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", + "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", + "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", + "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", + "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", + "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", + "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", + "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", + "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", + "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", + "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", + "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", + "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", + "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", + "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", + "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", + "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", + "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", + "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", + "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", + "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", + "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", + "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", + "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", + "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", + "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", + "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", + "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", + "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", + "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", + "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", + "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", + "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", + "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", + "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", + "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", + "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", + "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" + ], + "markers": "python_version >= '3.8'", + "version": "==1.16.0" }, "charset-normalizer": { "hashes": [ - "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", - "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" ], - "markers": "python_full_version >= '3.6.0'", - "version": "==2.1.1" + "markers": "python_full_version >= '3.7.0'", + "version": "==3.3.2" }, "click": { "hashes": [ - "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", - "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" ], "markers": "python_version >= '3.7'", - "version": "==8.1.3" + "version": "==8.1.7" + }, + "cryptography": { + "hashes": [ + "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960", + "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a", + "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc", + "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a", + "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf", + "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1", + "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39", + "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406", + "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a", + "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a", + "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c", + "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be", + "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15", + "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2", + "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d", + "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157", + "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003", + "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248", + "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a", + "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec", + "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309", + "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7", + "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d" + ], + "version": "==41.0.7" }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "sys_platform == 'win32'", - "version": "==0.4.6" - }, - "commonmark": { + "deprecated": { "hashes": [ - "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60", - "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9" + "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c", + "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3" ], - "version": "==0.9.1" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.2.14" }, - "deprecated": { + "docker": { "hashes": [ - "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d", - "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d" + "sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20", + "sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.2.13" + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==6.1.3" }, "execnet": { "hashes": [ - "sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5", - "sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142" + "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41", + "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.9.0" + "markers": "python_version >= '3.7'", + "version": "==2.0.2" }, "h11": { "hashes": [ @@ -191,19 +297,20 @@ }, "idna": { "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" ], "markers": "python_version >= '3.5'", - "version": "==3.4" + "version": "==3.6" }, "importlib-metadata": { "hashes": [ - "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab", - "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43" + "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb", + "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743" ], "index": "pypi", - "version": "==5.0.0" + "markers": "python_version >= '3.8'", + "version": "==6.8.0" }, "iniconfig": { "hashes": [ @@ -213,88 +320,177 @@ "markers": "python_version >= '3.7'", "version": "==2.0.0" }, + "jinja2": { + "hashes": [ + "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", + "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" + ], + "markers": "python_version >= '3.7'", + "version": "==3.1.2" + }, + "markdown-it-py": { + "hashes": [ + "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", + "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb" + ], + "markers": "python_version >= '3.8'", + "version": "==3.0.0" + }, + "markupsafe": { + "hashes": [ + "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", + "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", + "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", + "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", + "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c", + "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", + "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", + "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb", + "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939", + "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", + "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", + "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", + "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", + "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", + "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", + "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", + "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd", + "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", + "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", + "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", + "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", + "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", + "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", + "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", + "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", + "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007", + "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", + "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", + "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", + "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0", + "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", + "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", + "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", + "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1", + "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", + "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", + "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c", + "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", + "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823", + "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", + "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", + "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", + "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", + "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee", + "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc", + "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2", + "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48", + "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7", + "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e", + "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b", + "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa", + "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5", + "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e", + "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb", + "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", + "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", + "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", + "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc", + "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2", + "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.3" + }, + "mdurl": { + "hashes": [ + "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", + "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" + ], + "markers": "python_version >= '3.7'", + "version": "==0.1.2" + }, "mypy": { "hashes": [ - "sha256:0714258640194d75677e86c786e80ccf294972cc76885d3ebbb560f11db0003d", - "sha256:0c8f3be99e8a8bd403caa8c03be619544bc2c77a7093685dcf308c6b109426c6", - "sha256:0cca5adf694af539aeaa6ac633a7afe9bbd760df9d31be55ab780b77ab5ae8bf", - "sha256:1c8cd4fb70e8584ca1ed5805cbc7c017a3d1a29fb450621089ffed3e99d1857f", - "sha256:1f7d1a520373e2272b10796c3ff721ea1a0712288cafaa95931e66aa15798813", - "sha256:209ee89fbb0deed518605edddd234af80506aec932ad28d73c08f1400ef80a33", - "sha256:26efb2fcc6b67e4d5a55561f39176821d2adf88f2745ddc72751b7890f3194ad", - "sha256:37bd02ebf9d10e05b00d71302d2c2e6ca333e6c2a8584a98c00e038db8121f05", - "sha256:3a700330b567114b673cf8ee7388e949f843b356a73b5ab22dd7cff4742a5297", - "sha256:3c0165ba8f354a6d9881809ef29f1a9318a236a6d81c690094c5df32107bde06", - "sha256:3d80e36b7d7a9259b740be6d8d906221789b0d836201af4234093cae89ced0cd", - "sha256:4175593dc25d9da12f7de8de873a33f9b2b8bdb4e827a7cae952e5b1a342e243", - "sha256:4307270436fd7694b41f913eb09210faff27ea4979ecbcd849e57d2da2f65305", - "sha256:5e80e758243b97b618cdf22004beb09e8a2de1af481382e4d84bc52152d1c476", - "sha256:641411733b127c3e0dab94c45af15fea99e4468f99ac88b39efb1ad677da5711", - "sha256:652b651d42f155033a1967739788c436491b577b6a44e4c39fb340d0ee7f0d70", - "sha256:6d7464bac72a85cb3491c7e92b5b62f3dcccb8af26826257760a552a5e244aa5", - "sha256:74e259b5c19f70d35fcc1ad3d56499065c601dfe94ff67ae48b85596b9ec1461", - "sha256:7d17e0a9707d0772f4a7b878f04b4fd11f6f5bcb9b3813975a9b13c9332153ab", - "sha256:901c2c269c616e6cb0998b33d4adbb4a6af0ac4ce5cd078afd7bc95830e62c1c", - "sha256:98e781cd35c0acf33eb0295e8b9c55cdbef64fcb35f6d3aa2186f289bed6e80d", - "sha256:a12c56bf73cdab116df96e4ff39610b92a348cc99a1307e1da3c3768bbb5b135", - "sha256:ac6e503823143464538efda0e8e356d871557ef60ccd38f8824a4257acc18d93", - "sha256:b8472f736a5bfb159a5e36740847808f6f5b659960115ff29c7cecec1741c648", - "sha256:b86ce2c1866a748c0f6faca5232059f881cda6dda2a893b9a8373353cfe3715a", - "sha256:bc9ec663ed6c8f15f4ae9d3c04c989b744436c16d26580eaa760ae9dd5d662eb", - "sha256:c9166b3f81a10cdf9b49f2d594b21b31adadb3d5e9db9b834866c3258b695be3", - "sha256:d13674f3fb73805ba0c45eb6c0c3053d218aa1f7abead6e446d474529aafc372", - "sha256:de32edc9b0a7e67c2775e574cb061a537660e51210fbf6006b0b36ea695ae9bb", - "sha256:e62ebaad93be3ad1a828a11e90f0e76f15449371ffeecca4a0a0b9adc99abcef" + "sha256:12cce78e329838d70a204293e7b29af9faa3ab14899aec397798a4b41be7f340", + "sha256:1484b8fa2c10adf4474f016e09d7a159602f3239075c7bf9f1627f5acf40ad49", + "sha256:204e0d6de5fd2317394a4eff62065614c4892d5a4d1a7ee55b765d7a3d9e3f82", + "sha256:2643d145af5292ee956aa0a83c2ce1038a3bdb26e033dadeb2f7066fb0c9abce", + "sha256:2c6e4464ed5f01dc44dc9821caf67b60a4e5c3b04278286a85c067010653a0eb", + "sha256:2f7f6985d05a4e3ce8255396df363046c28bea790e40617654e91ed580ca7c51", + "sha256:31902408f4bf54108bbfb2e35369877c01c95adc6192958684473658c322c8a5", + "sha256:40716d1f821b89838589e5b3106ebbc23636ffdef5abc31f7cd0266db936067e", + "sha256:4b901927f16224d0d143b925ce9a4e6b3a758010673eeded9b748f250cf4e8f7", + "sha256:4fc3d14ee80cd22367caaaf6e014494415bf440980a3045bf5045b525680ac33", + "sha256:5cf3f0c5ac72139797953bd50bc6c95ac13075e62dbfcc923571180bebb662e9", + "sha256:6dbdec441c60699288adf051f51a5d512b0d818526d1dcfff5a41f8cd8b4aaf1", + "sha256:72cf32ce7dd3562373f78bd751f73c96cfb441de147cc2448a92c1a308bd0ca6", + "sha256:75aa828610b67462ffe3057d4d8a4112105ed211596b750b53cbfe182f44777a", + "sha256:75c4d2a6effd015786c87774e04331b6da863fc3fc4e8adfc3b40aa55ab516fe", + "sha256:78e25b2fd6cbb55ddfb8058417df193f0129cad5f4ee75d1502248e588d9e0d7", + "sha256:84860e06ba363d9c0eeabd45ac0fde4b903ad7aa4f93cd8b648385a888e23200", + "sha256:8c5091ebd294f7628eb25ea554852a52058ac81472c921150e3a61cdd68f75a7", + "sha256:944bdc21ebd620eafefc090cdf83158393ec2b1391578359776c00de00e8907a", + "sha256:9c7ac372232c928fff0645d85f273a726970c014749b924ce5710d7d89763a28", + "sha256:d9b338c19fa2412f76e17525c1b4f2c687a55b156320acb588df79f2e6fa9fea", + "sha256:ee5d62d28b854eb61889cde4e1dbc10fbaa5560cb39780c3995f6737f7e82120", + "sha256:f2c2521a8e4d6d769e3234350ba7b65ff5d527137cdcde13ff4d99114b0c8e7d", + "sha256:f6efc9bd72258f89a3816e3a98c09d36f079c223aa345c659622f056b760ab42", + "sha256:f7c5d642db47376a0cc130f0de6d055056e010debdaf0707cd2b0fc7e7ef30ea", + "sha256:fcb6d9afb1b6208b4c712af0dafdc650f518836065df0d4fb1d800f5d6773db2", + "sha256:fcd2572dd4519e8a6642b733cd3a8cfc1ef94bafd0c1ceed9c94fe736cb65b6a" ], "index": "pypi", - "version": "==0.991" + "markers": "python_version >= '3.8'", + "version": "==1.7.1" }, "mypy-extensions": { "hashes": [ - "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d", - "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8" + "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", + "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" ], - "version": "==0.4.3" + "markers": "python_version >= '3.5'", + "version": "==1.0.0" }, "outcome": { "hashes": [ - "sha256:6f82bd3de45da303cf1f771ecafa1633750a358436a8bb60e06a1ceb745d2672", - "sha256:c4ab89a56575d6d38a05aa16daeaa333109c1f96167aba8901ab18b6b5e0f7f5" + "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8", + "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b" ], "markers": "python_version >= '3.7'", - "version": "==1.2.0" + "version": "==1.3.0.post0" }, "packaging": { "hashes": [ - "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2", - "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97" + "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", + "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" ], "markers": "python_version >= '3.7'", - "version": "==23.0" + "version": "==23.2" }, "pathspec": { "hashes": [ - "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229", - "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc" + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" ], - "markers": "python_version >= '3.7'", - "version": "==0.11.0" + "markers": "python_version >= '3.8'", + "version": "==0.12.1" }, "platformdirs": { "hashes": [ - "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490", - "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2" + "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380", + "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420" ], - "markers": "python_version >= '3.7'", - "version": "==2.6.2" + "markers": "python_version >= '3.8'", + "version": "==4.1.0" }, "pluggy": { "hashes": [ - "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", - "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" + "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12", + "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7" ], - "markers": "python_version >= '3.6'", - "version": "==1.0.0" + "markers": "python_version >= '3.8'", + "version": "==1.3.0" }, "pycparser": { "hashes": [ @@ -305,69 +501,151 @@ }, "pydantic": { "hashes": [ - "sha256:05a81b006be15655b2a1bae5faa4280cf7c81d0e09fcb49b342ebf826abe5a72", - "sha256:0b53e1d41e97063d51a02821b80538053ee4608b9a181c1005441f1673c55423", - "sha256:2b3ce5f16deb45c472dde1a0ee05619298c864a20cded09c4edd820e1454129f", - "sha256:2e82a6d37a95e0b1b42b82ab340ada3963aea1317fd7f888bb6b9dfbf4fff57c", - "sha256:301d626a59edbe5dfb48fcae245896379a450d04baeed50ef40d8199f2733b06", - "sha256:39f4a73e5342b25c2959529f07f026ef58147249f9b7431e1ba8414a36761f53", - "sha256:4948f264678c703f3877d1c8877c4e3b2e12e549c57795107f08cf70c6ec7774", - "sha256:4b05697738e7d2040696b0a66d9f0a10bec0efa1883ca75ee9e55baf511909d6", - "sha256:51bdeb10d2db0f288e71d49c9cefa609bca271720ecd0c58009bd7504a0c464c", - "sha256:55b1625899acd33229c4352ce0ae54038529b412bd51c4915349b49ca575258f", - "sha256:572066051eeac73d23f95ba9a71349c42a3e05999d0ee1572b7860235b850cc6", - "sha256:6a05a9db1ef5be0fe63e988f9617ca2551013f55000289c671f71ec16f4985e3", - "sha256:6dc1cc241440ed7ca9ab59d9929075445da6b7c94ced281b3dd4cfe6c8cff817", - "sha256:6e7124d6855b2780611d9f5e1e145e86667eaa3bd9459192c8dc1a097f5e9903", - "sha256:75d52162fe6b2b55964fbb0af2ee58e99791a3138588c482572bb6087953113a", - "sha256:78cec42b95dbb500a1f7120bdf95c401f6abb616bbe8785ef09887306792e66e", - "sha256:7feb6a2d401f4d6863050f58325b8d99c1e56f4512d98b11ac64ad1751dc647d", - "sha256:8775d4ef5e7299a2f4699501077a0defdaac5b6c4321173bcb0f3c496fbadf85", - "sha256:887ca463c3bc47103c123bc06919c86720e80e1214aab79e9b779cda0ff92a00", - "sha256:9193d4f4ee8feca58bc56c8306bcb820f5c7905fd919e0750acdeeeef0615b28", - "sha256:983e720704431a6573d626b00662eb78a07148c9115129f9b4351091ec95ecc3", - "sha256:990406d226dea0e8f25f643b370224771878142155b879784ce89f633541a024", - "sha256:9cbdc268a62d9a98c56e2452d6c41c0263d64a2009aac69246486f01b4f594c4", - "sha256:a48f1953c4a1d9bd0b5167ac50da9a79f6072c63c4cef4cf2a3736994903583e", - "sha256:a9a6747cac06c2beb466064dda999a13176b23535e4c496c9d48e6406f92d42d", - "sha256:a9f2de23bec87ff306aef658384b02aa7c32389766af3c5dee9ce33e80222dfa", - "sha256:b5635de53e6686fe7a44b5cf25fcc419a0d5e5c1a1efe73d49d48fe7586db854", - "sha256:b6f9d649892a6f54a39ed56b8dfd5e08b5f3be5f893da430bed76975f3735d15", - "sha256:b9a3859f24eb4e097502a3be1fb4b2abb79b6103dd9e2e0edb70613a4459a648", - "sha256:cd8702c5142afda03dc2b1ee6bc358b62b3735b2cce53fc77b31ca9f728e4bc8", - "sha256:d7b5a3821225f5c43496c324b0d6875fde910a1c2933d726a743ce328fbb2a8c", - "sha256:d88c4c0e5c5dfd05092a4b271282ef0588e5f4aaf345778056fc5259ba098857", - "sha256:eb992a1ef739cc7b543576337bebfc62c0e6567434e522e97291b251a41dad7f", - "sha256:f2f7eb6273dd12472d7f218e1fef6f7c7c2f00ac2e1ecde4db8824c457300416", - "sha256:fdf88ab63c3ee282c76d652fc86518aacb737ff35796023fae56a65ced1a5978", - "sha256:fdf8d759ef326962b4678d89e275ffc55b7ce59d917d9f72233762061fd04a2d" + "sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0", + "sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd" ], "index": "pypi", - "version": "==1.10.4" + "markers": "python_version >= '3.7'", + "version": "==2.5.2" + }, + "pydantic-core": { + "hashes": [ + "sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b", + "sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b", + "sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d", + "sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8", + "sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124", + "sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189", + "sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c", + "sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d", + "sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f", + "sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520", + "sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4", + "sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6", + "sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955", + "sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3", + "sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b", + "sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a", + "sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68", + "sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3", + "sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd", + "sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de", + "sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b", + "sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634", + "sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7", + "sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459", + "sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7", + "sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3", + "sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331", + "sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf", + "sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d", + "sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36", + "sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59", + "sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937", + "sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc", + "sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093", + "sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753", + "sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706", + "sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca", + "sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260", + "sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997", + "sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588", + "sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71", + "sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb", + "sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e", + "sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69", + "sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5", + "sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07", + "sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1", + "sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0", + "sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd", + "sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8", + "sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944", + "sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26", + "sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda", + "sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4", + "sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9", + "sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00", + "sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe", + "sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6", + "sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada", + "sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4", + "sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7", + "sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325", + "sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4", + "sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b", + "sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88", + "sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04", + "sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863", + "sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0", + "sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911", + "sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b", + "sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e", + "sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144", + "sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5", + "sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720", + "sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab", + "sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d", + "sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789", + "sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec", + "sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2", + "sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db", + "sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f", + "sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef", + "sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3", + "sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209", + "sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc", + "sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651", + "sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8", + "sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e", + "sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66", + "sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7", + "sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550", + "sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd", + "sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405", + "sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27", + "sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093", + "sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077", + "sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113", + "sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3", + "sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6", + "sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf", + "sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed", + "sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88", + "sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe", + "sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18", + "sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867" + ], + "markers": "python_version >= '3.7'", + "version": "==2.14.5" }, "pygithub": { "hashes": [ - "sha256:5822febeac2391f1306c55a99af2bc8f86c8bf82ded000030cd02c18f31b731f", - "sha256:c273f252b278fb81f1769505cc6921bdb6791e1cebd6ac850cc97dad13c31ff3" + "sha256:4b528d5d6f35e991ea5fd3f942f58748f24938805cb7fcf24486546637917337", + "sha256:ecf12c2809c44147bce63b047b3d2e9dac8a41b63e90fcb263c703f64936b97c" ], "index": "pypi", - "version": "==1.57" + "markers": "python_version >= '3.7'", + "version": "==2.1.1" }, "pygments": { "hashes": [ - "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297", - "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717" + "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", + "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" ], - "markers": "python_version >= '3.6'", - "version": "==2.14.0" + "markers": "python_version >= '3.7'", + "version": "==2.17.2" }, "pyjwt": { + "extras": [ + "crypto" + ], "hashes": [ - "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd", - "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14" + "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", + "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" ], "markers": "python_version >= '3.7'", - "version": "==2.6.0" + "version": "==2.8.0" }, "pynacl": { "hashes": [ @@ -403,73 +681,114 @@ }, "pytest": { "hashes": [ - "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71", - "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59" + "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac", + "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==7.4.3" + }, + "pytest-html": { + "hashes": [ + "sha256:70a01e8ae5800f4a074b56a4cb1025c8f4f9b038bba5fe31e3c98eb996686f07", + "sha256:c8152cea03bd4e9bee6d525573b67bbc6622967b72b9628dda0ea3e2a0b5dd71" ], "index": "pypi", - "version": "==7.2.0" + "markers": "python_version >= '3.8'", + "version": "==4.1.1" + }, + "pytest-metadata": { + "hashes": [ + "sha256:769a9c65d2884bd583bc626b0ace77ad15dbe02dd91a9106d47fd46d9c2569ca", + "sha256:a17b1e40080401dc23177599208c52228df463db191c1a573ccdffacd885e190" + ], + "markers": "python_version >= '3.7'", + "version": "==3.0.0" }, "pytest-xdist": { "hashes": [ - "sha256:688da9b814370e891ba5de650c9327d1a9d861721a524eb917e620eec3e90291", - "sha256:9feb9a18e1790696ea23e1434fa73b325ed4998b0e9fcb221f16fd1945e6df1b" + "sha256:cbb36f3d67e0c478baa57fa4edc8843887e0f6cfc42d677530a36d7472b32d8a", + "sha256:d075629c7e00b611df89f490a5063944bee7a4362a5ff11c7cc7824a03dfce24" ], "index": "pypi", - "version": "==3.0.2" + "markers": "python_version >= '3.7'", + "version": "==3.5.0" + }, + "python-dateutil": { + "hashes": [ + "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", + "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.8.2" }, "python-dotenv": { "hashes": [ - "sha256:1684eb44636dd462b66c3ee016599815514527ad99965de77f43e0944634a7e5", - "sha256:b77d08274639e3d34145dfa6c7008e66df0f04b7be7a75fd0d5292c191d79045" + "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba", + "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a" ], "index": "pypi", - "version": "==0.21.0" + "markers": "python_version >= '3.8'", + "version": "==1.0.0" }, "requests": { "hashes": [ - "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", - "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" ], "index": "pypi", - "version": "==2.28.1" + "markers": "python_version >= '3.7'", + "version": "==2.31.0" }, "rich": { "hashes": [ - "sha256:12b1d77ee7edf251b741531323f0d990f5f570a4e7c054d0bfb59fb7981ad977", - "sha256:3aa9eba7219b8c575c6494446a59f702552efe1aa261e7eeb95548fa586e1950" + "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa", + "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235" ], "index": "pypi", - "version": "==13.0.0" + "markers": "python_full_version >= '3.7.0'", + "version": "==13.7.0" }, "ruff": { "hashes": [ - "sha256:055438a8b3ba5de45e2bf606f2aae0c6b928b5fba3928ad008c3019440f40547", - "sha256:1f9121c656021720391b1ddba843813569910adf7c08b4c0ed325a4418ff4acd", - "sha256:2939a8360c45a76373554e426aae691b4dc785e1fec647a74626cb8c7ea9429c", - "sha256:29654591e610630f3c3614a4ae16524ac4e0baa2680cf7fc8676fd047cb3f1c6", - "sha256:3bea5d101c5918ff5b4bf997565667e4ea040fa9ec0ef98f63d5168c84219519", - "sha256:4185c328c78adabfb0417a3e7f86395f8d5b3bcfb0e763d6cdde7246c3d08b35", - "sha256:53495204366169766b501332909a245072f5bc6a976972150f4df5fef961c119", - "sha256:64826b12171080be6731d5d46494fbb51b90cf6593134bed5a76f424dc98a480", - "sha256:6c21e3f42eb2d943d8437b365b7ec3c6d7d98a6c742cf08fd385671744737e5e", - "sha256:71f87d4e841b18c8b2c1a1f9c04e822285cfac7786fcde4ae34d4b107ab0bc81", - "sha256:7cd622e5d4f6aa356b4193840a2ca39cf6eb6d37de80c4e54a79f61f7c6b52ef", - "sha256:a5765fe2434e85f6c058cdda2538e18a7c6c87594ee63f3999fe39f558ee7c63", - "sha256:be96ee774c3e30c2aa0314bf73e3f5144e8e1d5971d13e60bf2f4a07112de6f9", - "sha256:ce82f88a2e8ad530a8ae81886b4bcbb33ba12643e873bcd65c2193fdf96bf49f", - "sha256:d4d8f3646f678c0148ddc1477151f14068d35609681663a916aae643ae724a0f", - "sha256:e3b09c10cabae034babdc0864985101f417d26ad70fccdd0022593b9cbd8e0b6" + "sha256:03910e81df0d8db0e30050725a5802441c2022ea3ae4fe0609b76081731accbc", + "sha256:05991ee20d4ac4bb78385360c684e4b417edd971030ab12a4fbd075ff535050e", + "sha256:137852105586dcbf80c1717facb6781555c4e99f520c9c827bd414fac67ddfb6", + "sha256:1610e14750826dfc207ccbcdd7331b6bd285607d4181df9c1c6ae26646d6848a", + "sha256:1b09f29b16c6ead5ea6b097ef2764b42372aebe363722f1605ecbcd2b9207184", + "sha256:1cf5f701062e294f2167e66d11b092bba7af6a057668ed618a9253e1e90cfd76", + "sha256:3a0cd909d25f227ac5c36d4e7e681577275fb74ba3b11d288aff7ec47e3ae745", + "sha256:4558b3e178145491e9bc3b2ee3c4b42f19d19384eaa5c59d10acf6e8f8b57e33", + "sha256:491262006e92f825b145cd1e52948073c56560243b55fb3b4ecb142f6f0e9543", + "sha256:5c549ed437680b6105a1299d2cd30e4964211606eeb48a0ff7a93ef70b902248", + "sha256:683aa5bdda5a48cb8266fcde8eea2a6af4e5700a392c56ea5fb5f0d4bfdc0240", + "sha256:87455a0c1f739b3c069e2f4c43b66479a54dea0276dd5d4d67b091265f6fd1dc", + "sha256:88b8cdf6abf98130991cbc9f6438f35f6e8d41a02622cc5ee130a02a0ed28703", + "sha256:bd98138a98d48a1c36c394fd6b84cd943ac92a08278aa8ac8c0fdefcf7138f35", + "sha256:e8fd1c62a47aa88a02707b5dd20c5ff20d035d634aa74826b42a1da77861b5ff", + "sha256:ea284789861b8b5ca9d5443591a92a397ac183d4351882ab52f6296b4fdd5462", + "sha256:fd89b45d374935829134a082617954120d7a1470a9f0ec0e7f3ead983edc48cc" ], "index": "pypi", - "version": "==0.0.236" + "markers": "python_version >= '3.7'", + "version": "==0.1.6" }, "selenium": { "hashes": [ - "sha256:06a1c7d9f313130b21c3218ddd8852070d0e7419afdd31f96160cd576555a5ce", - "sha256:3aefa14a28a42e520550c1cd0f29cf1d566328186ea63aa9a3e01fb265b5894d" + "sha256:22eab5a1724c73d51b240a69ca702997b717eee4ba1f6065bf5d6b44dba01d48", + "sha256:9e82cd1ac647fb73cf0d4a6e280284102aaa3c9d94f0fa6e6cc4b5db6a30afbf" ], "index": "pypi", - "version": "==4.7.2" + "markers": "python_version >= '3.8'", + "version": "==4.15.2" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" }, "sniffio": { "hashes": [ @@ -486,122 +805,142 @@ ], "version": "==2.4.0" }, + "syrupy": { + "hashes": [ + "sha256:231b1f5d00f1f85048ba81676c79448076189c4aef4d33f21ae32f3b4c565a54", + "sha256:747aae1bcf3cb3249e33b1e6d81097874d23615982d5686ebe637875b0775a1b" + ], + "index": "pypi", + "markers": "python_version < '4' and python_full_version >= '3.8.1'", + "version": "==4.6.0" + }, "trio": { "hashes": [ - "sha256:ce68f1c5400a47b137c5a4de72c7c901bd4e7a24fbdebfe9b41de8c6c04eaacf", - "sha256:f1dd0780a89bfc880c7c7994519cb53f62aacb2c25ff487001c0052bd721cdf0" + "sha256:5a0b566fa5d50cf231cfd6b08f3b03aa4179ff004b8f3144059587039e2b26d3", + "sha256:da1d35b9a2b17eb32cae2e763b16551f9aa6703634735024e32f325c9285069e" ], - "markers": "python_version >= '3.7'", - "version": "==0.22.0" + "markers": "python_version >= '3.8'", + "version": "==0.23.2" }, "trio-websocket": { "hashes": [ - "sha256:5b558f6e83cc20a37c3b61202476c5295d1addf57bd65543364e0337e37ed2bc", - "sha256:a3d34de8fac26023eee701ed1e7bf4da9a8326b61a62934ec9e53b64970fd8fe" + "sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f", + "sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638" ], - "markers": "python_version >= '3.5'", - "version": "==0.9.2" + "markers": "python_version >= '3.7'", + "version": "==0.11.1" }, "types-requests": { "hashes": [ - "sha256:091d4a5a33c1b4f20d8b1b952aa8fa27a6e767c44c3cf65e56580df0b05fd8a9", - "sha256:a7df37cc6fb6187a84097da951f8e21d335448aa2501a6b0a39cbd1d7ca9ee2a" + "sha256:b32b9a86beffa876c0c3ac99a4cd3b8b51e973fb8e3bd4e0a6bb32c7efad80fc", + "sha256:dc5852a76f1eaf60eafa81a2e50aefa3d1f015c34cf0cba130930866b1b22a92" ], "index": "pypi", - "version": "==2.28.11.5" + "markers": "python_version >= '3.7'", + "version": "==2.31.0.10" }, - "types-urllib3": { + "typing-extensions": { "hashes": [ - "sha256:ed6b9e8a8be488796f72306889a06a3fc3cb1aa99af02ab8afb50144d7317e49", - "sha256:eec5556428eec862b1ac578fb69aab3877995a99ffec9e5a12cf7fbd0cc9daee" + "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" ], - "version": "==1.26.25.4" + "markers": "python_version >= '3.8'", + "version": "==4.9.0" }, - "typing-extensions": { + "urllib3": { + "extras": [ + "socks" + ], "hashes": [ - "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa", - "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e" + "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3", + "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54" ], - "markers": "python_version >= '3.7'", - "version": "==4.4.0" + "markers": "python_version >= '3.8'", + "version": "==2.1.0" }, - "urllib3": { + "websocket-client": { "hashes": [ - "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72", - "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1" + "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6", + "sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.14" + "markers": "python_version >= '3.8'", + "version": "==1.7.0" }, "wrapt": { "hashes": [ - "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3", - "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b", - "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4", - "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2", - "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656", - "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3", - "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff", - "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310", - "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a", - "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57", - "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069", - "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383", - "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe", - "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87", - "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d", - "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b", - "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907", - "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f", - "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0", - "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28", - "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1", - "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853", - "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc", - "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3", - "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3", - "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164", - "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1", - "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c", - "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1", - "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7", - "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1", - "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320", - "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed", - "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1", - "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248", - "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c", - "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456", - "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77", - "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef", - "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1", - "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7", - "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86", - "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4", - "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d", - "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d", - "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8", - "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5", - "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471", - "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00", - "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68", - "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3", - "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d", - "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735", - "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d", - "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569", - "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7", - "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59", - "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5", - "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb", - "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b", - "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f", - "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462", - "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015", - "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.14.1" + "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc", + "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81", + "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09", + "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e", + "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca", + "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0", + "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb", + "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487", + "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40", + "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c", + "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060", + "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202", + "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41", + "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9", + "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b", + "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664", + "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d", + "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362", + "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00", + "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc", + "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1", + "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267", + "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956", + "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966", + "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1", + "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228", + "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72", + "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d", + "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292", + "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0", + "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0", + "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36", + "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c", + "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5", + "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f", + "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73", + "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b", + "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2", + "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593", + "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39", + "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389", + "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf", + "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf", + "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89", + "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c", + "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c", + "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f", + "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440", + "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465", + "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136", + "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b", + "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8", + "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3", + "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8", + "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6", + "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e", + "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f", + "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c", + "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e", + "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8", + "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2", + "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020", + "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35", + "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d", + "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3", + "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537", + "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809", + "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d", + "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a", + "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4" + ], + "markers": "python_version >= '3.6'", + "version": "==1.16.0" }, "wsproto": { "hashes": [ @@ -613,11 +952,11 @@ }, "zipp": { "hashes": [ - "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa", - "sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766" + "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31", + "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0" ], - "markers": "python_version >= '3.7'", - "version": "==3.11.0" + "markers": "python_version >= '3.8'", + "version": "==3.17.0" } }, "develop": {} diff --git a/app-testing/README.md b/app-testing/README.md index 19e8f937ee3..9327b2814af 100644 --- a/app-testing/README.md +++ b/app-testing/README.md @@ -11,31 +11,35 @@ Slices of the tests will be selected as candidates for automation and then perfo ## Steps 1. Have pyenv installed per [DEV_SETUP.md](../DEV_SETUP.md) - 1. Install python 3.11 + 1. Install python 3.12 2. Install the Opentrons application on your machine. 1. 2. This could also be done by building the installer on a branch and installing the App. 1. for Mac 1. `make -C app-shell dist-osx` 3. Install Chromedriver - = 1. in the app-testing directory 1. `sudo ./ci-tools/mac_get_chromedriver.sh 21.3.1` per the version of electron in the repository root package.json (`/opentrons/package.json`) for electron 1. Windows `sudo .\ci-tools\windows_get_chromedriver.ps1 -version 21.3.1` 1. if you experience `wget: command not found` 1. brew install wget and try again 2. when you run `chromedriver --version` 1. It should work 2. It should output the below. The chromedriver version must match Electron version we build into the App. 1. ChromeDriver 106.0.5249.181 (7e86549ea18ccbc17d7b600e3cd4190f45db35c7-refs/heads/main@{#1045491}) + 1. in the app-testing directory + 2. `sudo ./citools/{YOUR_OS}_get_chromedriver.sh 21.3.1` passing the version of electron in the repository root [package.json](`/opentrons/package.json`) for electron + 3. windows example using sudo (scoop install sudo): `sudo .\citools\windows_get_chromedriver.ps1 21.3.1` + 4. run `chromedriver --version` to verify 4. Create .env from example.env `cp example.env .env` 1. Fill in values (if there are secrets) 2. Make sure the paths work on your machine 5. Install pipenv globally against the python version you are using in this module. 1. pip install -U pipenv + 2. note: the rest of the monorepo uses pipenv but pinned at `pipenv==2021.5.29` 6. In the app-testing directory (make, python, pipenv required on your path) 1. `make teardown` 2. `make setup` 7. Run all tests 1. `make test` 8. Run specific test(s) - 1. `pipenv run python -m pytest -k test_labware_landing` - 1. [See docs on pytest -k flag](https://docs.pytest.org/en/6.2.x/usage.html#specifying-tests-selecting-tests) + 1. `pipenv run python -m pytest -k protocol_analyze_test` + 1. [See docs on pytest -k flag](https://docs.pytest.org/en/7.4.x/usage.html#specifying-tests-selecting-tests) ## Tools -python 3.11.0 - manage python with [pyenv](https://realpython.com/intro-to-pyenv) +python 3.12.0 - manage python with [pyenv](https://realpython.com/intro-to-pyenv) [pipenv](https://pipenv.pypa.io/en/latest/) ## Locator Tool @@ -59,26 +63,6 @@ pipenv run python -i locators.py > sometimes chromedriver does not cleanly exit. > `pkill -x chromedriver` -## Emulation - -We have made the choice to setup all test runs local and in CI against this emulator [config](./ci-tools/ot2_with_all_modules.yaml) - -To use locally setup the [emulator](https://github.com/Opentrons/opentrons-emulation) - -run our expected config - -```shell -make run file_path=$MONOREPOPATH/app-testing/ci-tools/ot2_with_all_modules.yaml -``` - -ctrl-c to stop - -remove the containers (this resets calibration, stopping them does not) - -```shell -make remove file_path=$MONOREPOPATH/app-testing/ci-tools/ot2_with_all_modules.yaml -``` - ## Gotchas - Only have 1 robot connected at once. @@ -89,9 +73,14 @@ make remove file_path=$MONOREPOPATH/app-testing/ci-tools/ot2_with_all_modules.ya The analysis test `pipenv run pytest -k test_analyses` is driven by the comma delimited string variable `APP_ANALYSIS_TEST_PROTOCOLS` in `.env` This allows us to run one or many. -### Adding protocols +### Adding protocols to the analysis test 1. add the protocol file named according to the naming convention in the files/protocols appropriate folder 1. add the protocol stem to `protocol_files.py` 1. add the protocol data as a property to `protocols.py` 1. run `make print-protocols` + +### Analyses Snapshot Test + +- run the Workflow Dispatch job + - `gh workflow run 'Analyses Snapshot Test' --ref 7.1-analyses-battery -f TARGET=v7.1.0-alpha.10 -f TEST_SOURCE=7.1-analyses-battery` diff --git a/api/src/opentrons/config/containers/__init__.py b/app-testing/analysis_results/.keep-me similarity index 100% rename from api/src/opentrons/config/containers/__init__.py rename to app-testing/analysis_results/.keep-me diff --git a/app-testing/automation/data/protocol.py b/app-testing/automation/data/protocol.py index e8ef4db3bf6..8aa133e2658 100644 --- a/app-testing/automation/data/protocol.py +++ b/app-testing/automation/data/protocol.py @@ -1,4 +1,5 @@ """Model of a protocol for testing.""" +import hashlib import os from pathlib import Path from typing import Literal, Optional @@ -15,7 +16,7 @@ class Protocol(BaseModel): file_name: names = Field(description="file name not including extension") file_extension: Literal["json", "py"] = Field(description="file extension of the protocol") protocol_name: str = Field(description="the protocol name which will appear in the protocol name field in the app") - robot: Literal["OT-2", "OT-3"] = Field(description="the robot type which will appear in the robot field in the app") + robot: Literal["OT-2", "Flex"] = Field(description="the robot type which will appear in the robot field in the app") app_error: bool = Field(description="will analysis with the app raise an error") robot_error: bool = Field(description="will analysis with the robot raise an error") app_analysis_error: Optional[str] = Field(description="the exact error shown in the app popout", default=None) @@ -24,6 +25,8 @@ class Protocol(BaseModel): instruments: Optional[list[str]] = Field(description="list of instruments that will show in the app", default=None) modules: Optional[list[module_types]] = Field(description="list of modules that will show in the app", default=None) description: Optional[str] = Field(description="Details about this protocol", default=None) + expected_test_failure: bool = Field(description="Is this test expected to fail", default=False) + expected_test_reason: Optional[str] = Field(description="Reason test is failing", default=False) @property def file_path(self) -> Path: @@ -50,3 +53,11 @@ def labware_paths(self) -> list[Path]: ) for p in self.custom_labware ] + + @property + def short_sha(self) -> str: + """Short sha of the file.""" + # Hash the string using SHA-1 + hash_object = hashlib.sha1(self.file_name.encode()) + # Convert to hexadecimal and truncate + return hash_object.hexdigest()[:10] diff --git a/app-testing/automation/data/protocol_files.py b/app-testing/automation/data/protocol_files.py index 36c04e02587..b9f89115900 100644 --- a/app-testing/automation/data/protocol_files.py +++ b/app-testing/automation/data/protocol_files.py @@ -2,37 +2,61 @@ from typing import Literal names = Literal[ + "OT2_None_None_2_12_Python310SyntaxRobotAnalysisOnlyError", + "OT2_None_None_2_13_PythonSyntaxError", "OT2_P1000SLeft_None_6_1_SimpleTransfer", - "OT2_P20SRight_None_6_1_SimpleTransferError", + "OT2_P10S_P300M_TC1_TM_MM_2_11_Swift", + "OT2_P20S_None_2_7_Walkthrough", "OT2_P20S_P300M_HS_6_1_HS_WithCollision_Error", "OT2_P20S_P300M_NoMods_6_1_TransferReTransferLiquid", + "OT2_P20SRight_None_6_1_SimpleTransferError", + "OT2_P300M_P20S_2_16_aspirateDispenseMix0Volume", "OT2_P300M_P20S_HS_6_1_Smoke620release", "OT2_P300M_P20S_MM_HS_TD_TC_6_1_AllMods_Error", "OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40", "OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40Error", "OT2_P300M_P20S_NoMod_6_1_MixTransferManyLiquids", + "OT2_P300M_P20S_None_2_12_FailOnRun", + "OT2_P300M_P20S_TC_HS_TM_2_13_SmokeTestV3", + "OT2_P300M_P20S_TC_HS_TM_2_14_SmokeTestV3", + "OT2_P300M_P20S_TC_HS_TM_2_15_SmokeTestV3", + "OT2_P300M_P20S_TC_HS_TM_2_16_SmokeTestV3", + "OT2_P300M_P20S_TC_MM_TM_2_13_Smoke620Release", "OT2_P300M_P300S_HS_6_1_HS_NormalUseWithTransfer", + "OT2_P300MLeft_MM_TM_2_4_Zymo", + "OT2_P300S_Thermocycler_Moam_Error", + "OT2_P300S_Twinning_Error", "OT2_P300SG1_None_5_2_6_Gen1PipetteSimple", "OT2_P300SLeft_MM_TM_TM_5_2_6_MOAMTemps", - "OT2_None_None_2_12_Python310SyntaxRobotAnalysisOnlyError", - "OT2_None_None_2_13_PythonSyntaxError", - "OT2_P10S_P300M_TC1_TM_MM_2_11_Swift", - "OT2_P20S_None_2_7_Walkthrough", - "OT2_P300MLeft_MM_TM_2_4_Zymo", - "OT2_P300M_P20S_None_2_12_FailOnRun", - "OT2_P300M_P20S_TC_MM_TM_6_13_Smoke620Release", "OT2_P300SLeft_MM1_MM_2_2_EngageMagHeightFromBase", "OT2_P300SLeft_MM1_MM_TM_2_3_Mix", - "OT2_P300S_Thermocycler_Moam_Error", - "OT2_P300S_Twinning_Error", - "OT3_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch", - "OT3_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right", - "OT3_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2", - "OT3_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4", - "OT3_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment", - "OT3_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x", - "OT3_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel", - "OT3_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR", - "OT3_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III", - "OT3_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria", + "OT2_P300M_P20S_TC_HS_TM_2_16_aspirateDispenseMix0Volume", + "Flex_None_None_2_16_AnalysisError_AccessToFixedTrashProp", + "Flex_None_None_2_16_AnalysisError_TrashBinInCol2", + "Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol3", + "Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol4", + "Flex_None_None_MM_2_16_AnalysisError_MagneticModuleInFlexProtocol", + "Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol3", + "Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol4", + "Flex_None_None_TM_2_16_AnalysisError_ModuleInCol2", + "Flex_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria", + "Flex_P1000_96_2_16_AnalysisError_DropTipsWithNoTrash", + "Flex_P1000_96_GRIPPER_2_16_AnalysisError_DropLabwareIntoTrashBin", + "Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoFixtures", + "Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModules", + "Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModulesNoFixtures", + "Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1", + "Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_Smoke", + "Flex_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel", + "Flex_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch", + "Flex_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III", + "Flex_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR", + "Flex_P1000_96_None_2_16_AnalysisError_TrashBinInStagingAreaCol3", + "Flex_P1000_96_TM_2_16_AnalysisError_ModuleAndWasteChuteConflict", + "Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4", + "Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment", + "Flex_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x", + "Flex_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right", + "Flex_P300Gen2_None_2_16_AnalysisError_OT2PipetteInFlexProtocol", + "Flex_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2", ] diff --git a/app-testing/automation/data/protocols.py b/app-testing/automation/data/protocols.py index c3a42c9f8dd..102b0faf683 100644 --- a/app-testing/automation/data/protocols.py +++ b/app-testing/automation/data/protocols.py @@ -8,83 +8,85 @@ class Protocols: # The name of the property must match the file_name property # and be in protocol_files.names - OT2_P20S_None_2_7_Walkthrough: Protocol = Protocol( - file_name="OT2_P20S_None_2_7_Walkthrough", - file_extension="py", - protocol_name="OT-2 Guided Walk-through", + ########################################################################################################## + # Begin JSON Protocols ################################################################################### + ########################################################################################################## + + OT2_P1000SLeft_None_6_1_SimpleTransfer: Protocol = Protocol( + file_name="OT2_P1000SLeft_None_6_1_SimpleTransfer", + file_extension="json", + protocol_name="Need Pipette", robot="OT-2", app_error=False, robot_error=False, ) - OT2_None_None_2_13_PythonSyntaxError: Protocol = Protocol( - file_name="OT2_None_None_2_13_PythonSyntaxError", - file_extension="py", - protocol_name="bad import", - robot="OT-2", - app_error=True, - robot_error=True, - app_analysis_error="No module named 'superspecialmagic'", - robot_analysis_error="?", - ) - - OT2_P10S_P300M_TC1_TM_MM_2_11_Swift: Protocol = Protocol( - file_name="OT2_P10S_P300M_TC1_TM_MM_2_11_Swift", - file_extension="py", - protocol_name="OT2_P10S_P300M_TC1_TM_MM_2_11_Swift.py", + OT2_P20S_P300M_HS_6_1_HS_WithCollision_Error: Protocol = Protocol( + file_name="OT2_P20S_P300M_HS_6_1_HS_WithCollision_Error", + file_extension="json", + protocol_name="HS Collision", robot="OT-2", app_error=False, robot_error=False, + description="""This protocol gives an error in PD.8-Channel pipette cannot access labware8-Channel pipettes cannot access labware or tip racks to the left or right of a Heater-Shaker GEN1 module. Move labware to a different slot to access it with an 8-Channel pipette.If you export it anyway there are NOT analysis errors in the app side analysis.TODO on if there are robot side analysis errors but do not expect them?""", # noqa: E501 ) - OT2_P300MLeft_MM_TM_2_4_Zymo: Protocol = Protocol( - file_name="OT2_P300MLeft_MM_TM_2_4_Zymo", - file_extension="py", - protocol_name="Zymo Direct-zol96 Magbead RNA", + OT2_P20S_P300M_NoMods_6_1_TransferReTransferLiquid: Protocol = Protocol( + file_name="OT2_P20S_P300M_NoMods_6_1_TransferReTransferLiquid", + file_extension="json", + protocol_name="Transfer- Multi liquid (retransfer)", robot="OT-2", app_error=False, robot_error=False, ) - - OT2_P300S_Thermocycler_Moam_Error: Protocol = Protocol( - file_name="OT2_P300S_Thermocycler_Moam_Error", - file_extension="py", - protocol_name="OT2_P300S_Thermocycler_Moam_Error.py", + OT2_P20SRight_None_6_1_SimpleTransferError: Protocol = Protocol( + file_name="OT2_P20SRight_None_6_1_SimpleTransferError", + file_extension="json", + protocol_name="Have Pipette", robot="OT-2", app_error=True, robot_error=True, - app_analysis_error="DeckConflictError [line 19]: thermocyclerModuleV2 in slot 7 prevents thermocyclerModuleV1 from using slot 7.", # noqa: E501 + app_analysis_error="Cannot aspirate more than pipette max volume", robot_analysis_error="?", ) - OT2_P300S_Twinning_Error: Protocol = Protocol( - file_name="OT2_P300S_Twinning_Error", - file_extension="py", - protocol_name="My Protocol", + OT2_P300M_P20S_HS_6_1_Smoke620release: Protocol = Protocol( + file_name="OT2_P300M_P20S_HS_6_1_Smoke620release", + file_extension="json", + protocol_name="H/S normal use", + robot="OT-2", + app_error=False, + robot_error=False, + ) + + OT2_P300M_P20S_MM_HS_TD_TC_6_1_AllMods_Error: Protocol = Protocol( + file_name="OT2_P300M_P20S_MM_HS_TD_TC_6_1_AllMods_Error", + file_extension="json", + protocol_name="All mods", robot="OT-2", app_error=True, robot_error=True, - app_analysis_error="AttributeError [line 24]: 'InstrumentContext' object has no attribute 'pair_with'", + app_analysis_error="Heater-Shaker cannot open its labware latch while it is shaking.", robot_analysis_error="?", ) - OT2_P20S_P300M_NoMods_6_1_TransferReTransferLiquid: Protocol = Protocol( - file_name="OT2_P20S_P300M_NoMods_6_1_TransferReTransferLiquid", + OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40: Protocol = Protocol( + file_name="OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40", file_extension="json", - protocol_name="Transfer- Multi liquid (retransfer)", + protocol_name="script_pur_sample_1", robot="OT-2", app_error=False, robot_error=False, ) - OT2_P300M_P20S_MM_HS_TD_TC_6_1_AllMods_Error: Protocol = Protocol( - file_name="OT2_P300M_P20S_MM_HS_TD_TC_6_1_AllMods_Error", + OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40Error: Protocol = Protocol( + file_name="OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40Error", file_extension="json", - protocol_name="All mods", + protocol_name="script_pur_sample_1", robot="OT-2", app_error=True, robot_error=True, - app_analysis_error="Heater-Shaker cannot open its labware latch while it is shaking.", + app_analysis_error="Cannot aspirate more than pipette max volume", robot_analysis_error="?", ) @@ -106,76 +108,71 @@ class Protocols: robot_error=False, ) - OT2_P20S_P300M_HS_6_1_HS_WithCollision_Error: Protocol = Protocol( - file_name="OT2_P20S_P300M_HS_6_1_HS_WithCollision_Error", + OT2_P300SG1_None_5_2_6_Gen1PipetteSimple: Protocol = Protocol( + file_name="OT2_P300SG1_None_5_2_6_Gen1PipetteSimple", file_extension="json", - protocol_name="HS Collision", + protocol_name="gen1 pipette", robot="OT-2", app_error=False, robot_error=False, - description=""" - This protocol gives an error in PD. - 8-Channel pipette cannot access labware - 8-Channel pipettes cannot access labware or tip racks to the left or right of - a Heater-Shaker GEN1 module. Move labware to a different slot to access it - with an 8-Channel pipette. - If you export it anyway there are NOT analysis errors in the app side analysis. - TODO on if there are robot side analysis errors but do not expect them? - """, ) - OT2_P300SLeft_MM1_MM_TM_2_3_Mix: Protocol = Protocol( - file_name="OT2_P300SLeft_MM1_MM_TM_2_3_Mix", - file_extension="py", - protocol_name="OT2_P300SLeft_MM1_MM_TM_2_3_Mix.py", + OT2_P300SLeft_MM_TM_TM_5_2_6_MOAMTemps: Protocol = Protocol( + file_name="OT2_P300SLeft_MM_TM_TM_5_2_6_MOAMTemps", + file_extension="json", + protocol_name="MoaM", robot="OT-2", app_error=False, robot_error=False, ) - OT2_P300SLeft_MM1_MM_2_2_EngageMagHeightFromBase: Protocol = Protocol( - file_name="OT2_P300SLeft_MM1_MM_2_2_EngageMagHeightFromBase", + ############################################################################################################ + # Begin Python Protocols ################################################################################### + ############################################################################################################ + + OT2_None_None_2_12_Python310SyntaxRobotAnalysisOnlyError: Protocol = Protocol( + file_name="OT2_None_None_2_12_Python310SyntaxRobotAnalysisOnlyError", file_extension="py", - protocol_name="OT2_P300SLeft_MM1_MM_2_2_EngageMagHeightFromBase.py", + protocol_name="🛠 3.10 only Python 🛠", robot="OT-2", app_error=False, - robot_error=False, + robot_error=True, + robot_analysis_error="?", ) - OT2_P300M_P20S_TC_MM_TM_6_13_Smoke620Release: Protocol = Protocol( - file_name="OT2_P300M_P20S_TC_MM_TM_6_13_Smoke620Release", + OT2_None_None_2_13_PythonSyntaxError: Protocol = Protocol( + file_name="OT2_None_None_2_13_PythonSyntaxError", file_extension="py", - protocol_name="🛠 Logo-Modules-CustomLabware 🛠", + protocol_name="bad import", robot="OT-2", - app_error=False, - robot_error=False, - custom_labware=["cpx_4_tuberack_100ul"], + app_error=True, + robot_error=True, + app_analysis_error="No module named 'superspecialmagic'", + robot_analysis_error="?", ) - OT2_P300SLeft_MM_TM_TM_5_2_6_MOAMTemps: Protocol = Protocol( - file_name="OT2_P300SLeft_MM_TM_TM_5_2_6_MOAMTemps", - file_extension="json", - protocol_name="MoaM", + OT2_P10S_P300M_TC1_TM_MM_2_11_Swift: Protocol = Protocol( + file_name="OT2_P10S_P300M_TC1_TM_MM_2_11_Swift", + file_extension="py", + protocol_name="OT2_P10S_P300M_TC1_TM_MM_2_11_Swift.py", robot="OT-2", app_error=False, robot_error=False, ) - OT2_P20SRight_None_6_1_SimpleTransferError: Protocol = Protocol( - file_name="OT2_P20SRight_None_6_1_SimpleTransferError", - file_extension="json", - protocol_name="Have Pipette", + OT2_P20S_None_2_7_Walkthrough: Protocol = Protocol( + file_name="OT2_P20S_None_2_7_Walkthrough", + file_extension="py", + protocol_name="OT-2 Guided Walk-through", robot="OT-2", - app_error=True, - robot_error=True, - app_analysis_error="Cannot aspirate more than pipette max volume", - robot_analysis_error="?", + app_error=False, + robot_error=False, ) - OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40: Protocol = Protocol( - file_name="OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40", - file_extension="json", - protocol_name="script_pur_sample_1", + OT2_P300M_P20S_2_16_aspirateDispenseMix0Volume: Protocol = Protocol( + file_name="OT2_P300M_P20S_2_16_aspirateDispenseMix0Volume", + file_extension="py", + protocol_name="QA Protocol - API 2.16 - Aspirate Dispense Mix with 0 Volume", robot="OT-2", app_error=False, robot_error=False, @@ -189,147 +186,366 @@ class Protocols: app_error=False, robot_error=False, ) + OT2_P300M_P20S_TC_HS_TM_2_13_SmokeTestV3: Protocol = Protocol( + file_name="OT2_P300M_P20S_TC_HS_TM_2_13_SmokeTestV3", + file_extension="py", + protocol_name="🛠️ 2.13 Smoke Test V3 🪄", + robot="OT-2", + app_error=False, + robot_error=False, + custom_labware=["cpx_4_tuberack_100ul"], + ) - OT2_P300SG1_None_5_2_6_Gen1PipetteSimple: Protocol = Protocol( - file_name="OT2_P300SG1_None_5_2_6_Gen1PipetteSimple", - file_extension="json", - protocol_name="gen1 pipette", + OT2_P300M_P20S_TC_HS_TM_2_14_SmokeTestV3: Protocol = Protocol( + file_name="OT2_P300M_P20S_TC_HS_TM_2_14_SmokeTestV3", + file_extension="py", + protocol_name="🛠️ 2.14 Smoke Test V3 🪄", robot="OT-2", app_error=False, robot_error=False, + custom_labware=["cpx_4_tuberack_100ul"], ) - OT2_P1000SLeft_None_6_1_SimpleTransfer: Protocol = Protocol( - file_name="OT2_P1000SLeft_None_6_1_SimpleTransfer", - file_extension="json", - protocol_name="Need Pipette", + OT2_P300M_P20S_TC_HS_TM_2_15_SmokeTestV3: Protocol = Protocol( + file_name="OT2_P300M_P20S_TC_HS_TM_2_15_SmokeTestV3", + file_extension="py", + protocol_name="🛠️ 2.15 Smoke Test V3 🪄", robot="OT-2", app_error=False, robot_error=False, + custom_labware=["cpx_4_tuberack_100ul"], ) - OT2_P300M_P20S_HS_6_1_Smoke620release: Protocol = Protocol( - file_name="OT2_P300M_P20S_HS_6_1_Smoke620release", - file_extension="json", - protocol_name="H/S normal use", + OT2_P300M_P20S_TC_HS_TM_2_16_SmokeTestV3: Protocol = Protocol( + file_name="OT2_P300M_P20S_TC_HS_TM_2_16_SmokeTestV3", + file_extension="py", + protocol_name="🛠️ 2.16 Smoke Test V3 🪄", robot="OT-2", app_error=False, robot_error=False, + custom_labware=["cpx_4_tuberack_100ul"], ) - OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40Error: Protocol = Protocol( - file_name="OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40Error", - file_extension="json", - protocol_name="script_pur_sample_1", + OT2_P300M_P20S_TC_MM_TM_2_13_Smoke620Release: Protocol = Protocol( + file_name="OT2_P300M_P20S_TC_MM_TM_2_13_Smoke620Release", + file_extension="py", + protocol_name="🛠 Logo-Modules-CustomLabware 🛠", + robot="OT-2", + app_error=False, + robot_error=False, + custom_labware=["cpx_4_tuberack_100ul"], + ) + + OT2_P300MLeft_MM_TM_2_4_Zymo: Protocol = Protocol( + file_name="OT2_P300MLeft_MM_TM_2_4_Zymo", + file_extension="py", + protocol_name="Zymo Direct-zol96 Magbead RNA", + robot="OT-2", + app_error=False, + robot_error=False, + ) + + OT2_P300S_Thermocycler_Moam_Error: Protocol = Protocol( + file_name="OT2_P300S_Thermocycler_Moam_Error", + file_extension="py", + protocol_name="OT2_P300S_Thermocycler_Moam_Error.py", robot="OT-2", app_error=True, robot_error=True, - app_analysis_error="Cannot aspirate more than pipette max volume", + app_analysis_error="DeckConflictError [line 19]: thermocyclerModuleV2 in slot 7 prevents thermocyclerModuleV1 from using slot 7.", # noqa: E501 robot_analysis_error="?", ) - OT2_None_None_2_12_Python310SyntaxRobotAnalysisOnlyError: Protocol = Protocol( - file_name="OT2_None_None_2_12_Python310SyntaxRobotAnalysisOnlyError", + OT2_P300S_Twinning_Error: Protocol = Protocol( + file_name="OT2_P300S_Twinning_Error", file_extension="py", - protocol_name="🛠 3.10 only Python 🛠", + protocol_name="My Protocol", robot="OT-2", - app_error=False, + app_error=True, robot_error=True, + app_analysis_error="AttributeError [line 24]: 'InstrumentContext' object has no attribute 'pair_with'", robot_analysis_error="?", ) - OT3_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch: Protocol = Protocol( - file_name="OT3_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch", + OT2_P300SLeft_MM1_MM_2_2_EngageMagHeightFromBase: Protocol = Protocol( + file_name="OT2_P300SLeft_MM1_MM_2_2_EngageMagHeightFromBase", file_extension="py", - protocol_name="MagMax RNA Extraction: Cells 96 ABR TESTING", - robot="OT-3", + protocol_name="OT2_P300SLeft_MM1_MM_2_2_EngageMagHeightFromBase.py", + robot="OT-2", app_error=False, robot_error=False, - custom_labware=["opentrons_ot3_96_tiprack_200ul_rss"], ) - OT3_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right: Protocol = Protocol( - file_name="OT3_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right", + OT2_P300SLeft_MM1_MM_TM_2_3_Mix: Protocol = Protocol( + file_name="OT2_P300SLeft_MM1_MM_TM_2_3_Mix", file_extension="py", - protocol_name="OT3 ABR Simple Normalize Long", - robot="OT-3", + protocol_name="OT2_P300SLeft_MM1_MM_TM_2_3_Mix.py", + robot="OT-2", app_error=False, robot_error=False, - custom_labware=["opentrons_ot3_96_tiprack_200ul_rss"], ) - OT3_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2: Protocol = Protocol( - file_name="OT3_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2", + OT2_P300M_P20S_TC_HS_TM_2_16_aspirateDispenseMix0Volume: Protocol = Protocol( + file_name="OT2_P300M_P20S_TC_HS_TM_2_16_aspirateDispenseMix0Volume", file_extension="py", - protocol_name="OT3 ABR KAPA Library Quant v2", - robot="OT-3", + protocol_name="OT2_P300M_P20S_TC_HS_TM_2_16_aspirateDispenseMix0Volume.py", + robot="OT-2", app_error=False, robot_error=False, ) - OT3_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4: Protocol = Protocol( - file_name="OT3_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4", + Flex_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria: Protocol = Protocol( + file_name="Flex_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria", + file_extension="py", + protocol_name="Quick Zymo Magbead RNA Extraction with Lysis: Bacteria 96 Channel Deletion Test", + robot="Flex", + app_error=False, + robot_error=False, + custom_labware=["opentrons_ot3_96_tiprack_1000ul_rss"], + ) + Flex_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel: Protocol = Protocol( + file_name="Flex_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel", + file_extension="py", + protocol_name="Omega HDQ DNA Extraction: Bacteria 96 FOR ABR TESTING", + robot="Flex", + app_error=False, + robot_error=False, + custom_labware=["opentrons_ot3_96_tiprack_1000ul_rss"], + ) + Flex_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch: Protocol = Protocol( + file_name="Flex_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch", + file_extension="py", + protocol_name="MagMax RNA Extraction: Cells 96 ABR TESTING", + robot="Flex", + app_error=False, + robot_error=False, + custom_labware=["opentrons_ot3_96_tiprack_200ul_rss"], + ) + Flex_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III: Protocol = Protocol( + file_name="Flex_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III", + file_extension="py", + protocol_name="Illumina DNA Prep 96x Head PART III", + robot="Flex", + app_error=False, + robot_error=False, + custom_labware=["opentrons_ot3_96_tiprack_200ul_rss", "opentrons_ot3_96_tiprack_50ul_rss"], + ) + Flex_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR: Protocol = Protocol( + file_name="Flex_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR", + file_extension="py", + protocol_name="IDT xGen EZ 96x Head PART I-III ABR", + robot="Flex", + app_error=False, + robot_error=False, + custom_labware=["opentrons_ot3_96_tiprack_50ul_rss", "opentrons_ot3_96_tiprack_200ul_rss"], + ) + Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4: Protocol = Protocol( + file_name="Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4", file_extension="py", protocol_name="Illumina DNA Enrichment v4", - robot="OT-3", + robot="Flex", app_error=False, robot_error=False, ) - - OT3_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment: Protocol = Protocol( - file_name="OT3_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment", + Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment: Protocol = Protocol( + file_name="Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment", file_extension="py", protocol_name="Illumina DNA Enrichment", - robot="OT-3", + robot="Flex", app_error=False, robot_error=False, ) - - OT3_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x: Protocol = Protocol( - file_name="OT3_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x", + Flex_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x: Protocol = Protocol( + file_name="Flex_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x", file_extension="py", protocol_name="Illumina DNA Prep 24x", - robot="OT-3", + robot="Flex", + app_error=False, + robot_error=False, + ) + Flex_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right: Protocol = Protocol( + file_name="Flex_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right", + file_extension="py", + protocol_name="Flex ABR Simple Normalize Long", + robot="Flex", + app_error=False, + robot_error=False, + custom_labware=["opentrons_ot3_96_tiprack_200ul_rss"], + ) + Flex_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2: Protocol = Protocol( + file_name="Flex_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2", + file_extension="py", + protocol_name="Flex ABR KAPA Library Quant v2", + robot="Flex", app_error=False, robot_error=False, ) - OT3_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel: Protocol = Protocol( - file_name="OT3_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel", + Flex_None_None_2_16_AnalysisError_TrashBinInCol2: Protocol = Protocol( + file_name="Flex_None_None_2_16_AnalysisError_TrashBinInCol2", file_extension="py", - protocol_name="Omega HDQ DNA Extraction: Bacteria 96 FOR ABR TESTING", - robot="OT-3", + protocol_name="QA Protocol - Analysis Error - Trash Bin in Column 2", + robot="Flex", + app_error=True, + robot_error=False, + app_analysis_error="InvalidTrashBinLocationError [line 15]: Invalid location for trash bin: C2. Valid slots: Any slot in column 1 or 3.", # noqa: E501 + ) + + Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol3: Protocol = Protocol( + file_name="Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol3", + file_extension="py", + protocol_name="QA Protocol - Analysis Error - Trash Bin in Staging Area Column 3", + robot="Flex", + app_error=True, + robot_error=False, + app_analysis_error="ProtocolCommandFailedError [line 21]: Error 4000 GENERAL_ERROR (ProtocolCommandFailedError): IncompatibleAddressableAreaError: Cannot use Trash Bin in C3, not compatible with one or more of the following fixtures: Slot C4", # noqa: E501 + expected_test_failure=True, + expected_test_reason="Analysis does not throw error when modules or fixtures are in staging area column 3.", # noqa: E501 + ) + + Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol4: Protocol = Protocol( + file_name="Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol4", + file_extension="py", + protocol_name="QA Protocol - Analysis Error - Trash Bin in Staging Area Column 4", + robot="Flex", + app_error=True, + robot_error=False, + app_analysis_error="ValueError [line 15]: Staging areas not permitted for trash bin.", # noqa: E501 + ) + + Flex_P1000_96_2_16_AnalysisError_DropTipsWithNoTrash: Protocol = Protocol( + file_name="Flex_P1000_96_2_16_AnalysisError_DropTipsWithNoTrash", + file_extension="py", + protocol_name="QA Protocol - Analysis Error - Drop Tips with no Trash", + robot="Flex", + app_error=True, + robot_error=False, + app_analysis_error="NoTrashDefinedError [line 24]: Error 4000 GENERAL_ERROR (NoTrashDefinedError): No trash container has been defined in this protocol.", # noqa: E501 + ) + + Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol3: Protocol = Protocol( + file_name="Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol3", + file_extension="py", + protocol_name="QA Protocol - Analysis Error - Module in Staging Area Column 3", + robot="Flex", + app_error=True, + robot_error=False, + app_analysis_error="InvalidModuleError [line 19]: Error 4000 GENERAL_ERROR (InvalidModuleError): Cannot use temperature module in C3, not compatible with one or more of the following fixtures: Slot C4", # noqa: E501 + expected_test_failure=True, + expected_test_reason="Analysis does not throw error when modules or fixtures are in staging area column 3.", # noqa: E501 + ) + + Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol4: Protocol = Protocol( + file_name="Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol4", + file_extension="py", + protocol_name="QA Protocol - Analysis Error - Module in Staging Area Column 4", + robot="Flex", + app_error=True, + robot_error=False, + app_analysis_error="ValueError [line 15]: Cannot load a module onto a staging slot.", # noqa: E501 + ) + + Flex_P1000_96_TM_2_16_AnalysisError_ModuleAndWasteChuteConflict: Protocol = Protocol( + file_name="Flex_P1000_96_TM_2_16_AnalysisError_ModuleAndWasteChuteConflict", + file_extension="py", + protocol_name="QA Protocol - Analysis Error - Module and Waste Chute Conflict", + robot="Flex", + app_error=True, + robot_error=False, + app_analysis_error="ProtocolCommandFailedError [line 25]: Error 4000 GENERAL_ERROR (ProtocolCommandFailedError): IncompatibleAddressableAreaError: Cannot use Waste Chute, not compatible with one or more of the following fixtures: Slot D3", # noqa: E501 + ) + + Flex_None_None_2_16_AnalysisError_AccessToFixedTrashProp: Protocol = Protocol( + file_name="Flex_None_None_2_16_AnalysisError_AccessToFixedTrashProp", + file_extension="py", + protocol_name="QA Protocol - Analysis Error - Access to Fixed Trash Property", + robot="Flex", + app_error=True, + robot_error=False, + app_analysis_error="APIVersionError [line 15]: Fixed Trash is not supported on Flex protocols in API Version 2.16 and above.", # noqa: E501 + ) + + Flex_P1000_96_GRIPPER_2_16_AnalysisError_DropLabwareIntoTrashBin: Protocol = Protocol( + file_name="Flex_P1000_96_GRIPPER_2_16_AnalysisError_DropLabwareIntoTrashBin", + file_extension="py", + protocol_name="QA Protocol - Analysis Error - Drop Labware in Trash Bin", + robot="Flex", + app_error=True, + robot_error=False, + app_analysis_error="ProtocolCommandFailedError [line 20]: Error 4000 GENERAL_ERROR (ProtocolCommandFailedError): IncompatibleAddressableAreaError: Cannot use Slot C3, not compatible with one or more of the following fixtures: Trash Bin in C3", # noqa: E501 + ) + + Flex_P300Gen2_None_2_16_AnalysisError_OT2PipetteInFlexProtocol: Protocol = Protocol( + file_name="Flex_P300Gen2_None_2_16_AnalysisError_OT2PipetteInFlexProtocol", + file_extension="py", + protocol_name="QA Protocol - Analysis Error - OT-2 Pipette in Flex Protocol", + robot="Flex", + app_error=True, + robot_error=False, + app_analysis_error="ProtocolCommandFailedError [line 22]: Error 4000 GENERAL_ERROR (ProtocolCommandFailedError): InvalidSpecificationForRobotTypeError: Cannot load a Gen2 pipette on a Flex.", # noqa: E501 + ) + + Flex_None_None_MM_2_16_AnalysisError_MagneticModuleInFlexProtocol: Protocol = Protocol( + file_name="Flex_None_None_MM_2_16_AnalysisError_MagneticModuleInFlexProtocol", + file_extension="py", + protocol_name="QA Protocol - Analysis Error - Magnetic Module in Flex Protocol", + robot="Flex", + app_error=True, + robot_error=False, + app_analysis_error="ValueError [line 15]: A magneticModuleType cannot be loaded into slot C1", # noqa: E501 + ) + + Flex_None_None_TM_2_16_AnalysisError_ModuleInCol2: Protocol = Protocol( + file_name="Flex_None_None_TM_2_16_AnalysisError_ModuleInCol2", + file_extension="py", + protocol_name="QA Protocol - Analysis Error - Module in Column 2", + robot="Flex", + app_error=True, + robot_error=False, + app_analysis_error="ValueError [line 15]: A temperatureModuleType cannot be loaded into slot C2", # noqa: E501 + ) + + Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoFixtures: Protocol = Protocol( + file_name="Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoFixtures", + file_extension="py", + protocol_name="QA Protocol - Deck Configuration 1 - No Fixtures", + robot="Flex", app_error=False, robot_error=False, - custom_labware=["opentrons_ot3_96_tiprack_1000ul_rss"], ) - OT3_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR: Protocol = Protocol( - file_name="OT3_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR", + Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModules: Protocol = Protocol( + file_name="Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModules", file_extension="py", - protocol_name="IDT xGen EZ 96x Head PART I-III ABR", - robot="OT-3", + protocol_name="QA Protocol - Deck Configuration 1 - No Modules", + robot="Flex", app_error=False, robot_error=False, - custom_labware=["opentrons_ot3_96_tiprack_50ul_rss", "opentrons_ot3_96_tiprack_200ul_rss"], ) - OT3_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III: Protocol = Protocol( - file_name="OT3_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III", + Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModulesNoFixtures: Protocol = Protocol( + file_name="Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModulesNoFixtures", file_extension="py", - protocol_name="Illumina DNA Prep 96x Head PART III", - robot="OT-3", + protocol_name="QA Protocol - Deck Configuration 1 - No Modules or Fixtures", + robot="Flex", app_error=False, robot_error=False, - custom_labware=["opentrons_ot3_96_tiprack_200ul_rss", "opentrons_ot3_96_tiprack_50ul_rss"], ) - OT3_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria: Protocol = Protocol( - file_name="OT3_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria", + Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1: Protocol = Protocol( + file_name="Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1", file_extension="py", - protocol_name="Quick Zymo Magbead RNA Extraction with Lysis: Bacteria 96 Channel Deletion Test", - robot="OT-3", + protocol_name="QA Protocol - Deck Configuration 1", + robot="Flex", + app_error=False, + robot_error=False, + ) + + Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_Smoke: Protocol = Protocol( + file_name="Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_Smoke", + file_extension="py", + protocol_name="QA Protocol - MEGAAA PROTOCOL - LETS BREAK, I MEAN TEST, EVERYTHING!!!!!", + robot="Flex", app_error=False, robot_error=False, - custom_labware=["opentrons_ot3_96_tiprack_1000ul_rss"], ) diff --git a/app-testing/automation/driver/base.py b/app-testing/automation/driver/base.py index 2a5c2398233..7ff6e5f39af 100644 --- a/app-testing/automation/driver/base.py +++ b/app-testing/automation/driver/base.py @@ -57,16 +57,17 @@ def apply_border_to_locator( def apply_style(argument: str) -> None: """Execute the javascript to apply the style.""" - self.driver.execute_script( - "arguments[0].setAttribute('style', arguments[1]);", finder(), argument - ) # type: ignore + self.driver.execute_script("arguments[0].setAttribute('style', arguments[1]);", finder(), argument) # type: ignore original_style = finder().get_attribute("style") apply_style(f"border: {border_size_px}px solid {color};") if screenshot: self.take_screenshot(message=screenshot_message) time.sleep(effect_time_sec) - apply_style(original_style) + if original_style is None: + apply_style("") + else: + apply_style(original_style) def apply_border_to_element( self, @@ -81,16 +82,17 @@ def apply_border_to_element( def apply_style(argument: str) -> None: """Execute the javascript to apply the style.""" - self.driver.execute_script( - "arguments[0].setAttribute('style', arguments[1]);", element, argument - ) # type: ignore + self.driver.execute_script("arguments[0].setAttribute('style', arguments[1]);", element, argument) # type: ignore original_style = element.get_attribute("style") apply_style(f"border: {border_size_px}px solid {color};") if screenshot: self.take_screenshot(message=screenshot_message) time.sleep(effect_time_sec) - apply_style(original_style) + if original_style is None: + apply_style("") + else: + apply_style(original_style) def highlight_element(self, finder: Callable[..., WebElement]) -> None: """Highlight an element.""" @@ -118,9 +120,7 @@ def take_screenshot(self, message: str = "") -> None: os.makedirs(directory_for_results) note = "" if (message == "") else f"_{message}".replace(" ", "_") file_name = ( - f"{str(time.time_ns())[:-3]}_{self.execution_id}".replace("/", "_").replace("::", "__").replace(".py", "") - + note - + ".png" + f"{str(time.time_ns())[:-3]}_{self.execution_id}".replace("/", "_").replace("::", "__").replace(".py", "") + note + ".png" ) screenshot_full_path: str = str(Path(directory_for_results, file_name)) self.console.print(f"screenshot saved: {file_name}", style="white on blue") @@ -188,9 +188,7 @@ def create_finder( ) def finder() -> Any: - return WebDriverWait(self.driver, timeout_sec, ignored_exceptions=ignored_exceptions).until( - expected_condition(element.locator) - ) + return WebDriverWait(self.driver, timeout_sec, ignored_exceptions=ignored_exceptions).until(expected_condition(element.locator)) return finder diff --git a/app-testing/automation/pages/app_settings.py b/app-testing/automation/pages/app_settings.py index b7eb0289cfc..d5480a1678d 100644 --- a/app-testing/automation/pages/app_settings.py +++ b/app-testing/automation/pages/app_settings.py @@ -471,8 +471,8 @@ def click_enable_developer_tools_toggle(self) -> None: tests. The click works but has no effect. """ button = self.get_enable_developer_tools_toggle() - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(button).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(button).perform() self.base.click(self.enable_developer_tools_toggle) # Elements for Feature Flag diff --git a/app-testing/automation/pages/device_landing.py b/app-testing/automation/pages/device_landing.py index 425ec0d3916..b2d32885fbf 100644 --- a/app-testing/automation/pages/device_landing.py +++ b/app-testing/automation/pages/device_landing.py @@ -164,7 +164,10 @@ def get_lights_status(self) -> bool: if not button: # None check but the finder throws so should never be hit return False # get the status of the toggle - return button.get_attribute("aria-checked").lower() == "true" + aria: str | None = button.get_attribute("aria-checked") + if not aria: # None check but the finder throws so *should* never be hit + return False + return aria.lower() == "true" def set_lights(self, on: bool) -> bool: """Set the lights toggle. Return a bool of the condition: final light state == the desired state.""" @@ -540,8 +543,8 @@ def is_deck_calibrated(self) -> bool: def get_pipette_calibration_overflow_1(self) -> WebElement: """Get the first pipette three dot menu button.""" scroll: WebElement = self.base.clickable_wrapper(self.pipette_calibration_overflow_1, 3) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(scroll).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(scroll).perform() return scroll def click_pipette_calibration_overflow_1(self) -> None: @@ -556,8 +559,8 @@ def click_pipette_calibration_overflow_1(self) -> None: def get_pipette_calibration_overflow_2(self) -> WebElement: """Get the first pipette three dot menu button.""" scroll: WebElement = self.base.clickable_wrapper(self.pipette_calibration_overflow_2, 3) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(scroll).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(scroll).perform() return scroll def click_pipette_calibration_overflow_2(self) -> None: @@ -573,8 +576,8 @@ def click_pipette_calibration_overflow_2(self) -> None: def click_pipette_offset_calibrate_button(self) -> None: """Click the calibrate button.""" scroll: WebElement = self.base.clickable_wrapper(self.calibrate_pipette_offset_button, 3) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(scroll).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(scroll).perform() self.base.click(self.calibrate_pipette_offset_button) # pipette calibration @@ -665,9 +668,9 @@ def click_continue_to_pipette_offset(self) -> None: def shift_down_arrow_key(self) -> None: """Send the keystroke shift + down arrow key.""" - actions = ActionChains(self.base.driver) # type: ignore - actions.send_keys(Keys.LEFT_SHIFT + Keys.ARROW_DOWN) # type: ignore - actions.perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.send_keys(Keys.LEFT_SHIFT + Keys.ARROW_DOWN) + actions.perform() save_calibration_move_to_slot_1: Element = Element( (By.XPATH, '//button[text()="save calibration and move to slot 1"]'), @@ -683,9 +686,9 @@ def click_save_calibration_move_to_slot_1(self) -> None: def up_arrow_key(self) -> None: """Send the keystroke arrow up key.""" - actions = ActionChains(self.base.driver) # type: ignore - actions.send_keys(Keys.ARROW_UP) # type: ignore - actions.perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.send_keys(Keys.ARROW_UP) + actions.perform() save_calibration: Element = Element( (By.XPATH, '//button[text()="save calibration"]'), diff --git a/app-testing/automation/pages/labware_position_check.py b/app-testing/automation/pages/labware_position_check.py index fdbbd12a0d7..1db45492a38 100644 --- a/app-testing/automation/pages/labware_position_check.py +++ b/app-testing/automation/pages/labware_position_check.py @@ -388,8 +388,8 @@ def __init__(self, driver: WebDriver, console: Console, execution_id: str) -> No def get_labware_position_check_button(self) -> WebElement: """Button to locate LPC button.""" button = self.base.clickable_wrapper(self.labware_setup_position_check_button, 2) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(button).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(button).perform() return button def get_labware_success_toast(self) -> WebElement: @@ -423,8 +423,8 @@ def get_labware_position_check_complete(self) -> WebElement: def click_labware_position_button(self) -> None: """Click labware position button.""" button = self.base.clickable_wrapper(self.labware_setup_position_check_button, 2) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(button).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(button).perform() self.base.click(self.labware_setup_position_check_button) def get_introScreen_labware_position_check_overview(self) -> WebElement: @@ -506,8 +506,8 @@ def click_down_jog_button(self) -> None: def get_confirm_position_button_pickup_tip(self) -> WebElement: """Locator for confirm position button pickup.""" toggle: WebElement = self.base.clickable_wrapper(self.confirm_position_button_pickup_tip, 5) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(toggle).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(toggle).perform() return toggle def click_confirm_position_button_pickup_tip(self) -> None: @@ -518,8 +518,8 @@ def click_confirm_position_button_pickup_tip(self) -> None: def get_confirm_position_moveto_slot_2(self) -> WebElement: """Locator for confirm position moveto slot.""" toggle: WebElement = self.base.clickable_wrapper(self.confirm_position_moveto_slot_2, 5) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(toggle).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(toggle).perform() return toggle def click_confirm_position_moveto_slot_2(self) -> None: @@ -530,8 +530,8 @@ def click_confirm_position_moveto_slot_2(self) -> None: def get_confirm_position_moveto_slot_5(self) -> WebElement: """Locator for confirm position move to slot.""" toggle: WebElement = self.base.clickable_wrapper(self.confirm_position_moveto_slot_5, 5) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(toggle).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(toggle).perform() return toggle def click_confirm_position_moveto_slot_5(self) -> None: @@ -542,8 +542,8 @@ def click_confirm_position_moveto_slot_5(self) -> None: def get_confirm_position_moveto_slot_6(self) -> WebElement: """Locator for confirm position moveto slot.""" toggle: WebElement = self.base.clickable_wrapper(self.confirm_position_moveto_slot_6, 5) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(toggle).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(toggle).perform() return toggle def click_confirm_position_moveto_slot_6(self) -> None: diff --git a/app-testing/automation/pages/labware_setup.py b/app-testing/automation/pages/labware_setup.py index e0dae8f9918..514a8916716 100644 --- a/app-testing/automation/pages/labware_setup.py +++ b/app-testing/automation/pages/labware_setup.py @@ -133,29 +133,29 @@ def get_thermocycler_module_modal_text(self) -> WebElement: def get_close_button(self) -> WebElement: """Locator for close button.""" toggle: WebElement = self.base.clickable_wrapper(LabwareSetup.close_button) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(toggle).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(toggle).perform() return toggle def click_close_button(self) -> None: """Click close button.""" toggle: WebElement = self.base.clickable_wrapper(LabwareSetup.close_button) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(toggle).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(toggle).perform() self.base.click(LabwareSetup.close_button) def get_proceed_to_run_button(self) -> WebElement: """Locator for proceed to run button.""" scroll: WebElement = self.base.clickable_wrapper(LabwareSetup.proceed_to_run_button) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(scroll).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(scroll).perform() return scroll def click_proceed_to_run_button(self) -> None: """Click proceed to run.""" scroll: WebElement = self.base.clickable_wrapper(LabwareSetup.proceed_to_run_button) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(scroll).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(scroll).perform() self.base.click(LabwareSetup.proceed_to_run_button) def get_start_run_button(self) -> WebElement: diff --git a/app-testing/automation/pages/module_setup.py b/app-testing/automation/pages/module_setup.py index 2afd0ad6ae6..20b024b807f 100644 --- a/app-testing/automation/pages/module_setup.py +++ b/app-testing/automation/pages/module_setup.py @@ -69,29 +69,29 @@ def get_temperature_module(self) -> WebElement: def get_module_setup_text_locator(self) -> WebElement: """Locator for module setup text.""" toggle: WebElement = self.base.clickable_wrapper(ModuleSetup.module_setup_text_locator) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(toggle).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(toggle).perform() return toggle def get_magnetic_module(self) -> WebElement: """Locator for magnetic module on deckmap.""" toggle: WebElement = self.base.clickable_wrapper(ModuleSetup.magnetic_module) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(toggle).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(toggle).perform() return toggle def get_proceed_to_labware_setup(self) -> WebElement: """Locator for proceed to labware setup.""" toggle: WebElement = self.base.clickable_wrapper(ModuleSetup.proceed_to_labware_setup) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(toggle).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(toggle).perform() return toggle def click_proceed_to_labware_setup(self) -> None: """Proceed to labware setup.""" toggle: WebElement = self.base.clickable_wrapper(ModuleSetup.proceed_to_labware_setup) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(toggle).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(toggle).perform() self.base.click(ModuleSetup.proceed_to_labware_setup) def click_proceed_to_module_setup(self) -> None: @@ -101,6 +101,6 @@ def click_proceed_to_module_setup(self) -> None: def click_module_setup_text(self) -> None: """Click module setup text.""" toggle: WebElement = self.base.clickable_wrapper(ModuleSetup.module_setup_text_locator) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(toggle).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(toggle).perform() self.base.click(ModuleSetup.module_setup_text_locator) diff --git a/app-testing/automation/pages/setup_calibration.py b/app-testing/automation/pages/setup_calibration.py index 7006ab18242..ea9589f027f 100644 --- a/app-testing/automation/pages/setup_calibration.py +++ b/app-testing/automation/pages/setup_calibration.py @@ -90,9 +90,7 @@ def __init__(self, driver: WebDriver, console: Console, execution_id: str) -> No "close robot calibration button", ) - proceed_to_module_setup_cta: Element = Element( - (By.ID, "RobotCalStep_proceedButton"), "proceed to module setup button" - ) + proceed_to_module_setup_cta: Element = Element((By.ID, "RobotCalStep_proceedButton"), "proceed to module setup button") def get_setup_for_run(self) -> WebElement: """Search for the setup for run text.""" @@ -129,8 +127,8 @@ def get_robot_calibration_help_modal_text(self) -> WebElement: def get_robot_calibration_close_button(self) -> WebElement: """Robot claibration close button.""" close: WebElement = self.base.clickable_wrapper(SetupCalibration.close_robot_calibration_button) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(close).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(close).perform() return close def click_robot_calibration_help_link(self) -> None: @@ -140,8 +138,8 @@ def click_robot_calibration_help_link(self) -> None: def click_robot_calibration_close_button(self) -> None: """Click robot calibration close.""" close: WebElement = self.base.clickable_wrapper(SetupCalibration.close_robot_calibration_button) - actions = ActionChains(self.base.driver) # type: ignore - actions.move_to_element(close).perform() # type: ignore + actions = ActionChains(self.base.driver) + actions.move_to_element(close).perform() self.base.click(SetupCalibration.close_robot_calibration_button) def get_required_tip_length_calibration(self) -> WebElement: diff --git a/app-testing/ci-tools/ot2_with_all_modules.yaml b/app-testing/ci-tools/ot2_with_all_modules.yaml deleted file mode 100644 index d9c1957446c..00000000000 --- a/app-testing/ci-tools/ot2_with_all_modules.yaml +++ /dev/null @@ -1,65 +0,0 @@ -###################### -# System Description # -###################### - -# This system builds an OT2 and 1 of each module. - - # - name: Substitute current sha into yaml - # id: sub-step - # uses: Opentrons/opentrons-emulation@release-v2.3.1 - # with: - # command: yaml-sub - # substitutions: >- - # [ - # ["otie", "source-location", "${{ github.sha }}"], - # ["t00-hot-to-handle", "source-location", "${{ github.sha }}"], - # ["fatal-attraction", "source-location", "${{ github.sha }}"], - # ["temperamental", "source-location", "${{ github.sha }}"], - # ["maggy", "source-location", "${{ github.sha }}"], - # ] - # input-file: ${{ github.workspace }}/ot3-firmware/emulation_setups/ci/ot3_only.yaml - # output-file-location: ${{ github.workspace }}/output.yaml - -system-unique-id: ot2-with-all-modules -robot: - id: otie - hardware: ot2 - source-type: remote - source-location: latest - emulation-level: firmware - robot-server-source-type: remote - robot-server-source-location: latest - exposed-port: 31950 - hardware-specific-attributes: - left-pipette: - model: p300_multi_v2.1 - id: p300multi - right-pipette: - model: p20_single_v2.2 - id: p20single -modules: - - id: shakey-and-warm - hardware: heater-shaker-module - source-type: remote - source-location: latest - emulation_level: firmware - - id: t00-hot-to-handle - hardware: thermocycler-module - source-type: remote - source-location: latest - emulation_level: firmware - - id: fatal-attraction - hardware: magnetic-module - source-type: remote - source-location: latest - emulation_level: firmware - - id: temperamental - hardware: temperature-module - source-type: remote - source-location: latest - emulation_level: firmware - - id: maggy - hardware: magnetic-module - source-type: remote - source-location: latest - emulation_level: firmware diff --git a/app-testing/citools/Dockerfile b/app-testing/citools/Dockerfile new file mode 100644 index 00000000000..05b2ed538ff --- /dev/null +++ b/app-testing/citools/Dockerfile @@ -0,0 +1,26 @@ +# Use 3.10 just like the app does +FROM python:3.10-slim-bullseye + +# Update packages and install git +RUN apt-get update && \ + apt-get upgrade -y && \ + apt-get install -y git libsystemd-dev + +# Define a build argument for the commit/tag/hash to clone +ARG OPENTRONS_VERSION=edge + +# Set the working directory in the container +WORKDIR /opentrons + +# Clone the Opentrons repository at the specified commit or tag +RUN git clone --branch $OPENTRONS_VERSION --depth 1 https://github.com/Opentrons/opentrons . + +# Install packages from local directories +RUN python -m pip install -U ./shared-data/python +RUN python -m pip install -U ./hardware[flex] +RUN python -m pip install -U ./api +RUN python -m pip install -U pandas==1.4.3 + +# The default command to run when starting the container +CMD ["tail", "-f", "/dev/null"] + diff --git a/app-testing/citools/__init__.py b/app-testing/citools/__init__.py new file mode 100644 index 00000000000..e11ed81c96c --- /dev/null +++ b/app-testing/citools/__init__.py @@ -0,0 +1 @@ +"""Package for all automation tools.""" diff --git a/app-testing/citools/generate_analyses.py b/app-testing/citools/generate_analyses.py new file mode 100644 index 00000000000..c8bccc9af45 --- /dev/null +++ b/app-testing/citools/generate_analyses.py @@ -0,0 +1,268 @@ +# docker build --build-arg OPENTRONS_VERSION=v7.0.2 -t opentrons-analysis:v7.0.2 . +# docker build --build-arg OPENTRONS_VERSION=v7.1.0-alpha.1 -t opentrons-analysis:v7.1.0-alpha.1 . +# docker build --build-arg OPENTRONS_VERSION=v7.1.0-alpha.2 -t opentrons-analysis:v7.1.0-alpha.2 . +# docker build --build-arg OPENTRONS_VERSION=v7.1.0-alpha.3 -t opentrons-analysis:v7.1.0-alpha.3 . + +# python -m pipenv run python citools/generate_analyses.py + +import json +import os +import time +from dataclasses import dataclass +from enum import Enum, auto +from pathlib import Path +from typing import Any, Dict, List + +import docker # type: ignore +from automation.data.protocol import Protocol +from rich import print +from rich.console import Console +from rich.panel import Panel +from rich.traceback import install + +install(show_locals=True) +IMAGE = "opentrons-analysis" +CONTAINER_LABWARE = "/var/lib/ot" +HOST_LABWARE = Path(Path(__file__).parent.parent, "files", "labware") +HOST_PROTOCOLS_ROOT = Path(Path(__file__).parent.parent, "files", "protocols") +CONTAINER_PROTOCOLS_ROOT = "/var/lib/ot/protocols" +CONTAINER_RESULTS = "/var/lib/ot/analysis_results" +HOST_RESULTS = Path(Path(__file__).parent.parent, "analysis_results") +ANALYSIS_SUFFIX = "analysis.json" + +console = Console() + + +class ProtocolType(Enum): + PROTOCOL_DESIGNER = auto() + PYTHON = auto() + + +@dataclass +class AnalyzeProtocol: + host_protocol_file: Path + container_protocol_file: Path + host_analysis_file: Path + container_analysis_file: Path + tag: str + analysis_execution_time: float | None = None + exit_code: int | None = None + output: str | None = None + analysis: Dict[str, Any] | None = None + + @property + def analysis_file_exists(self) -> bool: + return self.host_analysis_file.exists() + + def set_analysis(self) -> None: + if self.analysis_file_exists: + with open(self.host_analysis_file, "r") as file: + self.analysis = json.load(file) + + @property + def protocol_file_name(self) -> str: + return self.host_protocol_file.name + + @property + def protocol_type(self) -> str: + return (ProtocolType.PYTHON if self.host_protocol_file.suffix == ".py" else ProtocolType.PROTOCOL_DESIGNER).name.title() + + def set_analysis_execution_time(self, analysis_execution_time: float) -> None: + self.analysis_execution_time = analysis_execution_time + + +def run_container(image_name: str, timeout: int = 60) -> docker.models.containers.Container: + client = docker.from_env() + volumes = { + str(HOST_LABWARE): {"bind": CONTAINER_LABWARE, "mode": "rw"}, + str(HOST_RESULTS): {"bind": CONTAINER_RESULTS, "mode": "rw"}, + str(HOST_PROTOCOLS_ROOT): {"bind": CONTAINER_PROTOCOLS_ROOT, "mode": "rw"}, + } + + # Check for running containers using the specified image + containers = client.containers.list(filters={"ancestor": image_name, "status": "running"}) + + if containers: + print("Container already running.") + print("Exiting, stop this container so that you may be sure to have the right volumes attached.") + exit(1) + else: + # If no running container is found, start a new one with the specified volume + print("Starting a new container.") + container = client.containers.run(image_name, detach=True, volumes=volumes) + + # Wait for the container to be ready if a readiness command is provided + start_time = time.time() + while time.time() - start_time < timeout: + exit_code, output = container.exec_run(f"ls -al {CONTAINER_LABWARE}") + if exit_code == 0: + print("Container is ready.") + break + else: + print("Waiting for container to be ready...") + time.sleep(5) + else: + print("Timeout waiting for container to be ready. Proceeding anyway.") + return container + + +def stop_and_remove_containers(image_name: str) -> None: + client = docker.from_env() + + # Find all containers created from the specified image + containers = client.containers.list(all=True, filters={"ancestor": image_name}) + + for container in containers: + try: + # Stop the container if it's running + if container.status == "running": + print(f"Stopping container {container.short_id}...") + container.stop() + + # Remove the container + print(f"Removing container {container.short_id}...") + container.remove() + except docker.errors.ContainerError as e: + print(f"Error stopping/removing container {container.short_id}: {e}") + + +def has_designer_application(json_file_path: Path) -> bool: + try: + with open(json_file_path, "r", encoding="utf-8") as file: + data = json.load(file) + return "designerApplication" in data + except json.JSONDecodeError: + # Handle the exception if the file is not a valid JSON + print(f"Invalid JSON file: {json_file_path}") + return False + + +def host_analysis_path(protocol_file: Path, tag: str) -> Path: + return Path(HOST_RESULTS, f"{protocol_file.stem}_{tag}_{ANALYSIS_SUFFIX}") + + +def container_analysis_path(protocol_file: Path, tag: str) -> Path: + return Path(CONTAINER_RESULTS, f"{protocol_file.stem}_{tag}_{ANALYSIS_SUFFIX}") + + +def generate_protocols(tag: str) -> List[AnalyzeProtocol]: + def find_pd_protocols() -> List[AnalyzeProtocol]: + # Check if the provided path is a valid directory + if not HOST_PROTOCOLS_ROOT.is_dir(): + raise NotADirectoryError(f"The path {HOST_PROTOCOLS_ROOT} is not a valid directory.") + + # Recursively find all .json files + json_files = list(HOST_PROTOCOLS_ROOT.rglob("*.json")) + filtered_json_files = [file for file in json_files if has_designer_application(file)] + pd_protocols: List[AnalyzeProtocol] = [] + for path in filtered_json_files: + relative_path = path.relative_to(HOST_PROTOCOLS_ROOT) + updated_path = Path(CONTAINER_PROTOCOLS_ROOT, relative_path) + pd_protocols.append(AnalyzeProtocol(path, updated_path, host_analysis_path(path, tag), container_analysis_path(path, tag), tag)) + return pd_protocols + + def find_python_protocols() -> List[AnalyzeProtocol]: + # Check if the provided path is a valid directory + if not HOST_PROTOCOLS_ROOT.is_dir(): + raise NotADirectoryError(f"The path {HOST_PROTOCOLS_ROOT} is not a valid directory.") + + # Recursively find all .py files + python_files = list(HOST_PROTOCOLS_ROOT.rglob("*.py")) + py_protocols: List[AnalyzeProtocol] = [] + + for path in python_files: + relative_path = path.relative_to(HOST_PROTOCOLS_ROOT) + container_path = Path(CONTAINER_PROTOCOLS_ROOT, relative_path) + py_protocols.append( + AnalyzeProtocol(path, container_path, host_analysis_path(path, tag), container_analysis_path(path, tag), tag=tag) + ) + return py_protocols + + return find_pd_protocols() + find_python_protocols() + + +def remove_all_files_in_directory(directory: Path) -> None: + for filename in os.listdir(directory): + file_path = os.path.join(directory, filename) + try: + if os.path.isfile(file_path) or os.path.islink(file_path): + os.unlink(file_path) + elif os.path.isdir(file_path): + pass # Currently, subdirectories are not removed + except Exception as e: + print(f"Failed to delete {file_path}. Reason: {e}") + + +def report(protocol: AnalyzeProtocol) -> None: + panel = Panel( + f"[bold green]Output:[/bold green]\n{protocol.output}\n\n[bold red]Exit Code:[/bold red] {protocol.exit_code}", + title="[bold magenta]Command Result[/bold magenta]", + expand=False, + ) + console.print(panel) + if protocol.analysis_file_exists is True: + if protocol.analysis is not None and protocol.analysis["errors"] != []: + console.print(f"[bold red]Analysis has errors {protocol.protocol_file_name}[/bold red]") + console.print(protocol.analysis["errors"]) + console.print(protocol.output) + else: + console.print(f"[bold red]Analysis not created for {protocol.protocol_file_name}[/bold red]") + console.print(protocol.output) + + +def container_custom_labware_paths() -> List[str]: + if HOST_LABWARE.is_dir(): + return [os.path.join(CONTAINER_LABWARE, file) for file in os.listdir(HOST_LABWARE) if file.endswith(".json")] + return [] + + +def analyze(protocol: AnalyzeProtocol, container: docker.models.containers.Container) -> None: + # Run the analyze command + command = f"python -I -m opentrons.cli analyze --json-output {protocol.container_analysis_file} {protocol.container_protocol_file} {' '.join(map(str, container_custom_labware_paths()))}" # noqa: E501 + start_time = time.time() + exit_code, result = container.exec_run(command) # Assuming container is a defined object + protocol.output = result.decode("utf-8") + protocol.exit_code = exit_code + protocol.set_analysis() + protocol.set_analysis_execution_time(time.time() - start_time) + + +def analyze_many(protocol_files: List[AnalyzeProtocol], container: docker.models.containers.Container) -> None: + for file in protocol_files: + analyze(file, container) + accumulated_time = sum(protocol.analysis_execution_time for protocol in protocol_files if protocol.analysis_execution_time is not None) + console.print(f"{len(protocol_files)} protocols with total analysis time of {accumulated_time:.2f} seconds.\n") + + +def analyze_against_image(tag: str) -> List[AnalyzeProtocol]: + image_name = f"{IMAGE}:{tag}" + protocols = generate_protocols(tag) + protocols_to_process = protocols + # protocols_to_process = protocols[:1] # For testing + try: + console.print(f"Analyzing {len(protocols_to_process)} protocol(s) against {image_name}...") + container = run_container(image_name) + analyze_many(protocols_to_process, container) + finally: + stop_and_remove_containers(image_name) + return protocols_to_process + + +def generate_analyses_from_test(tag: str, protocols: List[Protocol]) -> None: + """Generate analyses from the tests.""" + image_name = f"{IMAGE}:{tag}" + protocols_to_process: List[AnalyzeProtocol] = [] + for protocol in protocols: + host_protocol_file = Path(protocol.file_path) + container_protocol_file = Path(CONTAINER_PROTOCOLS_ROOT, host_protocol_file.relative_to(HOST_PROTOCOLS_ROOT)) + host_analysis_file = host_analysis_path(host_protocol_file, tag) + container_analysis_file = container_analysis_path(host_protocol_file, tag) + protocols_to_process.append( + AnalyzeProtocol(host_protocol_file, container_protocol_file, host_analysis_file, container_analysis_file, tag) + ) + try: + console.print(f"Analyzing {len(protocols_to_process)} protocol(s) against {tag}...") + container = run_container(image_name) + analyze_many(protocols_to_process, container) + finally: + stop_and_remove_containers(image_name) diff --git a/app-testing/ci-tools/linux_get_chromedriver.sh b/app-testing/citools/linux_get_chromedriver.sh similarity index 61% rename from app-testing/ci-tools/linux_get_chromedriver.sh rename to app-testing/citools/linux_get_chromedriver.sh index a064ba8dd42..c42e7d4b79b 100755 --- a/app-testing/ci-tools/linux_get_chromedriver.sh +++ b/app-testing/citools/linux_get_chromedriver.sh @@ -3,13 +3,16 @@ set -eo pipefail VERSION=$1 +URL="https://github.com/electron/electron/releases/download/v${VERSION}/chromedriver-v${VERSION}-linux-x64.zip" CHROMEAPP=google-chrome if ! type -a google-chrome >/dev/null 2>&1; then sudo apt-get update sudo apt-get install -y google-chrome fi -wget -c -nc --retry-connrefused --tries=0 https://github.com/electron/electron/releases/download/v${VERSION}/chromedriver-v${VERSION}-linux-x64.zip +echo "Downloading chromedriver" +echo "URL: $URL" +wget -c -nc --retry-connrefused --tries=0 $URL unzip -o -q chromedriver-v${VERSION}-linux-x64.zip sudo mv chromedriver /usr/local/bin/chromedriver rm chromedriver-v${VERSION}-linux-x64.zip diff --git a/app-testing/ci-tools/mac_get_chromedriver.sh b/app-testing/citools/mac_get_chromedriver.sh similarity index 100% rename from app-testing/ci-tools/mac_get_chromedriver.sh rename to app-testing/citools/mac_get_chromedriver.sh diff --git a/app-testing/ci-tools/windows_get_chromedriver.ps1 b/app-testing/citools/windows_get_chromedriver.ps1 similarity index 100% rename from app-testing/ci-tools/windows_get_chromedriver.ps1 rename to app-testing/citools/windows_get_chromedriver.ps1 diff --git a/app-testing/conftest.py b/app-testing/conftest.py index afc55ea719e..1c2762fffd4 100644 --- a/app-testing/conftest.py +++ b/app-testing/conftest.py @@ -20,9 +20,14 @@ traceback.install(console=_console) -# Check to see if we have a dotenv file and use it +# My setting overrides to false we give preference to System Environment Variables +# This is important for CI if find_dotenv(): - load_dotenv(find_dotenv()) + load_dotenv(find_dotenv(), override=False) +elif find_dotenv(filename="example.env"): # example.env has our defaults + load_dotenv(find_dotenv(filename="example.env"), override=False) +else: + raise AssertionError("No .env or example.env file found.") def pytest_collection_modifyitems(items): # type: ignore # noqa: ANN201,ANN001 diff --git a/app-testing/example.env b/app-testing/example.env index d5a97f48962..a359f3d6770 100644 --- a/app-testing/example.env +++ b/app-testing/example.env @@ -11,46 +11,42 @@ SLOWMO=TrUe HIGHLIGHT_SECONDS=.3 # default is 2 UPDATE_CHANNEL="beta" # latest beta alpha LOCALHOST=false +# Analyses Snapshot test target +TARGET=edge # run all tests # possible values in \automation\data\protocol_files.py # dynamically generate with make print-protocols -# OT-2 Protocols -# APP_ANALYSIS_TEST_PROTOCOLS="OT2_P1000SLeft_None_6_1_SimpleTransfer, -# OT2_P20SRight_None_6_1_SimpleTransferError, -# OT2_P20S_P300M_HS_6_1_HS_WithCollision_Error, -# OT2_P20S_P300M_NoMods_6_1_TransferReTransferLiquid, -# OT2_P300M_P20S_HS_6_1_Smoke620release, -# OT2_P300M_P20S_MM_HS_TD_TC_6_1_AllMods_Error, -# OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40, -# OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40Error, -# OT2_P300M_P20S_NoMod_6_1_MixTransferManyLiquids, -# OT2_P300M_P300S_HS_6_1_HS_NormalUseWithTransfer, -# OT2_P300SG1_None_5_2_6_Gen1PipetteSimple, -# OT2_P300SLeft_MM_TM_TM_5_2_6_MOAMTemps, -# OT2_None_None_2_12_Python310SyntaxRobotAnalysisOnlyError, -# OT2_None_None_2_13_PythonSyntaxError, -# OT2_P10S_P300M_TC1_TM_MM_2_11_Swift, -# OT2_P20S_None_2_7_Walkthrough, -# OT2_P300MLeft_MM_TM_2_4_Zymo, -# OT2_P300M_P20S_None_2_12_FailOnRun, -# OT2_P300M_P20S_TC_MM_TM_6_13_Smoke620Release, -# OT2_P300SLeft_MM1_MM_2_2_EngageMagHeightFromBase, -# OT2_P300SLeft_MM1_MM_TM_2_3_Mix, -# OT2_P300S_Thermocycler_Moam_Error, -# OT2_P300S_Twinning_Error" -# Flex Protocols -APP_ANALYSIS_TEST_PROTOCOLS="OT3_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch, -OT3_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right, -OT3_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2, -OT3_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4, -OT3_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment, -OT3_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x, -OT3_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel, -OT3_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR, -OT3_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III, -OT3_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria" +APP_ANALYSIS_TEST_PROTOCOLS="Flex_None_None_2_16_AnalysisError_AccessToFixedTrashProp, Flex_None_None_2_16_AnalysisError_TrashBinInCol2, +Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol3, Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol4, +Flex_None_None_MM_2_16_AnalysisError_MagneticModuleInFlexProtocol, Flex_None_None_TM_2_16_AnalysisError_ModuleInCol2, +Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol3, Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol4, +Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment, +Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4, +Flex_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x, +Flex_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right, Flex_P1000_96_2_16_AnalysisError_DropTipsWithNoTrash, +Flex_P1000_96_GRIPPER_2_16_AnalysisError_DropLabwareIntoTrashBin, Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1, +Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoFixtures, +Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModules, +Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModulesNoFixtures, Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_Smoke, +Flex_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel, Flex_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch, +Flex_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III, +Flex_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR, +Flex_P1000_96_TM_2_16_AnalysisError_ModuleAndWasteChuteConflict, Flex_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria, +Flex_P300Gen2_None_2_16_AnalysisError_OT2PipetteInFlexProtocol, Flex_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2, +OT2_None_None_2_12_Python310SyntaxRobotAnalysisOnlyError, OT2_None_None_2_13_PythonSyntaxError, +OT2_P1000SLeft_None_6_1_SimpleTransfer, OT2_P10S_P300M_TC1_TM_MM_2_11_Swift, OT2_P20SRight_None_6_1_SimpleTransferError, +OT2_P20S_None_2_7_Walkthrough, OT2_P20S_P300M_HS_6_1_HS_WithCollision_Error, OT2_P20S_P300M_NoMods_6_1_TransferReTransferLiquid, +OT2_P300MLeft_MM_TM_2_4_Zymo, OT2_P300M_P20S_2_16_aspirateDispenseMix0Volume, OT2_P300M_P20S_HS_6_1_Smoke620release, +OT2_P300M_P20S_MM_HS_TD_TC_6_1_AllMods_Error, OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40, OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40Error, +OT2_P300M_P20S_NoMod_6_1_MixTransferManyLiquids, OT2_P300M_P20S_None_2_12_FailOnRun, OT2_P300M_P20S_TC_HS_TM_2_13_SmokeTestV3, +OT2_P300M_P20S_TC_HS_TM_2_14_SmokeTestV3, OT2_P300M_P20S_TC_HS_TM_2_15_SmokeTestV3, OT2_P300M_P20S_TC_HS_TM_2_16_SmokeTestV3, +OT2_P300M_P20S_TC_HS_TM_2_16_aspirateDispenseMix0Volume, OT2_P300M_P20S_TC_MM_TM_2_13_Smoke620Release, +OT2_P300M_P300S_HS_6_1_HS_NormalUseWithTransfer, OT2_P300SG1_None_5_2_6_Gen1PipetteSimple, +OT2_P300SLeft_MM1_MM_2_2_EngageMagHeightFromBase, OT2_P300SLeft_MM1_MM_TM_2_3_Mix, OT2_P300SLeft_MM_TM_TM_5_2_6_MOAMTemps, +OT2_P300S_Thermocycler_Moam_Error, OT2_P300S_Twinning_Error" # run one -# APP_ANALYSIS_TEST_PROTOCOLS="OT2_P1000SLeft_None_6_1_SimpleTransfer" -FILES_FOLDER="files" \ No newline at end of file +# APP_ANALYSIS_TEST_PROTOCOLS="Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment" + +FILES_FOLDER="files" diff --git a/app-testing/files/protocols/py/Flex_None_None_2_16_AnalysisError_AccessToFixedTrashProp.py b/app-testing/files/protocols/py/Flex_None_None_2_16_AnalysisError_AccessToFixedTrashProp.py new file mode 100644 index 00000000000..35ebce46e97 --- /dev/null +++ b/app-testing/files/protocols/py/Flex_None_None_2_16_AnalysisError_AccessToFixedTrashProp.py @@ -0,0 +1,15 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Analysis Error - Access to Fixed Trash Property", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + ctx.fixed_trash diff --git a/app-testing/files/protocols/py/Flex_None_None_2_16_AnalysisError_TrashBinInCol2.py b/app-testing/files/protocols/py/Flex_None_None_2_16_AnalysisError_TrashBinInCol2.py new file mode 100644 index 00000000000..70703b3f3f3 --- /dev/null +++ b/app-testing/files/protocols/py/Flex_None_None_2_16_AnalysisError_TrashBinInCol2.py @@ -0,0 +1,15 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Analysis Error - Trash Bin in Column 2", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + ctx.load_trash_bin("C2") diff --git a/app-testing/files/protocols/py/Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol3.py b/app-testing/files/protocols/py/Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol3.py new file mode 100644 index 00000000000..eb4cabec5a8 --- /dev/null +++ b/app-testing/files/protocols/py/Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol3.py @@ -0,0 +1,16 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Analysis Error - Trash Bin in Staging Area Column 3", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + ctx.load_labware("nest_1_reservoir_290ml", "C4") # Implicitly define a Staging Area + ctx.load_trash_bin("C3") diff --git a/app-testing/files/protocols/py/Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol4.py b/app-testing/files/protocols/py/Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol4.py new file mode 100644 index 00000000000..b1852ff672d --- /dev/null +++ b/app-testing/files/protocols/py/Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol4.py @@ -0,0 +1,15 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Analysis Error - Trash Bin in Staging Area Column 4", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + ctx.load_trash_bin("C4") diff --git a/app-testing/files/protocols/py/Flex_None_None_MM_2_16_AnalysisError_MagneticModuleInFlexProtocol.py b/app-testing/files/protocols/py/Flex_None_None_MM_2_16_AnalysisError_MagneticModuleInFlexProtocol.py new file mode 100644 index 00000000000..d2b9c7cb2ed --- /dev/null +++ b/app-testing/files/protocols/py/Flex_None_None_MM_2_16_AnalysisError_MagneticModuleInFlexProtocol.py @@ -0,0 +1,15 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Analysis Error - Magnetic Module in Flex Protocol", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + ctx.load_module("magnetic module gen2", "C1") diff --git a/app-testing/files/protocols/py/Flex_None_None_TM_2_16_AnalysisError_ModuleInCol2.py b/app-testing/files/protocols/py/Flex_None_None_TM_2_16_AnalysisError_ModuleInCol2.py new file mode 100644 index 00000000000..2ff8bb96261 --- /dev/null +++ b/app-testing/files/protocols/py/Flex_None_None_TM_2_16_AnalysisError_ModuleInCol2.py @@ -0,0 +1,16 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Analysis Error - Module in Column 2", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + temp_module = ctx.load_module("temperature module gen2", "C2") + temp_module.deactivate() diff --git a/app-testing/files/protocols/py/Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol3.py b/app-testing/files/protocols/py/Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol3.py new file mode 100644 index 00000000000..d45c4938b53 --- /dev/null +++ b/app-testing/files/protocols/py/Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol3.py @@ -0,0 +1,18 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Analysis Error - Module in Staging Area Column 3", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + ctx.load_waste_chute() + ctx.load_labware("nest_1_reservoir_290ml", "C4") # Implicitly define a Staging Area + temp_module = ctx.load_module("temperature module gen2", "C3") + temp_module.deactivate() diff --git a/app-testing/files/protocols/py/Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol4.py b/app-testing/files/protocols/py/Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol4.py new file mode 100644 index 00000000000..eaaf8d1555e --- /dev/null +++ b/app-testing/files/protocols/py/Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol4.py @@ -0,0 +1,15 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Analysis Error - Module in Staging Area Column 4", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + ctx.load_module("temperature module gen2", "B4") diff --git a/app-testing/files/protocols/py/OT3_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment.py b/app-testing/files/protocols/py/Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment.py similarity index 99% rename from app-testing/files/protocols/py/OT3_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment.py rename to app-testing/files/protocols/py/Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment.py index c4af8c32986..e4b55c71752 100644 --- a/app-testing/files/protocols/py/OT3_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment.py +++ b/app-testing/files/protocols/py/Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment.py @@ -45,17 +45,17 @@ def run(protocol: protocol_api.ProtocolContext): # ========== FIRST ROW =========== heatershaker = protocol.load_module("heaterShakerModuleV1", "1") sample_plate_2 = heatershaker.load_labware("nest_96_wellplate_2ml_deep") - tiprack_200_1 = protocol.load_labware("opentrons_ot3_96_tiprack_200ul", "2") + tiprack_200_1 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "2") temp_block = protocol.load_module("temperature module gen2", "3") reagent_plate = temp_block.load_labware("nest_96_wellplate_100ul_pcr_full_skirt") # ========== SECOND ROW ========== MAG_PLATE_SLOT = protocol.load_module("magneticBlockV1", "4") reservoir = protocol.load_labware("nest_96_wellplate_2ml_deep", "5") - tiprack_200_2 = protocol.load_labware("opentrons_ot3_96_tiprack_200ul", "6") + tiprack_200_2 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "6") # ========== THIRD ROW =========== thermocycler = protocol.load_module("thermocycler module gen2") sample_plate_1 = thermocycler.load_labware("nest_96_wellplate_100ul_pcr_full_skirt") - tiprack_20 = protocol.load_labware("opentrons_ot3_96_tiprack_50ul", "9") + tiprack_20 = protocol.load_labware("opentrons_flex_96_tiprack_50ul", "9") # ========== FOURTH ROW ========== # reagent @@ -340,7 +340,6 @@ def grip_offset(action, item, slot=None): protocol.comment("--> Repeating 3 washes") washreps = 3 for wash in range(washreps): - protocol.comment("--> Adding EEW") EEWVol = 200 p1000.pick_up_tip() diff --git a/app-testing/files/protocols/py/OT3_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4.py b/app-testing/files/protocols/py/Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4.py similarity index 98% rename from app-testing/files/protocols/py/OT3_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4.py rename to app-testing/files/protocols/py/Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4.py index 89d9f5903e3..92b7018f773 100644 --- a/app-testing/files/protocols/py/OT3_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4.py +++ b/app-testing/files/protocols/py/Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4.py @@ -49,16 +49,13 @@ def run(protocol: protocol_api.ProtocolContext): - global p200_tips global p50_tips if ABR_TEST == True: protocol.comment("THIS IS A ABR RUN WITH " + str(RUN) + " REPEATS") protocol.comment("THIS IS A DRY RUN") if DRYRUN == True else protocol.comment("THIS IS A REACTION RUN") - protocol.comment("USED TIPS WILL GO IN TRASH") if TIP_TRASH == True else protocol.comment( - "USED TIPS WILL BE RE-RACKED" - ) + protocol.comment("USED TIPS WILL GO IN TRASH") if TIP_TRASH == True else protocol.comment("USED TIPS WILL BE RE-RACKED") # DECK SETUP AND LABWARE # ========== FIRST ROW =========== @@ -69,15 +66,15 @@ def run(protocol: protocol_api.ProtocolContext): reagent_plate = temp_block.load_labware("nest_96_wellplate_100ul_pcr_full_skirt") # ========== SECOND ROW ========== MAG_PLATE_SLOT = 4 - tiprack_200_1 = protocol.load_labware("opentrons_ot3_96_tiprack_200ul", "5") - tiprack_50_1 = protocol.load_labware("opentrons_ot3_96_tiprack_50ul", "6") + tiprack_200_1 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "5") + tiprack_50_1 = protocol.load_labware("opentrons_flex_96_tiprack_50ul", "6") # ========== THIRD ROW =========== thermocycler = protocol.load_module("thermocycler module gen2") sample_plate_1 = thermocycler.load_labware("nest_96_wellplate_100ul_pcr_full_skirt") - tiprack_200_2 = protocol.load_labware("opentrons_ot3_96_tiprack_200ul", "8") - tiprack_50_2 = protocol.load_labware("opentrons_ot3_96_tiprack_50ul", "9") + tiprack_200_2 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "8") + tiprack_50_2 = protocol.load_labware("opentrons_flex_96_tiprack_50ul", "9") # ========== FOURTH ROW ========== - tiprack_200_3 = protocol.load_labware("opentrons_ot3_96_tiprack_200ul", "11") + tiprack_200_3 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "11") # reagent AMPure = reservoir["A1"] @@ -104,9 +101,7 @@ def run(protocol: protocol_api.ProtocolContext): EPM = reagent_plate.wells_by_name()["A7"] # pipette - p1000 = protocol.load_instrument( - "flex_8channel_1000", "left", tip_racks=[tiprack_200_1, tiprack_200_2, tiprack_200_3] - ) + p1000 = protocol.load_instrument("flex_8channel_1000", "left", tip_racks=[tiprack_200_1, tiprack_200_2, tiprack_200_3]) p50 = protocol.load_instrument("flex_8channel_50", "right", tip_racks=[tiprack_50_1, tiprack_50_2]) # tip and sample tracking @@ -443,7 +438,6 @@ def grip_offset(action, item, slot=None): washreps = 3 washcount = 0 for wash in range(washreps): - protocol.comment("--> Adding EEW") EEWVol = 200 for loop, X in enumerate(column_2_list): @@ -1007,7 +1001,6 @@ def grip_offset(action, item, slot=None): # Resetting TWB for X in range(COLUMNS): - p1000.aspirate(200, Liquid_trash_well_2.bottom(z=1)) p1000.dispense(200, EEW_1.bottom(z=1)) p1000.aspirate(200, Liquid_trash_well_2.bottom(z=1)) diff --git a/app-testing/files/protocols/py/OT3_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x.py b/app-testing/files/protocols/py/Flex_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x.py similarity index 99% rename from app-testing/files/protocols/py/OT3_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x.py rename to app-testing/files/protocols/py/Flex_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x.py index 1516b6318f6..4d35cdf23fe 100644 --- a/app-testing/files/protocols/py/OT3_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x.py +++ b/app-testing/files/protocols/py/Flex_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x.py @@ -5,7 +5,6 @@ "protocolName": "Illumina DNA Prep 24x", "author": "Opentrons ", "source": "Protocol Library", - "apiLevel": "2.15", } requirements = { @@ -40,16 +39,16 @@ def run(protocol: protocol_api.ProtocolContext): # ========== FIRST ROW =========== heatershaker = protocol.load_module("heaterShakerModuleV1", "1") sample_plate_1 = heatershaker.load_labware("nest_96_wellplate_100ul_pcr_full_skirt") - tiprack_200_1 = protocol.load_labware("opentrons_ot3_96_tiprack_200ul", "2") + tiprack_200_1 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "2") temp_block = protocol.load_module("temperature module gen2", "3") reagent_plate = temp_block.load_labware("nest_96_wellplate_100ul_pcr_full_skirt") # ========== SECOND ROW ========== mag_block = protocol.load_module("magneticBlockV1", 4) reservoir = protocol.load_labware("nest_96_wellplate_2ml_deep", "5") - tiprack_200_2 = protocol.load_labware("opentrons_ot3_96_tiprack_200ul", "6") + tiprack_200_2 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "6") # ========== THIRD ROW =========== thermocycler = protocol.load_module("thermocycler module gen2") - tiprack_20 = protocol.load_labware("opentrons_ot3_96_tiprack_50ul", "9") + tiprack_20 = protocol.load_labware("opentrons_flex_96_tiprack_50ul", "9") # ========== FOURTH ROW ========== # =========== RESERVOIR ========== diff --git a/app-testing/files/protocols/py/OT3_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right.py b/app-testing/files/protocols/py/Flex_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right.py similarity index 88% rename from app-testing/files/protocols/py/OT3_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right.py rename to app-testing/files/protocols/py/Flex_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right.py index 692c7bb8685..3b8ebfa3b15 100644 --- a/app-testing/files/protocols/py/OT3_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right.py +++ b/app-testing/files/protocols/py/Flex_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right.py @@ -22,7 +22,6 @@ def run(protocol: protocol_api.ProtocolContext): - if DRYRUN == "YES": protocol.comment("THIS IS A DRY RUN") else: @@ -34,16 +33,16 @@ def run(protocol: protocol_api.ProtocolContext): reservoir = protocol.load_labware("nest_12_reservoir_15ml", "1") sample_plate_1 = protocol.load_labware("nest_96_wellplate_100ul_pcr_full_skirt", "3") # ========== SECOND ROW ========== - tiprack_200_1 = protocol.load_labware("opentrons_ot3_96_tiprack_200ul", "4") - tiprack_200_2 = protocol.load_labware("opentrons_ot3_96_tiprack_200ul", "5") + tiprack_200_1 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "4") + tiprack_200_2 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "5") sample_plate_2 = protocol.load_labware("nest_96_wellplate_100ul_pcr_full_skirt", "6") # ========== THIRD ROW =========== - tiprack_200_3 = protocol.load_labware("opentrons_ot3_96_tiprack_200ul", "7") - tiprack_200_4 = protocol.load_labware("opentrons_ot3_96_tiprack_200ul", "8") + tiprack_200_3 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "7") + tiprack_200_4 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "8") sample_plate_3 = protocol.load_labware("nest_96_wellplate_100ul_pcr_full_skirt", "9") # ========== FOURTH ROW ========== - tiprack_200_5 = protocol.load_labware("opentrons_ot3_96_tiprack_200ul", "10") - tiprack_200_6 = protocol.load_labware("opentrons_ot3_96_tiprack_200ul", "11") + tiprack_200_5 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "10") + tiprack_200_6 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "11") # reagent Dye_1 = reservoir["A1"] @@ -173,9 +172,7 @@ def run(protocol: protocol_api.ProtocolContext): CurrentWell = str(data[current][1]) DyeVol = float(data[current][2]) if DyeVol != 0: - p1000.transfer( - DyeVol, Dye_1.bottom(z=2), sample_plate_1.wells_by_name()[CurrentWell].top(z=1), new_tip="never" - ) + p1000.transfer(DyeVol, Dye_1.bottom(z=2), sample_plate_1.wells_by_name()[CurrentWell].top(z=1), new_tip="never") current += 1 p1000.return_tip() @@ -204,9 +201,7 @@ def run(protocol: protocol_api.ProtocolContext): CurrentWell = str(data[current][1]) DyeVol = float(data[current][2]) if DyeVol != 0: - p1000.transfer( - DyeVol, Dye_2.bottom(z=2), sample_plate_2.wells_by_name()[CurrentWell].top(z=1), new_tip="never" - ) + p1000.transfer(DyeVol, Dye_2.bottom(z=2), sample_plate_2.wells_by_name()[CurrentWell].top(z=1), new_tip="never") current += 1 p1000.return_tip() @@ -235,9 +230,7 @@ def run(protocol: protocol_api.ProtocolContext): CurrentWell = str(data[current][1]) DyeVol = float(data[current][2]) if DyeVol != 0: - p1000.transfer( - DyeVol, Dye_3.bottom(z=2), sample_plate_3.wells_by_name()[CurrentWell].top(z=1), new_tip="never" - ) + p1000.transfer(DyeVol, Dye_3.bottom(z=2), sample_plate_3.wells_by_name()[CurrentWell].top(z=1), new_tip="never") current += 1 p1000.return_tip() diff --git a/app-testing/files/protocols/py/Flex_P1000_96_2_16_AnalysisError_DropTipsWithNoTrash.py b/app-testing/files/protocols/py/Flex_P1000_96_2_16_AnalysisError_DropTipsWithNoTrash.py new file mode 100644 index 00000000000..7b43ce3be2a --- /dev/null +++ b/app-testing/files/protocols/py/Flex_P1000_96_2_16_AnalysisError_DropTipsWithNoTrash.py @@ -0,0 +1,23 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Analysis Error - Drop Tips with no Trash", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + ################ + ### FIXTURES ### + ################ + + ctx.load_labware("nest_1_reservoir_290ml", "C4") # Implicitly define a Staging Area + tip_rack = ctx.load_labware("opentrons_flex_96_tiprack_1000ul", "D3", adapter="opentrons_flex_96_tiprack_adapter") + pipette_96_channel = ctx.load_instrument("flex_96channel_1000", mount="left", tip_racks=[tip_rack]) + pipette_96_channel.pick_up_tip() + pipette_96_channel.drop_tip() diff --git a/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_2_16_AnalysisError_DropLabwareIntoTrashBin.py b/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_2_16_AnalysisError_DropLabwareIntoTrashBin.py new file mode 100644 index 00000000000..35add4bee67 --- /dev/null +++ b/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_2_16_AnalysisError_DropLabwareIntoTrashBin.py @@ -0,0 +1,20 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Analysis Error - Drop Labware in Trash Bin", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + trash_bin = ctx.load_trash_bin("C3") + tip_rack = ctx.load_labware("opentrons_flex_96_tiprack_1000ul", "A1", adapter="opentrons_flex_96_tiprack_adapter") + pipette_96_channel = ctx.load_instrument("flex_96channel_1000", mount="left", tip_racks=[tip_rack]) + pipette_96_channel.pick_up_tip() + pipette_96_channel.drop_tip(trash_bin) + ctx.move_labware(tip_rack, "C3", use_gripper=True) diff --git a/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1.py b/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1.py new file mode 100644 index 00000000000..e76c8179098 --- /dev/null +++ b/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1.py @@ -0,0 +1,178 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Deck Configuration 1", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + +HEATER_SHAKER_NAME = "heaterShakerModuleV1" +MAGNETIC_BLOCK_NAME = "magneticBlockV1" +PCR_PLATE_96_NAME = "nest_96_wellplate_100ul_pcr_full_skirt" +STARTING_VOL = 100 +TEMPERATURE_MODULE_NAME = "temperature module gen2" +THERMOCYCLER_NAME = "thermocycler module gen2" +TIPRACK_96_NAME = "opentrons_flex_96_tiprack_1000ul" +TRANSFER_VOL = 10 +USING_GRIPPER = True + +TIP_RACK_LOCATION_1 = "C3" +TIP_RACK_LOCATION_2 = "D2" + + +def default_well(tiprack: protocol_api.labware) -> protocol_api.labware.Well: + return tiprack["A1"] + + +def run(ctx: protocol_api.ProtocolContext) -> None: + ################ + ### FIXTURES ### + ################ + + trash_bin_1 = ctx.load_trash_bin("C1") + trash_bin_2 = ctx.load_trash_bin("D1") + waste_chute = ctx.load_waste_chute() + + ############### + ### MODULES ### + ############### + thermocycler = ctx.load_module(THERMOCYCLER_NAME) # A1 & B1 + magnetic_block = ctx.load_module(MAGNETIC_BLOCK_NAME, "A2") + # heater_shaker = ctx.load_module(HEATER_SHAKER_NAME, "A3") + temperature_module = ctx.load_module(TEMPERATURE_MODULE_NAME, "B3") + + ####################### + ### MODULE ADAPTERS ### + ####################### + + temperature_module_adapter = temperature_module.load_adapter("opentrons_96_well_aluminum_block") + # heater_shaker_adapter = heater_shaker.load_adapter("opentrons_96_pcr_adapter") + + ############### + ### LABWARE ### + ############### + + src_pcr_plate = ctx.load_labware(PCR_PLATE_96_NAME, "B2") + dest_pcr_plate = ctx.load_labware(PCR_PLATE_96_NAME, "C2") + + on_deck_tip_rack_1 = ctx.load_labware(TIPRACK_96_NAME, TIP_RACK_LOCATION_1, adapter="opentrons_flex_96_tiprack_adapter") + tip_rack_adapter_1 = on_deck_tip_rack_1.parent + + on_deck_tip_rack_2 = ctx.load_labware(TIPRACK_96_NAME, TIP_RACK_LOCATION_2, adapter="opentrons_flex_96_tiprack_adapter") + tip_rack_adapter_2 = on_deck_tip_rack_2.parent + + off_deck_tip_rack_1 = ctx.load_labware(TIPRACK_96_NAME, protocol_api.OFF_DECK) + off_deck_tip_rack_2 = ctx.load_labware(TIPRACK_96_NAME, protocol_api.OFF_DECK) + + staging_area_tip_rack_1 = ctx.load_labware(TIPRACK_96_NAME, "C4") + staging_area_tip_rack_2 = ctx.load_labware(TIPRACK_96_NAME, "D4") + + tip_racks = [ + on_deck_tip_rack_1, + on_deck_tip_rack_2, + staging_area_tip_rack_1, + staging_area_tip_rack_2, + off_deck_tip_rack_1, + off_deck_tip_rack_2, + ] + + ########################## + ### PIPETTE DEFINITION ### + ########################## + + pipette_96_channel = ctx.load_instrument("flex_96channel_1000", mount="left", tip_racks=tip_racks) + + ######################## + ### LOAD SOME LIQUID ### + ######################## + + water = ctx.define_liquid(name="water", description="High Quality H₂O", display_color="#42AB2D") + + acetone = ctx.define_liquid(name="acetone", description="C₃H₆O", display_color="#38588a") + + [ + well.load_liquid(liquid=water if i % 2 == 0 else acetone, volume=STARTING_VOL) + for i, column in enumerate(src_pcr_plate.columns()) + for well in column + ] + + ######################## + ### MOVE SOME LIQUID ### + ######################## + + pipette_96_channel.pick_up_tip(default_well(on_deck_tip_rack_1)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.drop_tip(waste_chute) + + pipette_96_channel.pick_up_tip(default_well(on_deck_tip_rack_2)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.drop_tip(trash_bin_1) + + ################################## + ### THROW AWAY EMPTY TIP RACKS ### + ################################## + + ctx.move_labware(on_deck_tip_rack_1, waste_chute, use_gripper=USING_GRIPPER) + ctx.move_labware(on_deck_tip_rack_2, waste_chute, use_gripper=USING_GRIPPER) + + ################################### + ### MOVE STAGING AREA TIP RACKS ### + ################################### + + ctx.move_labware(staging_area_tip_rack_1, tip_rack_adapter_1, use_gripper=USING_GRIPPER) + ctx.move_labware(staging_area_tip_rack_2, tip_rack_adapter_2, use_gripper=USING_GRIPPER) + + ############################# + ### MOVE SOME MORE LIQUID ### + ############################# + + pipette_96_channel.pick_up_tip(default_well(staging_area_tip_rack_1)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.drop_tip(waste_chute) + + pipette_96_channel.pick_up_tip(default_well(staging_area_tip_rack_2)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.drop_tip(trash_bin_2) + + ################################## + ### THROW AWAY EMPTY TIP RACKS ### + ################################## + + ctx.move_labware(staging_area_tip_rack_1, waste_chute, use_gripper=USING_GRIPPER) + ctx.move_labware(staging_area_tip_rack_2, waste_chute, use_gripper=USING_GRIPPER) + + ############################### + ### MOVE OFF DECK TIP RACKS ### + ############################### + + ctx.move_labware(off_deck_tip_rack_1, tip_rack_adapter_1, use_gripper=not USING_GRIPPER) + ctx.move_labware(off_deck_tip_rack_2, tip_rack_adapter_2, use_gripper=not USING_GRIPPER) + + pipette_96_channel.pick_up_tip(default_well(off_deck_tip_rack_1)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.drop_tip(waste_chute) + + pipette_96_channel.pick_up_tip(default_well(off_deck_tip_rack_2)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.drop_tip(waste_chute) + + ############################ + ### PUT STUFF ON MODULES ### + ############################ + + thermocycler.open_lid() + ctx.move_labware(dest_pcr_plate, thermocycler, use_gripper=USING_GRIPPER) + ctx.move_labware(dest_pcr_plate, magnetic_block, use_gripper=USING_GRIPPER) + # ctx.move_labware(dest_pcr_plate, heater_shaker_adapter, use_gripper=USING_GRIPPER) + ctx.move_labware(dest_pcr_plate, temperature_module_adapter, use_gripper=USING_GRIPPER) + + ########################################## + ### MAKE THIS PROTOCOL TOTALLY USELESS ### + ########################################## + + ctx.move_labware(src_pcr_plate, waste_chute, use_gripper=USING_GRIPPER) + ctx.move_labware(dest_pcr_plate, waste_chute, use_gripper=USING_GRIPPER) diff --git a/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoFixtures.py b/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoFixtures.py new file mode 100644 index 00000000000..b29e6457338 --- /dev/null +++ b/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoFixtures.py @@ -0,0 +1,132 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Deck Configuration 1 - No Fixtures", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + +HEATER_SHAKER_NAME = "heaterShakerModuleV1" +MAGNETIC_BLOCK_NAME = "magneticBlockV1" +PCR_PLATE_96_NAME = "nest_96_wellplate_100ul_pcr_full_skirt" +STARTING_VOL = 100 +TEMPERATURE_MODULE_NAME = "temperature module gen2" +THERMOCYCLER_NAME = "thermocycler module gen2" +TIPRACK_96_NAME = "opentrons_flex_96_tiprack_1000ul" +TRANSFER_VOL = 10 +USING_GRIPPER = True +TIP_RACK_LOCATION_1 = "C3" +TIP_RACK_LOCATION_2 = "D2" + + +def default_well(tiprack: protocol_api.labware) -> protocol_api.labware.Well: + return tiprack["A1"] + + +def run(ctx: protocol_api.ProtocolContext) -> None: + ############### + ### MODULES ### + ############### + thermocycler = ctx.load_module(THERMOCYCLER_NAME) # A1 & B1 + magnetic_block = ctx.load_module(MAGNETIC_BLOCK_NAME, "A2") + # heater_shaker = ctx.load_module(HEATER_SHAKER_NAME, "A3") + temperature_module = ctx.load_module(TEMPERATURE_MODULE_NAME, "B3") + + ####################### + ### MODULE ADAPTERS ### + ####################### + + temperature_module_adapter = temperature_module.load_adapter("opentrons_96_well_aluminum_block") + # heater_shaker_adapter = heater_shaker.load_adapter("opentrons_96_pcr_adapter") + + ############### + ### LABWARE ### + ############### + + src_pcr_plate = ctx.load_labware(PCR_PLATE_96_NAME, "B2") + dest_pcr_plate = ctx.load_labware(PCR_PLATE_96_NAME, "C2") + + on_deck_tip_rack_1 = ctx.load_labware(TIPRACK_96_NAME, TIP_RACK_LOCATION_1, adapter="opentrons_flex_96_tiprack_adapter") + tip_rack_adapter_1 = on_deck_tip_rack_1.parent + + on_deck_tip_rack_2 = ctx.load_labware(TIPRACK_96_NAME, TIP_RACK_LOCATION_2, adapter="opentrons_flex_96_tiprack_adapter") + tip_rack_adapter_2 = on_deck_tip_rack_2.parent + off_deck_tip_rack_1 = ctx.load_labware(TIPRACK_96_NAME, protocol_api.OFF_DECK) + off_deck_tip_rack_2 = ctx.load_labware(TIPRACK_96_NAME, protocol_api.OFF_DECK) + + tip_racks = [on_deck_tip_rack_1, on_deck_tip_rack_2, off_deck_tip_rack_1, off_deck_tip_rack_2] + + ########################## + ### PIPETTE DEFINITION ### + ########################## + + pipette_96_channel = ctx.load_instrument("flex_96channel_1000", mount="left", tip_racks=tip_racks) + + ######################## + ### LOAD SOME LIQUID ### + ######################## + + water = ctx.define_liquid(name="water", description="High Quality H₂O", display_color="#42AB2D") + + acetone = ctx.define_liquid(name="acetone", description="C₃H₆O", display_color="#38588a") + + [ + well.load_liquid(liquid=water if i % 2 == 0 else acetone, volume=STARTING_VOL) + for i, column in enumerate(src_pcr_plate.columns()) + for well in column + ] + + ######################## + ### MOVE SOME LIQUID ### + ######################## + + pipette_96_channel.pick_up_tip(default_well(on_deck_tip_rack_1)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.return_tip() + + pipette_96_channel.pick_up_tip(default_well(on_deck_tip_rack_2)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.return_tip() + + ##################################### + ### MOVE EMPTY TIP RACKS OFF DECK ### + ##################################### + + ctx.move_labware(on_deck_tip_rack_1, protocol_api.OFF_DECK, use_gripper=not USING_GRIPPER) + ctx.move_labware(on_deck_tip_rack_2, protocol_api.OFF_DECK, use_gripper=not USING_GRIPPER) + + ############################### + ### MOVE OFF DECK TIP RACKS ### + ############################### + + ctx.move_labware(off_deck_tip_rack_1, tip_rack_adapter_1, use_gripper=not USING_GRIPPER) + ctx.move_labware(off_deck_tip_rack_2, tip_rack_adapter_2, use_gripper=not USING_GRIPPER) + + pipette_96_channel.pick_up_tip(default_well(off_deck_tip_rack_1)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.return_tip() + + pipette_96_channel.pick_up_tip(default_well(off_deck_tip_rack_2)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.return_tip() + + ############################ + ### PUT STUFF ON MODULES ### + ############################ + + thermocycler.open_lid() + ctx.move_labware(dest_pcr_plate, thermocycler, use_gripper=USING_GRIPPER) + ctx.move_labware(dest_pcr_plate, magnetic_block, use_gripper=USING_GRIPPER) + # ctx.move_labware(dest_pcr_plate, heater_shaker_adapter, use_gripper=USING_GRIPPER) + ctx.move_labware(dest_pcr_plate, temperature_module_adapter, use_gripper=USING_GRIPPER) + + ########################################## + ### MAKE THIS PROTOCOL TOTALLY USELESS ### + ########################################## + + ctx.move_labware(src_pcr_plate, protocol_api.OFF_DECK, use_gripper=not USING_GRIPPER) + ctx.move_labware(dest_pcr_plate, protocol_api.OFF_DECK, use_gripper=not USING_GRIPPER) diff --git a/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModules.py b/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModules.py new file mode 100644 index 00000000000..680ad37966b --- /dev/null +++ b/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModules.py @@ -0,0 +1,151 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Deck Configuration 1 - No Modules", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + +HEATER_SHAKER_NAME = "heaterShakerModuleV1" +MAGNETIC_BLOCK_NAME = "magneticBlockV1" +PCR_PLATE_96_NAME = "nest_96_wellplate_100ul_pcr_full_skirt" +STARTING_VOL = 100 +TEMPERATURE_MODULE_NAME = "temperature module gen2" +THERMOCYCLER_NAME = "thermocycler module gen2" +TIPRACK_96_NAME = "opentrons_flex_96_tiprack_1000ul" +TRANSFER_VOL = 10 +USING_GRIPPER = True +TIP_RACK_LOCATION_1 = "C3" +TIP_RACK_LOCATION_2 = "D2" + + +def default_well(tiprack: protocol_api.labware) -> protocol_api.labware.Well: + return tiprack["A1"] + + +def run(ctx: protocol_api.ProtocolContext) -> None: + ################ + ### FIXTURES ### + ################ + + trash_bin_1 = ctx.load_trash_bin("C1") + trash_bin_2 = ctx.load_trash_bin("D1") + waste_chute = ctx.load_waste_chute() + + ############### + ### LABWARE ### + ############### + + src_pcr_plate = ctx.load_labware(PCR_PLATE_96_NAME, "B2") + dest_pcr_plate = ctx.load_labware(PCR_PLATE_96_NAME, "C2") + + on_deck_tip_rack_1 = ctx.load_labware(TIPRACK_96_NAME, TIP_RACK_LOCATION_1, adapter="opentrons_flex_96_tiprack_adapter") + tip_rack_adapter_1 = on_deck_tip_rack_1.parent + + on_deck_tip_rack_2 = ctx.load_labware(TIPRACK_96_NAME, TIP_RACK_LOCATION_2, adapter="opentrons_flex_96_tiprack_adapter") + tip_rack_adapter_2 = on_deck_tip_rack_2.parent + off_deck_tip_rack_1 = ctx.load_labware(TIPRACK_96_NAME, protocol_api.OFF_DECK) + off_deck_tip_rack_2 = ctx.load_labware(TIPRACK_96_NAME, protocol_api.OFF_DECK) + + staging_area_tip_rack_1 = ctx.load_labware(TIPRACK_96_NAME, "C4") # Staging Area + staging_area_tip_rack_2 = ctx.load_labware(TIPRACK_96_NAME, "D4") # Staging Area + + tip_racks = [ + on_deck_tip_rack_1, + on_deck_tip_rack_2, + staging_area_tip_rack_1, + staging_area_tip_rack_2, + off_deck_tip_rack_1, + off_deck_tip_rack_2, + ] + + ########################## + ### PIPETTE DEFINITION ### + ########################## + + pipette_96_channel = ctx.load_instrument("flex_96channel_1000", mount="left", tip_racks=tip_racks) + + ######################## + ### LOAD SOME LIQUID ### + ######################## + + water = ctx.define_liquid(name="water", description="High Quality H₂O", display_color="#42AB2D") + + acetone = ctx.define_liquid(name="acetone", description="C₃H₆O", display_color="#38588a") + + [ + well.load_liquid(liquid=water if i % 2 == 0 else acetone, volume=STARTING_VOL) + for i, column in enumerate(src_pcr_plate.columns()) + for well in column + ] + + ######################## + ### MOVE SOME LIQUID ### + ######################## + + pipette_96_channel.pick_up_tip(default_well(on_deck_tip_rack_1)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.drop_tip(waste_chute) + + pipette_96_channel.pick_up_tip(default_well(on_deck_tip_rack_2)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.drop_tip(trash_bin_1) + + ################################## + ### THROW AWAY EMPTY TIP RACKS ### + ################################## + + ctx.move_labware(on_deck_tip_rack_1, waste_chute, use_gripper=USING_GRIPPER) + ctx.move_labware(on_deck_tip_rack_2, waste_chute, use_gripper=USING_GRIPPER) + + ################################### + ### MOVE STAGING AREA TIP RACKS ### + ################################### + + ctx.move_labware(staging_area_tip_rack_1, tip_rack_adapter_1, use_gripper=USING_GRIPPER) + ctx.move_labware(staging_area_tip_rack_2, tip_rack_adapter_2, use_gripper=USING_GRIPPER) + + ############################# + ### MOVE SOME MORE LIQUID ### + ############################# + + pipette_96_channel.pick_up_tip(default_well(staging_area_tip_rack_1)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.drop_tip(waste_chute) + + pipette_96_channel.pick_up_tip(default_well(staging_area_tip_rack_2)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.drop_tip(trash_bin_2) + + ################################## + ### THROW AWAY EMPTY TIP RACKS ### + ################################## + + ctx.move_labware(staging_area_tip_rack_1, waste_chute, use_gripper=USING_GRIPPER) + ctx.move_labware(staging_area_tip_rack_2, waste_chute, use_gripper=USING_GRIPPER) + + ############################### + ### MOVE OFF DECK TIP RACKS ### + ############################### + + ctx.move_labware(off_deck_tip_rack_1, tip_rack_adapter_1, use_gripper=not USING_GRIPPER) + ctx.move_labware(off_deck_tip_rack_2, tip_rack_adapter_2, use_gripper=not USING_GRIPPER) + + pipette_96_channel.pick_up_tip(default_well(off_deck_tip_rack_1)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.drop_tip(waste_chute) + + pipette_96_channel.pick_up_tip(default_well(off_deck_tip_rack_2)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.drop_tip(waste_chute) + + ########################################## + ### MAKE THIS PROTOCOL TOTALLY USELESS ### + ########################################## + + ctx.move_labware(src_pcr_plate, waste_chute, use_gripper=USING_GRIPPER) + ctx.move_labware(dest_pcr_plate, waste_chute, use_gripper=USING_GRIPPER) diff --git a/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModulesNoFixtures.py b/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModulesNoFixtures.py new file mode 100644 index 00000000000..165d532d5a4 --- /dev/null +++ b/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModulesNoFixtures.py @@ -0,0 +1,107 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Deck Configuration 1 - No Modules or Fixtures", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + +HEATER_SHAKER_NAME = "heaterShakerModuleV1" +MAGNETIC_BLOCK_NAME = "magneticBlockV1" +PCR_PLATE_96_NAME = "nest_96_wellplate_100ul_pcr_full_skirt" +STARTING_VOL = 100 +TEMPERATURE_MODULE_NAME = "temperature module gen2" +THERMOCYCLER_NAME = "thermocycler module gen2" +TIPRACK_96_NAME = "opentrons_flex_96_tiprack_1000ul" +TRANSFER_VOL = 10 +USING_GRIPPER = True +TIP_RACK_LOCATION_1 = "C3" +TIP_RACK_LOCATION_2 = "D2" + + +def default_well(tiprack: protocol_api.labware) -> protocol_api.labware.Well: + return tiprack["A1"] + + +def run(ctx: protocol_api.ProtocolContext) -> None: + ############### + ### LABWARE ### + ############### + + src_pcr_plate = ctx.load_labware(PCR_PLATE_96_NAME, "B2") + dest_pcr_plate = ctx.load_labware(PCR_PLATE_96_NAME, "C2") + + on_deck_tip_rack_1 = ctx.load_labware(TIPRACK_96_NAME, TIP_RACK_LOCATION_1, adapter="opentrons_flex_96_tiprack_adapter") + tip_rack_adapter_1 = on_deck_tip_rack_1.parent + + on_deck_tip_rack_2 = ctx.load_labware(TIPRACK_96_NAME, TIP_RACK_LOCATION_2, adapter="opentrons_flex_96_tiprack_adapter") + tip_rack_adapter_2 = on_deck_tip_rack_2.parent + off_deck_tip_rack_1 = ctx.load_labware(TIPRACK_96_NAME, protocol_api.OFF_DECK) + off_deck_tip_rack_2 = ctx.load_labware(TIPRACK_96_NAME, protocol_api.OFF_DECK) + + tip_racks = [on_deck_tip_rack_1, on_deck_tip_rack_2, off_deck_tip_rack_1, off_deck_tip_rack_2] + + ########################## + ### PIPETTE DEFINITION ### + ########################## + + pipette_96_channel = ctx.load_instrument("flex_96channel_1000", mount="left", tip_racks=tip_racks) + + ######################## + ### LOAD SOME LIQUID ### + ######################## + + water = ctx.define_liquid(name="water", description="High Quality H₂O", display_color="#42AB2D") + + acetone = ctx.define_liquid(name="acetone", description="C₃H₆O", display_color="#38588a") + + [ + well.load_liquid(liquid=water if i % 2 == 0 else acetone, volume=STARTING_VOL) + for i, column in enumerate(src_pcr_plate.columns()) + for well in column + ] + + ######################## + ### MOVE SOME LIQUID ### + ######################## + + pipette_96_channel.pick_up_tip(default_well(on_deck_tip_rack_1)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.return_tip() + + pipette_96_channel.pick_up_tip(default_well(on_deck_tip_rack_2)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.return_tip() + + ##################################### + ### MOVE EMPTY TIP RACKS OFF DECK ### + ##################################### + + ctx.move_labware(on_deck_tip_rack_1, protocol_api.OFF_DECK, use_gripper=not USING_GRIPPER) + ctx.move_labware(on_deck_tip_rack_2, protocol_api.OFF_DECK, use_gripper=not USING_GRIPPER) + + ############################### + ### MOVE OFF DECK TIP RACKS ### + ############################### + + ctx.move_labware(off_deck_tip_rack_1, tip_rack_adapter_1, use_gripper=not USING_GRIPPER) + ctx.move_labware(off_deck_tip_rack_2, tip_rack_adapter_2, use_gripper=not USING_GRIPPER) + + pipette_96_channel.pick_up_tip(default_well(off_deck_tip_rack_1)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.return_tip() + + pipette_96_channel.pick_up_tip(default_well(off_deck_tip_rack_2)) + pipette_96_channel.transfer(TRANSFER_VOL, default_well(src_pcr_plate), default_well(dest_pcr_plate), new_tip="never") + pipette_96_channel.return_tip() + + ########################################## + ### MAKE THIS PROTOCOL TOTALLY USELESS ### + ########################################## + + ctx.move_labware(src_pcr_plate, protocol_api.OFF_DECK, use_gripper=not USING_GRIPPER) + ctx.move_labware(dest_pcr_plate, protocol_api.OFF_DECK, use_gripper=not USING_GRIPPER) diff --git a/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_Smoke.py b/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_Smoke.py new file mode 100644 index 00000000000..2caabd69fb2 --- /dev/null +++ b/app-testing/files/protocols/py/Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_Smoke.py @@ -0,0 +1,394 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - MEGAAA PROTOCOL - LETS BREAK, I MEAN TEST, EVERYTHING!!!!!", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + +############# +### FLAGS ### +############# + +# prefer to move off deck, instead of waste chute disposal, if possible +PREFER_MOVE_OFF_DECK = True + +################# +### CONSTANTS ### +################# + +HEATER_SHAKER_ADAPTER_NAME = "opentrons_96_pcr_adapter" +HEATER_SHAKER_NAME = "heaterShakerModuleV1" +MAGNETIC_BLOCK_NAME = "magneticBlockV1" +TEMPERATURE_MODULE_ADAPTER_NAME = "opentrons_96_well_aluminum_block" +TEMPERATURE_MODULE_NAME = "temperature module gen2" +THERMOCYCLER_NAME = "thermocycler module gen2" + +PCR_PLATE_96_NAME = "nest_96_wellplate_100ul_pcr_full_skirt" +RESERVOIR_NAME = "nest_1_reservoir_290ml" +TIPRACK_96_ADAPTER_NAME = "opentrons_flex_96_tiprack_adapter" +TIPRACK_96_NAME = "opentrons_flex_96_tiprack_1000ul" + +PIPETTE_96_CHANNEL_NAME = "flex_96channel_1000" + +USING_GRIPPER = True +RESET_AFTER_EACH_MOVE = True + + +def run(ctx: protocol_api.ProtocolContext) -> None: + ################ + ### FIXTURES ### + ################ + + trash_bin = ctx.load_trash_bin("B3") + waste_chute = ctx.load_waste_chute() + + ############### + ### MODULES ### + ############### + thermocycler = ctx.load_module(THERMOCYCLER_NAME) # A1 & B1 + magnetic_block = ctx.load_module(MAGNETIC_BLOCK_NAME, "C1") + heater_shaker = ctx.load_module(HEATER_SHAKER_NAME, "A3") + temperature_module = ctx.load_module(TEMPERATURE_MODULE_NAME, "D1") + + thermocycler.open_lid() + heater_shaker.open_labware_latch() + + ####################### + ### MODULE ADAPTERS ### + ####################### + + temperature_module_adapter = temperature_module.load_adapter(TEMPERATURE_MODULE_ADAPTER_NAME) + heater_shaker_adapter = heater_shaker.load_adapter(HEATER_SHAKER_ADAPTER_NAME) + + adapters = [temperature_module_adapter, heater_shaker_adapter] + + ############### + ### LABWARE ### + ############### + + source_reservoir = ctx.load_labware(RESERVOIR_NAME, "D2") + dest_pcr_plate = ctx.load_labware(PCR_PLATE_96_NAME, "C2") + + tip_rack_1 = ctx.load_labware(TIPRACK_96_NAME, "A2", adapter=TIPRACK_96_ADAPTER_NAME) + tip_rack_adapter = tip_rack_1.parent + + tip_rack_2 = ctx.load_labware(TIPRACK_96_NAME, "C3") + tip_rack_3 = ctx.load_labware(TIPRACK_96_NAME, "C4") + + tip_racks = [ + tip_rack_1, + tip_rack_2, + tip_rack_3, + ] + + ########################## + ### PIPETTE DEFINITION ### + ########################## + + pipette_96_channel = ctx.load_instrument(PIPETTE_96_CHANNEL_NAME, mount="left", tip_racks=tip_racks) + + assert isinstance(pipette_96_channel.trash_container, protocol_api.TrashBin) + + ######################## + ### LOAD SOME LIQUID ### + ######################## + + water = ctx.define_liquid(name="water", description="High Quality H₂O", display_color="#42AB2D") + source_reservoir.wells_by_name()["A1"].load_liquid(liquid=water, volume=29000) + + ################################ + ### GRIPPER LABWARE MOVEMENT ### + ################################ + + def get_disposal_preference(): + """ + Get the disposal preference based on the PREFER_MOVE_OFF_DECK flag. + + Returns: + tuple: A tuple containing the disposal preference. The first element is the location preference, + either `protocol_api.OFF_DECK` or `waste_chute`. The second element is a boolean indicating + whether the gripper is being used or not. + """ + return (protocol_api.OFF_DECK, not USING_GRIPPER) if PREFER_MOVE_OFF_DECK else (waste_chute, USING_GRIPPER) + + def run_moves(labware, move_sequences, reset_location, use_gripper): + """ + Perform a series of moves for a given labware using specified move sequences. + + Will perform 2 versions of the moves: + 1. Moves to each location in the sequence, resetting to the reset location after each move. + 2. Moves to each location in the sequence, resetting to the reset location after all moves. + + Args: + labware (str): The labware to be moved. + move_sequences (list): A list of move sequences, where each sequence is a list of locations. + reset_location (str): The location to reset the labware after each move sequence. + use_gripper (bool): Flag indicating whether to use the gripper during the moves. + """ + + def move_to_locations(labware_to_move, move_locations, reset_after_each_move, use_gripper, reset_location): + """ + Move the labware to the specified locations. + + Args: + labware_to_move (str): The labware to be moved. + move_locations (list): A list of locations to move the labware to. + reset_after_each_move (bool): Flag indicating whether to reset the labware after each move. + use_gripper (bool): Flag indicating whether to use the gripper during the moves. + reset_location (str): The location to reset the labware after each move sequence. + """ + + def reset_labware(): + """ + Reset the labware to the reset location. + """ + ctx.move_labware(labware_to_move, reset_location, use_gripper=use_gripper) + + if len(move_locations) == 0: + return + + for location in move_locations: + ctx.move_labware(labware_to_move, location, use_gripper=use_gripper) + + if reset_after_each_move: + reset_labware() + + if not reset_after_each_move: + reset_labware() + + for move_sequence in move_sequences: + move_to_locations(labware, move_sequence, RESET_AFTER_EACH_MOVE, use_gripper, reset_location) + move_to_locations(labware, move_sequence, not RESET_AFTER_EACH_MOVE, use_gripper, reset_location) + + def test_gripper_moves(): + """ + Function to test the movement of the gripper in various locations. + + This function contains several helper functions to perform the movement of labware using a gripper. + Each function performs a sequence of moves, starting with a specific location on the deck. + + Args: + None + + Returns: + None + """ + + def deck_moves(labware, reset_location): + """ + Function to perform the movement of labware, with the inital position being on the deck. + + Args: + pcr_plate (str): The labware to be moved on the deck. + reset_location (str): The reset location on the deck. + + Returns: + None + """ + deck_move_sequence = [ + ["B2"], # Deck Moves + ["C3"], # Staging Area Slot 3 Moves + ["C4", "D4"], # Staging Area Slot 4 Moves + [thermocycler, temperature_module_adapter, heater_shaker_adapter, magnetic_block], # Module Moves + ] + + run_moves(labware, deck_move_sequence, reset_location, USING_GRIPPER) + + def staging_area_slot_3_moves(labware, reset_location): + """ + Function to perform the movement of labware, with the inital position being on staging area slot 3. + + Args: + labware (str): The labware to be moved in staging area slot 3. + reset_location (str): The reset location in staging area slot 3. + + Returns: + None + """ + staging_area_slot_3_move_sequence = [ + ["B2", "C2"], # Deck Moves + [], # Don't have Staging Area Slot 3 open + ["C4", "D4"], # Staging Area Slot 4 Moves + [thermocycler, temperature_module_adapter, heater_shaker_adapter, magnetic_block], # Module Moves + ] + + run_moves(labware, staging_area_slot_3_move_sequence, reset_location, USING_GRIPPER) + + def staging_area_slot_4_moves(labware, reset_location): + """ + Function to perform the movement of labware, with the inital position being on staging area slot 4. + + Args: + labware (str): The labware to be moved in staging area slot 4. + reset_location (str): The reset location in staging area slot 4. + + Returns: + None + """ + staging_area_slot_4_move_sequence = [ + ["C2", "B2"], # Deck Moves + ["C3"], # Staging Area Slot 3 Moves + ["C4"], # Staging Area Slot 4 Moves + [thermocycler, temperature_module_adapter, heater_shaker_adapter, magnetic_block], # Module Moves + ] + + run_moves(labware, staging_area_slot_4_move_sequence, reset_location, USING_GRIPPER) + + def module_moves(labware, module_locations): + """ + Function to perform the movement of labware, with the inital position being on a module. + + Args: + labware (str): The labware to be moved with modules. + module_locations (list): The locations of the modules. + + Returns: + None + """ + module_move_sequence = [ + ["C2", "B2"], # Deck Moves + ["C3"], # Staging Area Slot 3 Moves + ["C4", "D4"], # Staging Area Slot 4 Moves + ] + + for module_starting_location in module_locations: + labware_move_to_locations = module_locations.copy() + labware_move_to_locations.remove(module_starting_location) + all_sequences = module_move_sequence.copy() + all_sequences.append(labware_move_to_locations) + ctx.move_labware(labware, module_starting_location, use_gripper=USING_GRIPPER) + run_moves(labware, all_sequences, module_starting_location, USING_GRIPPER) + + DECK_MOVE_RESET_LOCATION = "C2" + STAGING_AREA_SLOT_3_RESET_LOCATION = "C3" + STAGING_AREA_SLOT_4_RESET_LOCATION = "D4" + + deck_moves(dest_pcr_plate, DECK_MOVE_RESET_LOCATION) + + ctx.move_labware(dest_pcr_plate, STAGING_AREA_SLOT_3_RESET_LOCATION, use_gripper=USING_GRIPPER) + staging_area_slot_3_moves(dest_pcr_plate, STAGING_AREA_SLOT_3_RESET_LOCATION) + + ctx.move_labware(dest_pcr_plate, STAGING_AREA_SLOT_4_RESET_LOCATION, use_gripper=USING_GRIPPER) + staging_area_slot_4_moves(dest_pcr_plate, STAGING_AREA_SLOT_4_RESET_LOCATION) + + module_locations = [thermocycler, magnetic_block] + adapters + module_moves(dest_pcr_plate, module_locations) + + def test_manual_moves(): + # In C4 currently + ctx.move_labware(source_reservoir, "D4", use_gripper=not USING_GRIPPER) + + def test_pipetting(): + def test_partial_tip_pickup_usage(): + pipette_96_channel.configure_nozzle_layout(style=protocol_api.COLUMN, start="A12") + for i in range(1, 13): + pipette_96_channel.pick_up_tip(tip_rack_2[f"A{i}"]) + + pipette_96_channel.aspirate(5, source_reservoir["A1"]) + pipette_96_channel.touch_tip() + + pipette_96_channel.dispense(5, dest_pcr_plate[f"A{i}"]) + pipette_96_channel.drop_tip(trash_bin) + + # leave this dropping in waste chute, do not use get_disposal_preference + # want to test partial drop + ctx.move_labware(tip_rack_2, waste_chute, use_gripper=USING_GRIPPER) + + def test_full_tip_rack_usage(): + pipette_96_channel.configure_nozzle_layout(style=protocol_api.ALL, start="A1") + pipette_96_channel.pick_up_tip(tip_rack_1["A1"]) + + pipette_96_channel.aspirate(5, source_reservoir["A1"]) + pipette_96_channel.touch_tip() + + pipette_96_channel.air_gap(height=30) + + pipette_96_channel.blow_out(waste_chute) + + pipette_96_channel.aspirate(5, source_reservoir["A1"]) + pipette_96_channel.touch_tip() + + pipette_96_channel.air_gap(height=30) + pipette_96_channel.blow_out(trash_bin) + + pipette_96_channel.aspirate(10, source_reservoir["A1"]) + pipette_96_channel.touch_tip() + + pipette_96_channel.dispense(10, dest_pcr_plate["A1"]) + pipette_96_channel.mix(repetitions=5, volume=15) + pipette_96_channel.return_tip() + + ctx.move_labware(tip_rack_1, get_disposal_preference()[0], use_gripper=get_disposal_preference()[1]) + ctx.move_labware(tip_rack_3, tip_rack_adapter, use_gripper=USING_GRIPPER) + + pipette_96_channel.pick_up_tip(tip_rack_3["A1"]) + pipette_96_channel.transfer( + volume=10, + source=source_reservoir["A1"], + dest=dest_pcr_plate["A1"], + new_tip="never", + touch_tip=True, + blow_out=True, + blowout_location="trash", + mix_before=(3, 5), + mix_after=(1, 5), + ) + pipette_96_channel.return_tip() + + ctx.move_labware(tip_rack_3, get_disposal_preference()[0], use_gripper=get_disposal_preference()[1]) + + test_partial_tip_pickup_usage() + test_full_tip_rack_usage() + + def test_module_usage(): + def test_thermocycler(): + thermocycler.close_lid() + + thermocycler.set_block_temperature(75.0, hold_time_seconds=5.0) + thermocycler.set_lid_temperature(80.0) + thermocycler.deactivate() + + def test_heater_shaker(): + heater_shaker.open_labware_latch() + heater_shaker.close_labware_latch() + + heater_shaker.set_target_temperature(75.0) + heater_shaker.set_and_wait_for_shake_speed(1000) + heater_shaker.wait_for_temperature() + + heater_shaker.deactivate_heater() + heater_shaker.deactivate_shaker() + + def test_temperature_module(): + temperature_module.set_temperature(80) + temperature_module.set_temperature(10) + temperature_module.deactivate() + + def test_magnetic_block(): + pass + + test_thermocycler() + test_heater_shaker() + test_temperature_module() + test_magnetic_block() + + ################################################################################################### + ### THE ORDER OF THESE FUNCTION CALLS MATTER. CHANGING THEM WILL CAUSE THE PROTOCOL NOT TO WORK ### + ################################################################################################### + test_pipetting() + test_gripper_moves() + test_module_usage() + test_manual_moves() + + ################################################################################################### + ### THE ORDER OF THESE FUNCTION CALLS MATTER. CHANGING THEM WILL CAUSE THE PROTOCOL NOT TO WORK ### + ################################################################################################### + + +# Cannot test in this protocol +# - Waste Chute w/ Lid diff --git a/app-testing/files/protocols/py/OT3_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel.py b/app-testing/files/protocols/py/Flex_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel.py similarity index 98% rename from app-testing/files/protocols/py/OT3_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel.py rename to app-testing/files/protocols/py/Flex_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel.py index efe8473686f..1d36403234e 100644 --- a/app-testing/files/protocols/py/OT3_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel.py +++ b/app-testing/files/protocols/py/Flex_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel.py @@ -26,7 +26,6 @@ metadata = { "protocolName": "Omega HDQ DNA Extraction: Bacteria 96 FOR ABR TESTING", "author": "Zach Galluzzo ", - "apiLevel": "2.15", } requirements = { @@ -87,7 +86,7 @@ def run(ctx): elution_vol = 100 # load 96 channel pipette - pip = ctx.load_instrument("p1000_96", mount="left") + pip = ctx.load_instrument("flex_96channel_1000", mount="left") pip.flow_rate.aspirate = 50 pip.flow_rate.dispense = 150 @@ -431,9 +430,7 @@ def grip_offset(action, item, slot=None): drop_offset=grip_offset("drop", "mag-plate"), ) - ctx.delay( - minutes=settling_time, msg="Please wait " + str(settling_time) + " minute(s) for beads to pellet." - ) + ctx.delay(minutes=settling_time, msg="Please wait " + str(settling_time) + " minute(s) for beads to pellet.") # Remove Supernatant and move off magnet ctx.comment("------- Removing Supernatant -------") diff --git a/app-testing/files/protocols/py/OT3_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch.py b/app-testing/files/protocols/py/Flex_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch.py similarity index 97% rename from app-testing/files/protocols/py/OT3_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch.py rename to app-testing/files/protocols/py/Flex_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch.py index c940ecb4b2d..498aa01d627 100644 --- a/app-testing/files/protocols/py/OT3_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch.py +++ b/app-testing/files/protocols/py/Flex_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch.py @@ -84,7 +84,7 @@ def run(ctx): tips1 = ctx.load_labware("opentrons_ot3_96_tiprack_200ul_rss", "11").wells()[0] # load 96 channel pipette - pip = ctx.load_instrument("p1000_96", mount="left") + pip = ctx.load_instrument("flex_96channel_1000", mount="left") pip.flow_rate.aspirate = 50 pip.flow_rate.dispense = 150 @@ -292,9 +292,7 @@ def lysis(vol, source): pip.return_tip() h_s.set_and_wait_for_shake_speed(rpm=2200) - ctx.delay( - minutes=1 if not dry_run else 0.25, msg="Please wait 1 minute while the lysis buffer mixes with the sample." - ) + ctx.delay(minutes=1 if not dry_run else 0.25, msg="Please wait 1 minute while the lysis buffer mixes with the sample.") h_s.deactivate_shaker() def bind(): @@ -356,9 +354,7 @@ def bind(): ) # Incubate for beads to bind DNA - ctx.delay( - minutes=5 if not dry_run else 0.25, msg="Please wait 5 minutes while the sample binds with the beads." - ) + ctx.delay(minutes=5 if not dry_run else 0.25, msg="Please wait 5 minutes while the sample binds with the beads.") h_s.deactivate_shaker() # Transfer plate to magnet @@ -379,7 +375,6 @@ def bind(): remove_supernatant(175, lysis_res) def wash(vol, source, waste): - global whichwash # Defines which wash the protocol is on to log on the app """ if source == wash1: @@ -415,9 +410,7 @@ def wash(vol, source, waste): h_s.close_labware_latch() for washi in np.arange(settling_time, 0, -0.5): # settling time timer for washes - ctx.delay( - minutes=0.5, msg="There are " + str(washi) + " minutes left in wash " + str(whichwash) + " incubation." - ) + ctx.delay(minutes=0.5, msg="There are " + str(washi) + " minutes left in wash " + str(whichwash) + " incubation.") remove_supernatant(vol, lysis_res) @@ -441,7 +434,6 @@ def dnase(vol, source): pip.flow_rate.dispense = 150 def stop_reaction(vol, source): - pip.pick_up_tip(tips) pip.aspirate(vol, source) pip.dispense(vol, samples_m) diff --git a/app-testing/files/protocols/py/OT3_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III.py b/app-testing/files/protocols/py/Flex_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III.py similarity index 99% rename from app-testing/files/protocols/py/OT3_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III.py rename to app-testing/files/protocols/py/Flex_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III.py index 75739ef2a44..a1f76f22ec0 100644 --- a/app-testing/files/protocols/py/OT3_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III.py +++ b/app-testing/files/protocols/py/Flex_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III.py @@ -5,7 +5,6 @@ "protocolName": "Illumina DNA Prep 96x Head PART III", "author": "Opentrons ", "source": "Protocol Library", - "apiLevel": "2.15", } requirements = { @@ -63,7 +62,7 @@ def run(protocol: protocol_api.ProtocolContext): if USE_8xMULTI == "YES": p1000 = protocol.load_instrument("flex_1channel_1000", "right") else: - p1000 = protocol.load_instrument("p1000_96", "left") + p1000 = protocol.load_instrument("flex_96channel_1000", "left") def grip_offset(action, item, slot=None): """Grip offset.""" diff --git a/app-testing/files/protocols/py/OT3_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR.py b/app-testing/files/protocols/py/Flex_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR.py similarity index 99% rename from app-testing/files/protocols/py/OT3_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR.py rename to app-testing/files/protocols/py/Flex_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR.py index 71d8aa6ab48..09c9797d3be 100644 --- a/app-testing/files/protocols/py/OT3_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR.py +++ b/app-testing/files/protocols/py/Flex_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR.py @@ -5,7 +5,6 @@ "protocolName": "IDT xGen EZ 96x Head PART I-III ABR", "author": "Opentrons ", "source": "Protocol Library", - "apiLevel": "2.15", } requirements = { @@ -39,11 +38,8 @@ def run(protocol: protocol_api.ProtocolContext): - protocol.comment("THIS IS A DRY RUN") if DRYRUN == True else protocol.comment("THIS IS A REACTION RUN") - protocol.comment("USED TIPS WILL GO IN TRASH") if TIP_TRASH == True else protocol.comment( - "USED TIPS WILL BE RE-RACKED" - ) + protocol.comment("USED TIPS WILL GO IN TRASH") if TIP_TRASH == True else protocol.comment("USED TIPS WILL BE RE-RACKED") # DECK SETUP AND LABWARE # ========== FIRST ROW =========== @@ -89,7 +85,7 @@ def run(protocol: protocol_api.ProtocolContext): Liquid_trash = reservoir_4["A1"] # pipette - p1000 = protocol.load_instrument("p1000_96", "left") + p1000 = protocol.load_instrument("flex_96channel_1000", "left") # tip and sample tracking diff --git a/app-testing/files/protocols/py/Flex_P1000_96_TM_2_16_AnalysisError_ModuleAndWasteChuteConflict.py b/app-testing/files/protocols/py/Flex_P1000_96_TM_2_16_AnalysisError_ModuleAndWasteChuteConflict.py new file mode 100644 index 00000000000..8868e4d49f9 --- /dev/null +++ b/app-testing/files/protocols/py/Flex_P1000_96_TM_2_16_AnalysisError_ModuleAndWasteChuteConflict.py @@ -0,0 +1,24 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Analysis Error - Module and Waste Chute Conflict", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + ctx.load_waste_chute() + + tip_rack = ctx.load_labware("opentrons_flex_96_tiprack_1000ul", "A1", adapter="opentrons_flex_96_tiprack_adapter") + + temp_module = ctx.load_module("temperature module gen2", "D3") + temp_module.deactivate() + + pipette_96_channel = ctx.load_instrument("flex_96channel_1000", mount="left", tip_racks=[tip_rack]) + pipette_96_channel.pick_up_tip() + pipette_96_channel.drop_tip() diff --git a/app-testing/files/protocols/py/OT3_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria.py b/app-testing/files/protocols/py/Flex_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria.py similarity index 96% rename from app-testing/files/protocols/py/OT3_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria.py rename to app-testing/files/protocols/py/Flex_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria.py index 8d0687075aa..9600944a1a6 100644 --- a/app-testing/files/protocols/py/OT3_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria.py +++ b/app-testing/files/protocols/py/Flex_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria.py @@ -67,9 +67,7 @@ def run(ctx): elutionplate = tempdeck.load_labware("opentrons_96_pcr_adapter_armadillo_wellplate_200ul") # Load Reservoir Plates - wash2_reservoir = lysis_reservoir = ctx.load_labware( - deepwell_type, "2" - ) # deleted after use- replaced (by gripper) with wash2 res + wash2_reservoir = lysis_reservoir = ctx.load_labware(deepwell_type, "2") # deleted after use- replaced (by gripper) with wash2 res bind_reservoir = ctx.load_labware(deepwell_type, "6") wash1_reservoir = ctx.load_labware(deepwell_type, "5") wash3_reservoir = wash4_reservoir = wash5_reservoir = ctx.load_labware(deepwell_type, "7") @@ -91,7 +89,7 @@ def run(ctx): tips1 = ctx.load_labware("opentrons_ot3_96_tiprack_1000ul_rss", "11").wells()[0] # load instruments - pip = ctx.load_instrument("p1000_96", mount="left") + pip = ctx.load_instrument("flex_96channel_1000", mount="left") pip.flow_rate.aspirate = 50 pip.flow_rate.dispense = 150 @@ -331,9 +329,7 @@ def bind(vol, source): pip.return_tip() h_s.set_and_wait_for_shake_speed(rpm=1800) - ctx.delay( - minutes=20 if not dry_run else 0.25, msg="Please wait 20 minutes while the sample binds with the beads." - ) + ctx.delay(minutes=20 if not dry_run else 0.25, msg="Please wait 20 minutes while the sample binds with the beads.") h_s.deactivate_shaker() h_s.open_labware_latch() @@ -354,7 +350,6 @@ def bind(vol, source): remove_supernatant(vol + starting_vol, bind_res) def wash(vol, source): - global whichwash # Defines which wash the protocol is on to log on the app if source == wash1: @@ -395,9 +390,7 @@ def wash(vol, source): h_s.close_labware_latch() for washi in np.arange(settling_time, 0, -0.5): # settling time timer for washes - ctx.delay( - minutes=0.5, msg="There are " + str(washi) + " minutes left in wash " + str(whichwash) + " incubation." - ) + ctx.delay(minutes=0.5, msg="There are " + str(washi) + " minutes left in wash " + str(whichwash) + " incubation.") remove_supernatant(vol, waste_res) @@ -416,7 +409,6 @@ def dnase(vol, source): h_s.deactivate_shaker() def stop_reaction(vol, source): - pip.pick_up_tip(tips) pip.aspirate(vol, source) pip.dispense(vol, samples_m) @@ -459,9 +451,7 @@ def elute(vol, source): h_s.set_and_wait_for_shake_speed(rpm=2000) if not dry_run: tempdeck.set_temperature(4) - ctx.delay( - minutes=3 if not dry_run else 0.25, msg="Please wait 5 minutes while the sample elutes from the beads." - ) + ctx.delay(minutes=3 if not dry_run else 0.25, msg="Please wait 5 minutes while the sample elutes from the beads.") h_s.deactivate_shaker() h_s.open_labware_latch() diff --git a/app-testing/files/protocols/py/Flex_P300Gen2_None_2_16_AnalysisError_OT2PipetteInFlexProtocol.py b/app-testing/files/protocols/py/Flex_P300Gen2_None_2_16_AnalysisError_OT2PipetteInFlexProtocol.py new file mode 100644 index 00000000000..fbe5b9cd652 --- /dev/null +++ b/app-testing/files/protocols/py/Flex_P300Gen2_None_2_16_AnalysisError_OT2PipetteInFlexProtocol.py @@ -0,0 +1,23 @@ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - Analysis Error - OT-2 Pipette in Flex Protocol", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.16", +} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + tips_300ul = [ + ctx.load_labware( + load_name="opentrons_96_tiprack_300ul", + location="A1", + label="300ul tips", + ) + ] + pipette_left = ctx.load_instrument(instrument_name="p300_multi_gen2", mount="left", tip_racks=tips_300ul) + pipette_left.pick_up_tip() diff --git a/app-testing/files/protocols/py/OT3_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2.py b/app-testing/files/protocols/py/Flex_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2.py similarity index 86% rename from app-testing/files/protocols/py/OT3_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2.py rename to app-testing/files/protocols/py/Flex_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2.py index 0135ba488a9..c08906b2297 100644 --- a/app-testing/files/protocols/py/OT3_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2.py +++ b/app-testing/files/protocols/py/Flex_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2.py @@ -1,7 +1,5 @@ from opentrons import protocol_api -from opentrons import types - import inspect metadata = { @@ -51,7 +49,6 @@ def right(s, amount): def run(protocol: protocol_api.ProtocolContext): - if DRYRUN == "YES": protocol.comment("THIS IS A DRY RUN") else: @@ -65,9 +62,9 @@ def run(protocol: protocol_api.ProtocolContext): reservoir = protocol.load_labware("nest_12_reservoir_15ml", "2") dilution_plate_1 = protocol.load_labware("opentrons_96_aluminumblock_biorad_wellplate_200ul", "3") - tiprack_50_1 = protocol.load_labware("opentrons_ot3_96_tiprack_50ul", "4") - tiprack_200_1 = protocol.load_labware("opentrons_ot3_96_tiprack_200ul", "5") - tiprack_50_2 = protocol.load_labware("opentrons_ot3_96_tiprack_50ul", "6") + tiprack_50_1 = protocol.load_labware("opentrons_flex_96_tiprack_50ul", "4") + tiprack_200_1 = protocol.load_labware("opentrons_flex_96_tiprack_200ul", "5") + tiprack_50_2 = protocol.load_labware("opentrons_flex_96_tiprack_50ul", "6") reagent_plate = protocol.load_labware("nest_96_wellplate_100ul_pcr_full_skirt", "7") # <--- NEST Strip Tubes dilution_plate_2 = protocol.load_labware("opentrons_96_aluminumblock_biorad_wellplate_200ul", "8") @@ -79,12 +76,8 @@ def run(protocol: protocol_api.ProtocolContext): "nest_96_wellplate_100ul_pcr_full_skirt", "10" ) # <--- Actually an Eppendorf 96 well, same dimensions if FORMAT == "384": - qpcrplate_1 = protocol.load_labware( - "corning_384_wellplate_112ul_flat", "9" - ) # <--- Actually an Eppendorf 96 well, same dimensions - qpcrplate_2 = protocol.load_labware( - "corning_384_wellplate_112ul_flat", "10" - ) # <--- Actually an Eppendorf 96 well, same dimensions + qpcrplate_1 = protocol.load_labware("corning_384_wellplate_112ul_flat", "9") # <--- Actually an Eppendorf 96 well, same dimensions + qpcrplate_2 = protocol.load_labware("corning_384_wellplate_112ul_flat", "10") # <--- Actually an Eppendorf 96 well, same dimensions # REAGENT PLATE STD_1 = reagent_plate["A1"] @@ -138,9 +131,7 @@ def run(protocol: protocol_api.ProtocolContext): protocol.comment("--> Dispensing Diluent Part 1 and Part 2") protocol.comment("==============================================") p1000.pick_up_tip() - if ( - samplecolumns >= 1 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 1: # ----------------------------------------------------------------------------------------- X = "A2" Y = "A6" p1000.move_to(DIL.bottom(z=p1000_offset_Res)) @@ -160,9 +151,7 @@ def run(protocol: protocol_api.ProtocolContext): p1000.default_speed = 400 p1000.move_to(DIL.top()) p1000.blow_out() - if ( - samplecolumns >= 2 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 2: # ----------------------------------------------------------------------------------------- X = "A3" Y = "A7" p1000.move_to(DIL.bottom(z=p1000_offset_Res)) @@ -182,9 +171,7 @@ def run(protocol: protocol_api.ProtocolContext): p1000.default_speed = 400 p1000.move_to(DIL.top()) p1000.blow_out() - if ( - samplecolumns >= 3 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 3: # ----------------------------------------------------------------------------------------- X = "A4" Y = "A8" p1000.move_to(DIL.bottom(z=p1000_offset_Res)) @@ -209,27 +196,21 @@ def run(protocol: protocol_api.ProtocolContext): protocol.comment("==============================================") protocol.comment("--> Adding Sample to Diluent Part 1") protocol.comment("==============================================") - if ( - samplecolumns >= 1 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 1: # ----------------------------------------------------------------------------------------- X = INICOLUMN1 Y = "A2" p50.pick_up_tip() p50.aspirate(2, source_plate[X].bottom(z=p50_offset_Mag), rate=0.25) p50.dispense(2, dilution_plate_1[Y].center(), rate=0.5) p50.drop_tip() if DRYRUN == "NO" else p50.return_tip() - if ( - samplecolumns >= 2 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 2: # ----------------------------------------------------------------------------------------- X = INICOLUMN2 Y = "A3" p50.pick_up_tip() p50.aspirate(2, source_plate[X].bottom(z=p50_offset_Mag), rate=0.25) p50.dispense(2, dilution_plate_1[Y].center(), rate=0.5) p50.drop_tip() if DRYRUN == "NO" else p50.return_tip() - if ( - samplecolumns >= 3 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 3: # ----------------------------------------------------------------------------------------- X = INICOLUMN3 Y = "A4" p50.pick_up_tip() @@ -238,9 +219,7 @@ def run(protocol: protocol_api.ProtocolContext): p50.drop_tip() if DRYRUN == "NO" else p50.return_tip() protocol.comment("--> Mixing") - if ( - samplecolumns >= 1 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 1: # ----------------------------------------------------------------------------------------- X = "A2" p1000.pick_up_tip() p1000.move_to(dilution_plate_1[X].bottom(z=p1000_offset_Temp)) @@ -250,9 +229,7 @@ def run(protocol: protocol_api.ProtocolContext): protocol.delay(seconds=2) p1000.default_speed = 400 p1000.drop_tip() if DRYRUN == "NO" else p1000.return_tip() - if ( - samplecolumns >= 2 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 2: # ----------------------------------------------------------------------------------------- X = "A3" p1000.pick_up_tip() p1000.move_to(dilution_plate_1[X].bottom(z=p1000_offset_Temp)) @@ -263,9 +240,7 @@ def run(protocol: protocol_api.ProtocolContext): protocol.delay(seconds=2) p1000.default_speed = 400 p1000.drop_tip() if DRYRUN == "NO" else p1000.return_tip() - if ( - samplecolumns >= 3 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 3: # ----------------------------------------------------------------------------------------- X = "A4" p1000.pick_up_tip() p1000.move_to(dilution_plate_1[X].bottom(z=p1000_offset_Temp)) @@ -279,27 +254,21 @@ def run(protocol: protocol_api.ProtocolContext): protocol.comment("==============================================") protocol.comment("--> Adding Diluted Sample to Diluent Part 2") protocol.comment("==============================================") - if ( - samplecolumns >= 1 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 1: # ----------------------------------------------------------------------------------------- X = "A2" Y = "A6" p50.pick_up_tip() p50.aspirate(5, dilution_plate_1[X].center(), rate=0.5) p50.dispense(5, dilution_plate_1[Y].center(), rate=0.5) p50.drop_tip() if DRYRUN == "NO" else p50.return_tip() - if ( - samplecolumns >= 2 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 2: # ----------------------------------------------------------------------------------------- X = "A3" Y = "A7" p50.pick_up_tip() p50.aspirate(5, dilution_plate_1[X].center(), rate=0.5) p50.dispense(5, dilution_plate_1[Y].center(), rate=0.5) p50.drop_tip() if DRYRUN == "NO" else p50.return_tip() - if ( - samplecolumns >= 3 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 3: # ----------------------------------------------------------------------------------------- X = "A4" Y = "A8" p50.pick_up_tip() @@ -308,9 +277,7 @@ def run(protocol: protocol_api.ProtocolContext): p50.drop_tip() if DRYRUN == "NO" else p50.return_tip() protocol.comment("--> Mixing") - if ( - samplecolumns >= 1 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 1: # ----------------------------------------------------------------------------------------- X = "A6" p1000.pick_up_tip() p1000.move_to(dilution_plate_1[X].bottom(z=p1000_offset_Temp)) @@ -320,9 +287,7 @@ def run(protocol: protocol_api.ProtocolContext): protocol.delay(seconds=2) p1000.default_speed = 400 p1000.drop_tip() if DRYRUN == "NO" else p1000.return_tip() - if ( - samplecolumns >= 2 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 2: # ----------------------------------------------------------------------------------------- X = "A7" p1000.pick_up_tip() p1000.move_to(dilution_plate_1[X].bottom(z=p1000_offset_Temp)) @@ -332,9 +297,7 @@ def run(protocol: protocol_api.ProtocolContext): protocol.delay(seconds=2) p1000.default_speed = 400 p1000.drop_tip() if DRYRUN == "NO" else p1000.return_tip() - if ( - samplecolumns >= 3 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 3: # ----------------------------------------------------------------------------------------- X = "A8" p1000.pick_up_tip() p1000.move_to(dilution_plate_1[X].bottom(z=p1000_offset_Temp)) @@ -354,21 +317,15 @@ def run(protocol: protocol_api.ProtocolContext): p1000.pick_up_tip() p1000.aspirate((qPCRVol), PCR_1.bottom(z=p1000_offset_Thermo), rate=0.25) p1000.dispense(qPCRVol, dilution_plate_1["A9"].bottom(z=p1000_offset_Temp), rate=0.25) - if ( - samplecolumns >= 1 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 1: # ----------------------------------------------------------------------------------------- X = "A10" p1000.aspirate((qPCRVol), PCR_1.bottom(z=p1000_offset_Thermo), rate=0.25) p1000.dispense(qPCRVol, dilution_plate_1[X].bottom(z=p1000_offset_Temp), rate=0.25) - if ( - samplecolumns >= 2 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 2: # ----------------------------------------------------------------------------------------- X = "A11" p1000.aspirate((qPCRVol), PCR_1.bottom(z=p1000_offset_Thermo), rate=0.25) p1000.dispense(qPCRVol, dilution_plate_1[X].bottom(z=p1000_offset_Temp), rate=0.25) - if ( - samplecolumns >= 3 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 3: # ----------------------------------------------------------------------------------------- X = "A12" p1000.aspirate((qPCRVol), PCR_1.bottom(z=p1000_offset_Thermo), rate=0.25) p1000.dispense(qPCRVol, dilution_plate_1[X].bottom(z=p1000_offset_Temp), rate=0.25) @@ -377,21 +334,15 @@ def run(protocol: protocol_api.ProtocolContext): p1000.pick_up_tip() p1000.aspirate((qPCRVol), PCR_2.bottom(z=p1000_offset_Thermo), rate=0.25) p1000.dispense(qPCRVol, dilution_plate_2["A9"].bottom(z=p1000_offset_Deck), rate=0.25) - if ( - samplecolumns >= 1 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 1: # ----------------------------------------------------------------------------------------- X = "A10" p1000.aspirate((qPCRVol), PCR_2.bottom(z=p1000_offset_Thermo), rate=0.25) p1000.dispense(qPCRVol, dilution_plate_2[X].bottom(z=p1000_offset_Deck), rate=0.25) - if ( - samplecolumns >= 2 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 2: # ----------------------------------------------------------------------------------------- X = "A11" p1000.aspirate((qPCRVol), PCR_2.bottom(z=p1000_offset_Thermo), rate=0.25) p1000.dispense(qPCRVol, dilution_plate_2[X].bottom(z=p1000_offset_Deck), rate=0.25) - if ( - samplecolumns >= 3 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 3: # ----------------------------------------------------------------------------------------- X = "A12" p1000.aspirate((qPCRVol), PCR_2.bottom(z=p1000_offset_Thermo), rate=0.25) p1000.dispense(qPCRVol, dilution_plate_2[X].bottom(z=p1000_offset_Deck), rate=0.25) @@ -422,9 +373,7 @@ def run(protocol: protocol_api.ProtocolContext): protocol.comment("==============================================") protocol.comment("--> Adding Diluted Sample to Mix") protocol.comment("==============================================") - if ( - samplecolumns >= 1 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 1: # ----------------------------------------------------------------------------------------- X = "A6" Y = "A10" p50.pick_up_tip() @@ -435,9 +384,7 @@ def run(protocol: protocol_api.ProtocolContext): protocol.delay(seconds=2) p50.default_speed = 400 p50.drop_tip() if DRYRUN == "NO" else p50.return_tip() - if ( - samplecolumns >= 2 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 2: # ----------------------------------------------------------------------------------------- X = "A7" Y = "A11" p50.pick_up_tip() @@ -448,9 +395,7 @@ def run(protocol: protocol_api.ProtocolContext): protocol.delay(seconds=2) p50.default_speed = 400 p50.drop_tip() if DRYRUN == "NO" else p50.return_tip() - if ( - samplecolumns >= 3 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 3: # ----------------------------------------------------------------------------------------- X = "A8" Y = "A12" p50.pick_up_tip() @@ -462,9 +407,7 @@ def run(protocol: protocol_api.ProtocolContext): p50.default_speed = 400 p50.drop_tip() if DRYRUN == "NO" else p50.return_tip() - if ( - samplecolumns >= 1 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 1: # ----------------------------------------------------------------------------------------- X = "A6" Y = "A10" p50.pick_up_tip() @@ -475,9 +418,7 @@ def run(protocol: protocol_api.ProtocolContext): protocol.delay(seconds=2) p50.default_speed = 400 p50.drop_tip() if DRYRUN == "NO" else p50.return_tip() - if ( - samplecolumns >= 2 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 2: # ----------------------------------------------------------------------------------------- X = "A7" Y = "A11" p50.pick_up_tip() @@ -488,9 +429,7 @@ def run(protocol: protocol_api.ProtocolContext): protocol.delay(seconds=2) p50.default_speed = 400 p50.drop_tip() if DRYRUN == "NO" else p50.return_tip() - if ( - samplecolumns >= 3 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 3: # ----------------------------------------------------------------------------------------- X = "A8" Y = "A12" p50.pick_up_tip() @@ -517,9 +456,7 @@ def run(protocol: protocol_api.ProtocolContext): p1000.dispense(20, qpcrplate_1[Y2].bottom(z=p1000_offset_Mag), rate=0.5) p1000.dispense(20, qpcrplate_1[Y3].bottom(z=p1000_offset_Mag), rate=0.5) p1000.drop_tip() if DRYRUN == "NO" else p1000.return_tip() - if ( - samplecolumns >= 1 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 1: # ----------------------------------------------------------------------------------------- X = "A10" Y1 = "A4" Y2 = "A5" @@ -530,9 +467,7 @@ def run(protocol: protocol_api.ProtocolContext): p1000.dispense(20, qpcrplate_1[Y2].bottom(z=p1000_offset_Mag), rate=0.5) p1000.dispense(20, qpcrplate_1[Y3].bottom(z=p1000_offset_Mag), rate=0.5) p1000.drop_tip() if DRYRUN == "NO" else p1000.return_tip() - if ( - samplecolumns >= 2 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 2: # ----------------------------------------------------------------------------------------- X = "A11" Y1 = "A7" Y2 = "A8" @@ -543,9 +478,7 @@ def run(protocol: protocol_api.ProtocolContext): p1000.dispense(20, qpcrplate_1[Y2].bottom(z=p1000_offset_Mag), rate=0.5) p1000.dispense(20, qpcrplate_1[Y3].bottom(z=p1000_offset_Mag), rate=0.5) p1000.drop_tip() if DRYRUN == "NO" else p1000.return_tip() - if ( - samplecolumns >= 3 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 3: # ----------------------------------------------------------------------------------------- X = "A12" Y1 = "A10" Y2 = "A11" @@ -557,7 +490,6 @@ def run(protocol: protocol_api.ProtocolContext): p1000.dispense(20, qpcrplate_1[Y3].bottom(z=p1000_offset_Mag), rate=0.5) p1000.drop_tip() if DRYRUN == "NO" else p1000.return_tip() if FORMAT == "384": - p1000.reset_tipracks() p50.reset_tipracks() @@ -615,9 +547,7 @@ def run(protocol: protocol_api.ProtocolContext): p1000.default_speed = 400 p1000.drop_tip() if DRYRUN == "NO" else p1000.return_tip() - if ( - samplecolumns >= 1 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 1: # ----------------------------------------------------------------------------------------- X = "A10" Y1 = "B1" Y2 = "B2" @@ -670,9 +600,7 @@ def run(protocol: protocol_api.ProtocolContext): p1000.drop_tip() if DRYRUN == "NO" else p1000.return_tip() - if ( - samplecolumns >= 2 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 2: # ----------------------------------------------------------------------------------------- X = "A11" Y1 = "A7" Y2 = "A8" @@ -725,9 +653,7 @@ def run(protocol: protocol_api.ProtocolContext): p1000.drop_tip() if DRYRUN == "NO" else p1000.return_tip() - if ( - samplecolumns >= 3 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 3: # ----------------------------------------------------------------------------------------- X = "A12" Y1 = "B7" Y2 = "B8" @@ -831,9 +757,7 @@ def run(protocol: protocol_api.ProtocolContext): p1000.default_speed = 400 p1000.drop_tip() if DRYRUN == "NO" else p1000.return_tip() - if ( - samplecolumns >= 1 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 1: # ----------------------------------------------------------------------------------------- X = "A10" Y1 = "B1" Y2 = "B2" @@ -886,9 +810,7 @@ def run(protocol: protocol_api.ProtocolContext): p1000.drop_tip() if DRYRUN == "NO" else p1000.return_tip() - if ( - samplecolumns >= 2 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 2: # ----------------------------------------------------------------------------------------- X = "A11" Y1 = "A7" Y2 = "A8" @@ -941,9 +863,7 @@ def run(protocol: protocol_api.ProtocolContext): p1000.drop_tip() if DRYRUN == "NO" else p1000.return_tip() - if ( - samplecolumns >= 3 - ): # ----------------------------------------------------------------------------------------- + if samplecolumns >= 3: # ----------------------------------------------------------------------------------------- X = "A12" Y1 = "B7" Y2 = "B8" diff --git a/app-testing/files/protocols/py/OT2_P20S_None_2_7_Walkthrough.py b/app-testing/files/protocols/py/OT2_P20S_None_2_7_Walkthrough.py index 5ee3763af99..68718efe2e9 100644 --- a/app-testing/files/protocols/py/OT2_P20S_None_2_7_Walkthrough.py +++ b/app-testing/files/protocols/py/OT2_P20S_None_2_7_Walkthrough.py @@ -18,10 +18,7 @@ def get_values(*names): def run(ctx): - - [well_plate, pipette, tips, pipette_mount] = get_values( # noqa: F821 - "well_plate", "pipette", "tips", "pipette_mount" - ) + [well_plate, pipette, tips, pipette_mount] = get_values("well_plate", "pipette", "tips", "pipette_mount") # noqa: F821 # load labware plate = ctx.load_labware(well_plate, "1") diff --git a/app-testing/files/protocols/py/OT2_P300MLeft_MM_TM_2_4_Zymo.py b/app-testing/files/protocols/py/OT2_P300MLeft_MM_TM_2_4_Zymo.py index bce761ac09a..2ea6ae793d0 100644 --- a/app-testing/files/protocols/py/OT2_P300MLeft_MM_TM_2_4_Zymo.py +++ b/app-testing/files/protocols/py/OT2_P300MLeft_MM_TM_2_4_Zymo.py @@ -108,10 +108,7 @@ def run(ctx): res2 = ctx.load_labware(res_type, "3", "reagent reservoir 2") res1 = ctx.load_labware(res_type, "2", "reagent reservoir 1") num_cols = math.ceil(num_samples / 8) - tips300 = [ - ctx.load_labware("opentrons_96_tiprack_300ul", slot, "200µl filtertiprack") - for slot in ["5", "7", "8", "10", "11"] - ] + tips300 = [ctx.load_labware("opentrons_96_tiprack_300ul", slot, "200µl filtertiprack") for slot in ["5", "7", "8", "10", "11"]] if park_tips: parkingrack = ctx.load_labware("opentrons_96_tiprack_20ul", "4", "tiprack for parking") parking_spots = parkingrack.rows()[0][:num_cols] @@ -433,7 +430,6 @@ def wash(vol, source, mix_reps=15, park=True, resuspend=True): remove_supernatant(vol, park=park) def dnase(vol, source, mix_reps=6, park=True, resuspend=True): - if resuspend and magdeck.status == "engaged": magdeck.disengage() @@ -463,7 +459,6 @@ def dnase(vol, source, mix_reps=6, park=True, resuspend=True): ctx.pause("Incubating for 10 minutes for DNase 1 treatment with occasional mixing.") def stop_reaction(vol, source, mix_reps=6, park=True, resuspend=True): - if resuspend and magdeck.status == "engaged": magdeck.disengage() diff --git a/app-testing/files/protocols/py/OT2_P300M_P20S_2_16_aspirateDispenseMix0Volume.py b/app-testing/files/protocols/py/OT2_P300M_P20S_2_16_aspirateDispenseMix0Volume.py new file mode 100644 index 00000000000..caa4233b1a2 --- /dev/null +++ b/app-testing/files/protocols/py/OT2_P300M_P20S_2_16_aspirateDispenseMix0Volume.py @@ -0,0 +1,107 @@ +"""Smoke Test v3.0 """ +from opentrons import protocol_api + +metadata = { + "protocolName": "QA Protocol - API 2.16 - Aspirate Dispense Mix with 0 Volume", + "author": "Opentrons Engineering ", + "source": "Software Testing Team", +} + +requirements = {"robotType": "OT-2", "apiLevel": "2.16"} + + +def perform_check( + method_sig: str, + actual: float, + expected: float, +): + """Perform a check on the pipette's current volume.""" + assert actual == expected, f"pipette volume after {method_sig} is {actual} instead of {expected}" + + +def run(ctx: protocol_api.ProtocolContext) -> None: + """This method is run by the protocol engine.""" + + ctx.set_rail_lights(True) + + # deck positions + tips_300ul_position = "5" + tips_20ul_position = "4" + dye_source_position = "3" + + # 300ul tips + tips_300ul = [ + ctx.load_labware( + load_name="opentrons_96_tiprack_300ul", + location=tips_300ul_position, + label="300ul tips", + ) + ] + + # 20ul tips + tips_20ul = [ + ctx.load_labware( + load_name="opentrons_96_tiprack_20ul", + location=tips_20ul_position, + label="20ul tips", + ) + ] + + # pipettes + ctx.load_instrument(instrument_name="p300_multi_gen2", mount="left", tip_racks=tips_300ul) + + pipette_right = ctx.load_instrument(instrument_name="p20_single_gen2", mount="right", tip_racks=tips_20ul) + + dye_container = ctx.load_labware( + load_name="nest_12_reservoir_15ml", + location=dye_source_position, + label="dye container", + ) + + water = ctx.define_liquid( + name="water", description="H₂O", display_color="#42AB2D" + ) # subscript 2 https://www.compart.com/en/unicode/U+2082 + + dye_container.wells_by_name()["A1"].load_liquid(liquid=water, volume=20) + + pipette_right.pick_up_tip() + + # Testing that volume=0 is a no-op + # In API versions previous to 2.16, volume=0 would use the pipette's entire volume + + # Aspirate nothing, then dispense everything (Which in this case means nothing) + pipette_right.aspirate(volume=0, location=dye_container.wells_by_name()["A1"]) + perform_check( + method_sig="aspirate(volume=0)", + actual=pipette_right.current_volume, + expected=0.0, + ) + + pipette_right.dispense(location=dye_container.wells_by_name()["A1"]) + perform_check( + method_sig="dispense(volume=0)", + actual=pipette_right.current_volume, + expected=0.0, + ) + + # Aspirate full pipette volume, dispense nothing, mix nothing + pipette_right.aspirate(volume=20, location=dye_container.wells_by_name()["A1"]) + perform_check( + method_sig="aspirate(volume=20)", + actual=pipette_right.current_volume, + expected=20.0, + ) + + pipette_right.dispense(volume=0, location=dye_container.wells_by_name()["A1"]) + perform_check( + method_sig="dispense(volume=0)", + actual=pipette_right.current_volume, + expected=20.0, + ) + + pipette_right.mix(volume=0, location=dye_container.wells_by_name()["A1"]) + perform_check( + method_sig="mix(volume=0)", + actual=pipette_right.current_volume, + expected=20.0, + ) diff --git a/app-testing/files/protocols/py/OT2_P300M_P20S_TC_HS_TM_2_13_SmokeTestV3.py b/app-testing/files/protocols/py/OT2_P300M_P20S_TC_HS_TM_2_13_SmokeTestV3.py new file mode 100644 index 00000000000..43a2e61dff5 --- /dev/null +++ b/app-testing/files/protocols/py/OT2_P300M_P20S_TC_HS_TM_2_13_SmokeTestV3.py @@ -0,0 +1,212 @@ +"""Smoke Test v3.0 """ +# https://opentrons.atlassian.net/projects/RQA?selectedItem=com.atlassian.plugins.atlassian-connect-plugin:com.kanoah.test-manager__main-project-page#!/testCase/QB-T497 +from opentrons import protocol_api + +metadata = { + "protocolName": "🛠️ 2.13 Smoke Test V3 🪄", + "author": "Opentrons Engineering ", + "source": "Software Testing Team", + "description": ("Description of the protocol that is longish \n has \n returns and \n emoji 😊 ⬆️ "), +} + +requirements = {"robotType": "OT-2", "apiLevel": "2.13"} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + """This method is run by the protocol engine.""" + + ctx.set_rail_lights(True) + ctx.comment(f"Let there be light! {ctx.rail_lights_on} 🌠🌠🌠") + ctx.comment(f"Is the door is closed? {ctx.door_closed} 🚪🚪🚪") + ctx.comment(f"Is this a simulation? {ctx.is_simulating()} 🔮🔮🔮") + ctx.comment(f"Running against API Version: {ctx.api_version}") + + # deck positions + tips_300ul_position = "5" + tips_20ul_position = "4" + dye_source_position = "3" + logo_position = "2" + temperature_position = "9" + custom_lw_position = "6" + hs_position = "1" + + # Thermocycler has a default position that covers Slots 7, 8, 10, and 11. + # This is the only valid location for the Thermocycler on the OT-2 deck. + # This position is a default parameter when declaring the TC so you do not need to specify. + + # 300ul tips + tips_300ul = [ + ctx.load_labware( + load_name="opentrons_96_tiprack_300ul", + location=tips_300ul_position, + label="300ul tips", + ) + ] + + # 20ul tips + tips_20ul = [ + ctx.load_labware( + load_name="opentrons_96_tiprack_20ul", + location=tips_20ul_position, + label="20ul tips", + ) + ] + + # pipettes + pipette_left = ctx.load_instrument(instrument_name="p300_multi_gen2", mount="left", tip_racks=tips_300ul) + + pipette_right = ctx.load_instrument(instrument_name="p20_single_gen2", mount="right", tip_racks=tips_20ul) + + # modules https://docs.opentrons.com/v2/new_modules.html#available-modules + hs_module = ctx.load_module("heaterShakerModuleV1", hs_position) + temperature_module = ctx.load_module("temperature module gen2", temperature_position) + thermocycler_module = ctx.load_module("thermocycler module gen2") + + # module labware + temp_plate = temperature_module.load_labware( + "opentrons_96_aluminumblock_nest_wellplate_100ul", + label="Temperature-Controlled plate", + ) + hs_plate = hs_module.load_labware("opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt") + tc_plate = thermocycler_module.load_labware("nest_96_wellplate_100ul_pcr_full_skirt") + + custom_labware = ctx.load_labware( + "cpx_4_tuberack_100ul", + custom_lw_position, + "4 tubes", + "custom_beta", + ) + + # create plates and pattern list + logo_destination_plate = ctx.load_labware( + load_name="nest_96_wellplate_100ul_pcr_full_skirt", + location=logo_position, + label="logo destination", + ) + + dye_container = ctx.load_labware( + load_name="nest_12_reservoir_15ml", + location=dye_source_position, + label="dye container", + ) + + dye_source = dye_container.wells_by_name()["A2"] + + # Well Location set-up + dye_destination_wells = [ + logo_destination_plate.wells_by_name()["C7"], + logo_destination_plate.wells_by_name()["D6"], + logo_destination_plate.wells_by_name()["D7"], + logo_destination_plate.wells_by_name()["D8"], + logo_destination_plate.wells_by_name()["E5"], + ] + + hs_module.close_labware_latch() + + # Distribute dye + pipette_right.pick_up_tip() + pipette_right.distribute( + volume=18, + source=dye_source, + dest=dye_destination_wells, + new_tip="never", + ) + pipette_right.drop_tip() + + # transfer + transfer_destinations = [ + logo_destination_plate.wells_by_name()["A11"], + logo_destination_plate.wells_by_name()["B11"], + logo_destination_plate.wells_by_name()["C11"], + ] + pipette_right.pick_up_tip() + pipette_right.transfer( + volume=60, + source=dye_container.wells_by_name()["A2"], + dest=transfer_destinations, + new_tip="never", + touch_tip=True, + blow_out=True, + blowout_location="destination well", + mix_before=(3, 20), + mix_after=(1, 20), + mix_touch_tip=True, + ) + + # consolidate + pipette_right.consolidate( + volume=20, + source=transfer_destinations, + dest=dye_container.wells_by_name()["A5"], + new_tip="never", + touch_tip=False, + blow_out=True, + blowout_location="destination well", + mix_before=(3, 20), + ) + + # well to well + pipette_right.return_tip() + pipette_right.pick_up_tip() + pipette_right.aspirate(volume=5, location=logo_destination_plate.wells_by_name()["A11"]) + pipette_right.air_gap(volume=10) + ctx.delay(seconds=3) + pipette_right.dispense(volume=5, location=logo_destination_plate.wells_by_name()["H11"]) + + # move to + pipette_right.move_to(logo_destination_plate.wells_by_name()["E12"].top()) + pipette_right.move_to(logo_destination_plate.wells_by_name()["E11"].bottom()) + pipette_right.blow_out() + # touch tip + # pipette ends in the middle of the well as of 6.3.0 in all touch_tip + pipette_right.touch_tip(location=logo_destination_plate.wells_by_name()["H1"]) + pipette_right.return_tip() + + # Play with the modules + temperature_module.await_temperature(25) + + hs_module.set_and_wait_for_shake_speed(466) + ctx.delay(seconds=5) + + hs_module.set_and_wait_for_temperature(38) + + thermocycler_module.open_lid() + thermocycler_module.close_lid() + thermocycler_module.set_lid_temperature(38) # 37 is the minimum + thermocycler_module.set_block_temperature(temperature=28, hold_time_seconds=5) + thermocycler_module.deactivate_block() + thermocycler_module.deactivate_lid() + thermocycler_module.open_lid() + + hs_module.deactivate_shaker() + + ctx.pause("This is a pause") + + # dispense to modules + + # to temperature module + pipette_right.pick_up_tip() + pipette_right.aspirate(volume=15, location=dye_source) + pipette_right.dispense(volume=15, location=temp_plate.well(0)) + pipette_right.drop_tip() + + # to heater shaker + pipette_left.pick_up_tip() + pipette_left.aspirate(volume=50, location=dye_source) + pipette_left.dispense(volume=50, location=hs_plate.well(0)) + hs_module.set_and_wait_for_shake_speed(350) + ctx.delay(seconds=5) + hs_module.deactivate_shaker() + + # to custom labware + # This labware does not EXIST!!!! so... + # Use tip rack lid to catch dye on wet run + pipette_right.pick_up_tip() + pipette_right.aspirate(volume=10, location=dye_source, rate=2.0) + pipette_right.dispense(volume=10, location=custom_labware.well(3), rate=1.5) + pipette_right.drop_tip() + + # to thermocycler + pipette_left.aspirate(volume=75, location=dye_source) + pipette_left.dispense(volume=60, location=tc_plate.wells_by_name()["A6"]) + pipette_left.drop_tip() diff --git a/app-testing/files/protocols/py/OT2_P300M_P20S_TC_HS_TM_2_14_SmokeTestV3.py b/app-testing/files/protocols/py/OT2_P300M_P20S_TC_HS_TM_2_14_SmokeTestV3.py new file mode 100644 index 00000000000..3413a55af87 --- /dev/null +++ b/app-testing/files/protocols/py/OT2_P300M_P20S_TC_HS_TM_2_14_SmokeTestV3.py @@ -0,0 +1,230 @@ +"""Smoke Test v3.0 """ +# https://opentrons.atlassian.net/projects/RQA?selectedItem=com.atlassian.plugins.atlassian-connect-plugin:com.kanoah.test-manager__main-project-page#!/testCase/QB-T497 +from opentrons import protocol_api + +metadata = { + "protocolName": "🛠️ 2.14 Smoke Test V3 🪄", + "author": "Opentrons Engineering ", + "source": "Software Testing Team", + "description": ("Description of the protocol that is longish \n has \n returns and \n emoji 😊 ⬆️ "), +} + +requirements = {"robotType": "OT-2", "apiLevel": "2.14"} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + """This method is run by the protocol engine.""" + + ctx.set_rail_lights(True) + ctx.comment(f"Let there be light! {ctx.rail_lights_on} 🌠🌠🌠") + ctx.comment(f"Is the door is closed? {ctx.door_closed} 🚪🚪🚪") + ctx.comment(f"Is this a simulation? {ctx.is_simulating()} 🔮🔮🔮") + ctx.comment(f"Running against API Version: {ctx.api_version}") + + # deck positions + tips_300ul_position = "5" + tips_20ul_position = "4" + dye_source_position = "3" + logo_position = "2" + temperature_position = "9" + custom_lw_position = "6" + hs_position = "1" + + # Thermocycler has a default position that covers Slots 7, 8, 10, and 11. + # This is the only valid location for the Thermocycler on the OT-2 deck. + # This position is a default parameter when declaring the TC so you do not need to specify. + + # 300ul tips + tips_300ul = [ + ctx.load_labware( + load_name="opentrons_96_tiprack_300ul", + location=tips_300ul_position, + label="300ul tips", + ) + ] + + # 20ul tips + tips_20ul = [ + ctx.load_labware( + load_name="opentrons_96_tiprack_20ul", + location=tips_20ul_position, + label="20ul tips", + ) + ] + + # pipettes + pipette_left = ctx.load_instrument(instrument_name="p300_multi_gen2", mount="left", tip_racks=tips_300ul) + + pipette_right = ctx.load_instrument(instrument_name="p20_single_gen2", mount="right", tip_racks=tips_20ul) + + # modules https://docs.opentrons.com/v2/new_modules.html#available-modules + hs_module = ctx.load_module("heaterShakerModuleV1", hs_position) + temperature_module = ctx.load_module("temperature module gen2", temperature_position) + thermocycler_module = ctx.load_module("thermocycler module gen2") + + # module labware + temp_plate = temperature_module.load_labware( + "opentrons_96_aluminumblock_nest_wellplate_100ul", + label="Temperature-Controlled plate", + ) + hs_plate = hs_module.load_labware("opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt") + tc_plate = thermocycler_module.load_labware("nest_96_wellplate_100ul_pcr_full_skirt") + + # A 2.14 difference, no params specified, still should find it. + custom_labware = ctx.load_labware( + "cpx_4_tuberack_100ul", + custom_lw_position, + label="4 custom tubes", + ) + + # create plates and pattern list + logo_destination_plate = ctx.load_labware( + load_name="nest_96_wellplate_100ul_pcr_full_skirt", + location=logo_position, + label="logo destination", + ) + + dye_container = ctx.load_labware( + load_name="nest_12_reservoir_15ml", + location=dye_source_position, + label="dye container", + ) + + dye_source = dye_container.wells_by_name()["A2"] + + # Well Location set-up + dye_destination_wells = [ + logo_destination_plate.wells_by_name()["C7"], + logo_destination_plate.wells_by_name()["D6"], + logo_destination_plate.wells_by_name()["D7"], + logo_destination_plate.wells_by_name()["D8"], + logo_destination_plate.wells_by_name()["E5"], + ] + + # >= 2.14 define_liquid and load_liquid + water = ctx.define_liquid( + name="water", description="H₂O", display_color="#42AB2D" + ) # subscript 2 https://www.compart.com/en/unicode/U+2082 + + acetone = ctx.define_liquid( + name="acetone", description="C₃H₆O", display_color="#38588a" + ) # subscript 3 https://www.compart.com/en/unicode/U+2083 + # subscript 6 https://www.compart.com/en/unicode/U+2086 + + dye_container.wells_by_name()["A1"].load_liquid(liquid=water, volume=4000) + dye_container.wells_by_name()["A2"].load_liquid(liquid=water, volume=2000) + dye_container.wells_by_name()["A5"].load_liquid(liquid=acetone, volume=555.55555) + + # 2 different liquids in the same well + dye_container.wells_by_name()["A8"].load_liquid(liquid=water, volume=900.00) + dye_container.wells_by_name()["A8"].load_liquid(liquid=acetone, volume=1001.11) + + hs_module.close_labware_latch() + + # Distribute dye + pipette_right.pick_up_tip() + pipette_right.distribute( + volume=18, + source=dye_source, + dest=dye_destination_wells, + new_tip="never", + ) + pipette_right.drop_tip() + + # transfer + transfer_destinations = [ + logo_destination_plate.wells_by_name()["A11"], + logo_destination_plate.wells_by_name()["B11"], + logo_destination_plate.wells_by_name()["C11"], + ] + pipette_right.pick_up_tip() + + pipette_right.transfer( + volume=60, + source=dye_container.wells_by_name()["A2"], + dest=transfer_destinations, + new_tip="never", + touch_tip=True, + blow_out=True, + blowout_location="destination well", + mix_before=(3, 20), + mix_after=(1, 20), + mix_touch_tip=True, + ) + + # consolidate + pipette_right.consolidate( + volume=20, + source=transfer_destinations, + dest=dye_container.wells_by_name()["A5"], + new_tip="never", + touch_tip=False, + blow_out=True, + blowout_location="destination well", + mix_before=(3, 20), + ) + + # well to well + pipette_right.return_tip() + pipette_right.pick_up_tip() + pipette_right.aspirate(volume=5, location=logo_destination_plate.wells_by_name()["A11"]) + pipette_right.air_gap(volume=10) + ctx.delay(seconds=3) + pipette_right.dispense(volume=5, location=logo_destination_plate.wells_by_name()["H11"]) + + # move to + pipette_right.move_to(logo_destination_plate.wells_by_name()["E12"].top()) + pipette_right.move_to(logo_destination_plate.wells_by_name()["E11"].bottom()) + pipette_right.blow_out() + # touch tip + # pipette ends in the middle of the well as of 6.3.0 in all touch_tip + pipette_right.touch_tip(location=logo_destination_plate.wells_by_name()["H1"]) + ctx.pause("Is the pipette tip in the middle of the well?") + pipette_right.return_tip() + + # Play with the modules + temperature_module.await_temperature(25) + + hs_module.set_and_wait_for_shake_speed(466) + ctx.delay(seconds=5) + + hs_module.set_and_wait_for_temperature(38) + + thermocycler_module.open_lid() + thermocycler_module.close_lid() + thermocycler_module.set_lid_temperature(38) # 37 is the minimum + thermocycler_module.set_block_temperature(temperature=28, hold_time_seconds=5) + thermocycler_module.deactivate_block() + thermocycler_module.deactivate_lid() + thermocycler_module.open_lid() + + hs_module.deactivate_shaker() + + # dispense to modules + + # to temperature module + pipette_right.pick_up_tip() + pipette_right.aspirate(volume=15, location=dye_source) + pipette_right.dispense(volume=15, location=temp_plate.well(0)) + pipette_right.drop_tip() + + # to heater shaker + pipette_left.pick_up_tip() + pipette_left.aspirate(volume=50, location=dye_source) + pipette_left.dispense(volume=50, location=hs_plate.well(0)) + hs_module.set_and_wait_for_shake_speed(350) + ctx.delay(seconds=5) + hs_module.deactivate_shaker() + + # to custom labware + # This labware does not EXIST!!!! so... + # Use tip rack lid to catch dye on wet run + pipette_right.pick_up_tip() + pipette_right.aspirate(volume=10, location=dye_source, rate=2.0) + pipette_right.dispense(volume=10, location=custom_labware.well(3), rate=1.5) + pipette_right.drop_tip() + + # to thermocycler + pipette_left.aspirate(volume=75, location=dye_source) + pipette_left.dispense(volume=60, location=tc_plate.wells_by_name()["A6"]) + pipette_left.drop_tip() diff --git a/app-testing/files/protocols/py/OT2_P300M_P20S_TC_HS_TM_2_15_SmokeTestV3.py b/app-testing/files/protocols/py/OT2_P300M_P20S_TC_HS_TM_2_15_SmokeTestV3.py new file mode 100644 index 00000000000..c60e647844d --- /dev/null +++ b/app-testing/files/protocols/py/OT2_P300M_P20S_TC_HS_TM_2_15_SmokeTestV3.py @@ -0,0 +1,322 @@ +"""Smoke Test v3.0 """ +# https://opentrons.atlassian.net/projects/RQA?selectedItem=com.atlassian.plugins.atlassian-connect-plugin:com.kanoah.test-manager__main-project-page#!/testCase/QB-T497 +from opentrons import protocol_api + +metadata = { + "protocolName": "🛠️ 2.15 Smoke Test V3 🪄", + "author": "Opentrons Engineering ", + "source": "Software Testing Team", + "description": ("Description of the protocol that is longish \n has \n returns and \n emoji 😊 ⬆️ "), +} + +requirements = {"robotType": "OT-2", "apiLevel": "2.15"} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + """This method is run by the protocol engine.""" + + ctx.set_rail_lights(True) + ctx.comment(f"Let there be light! {ctx.rail_lights_on} 🌠🌠🌠") + ctx.comment(f"Is the door is closed? {ctx.door_closed} 🚪🚪🚪") + ctx.comment(f"Is this a simulation? {ctx.is_simulating()} 🔮🔮🔮") + ctx.comment(f"Running against API Version: {ctx.api_version}") + + # deck positions + tips_300ul_position = "5" + tips_20ul_position = "4" + dye_source_position = "3" + logo_position = "2" + temperature_position = "9" + custom_lw_position = "6" + hs_position = "1" + + # Thermocycler has a default position that covers Slots 7, 8, 10, and 11. + # This is the only valid location for the Thermocycler on the OT-2 deck. + # This position is a default parameter when declaring the TC so you do not need to specify. + + # 300ul tips + tips_300ul = [ + ctx.load_labware( + load_name="opentrons_96_tiprack_300ul", + location=tips_300ul_position, + label="300ul tips", + ) + ] + + # 20ul tips + tips_20ul = [ + ctx.load_labware( + load_name="opentrons_96_tiprack_20ul", + location=tips_20ul_position, + label="20ul tips", + ) + ] + + # pipettes + pipette_left = ctx.load_instrument(instrument_name="p300_multi_gen2", mount="left", tip_racks=tips_300ul) + + pipette_right = ctx.load_instrument(instrument_name="p20_single_gen2", mount="right", tip_racks=tips_20ul) + + # modules https://docs.opentrons.com/v2/new_modules.html#available-modules + hs_module = ctx.load_module("heaterShakerModuleV1", hs_position) + temperature_module = ctx.load_module("temperature module gen2", temperature_position) + thermocycler_module = ctx.load_module("thermocycler module gen2") + + # module labware + temp_adapter = temperature_module.load_adapter("opentrons_96_well_aluminum_block") + temp_plate = temp_adapter.load_labware( + "nest_96_wellplate_100ul_pcr_full_skirt", + label="Temperature-Controlled plate", + ) + hs_plate = hs_module.load_labware(name="nest_96_wellplate_100ul_pcr_full_skirt", adapter="opentrons_96_pcr_adapter") + tc_plate = thermocycler_module.load_labware("nest_96_wellplate_100ul_pcr_full_skirt") + + # A 2.14 difference, no params specified, still should find it. + custom_labware = ctx.load_labware( + "cpx_4_tuberack_100ul", + custom_lw_position, + label="4 custom tubes", + ) + + # create plates and pattern list + logo_destination_plate = ctx.load_labware( + load_name="nest_96_wellplate_100ul_pcr_full_skirt", + location=logo_position, + label="logo destination", + ) + + dye_container = ctx.load_labware( + load_name="nest_12_reservoir_15ml", + location=dye_source_position, + label="dye container", + ) + + dye_source = dye_container.wells_by_name()["A2"] + + # Well Location set-up + dye_destination_wells = [ + logo_destination_plate.wells_by_name()["C7"], + logo_destination_plate.wells_by_name()["D6"], + logo_destination_plate.wells_by_name()["D7"], + logo_destination_plate.wells_by_name()["D8"], + logo_destination_plate.wells_by_name()["E5"], + ] + + # >= 2.14 define_liquid and load_liquid + water = ctx.define_liquid( + name="water", description="H₂O", display_color="#42AB2D" + ) # subscript 2 https://www.compart.com/en/unicode/U+2082 + + acetone = ctx.define_liquid( + name="acetone", description="C₃H₆O", display_color="#38588a" + ) # subscript 3 https://www.compart.com/en/unicode/U+2083 + # subscript 6 https://www.compart.com/en/unicode/U+2086 + + dye_container.wells_by_name()["A1"].load_liquid(liquid=water, volume=4000) + dye_container.wells_by_name()["A2"].load_liquid(liquid=water, volume=2000) + dye_container.wells_by_name()["A5"].load_liquid(liquid=acetone, volume=555.55555) + + # 2 different liquids in the same well + dye_container.wells_by_name()["A8"].load_liquid(liquid=water, volume=900.00) + dye_container.wells_by_name()["A8"].load_liquid(liquid=acetone, volume=1001.11) + + hs_module.close_labware_latch() + + pipette_right.pick_up_tip() + + ######################################## + # Manual Deck State Modification Start # + ######################################## + + # -------------------------- # + # Added in API version: 2.15 # + # -------------------------- # + + # Putting steps for this at beginning of protocol so you can do the manual stuff + # then walk away to let the rest of the protocol execute + + # The test flow is as follows: + # 1. Remove the existing PCR plate from slot 2 + # 2. Move the reservoir from slot 3 to slot 2 + # 3. Pickup P20 tip, move pipette to reservoir A1 in slot 2 + # 4. Pause and ask user to validate that the tip is in the middle of reservoir A1 in slot 2 + # 5. Move the reservoir back to slot 3 from slot 2 + # 6. Move pipette to reservoir A1 in slot 3 + # 7. Pause and ask user to validate that the tip is in the middle of reservoir A1 in slot 3 + # 8. Move custom labware from slot 6 to slot 2 + # 9. Move pipette to well A1 in slot 2 + # 10. Pause and ask user to validate that the tip is in the middle of well A1 in slot 2 + # 11. Move the custom labware back to slot 6 from slot 2 + # 12. Move pipette to well A1 in slot 6 + # 13. Pause and ask user to validate that the tip is in the middle of well A1 in slot 6 + # 14. Move the offdeck PCR plate back to slot 2 + # 15. Move pipette to well A1 in slot 2 + # 16. Pause and ask user to validate that the tip is in the middle of well A1 in slot 2 + + # In effect, nothing will actually change to the protocol, + # but we will be able to test that the UI responds appropriately. + + # Note: + # logo_destination_plate is a nest_96_wellplate_100ul_pcr_full_skirt - starting position is slot 2 + # dye_container is a nest_12_reservoir_15ml - starting position is slot 3 + + # Step 1 + ctx.move_labware( + labware=logo_destination_plate, + new_location=protocol_api.OFF_DECK, + ) + + # Step 2 + ctx.move_labware(labware=dye_container, new_location="2") + + # Step 3 + pipette_right.move_to(location=dye_container.wells_by_name()["A1"].top()) + + # Step 4 + ctx.pause("Is the pipette tip in the middle of reservoir A1 in slot 2?") + + # Step 5 + ctx.move_labware(labware=dye_container, new_location="3") + + # Step 6 + pipette_right.move_to(location=dye_container.wells_by_name()["A1"].top()) + + # Step 7 + ctx.pause("Is the pipette tip in the middle of reservoir A1 in slot 3?") + + # Step 8 + ctx.move_labware(labware=custom_labware, new_location="2") + + # Step 9 + pipette_right.move_to(location=custom_labware.wells_by_name()["A1"].top()) + + # Step 10 + ctx.pause("Is the pipette tip in the middle of custom labware A1 in slot 2?") + + # Step 11 + ctx.move_labware(labware=custom_labware, new_location="6") + + # Step 12 + pipette_right.move_to(location=custom_labware.wells_by_name()["A1"].top()) + + # Step 13 + ctx.pause("Is the pipette tip in the middle of custom labware A1 in slot 6?") + + # Step 14 + ctx.move_labware(labware=logo_destination_plate, new_location="2") + + # Step 15 + pipette_right.move_to(location=logo_destination_plate.wells_by_name()["A1"].top()) + + # Step 16 + ctx.pause("Is the pipette tip in the middle of well A1 in slot 2?") + + ###################################### + # Manual Deck State Modification End # + ###################################### + + # Distribute dye + pipette_right.distribute( + volume=18, + source=dye_source, + dest=dye_destination_wells, + new_tip="never", + ) + pipette_right.drop_tip() + + # transfer + transfer_destinations = [ + logo_destination_plate.wells_by_name()["A11"], + logo_destination_plate.wells_by_name()["B11"], + logo_destination_plate.wells_by_name()["C11"], + ] + pipette_right.pick_up_tip() + pipette_right.transfer( + volume=60, + source=dye_container.wells_by_name()["A2"], + dest=transfer_destinations, + new_tip="never", + touch_tip=True, + blow_out=True, + blowout_location="destination well", + mix_before=(3, 20), + mix_after=(1, 20), + mix_touch_tip=True, + ) + + # consolidate + pipette_right.consolidate( + volume=20, + source=transfer_destinations, + dest=dye_container.wells_by_name()["A5"], + new_tip="never", + touch_tip=False, + blow_out=True, + blowout_location="destination well", + mix_before=(3, 20), + ) + + # well to well + pipette_right.return_tip() + pipette_right.pick_up_tip() + pipette_right.aspirate(volume=5, location=logo_destination_plate.wells_by_name()["A11"]) + pipette_right.air_gap(volume=10) + ctx.delay(seconds=3) + pipette_right.dispense(volume=5, location=logo_destination_plate.wells_by_name()["H11"]) + + # move to + pipette_right.move_to(logo_destination_plate.wells_by_name()["E12"].top()) + pipette_right.move_to(logo_destination_plate.wells_by_name()["E11"].bottom()) + pipette_right.blow_out() + # touch tip + # pipette ends in the middle of the well as of 6.3.0 in all touch_tip + pipette_right.touch_tip(location=logo_destination_plate.wells_by_name()["H1"]) + ctx.pause("Is the pipette tip in the middle of the well?") + pipette_right.return_tip() + + # Play with the modules + temperature_module.await_temperature(25) + + hs_module.set_and_wait_for_shake_speed(466) + ctx.delay(seconds=5) + + hs_module.set_and_wait_for_temperature(38) + + thermocycler_module.open_lid() + thermocycler_module.close_lid() + thermocycler_module.set_lid_temperature(38) # 37 is the minimum + thermocycler_module.set_block_temperature(temperature=28, hold_time_seconds=5) + thermocycler_module.deactivate_block() + thermocycler_module.deactivate_lid() + thermocycler_module.open_lid() + + hs_module.deactivate_shaker() + + # dispense to modules + + # to temperature module + pipette_right.pick_up_tip() + pipette_right.aspirate(volume=15, location=dye_source) + pipette_right.dispense(volume=15, location=temp_plate.well(0)) + pipette_right.drop_tip() + + # to heater shaker + pipette_left.pick_up_tip() + pipette_left.aspirate(volume=50, location=dye_source) + pipette_left.dispense(volume=50, location=hs_plate.well(0)) + hs_module.set_and_wait_for_shake_speed(350) + ctx.delay(seconds=5) + hs_module.deactivate_shaker() + + # to custom labware + # This labware does not EXIST!!!! so... + # Use tip rack lid to catch dye on wet run + pipette_right.pick_up_tip() + pipette_right.aspirate(volume=10, location=dye_source, rate=2.0) + pipette_right.dispense(volume=10, location=custom_labware.well(3), rate=1.5) + pipette_right.drop_tip() + + # to thermocycler + pipette_left.aspirate(volume=75, location=dye_source) + pipette_left.dispense(volume=60, location=tc_plate.wells_by_name()["A6"]) + pipette_left.drop_tip() diff --git a/app-testing/files/protocols/py/OT2_P300M_P20S_TC_HS_TM_2_16_SmokeTestV3.py b/app-testing/files/protocols/py/OT2_P300M_P20S_TC_HS_TM_2_16_SmokeTestV3.py new file mode 100644 index 00000000000..b642a18e18f --- /dev/null +++ b/app-testing/files/protocols/py/OT2_P300M_P20S_TC_HS_TM_2_16_SmokeTestV3.py @@ -0,0 +1,358 @@ +"""Smoke Test v3.0 """ +# https://opentrons.atlassian.net/projects/RQA?selectedItem=com.atlassian.plugins.atlassian-connect-plugin:com.kanoah.test-manager__main-project-page#!/testCase/QB-T497 +from opentrons import protocol_api + +metadata = { + "protocolName": "🛠️ 2.16 Smoke Test V3 🪄", + "author": "Opentrons Engineering ", + "source": "Software Testing Team", + "description": ("Description of the protocol that is longish \n has \n returns and \n emoji 😊 ⬆️ "), +} + +requirements = {"robotType": "OT-2", "apiLevel": "2.16"} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + """This method is run by the protocol engine.""" + + ctx.set_rail_lights(True) + ctx.comment(f"Let there be light! {ctx.rail_lights_on} 🌠🌠🌠") + ctx.comment(f"Is the door is closed? {ctx.door_closed} 🚪🚪🚪") + ctx.comment(f"Is this a simulation? {ctx.is_simulating()} 🔮🔮🔮") + ctx.comment(f"Running against API Version: {ctx.api_version}") + + # deck positions + tips_300ul_position = "5" + tips_20ul_position = "4" + dye_source_position = "3" + logo_position = "2" + temperature_position = "9" + custom_lw_position = "6" + hs_position = "1" + + # Thermocycler has a default position that covers Slots 7, 8, 10, and 11. + # This is the only valid location for the Thermocycler on the OT-2 deck. + # This position is a default parameter when declaring the TC so you do not need to specify. + + # 300ul tips + tips_300ul = [ + ctx.load_labware( + load_name="opentrons_96_tiprack_300ul", + location=tips_300ul_position, + label="300ul tips", + ) + ] + + # 20ul tips + tips_20ul = [ + ctx.load_labware( + load_name="opentrons_96_tiprack_20ul", + location=tips_20ul_position, + label="20ul tips", + ) + ] + + # pipettes + pipette_left = ctx.load_instrument(instrument_name="p300_multi_gen2", mount="left", tip_racks=tips_300ul) + + pipette_right = ctx.load_instrument(instrument_name="p20_single_gen2", mount="right", tip_racks=tips_20ul) + + # modules https://docs.opentrons.com/v2/new_modules.html#available-modules + hs_module = ctx.load_module("heaterShakerModuleV1", hs_position) + temperature_module = ctx.load_module("temperature module gen2", temperature_position) + thermocycler_module = ctx.load_module("thermocycler module gen2") + + # module labware + temp_adapter = temperature_module.load_adapter("opentrons_96_well_aluminum_block") + temp_plate = temp_adapter.load_labware( + "nest_96_wellplate_100ul_pcr_full_skirt", + label="Temperature-Controlled plate", + ) + hs_plate = hs_module.load_labware(name="nest_96_wellplate_100ul_pcr_full_skirt", adapter="opentrons_96_pcr_adapter") + tc_plate = thermocycler_module.load_labware("nest_96_wellplate_100ul_pcr_full_skirt") + + # A 2.14 difference, no params specified, still should find it. + custom_labware = ctx.load_labware( + "cpx_4_tuberack_100ul", + custom_lw_position, + label="4 custom tubes", + ) + + # create plates and pattern list + logo_destination_plate = ctx.load_labware( + load_name="nest_96_wellplate_100ul_pcr_full_skirt", + location=logo_position, + label="logo destination", + ) + + dye_container = ctx.load_labware( + load_name="nest_12_reservoir_15ml", + location=dye_source_position, + label="dye container", + ) + + dye_source = dye_container.wells_by_name()["A2"] + + # Well Location set-up + dye_destination_wells = [ + logo_destination_plate.wells_by_name()["C7"], + logo_destination_plate.wells_by_name()["D6"], + logo_destination_plate.wells_by_name()["D7"], + logo_destination_plate.wells_by_name()["D8"], + logo_destination_plate.wells_by_name()["E5"], + ] + + # >= 2.14 define_liquid and load_liquid + water = ctx.define_liquid( + name="water", description="H₂O", display_color="#42AB2D" + ) # subscript 2 https://www.compart.com/en/unicode/U+2082 + + acetone = ctx.define_liquid( + name="acetone", description="C₃H₆O", display_color="#38588a" + ) # subscript 3 https://www.compart.com/en/unicode/U+2083 + # subscript 6 https://www.compart.com/en/unicode/U+2086 + + dye_container.wells_by_name()["A1"].load_liquid(liquid=water, volume=4000) + dye_container.wells_by_name()["A2"].load_liquid(liquid=water, volume=2000) + dye_container.wells_by_name()["A5"].load_liquid(liquid=acetone, volume=555.55555) + + # 2 different liquids in the same well + dye_container.wells_by_name()["A8"].load_liquid(liquid=water, volume=900.00) + dye_container.wells_by_name()["A8"].load_liquid(liquid=acetone, volume=1001.11) + + hs_module.close_labware_latch() + + pipette_right.pick_up_tip() + + ################################## + # Manual Deck State Modification # + ################################## + + # -------------------------- # + # Added in API version: 2.15 # + # -------------------------- # + + # Putting steps for this at beginning of protocol so you can do the manual stuff + # then walk away to let the rest of the protocol execute + + # The test flow is as follows: + # 1. Remove the existing PCR plate from slot 2 + # 2. Move the reservoir from slot 3 to slot 2 + # 3. Pickup P20 tip, move pipette to reservoir A1 in slot 2 + # 4. Pause and ask user to validate that the tip is in the middle of reservoir A1 in slot 2 + # 5. Move the reservoir back to slot 3 from slot 2 + # 6. Move pipette to reservoir A1 in slot 3 + # 7. Pause and ask user to validate that the tip is in the middle of reservoir A1 in slot 3 + # 8. Move custom labware from slot 6 to slot 2 + # 9. Move pipette to well A1 in slot 2 + # 10. Pause and ask user to validate that the tip is in the middle of well A1 in slot 2 + # 11. Move the custom labware back to slot 6 from slot 2 + # 12. Move pipette to well A1 in slot 6 + # 13. Pause and ask user to validate that the tip is in the middle of well A1 in slot 6 + # 14. Move the offdeck PCR plate back to slot 2 + # 15. Move pipette to well A1 in slot 2 + # 16. Pause and ask user to validate that the tip is in the middle of well A1 in slot 2 + + # In effect, nothing will actually change to the protocol, + # but we will be able to test that the UI responds appropriately. + + # Note: + # logo_destination_plate is a nest_96_wellplate_100ul_pcr_full_skirt - starting position is slot 2 + # dye_container is a nest_12_reservoir_15ml - starting position is slot 3 + + # Step 1 + ctx.move_labware( + labware=logo_destination_plate, + new_location=protocol_api.OFF_DECK, + ) + + # Step 2 + ctx.move_labware(labware=dye_container, new_location="2") + + # Step 3 + pipette_right.move_to(location=dye_container.wells_by_name()["A1"].top()) + + # Step 4 + ctx.pause("Is the pipette tip in the middle of reservoir A1 in slot 2?") + + # Step 5 + ctx.move_labware(labware=dye_container, new_location="3") + + # Step 6 + pipette_right.move_to(location=dye_container.wells_by_name()["A1"].top()) + + # Step 7 + ctx.pause("Is the pipette tip in the middle of reservoir A1 in slot 3?") + + # Step 8 + ctx.move_labware(labware=custom_labware, new_location="2") + + # Step 9 + pipette_right.move_to(location=custom_labware.wells_by_name()["A1"].top()) + + # Step 10 + ctx.pause("Is the pipette tip in the middle of custom labware A1 in slot 2?") + + # Step 11 + ctx.move_labware(labware=custom_labware, new_location="6") + + # Step 12 + pipette_right.move_to(location=custom_labware.wells_by_name()["A1"].top()) + + # Step 13 + ctx.pause("Is the pipette tip in the middle of custom labware A1 in slot 6?") + + # Step 14 + ctx.move_labware(labware=logo_destination_plate, new_location="2") + + # Step 15 + pipette_right.move_to(location=logo_destination_plate.wells_by_name()["A1"].top()) + + # Step 16 + ctx.pause("Is the pipette tip in the middle of well A1 in slot 2?") + + ####################### + # prepare_to_aspirate # + ####################### + + # -------------------------- # + # Added in API version: 2.16 # + # -------------------------- # + + pipette_right.prepare_to_aspirate() + pipette_right.move_to(dye_container.wells_by_name()["A1"].bottom(z=2)) + ctx.pause( + "Testing prepare_to_aspirate - watch pipette until next pause.\n The pipette should only move up out of the well after it has aspirated." + ) + pipette_right.aspirate(10, dye_container.wells_by_name()["A1"].bottom(z=2)) + ctx.pause("Did the pipette move up out of the well, only once, after aspirating?") + pipette_right.dispense(10, dye_container.wells_by_name()["A1"].bottom(z=2)) + + ######################################### + # protocol_context.fixed_trash property # + ######################################### + + # ---------------------------- # + # Changed in API version: 2.16 # + # ---------------------------- # + + pipette_right.move_to(ctx.fixed_trash) + ctx.pause("Is the pipette over the trash? Pipette will home after this pause.") + ctx.home() + + ############################################### + # instrument_context.trash_container property # + ############################################### + + # ---------------------------- # + # Changed in API version: 2.16 # + # ---------------------------- # + + pipette_right.move_to(pipette_right.trash_container) + ctx.pause("Is the pipette over the trash?") + + # Distribute dye + pipette_right.distribute( + volume=18, + source=dye_source, + dest=dye_destination_wells, + new_tip="never", + ) + pipette_right.drop_tip() + + # transfer + transfer_destinations = [ + logo_destination_plate.wells_by_name()["A11"], + logo_destination_plate.wells_by_name()["B11"], + logo_destination_plate.wells_by_name()["C11"], + ] + pipette_right.pick_up_tip() + pipette_right.transfer( + volume=60, + source=dye_container.wells_by_name()["A2"], + dest=transfer_destinations, + new_tip="never", + touch_tip=True, + blow_out=True, + blowout_location="destination well", + mix_before=(3, 20), + mix_after=(1, 20), + mix_touch_tip=True, + ) + + # consolidate + pipette_right.consolidate( + volume=20, + source=transfer_destinations, + dest=dye_container.wells_by_name()["A5"], + new_tip="never", + touch_tip=False, + blow_out=True, + blowout_location="destination well", + mix_before=(3, 20), + ) + + # well to well + pipette_right.return_tip() + pipette_right.pick_up_tip() + pipette_right.aspirate(volume=5, location=logo_destination_plate.wells_by_name()["A11"]) + pipette_right.air_gap(volume=10) + ctx.delay(seconds=3) + pipette_right.dispense(volume=5, location=logo_destination_plate.wells_by_name()["H11"]) + + # move to + pipette_right.move_to(logo_destination_plate.wells_by_name()["E12"].top()) + pipette_right.move_to(logo_destination_plate.wells_by_name()["E11"].bottom()) + pipette_right.blow_out() + # touch tip + # pipette ends in the middle of the well as of 6.3.0 in all touch_tip + pipette_right.touch_tip(location=logo_destination_plate.wells_by_name()["H1"]) + ctx.pause("Is the pipette tip in the middle of the well?") + pipette_right.return_tip() + + # Play with the modules + temperature_module.await_temperature(25) + + hs_module.set_and_wait_for_shake_speed(466) + ctx.delay(seconds=5) + + hs_module.set_and_wait_for_temperature(38) + + thermocycler_module.open_lid() + thermocycler_module.close_lid() + thermocycler_module.set_lid_temperature(38) # 37 is the minimum + thermocycler_module.set_block_temperature(temperature=28, hold_time_seconds=5) + thermocycler_module.deactivate_block() + thermocycler_module.deactivate_lid() + thermocycler_module.open_lid() + + hs_module.deactivate_shaker() + + # dispense to modules + + # to temperature module + pipette_right.pick_up_tip() + pipette_right.aspirate(volume=15, location=dye_source) + pipette_right.dispense(volume=15, location=temp_plate.well(0)) + pipette_right.drop_tip() + + # to heater shaker + pipette_left.pick_up_tip() + pipette_left.aspirate(volume=50, location=dye_source) + pipette_left.dispense(volume=50, location=hs_plate.well(0)) + hs_module.set_and_wait_for_shake_speed(350) + ctx.delay(seconds=5) + hs_module.deactivate_shaker() + + # to custom labware + # This labware does not EXIST!!!! so... + # Use tip rack lid to catch dye on wet run + pipette_right.pick_up_tip() + pipette_right.aspirate(volume=10, location=dye_source, rate=2.0) + pipette_right.dispense(volume=10, location=custom_labware.well(3), rate=1.5) + pipette_right.drop_tip() + + # to thermocycler + pipette_left.aspirate(volume=75, location=dye_source) + pipette_left.dispense(volume=60, location=tc_plate.wells_by_name()["A6"]) + pipette_left.drop_tip() diff --git a/app-testing/files/protocols/py/OT2_P300M_P20S_TC_HS_TM_2_16_aspirateDispenseMix0Volume.py b/app-testing/files/protocols/py/OT2_P300M_P20S_TC_HS_TM_2_16_aspirateDispenseMix0Volume.py new file mode 100644 index 00000000000..edf43366e1a --- /dev/null +++ b/app-testing/files/protocols/py/OT2_P300M_P20S_TC_HS_TM_2_16_aspirateDispenseMix0Volume.py @@ -0,0 +1,71 @@ +"""Smoke Test v3.0 """ +from opentrons import protocol_api + +metadata = { + "protocolName": "API 2.16 Aspirate Dispense Mix 0 Volume", + "author": "Opentrons Engineering ", + "source": "Software Testing Team", +} + +requirements = {"robotType": "OT-2", "apiLevel": "2.16"} + + +def run(ctx: protocol_api.ProtocolContext) -> None: + """This method is run by the protocol engine.""" + + ctx.set_rail_lights(True) + + # deck positions + tips_300ul_position = "5" + tips_20ul_position = "4" + dye_source_position = "3" + logo_position = "2" + + # 300ul tips + tips_300ul = [ + ctx.load_labware( + load_name="opentrons_96_tiprack_300ul", + location=tips_300ul_position, + label="300ul tips", + ) + ] + + # 20ul tips + tips_20ul = [ + ctx.load_labware( + load_name="opentrons_96_tiprack_20ul", + location=tips_20ul_position, + label="20ul tips", + ) + ] + + # pipettes + ctx.load_instrument(instrument_name="p300_multi_gen2", mount="left", tip_racks=tips_300ul) + + pipette_right = ctx.load_instrument(instrument_name="p20_single_gen2", mount="right", tip_racks=tips_20ul) + + dye_container = ctx.load_labware( + load_name="nest_12_reservoir_15ml", + location=dye_source_position, + label="dye container", + ) + + # >= 2.14 define_liquid and load_liquid + water = ctx.define_liquid( + name="water", description="H₂O", display_color="#42AB2D" + ) # subscript 2 https://www.compart.com/en/unicode/U+2082 + + dye_container.wells_by_name()["A1"].load_liquid(liquid=water, volume=20) + + pipette_right.pick_up_tip() + + # >= 2.15: Aspirate everything, then dispense everything + # < 2.15: Aspirate nothing, then dispense everything(Which in this case means nothing) + # pipette_right.aspirate(volume=0, location=dye_container.wells_by_name()["A1"]) + # pipette_right.dispense(location=dye_container.wells_by_name()["A1"]) + + # >= 2.15: Aspirate everything, dispense everything, mix everything + # < 2.15: Aspirate everything, dispense nothing, mix nothing + pipette_right.aspirate(volume=20, location=dye_container.wells_by_name()["A1"]) + pipette_right.dispense(volume=0, location=dye_container.wells_by_name()["A1"]) + pipette_right.mix(volume=0, location=dye_container.wells_by_name()["A1"]) diff --git a/app-testing/files/protocols/py/OT2_P300M_P20S_TC_MM_TM_6_13_Smoke620Release.py b/app-testing/files/protocols/py/OT2_P300M_P20S_TC_MM_TM_2_13_Smoke620Release.py similarity index 100% rename from app-testing/files/protocols/py/OT2_P300M_P20S_TC_MM_TM_6_13_Smoke620Release.py rename to app-testing/files/protocols/py/OT2_P300M_P20S_TC_MM_TM_2_13_Smoke620Release.py diff --git a/app-testing/files/protocols/py/OT2_P300S_Twinning_Error.py b/app-testing/files/protocols/py/OT2_P300S_Twinning_Error.py index 497313c66ad..a3f7a3414fa 100644 --- a/app-testing/files/protocols/py/OT2_P300S_Twinning_Error.py +++ b/app-testing/files/protocols/py/OT2_P300S_Twinning_Error.py @@ -8,7 +8,6 @@ def run(ctx): - tiprack = ctx.load_labware("opentrons_96_tiprack_300ul", 1) labware = ctx.load_labware("usascientific_12_reservoir_22ml", 2) other_labware = ctx.load_labware("corning_96_wellplate_360ul_flat", 3) diff --git a/app-testing/print_protocols.py b/app-testing/print_protocols.py index c129fd0cb80..e064f44d883 100644 --- a/app-testing/print_protocols.py +++ b/app-testing/print_protocols.py @@ -6,21 +6,25 @@ from rich.panel import Panel stems = [p.stem for p in pathlib.Path(pathlib.Path.cwd(), "files", "protocols").rglob("*") if p.is_file()] +sorted_stems = sorted(stems) rich.print(Panel("For protocol_files.names")) -rich.print(stems) +rich.print(sorted_stems) rich.print(Panel("Formatted for .env")) -rich.print(", ".join(stems)) +rich.print(", ".join(sorted_stems)) rich.print(Panel("What are actually defined?")) protocols = Protocols() props = [prop for prop in dir(protocols) if "__" not in prop] -rich.print(", ".join(props)) +rich.print(",\n".join(props)) -possible = set(stems) +possible = set(sorted_stems) actual = set(props) -out = possible - actual +missing_protocols = possible - actual +orphan_protocols = actual - possible rich.print(Panel("Are all protocols mapped?")) -if len(out) == 0: +if len(missing_protocols) == 0 and len(orphan_protocols) == 0: rich.print("🥳 everything is mapped.") else: - rich.print("The below protocols need mapped:") - rich.print(out) + rich.print("The below protocols need to be mapped in protocols.py:") + rich.print(missing_protocols) + rich.print("\nThe below protocols are mapped in protocols.py, but don't exist in the protocols dir:") + rich.print(orphan_protocols) diff --git a/app-testing/pyproject.toml b/app-testing/pyproject.toml index 74380c51b22..273fc00740d 100644 --- a/app-testing/pyproject.toml +++ b/app-testing/pyproject.toml @@ -1,10 +1,10 @@ [tool.black] -line-length = 120 -target-version = ['py311'] +line-length = 140 +target-version = ['py312'] [tool.ruff] -line-length = 120 -target-version = "py311" +line-length = 140 +target-version = "py312" exclude = ["files"] src = ["*.py", "automation", "tests"] select = [ @@ -28,6 +28,7 @@ disallow_any_generics = true check_untyped_defs = true no_implicit_reexport = true exclude = "__init__.py" +python_version = "3.12" [mypy-selenium] ignore_missing_imports = true diff --git a/app-testing/pytest.ini b/app-testing/pytest.ini index b43796a2150..5bdb3486d34 100644 --- a/app-testing/pytest.ini +++ b/app-testing/pytest.ini @@ -1,3 +1,4 @@ [pytest] +generate_report_on_test = True junit_family = legacy -addopts = -s --junitxml=results/results.xml --log-cli-level info --strict-markers +addopts = --junitxml=results/results.xml --log-cli-level info --html=results/report.html --self-contained-html diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[01a37ee87b][Flex_P1000_96_2_16_AnalysisError_DropTipsWithNoTrash].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[01a37ee87b][Flex_P1000_96_2_16_AnalysisError_DropTipsWithNoTrash].json new file mode 100644 index 00000000000..2be98b6120f --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[01a37ee87b][Flex_P1000_96_2_16_AnalysisError_DropTipsWithNoTrash].json @@ -0,0 +1,1425 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_1_reservoir_290ml", + "location": { + "addressableAreaName": "C4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360206", + "360266" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.47, + "zDimension": 44.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 1 Well Reservoir 290 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_1_reservoir_290ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.55, + "shape": "rectangular", + "totalLiquidVolume": 290000, + "x": 63.88, + "xDimension": 106.8, + "y": 42.74, + "yDimension": 71.2, + "z": 4.85 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "D3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons Flex 96 Tip Rack Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_flex_96_tiprack_adapter", + "quirks": [ + "tiprackAdapterFor96Channel" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": {} + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p1000_96" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "NoTrashDefinedError [line 23]: Error 4000 GENERAL_ERROR (NoTrashDefinedError): No trash container has been defined in this protocol.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "No trash container has been defined in this protocol.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "NoTrashDefinedError", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "Flex_P1000_96_2_16_AnalysisError_DropTipsWithNoTrash.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/nest_1_reservoir_290ml/1", + "loadName": "nest_1_reservoir_290ml", + "location": { + "addressableAreaName": "C4" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_adapter/1", + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "D3" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {} + } + ], + "liquids": [], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Analysis Error - Drop Tips with no Trash" + }, + "modules": [], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p1000_96" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0400decc88][Flex_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0400decc88][Flex_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x].json new file mode 100644 index 00000000000..f699ac7ad6a --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0400decc88][Flex_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x].json @@ -0,0 +1,31121 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "THIS IS A REACTION RUN", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "D1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "D2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_200ul", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "D3" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 45.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Magnetic Block GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 0.0, + "z": 38.0 + }, + "model": "magneticBlockV1", + "moduleType": "magneticBlockType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": {}, + "ot2_standard": {}, + "ot3_standard": {} + } + }, + "model": "magneticBlockV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "C3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_200ul", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "B1" + }, + "model": "thermocyclerModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 108.96, + "lidHeight": 61.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 5.6 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.6 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 68.8, + "z": 108.96 + }, + "model": "thermocyclerModuleV2", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot3_standard": { + "B1": { + "cornerOffsetFromSlot": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ], + "labwareOffset": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "thermocyclerModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_50ul", + "location": { + "slotName": "B3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 50 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_50ul", + "quirks": [], + "tipLength": 57.9, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p1000_multi_flex" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p50_multi_flex" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "SETTING THERMO and TEMP BLOCK Temperature", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetBlockTemperature", + "params": { + "celsius": 4.0, + "holdTimeSeconds": 0.0 + }, + "result": { + "targetBlockTemperature": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForBlockTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetLidTemperature", + "params": { + "celsius": 100.0 + }, + "result": { + "targetLidTemperature": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForLidTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "temperatureModule/setTargetTemperature", + "params": { + "celsius": 4.0 + }, + "result": { + "targetTemperature": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "temperatureModule/waitForTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Ready" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Tagment", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ADDING TAGMIX", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 23.370000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 23.370000000000005 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 23.370000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 23.370000000000005 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 23.370000000000005 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 23.370000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 23.370000000000005 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 36.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 34.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 23.370000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 23.370000000000005 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 23.370000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 23.370000000000005 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 23.370000000000005 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 23.370000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 23.370000000000005 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 36.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 34.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 23.370000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 23.370000000000005 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 23.370000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 23.370000000000005 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 23.370000000000005 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 23.370000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 23.370000000000005 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 36.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 34.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 300.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/closeLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/runProfile", + "params": { + "blockMaxVolumeUl": 50.0, + "profile": [ + { + "celsius": 55.0, + "holdSeconds": 900.0 + } + ] + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetBlockTemperature", + "params": { + "celsius": 10.0, + "holdTimeSeconds": 0.0 + }, + "result": { + "targetBlockTemperature": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForBlockTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding TAGSTOP", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/closeLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/runProfile", + "params": { + "blockMaxVolumeUl": 50.0, + "profile": [ + { + "celsius": 37.0, + "holdSeconds": 900.0 + } + ] + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetBlockTemperature", + "params": { + "celsius": 10.0, + "holdTimeSeconds": 0.0 + }, + "result": { + "targetBlockTemperature": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForBlockTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.0 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 240.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Cleanup", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 42.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 42.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 39.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 39.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 55.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 42.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 42.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 39.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 39.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 55.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 42.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 42.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 39.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 39.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 55.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Wash ", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 35.650000000000006 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 35.650000000000006 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 35.650000000000006 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1600.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 180.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.0 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 180.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 42.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 42.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 38.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 38.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 42.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 42.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 38.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 38.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 42.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 42.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 38.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 38.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Wash ", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 35.650000000000006 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 35.650000000000006 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 35.650000000000006 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1600.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 180.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.0 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 180.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 42.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 42.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 38.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 38.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 42.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 42.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 38.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 38.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 42.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 42.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 38.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 38.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Wash ", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 35.650000000000006 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 35.650000000000006 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 35.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 35.650000000000006 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1600.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 180.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.0 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 180.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 42.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 42.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 38.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 38.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 42.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 42.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 38.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 38.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 42.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -10.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 42.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 38.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 38.92 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 46.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 60.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Residual Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 39.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.24, + "z": 39.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 39.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.24, + "z": 39.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 39.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.24, + "z": 39.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 30.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EPM", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.040000000000001, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 15.420000000000002, + "y": 74.24, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 1.040000000000001, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 15.420000000000002, + "y": 74.24, + "z": 23.260000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 75.28, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 75.28, + "z": 23.260000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.040000000000001, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 13.34, + "y": 74.24, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": -1.040000000000001, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 13.34, + "y": 74.24, + "z": 23.260000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 73.19999999999999, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 73.19999999999999, + "z": 23.260000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.390000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 27.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 34.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 24.419999999999998, + "y": 74.24, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 24.419999999999998, + "y": 74.24, + "z": 23.260000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 75.28, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 75.28, + "z": 23.260000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 22.34, + "y": 74.24, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": -1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 22.34, + "y": 74.24, + "z": 23.260000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 73.19999999999999, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 73.19999999999999, + "z": 23.260000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.390000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 27.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 34.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 33.42, + "y": 74.24, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 33.42, + "y": 74.24, + "z": 23.260000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 75.28, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 75.28, + "z": 23.260000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 31.340000000000003, + "y": 74.24, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": -1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 31.340000000000003, + "y": 74.24, + "z": 23.260000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 73.19999999999999, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 73.19999999999999, + "z": 23.260000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.390000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 27.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 34.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 2000.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 180.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Barcodes", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetLidTemperature", + "params": { + "celsius": 100.0 + }, + "result": { + "targetLidTemperature": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForLidTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/closeLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/runProfile", + "params": { + "blockMaxVolumeUl": 50.0, + "profile": [ + { + "celsius": 68.0, + "holdSeconds": 180.0 + }, + { + "celsius": 98.0, + "holdSeconds": 180.0 + } + ] + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/runProfile", + "params": { + "blockMaxVolumeUl": 50.0, + "profile": [ + { + "celsius": 98.0, + "holdSeconds": 45.0 + }, + { + "celsius": 62.0, + "holdSeconds": 30.0 + }, + { + "celsius": 68.0, + "holdSeconds": 120.0 + }, + { + "celsius": 98.0, + "holdSeconds": 45.0 + }, + { + "celsius": 62.0, + "holdSeconds": 30.0 + }, + { + "celsius": 68.0, + "holdSeconds": 120.0 + }, + { + "celsius": 98.0, + "holdSeconds": 45.0 + }, + { + "celsius": 62.0, + "holdSeconds": 30.0 + }, + { + "celsius": 68.0, + "holdSeconds": 120.0 + }, + { + "celsius": 98.0, + "holdSeconds": 45.0 + }, + { + "celsius": 62.0, + "holdSeconds": 30.0 + }, + { + "celsius": 68.0, + "holdSeconds": 120.0 + }, + { + "celsius": 98.0, + "holdSeconds": 45.0 + }, + { + "celsius": 62.0, + "holdSeconds": 30.0 + }, + { + "celsius": 68.0, + "holdSeconds": 120.0 + } + ] + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/runProfile", + "params": { + "blockMaxVolumeUl": 50.0, + "profile": [ + { + "celsius": 68.0, + "holdSeconds": 60.0 + } + ] + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetBlockTemperature", + "params": { + "celsius": 10.0, + "holdTimeSeconds": 0.0 + }, + "result": { + "targetBlockTemperature": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForBlockTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Cleanup", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding H20 and SAMPLE", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 19.870000000000005 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 74.24, + "z": 19.870000000000005 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 19.870000000000005 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ADDING AMPure (0.8x)", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 24.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 24.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 24.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 24.870000000000005 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 24.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 24.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 24.870000000000005 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 36.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 34.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 24.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 24.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 24.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 24.870000000000005 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 24.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 24.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 24.870000000000005 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 36.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 34.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 55.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 24.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 24.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 24.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 24.870000000000005 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 24.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 24.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 24.870000000000005 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 36.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 34.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 300.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.0 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 240.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 42.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 42.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 39.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 39.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 55.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 42.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 42.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 39.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 39.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 55.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 42.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 42.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 39.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 39.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 55.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 51.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 51.7 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 51.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 58.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 53.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 58.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 51.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 51.7 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 51.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 58.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 53.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 58.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 51.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 51.7 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 51.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 58.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 53.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 58.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 30.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 42.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 42.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 39.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 39.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 55.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 42.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 42.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 39.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 39.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 55.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 42.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 42.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 39.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 39.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 55.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 51.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 51.7 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 51.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 58.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 53.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 58.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 51.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 51.7 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 51.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 58.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 53.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 58.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 51.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 51.7 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 51.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 58.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 53.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 58.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 30.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 42.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 42.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 39.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 39.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 55.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 42.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 42.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 39.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 39.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 55.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 42.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -11.280000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 42.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 39.42 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.280000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 39.42 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 55.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 120.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Residual ETOH", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 38.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 38.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 38.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 38.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 38.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 38.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 60.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding RSB", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 51.42, + "y": 74.24, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 51.42, + "y": 74.24, + "z": 23.260000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 75.28, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 75.28, + "z": 23.260000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 49.34, + "y": 74.24, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": -1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 49.34, + "y": 74.24, + "z": 23.260000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 73.19999999999999, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 73.19999999999999, + "z": 23.260000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.390000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 27.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 34.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 60.42, + "y": 74.24, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 60.42, + "y": 74.24, + "z": 23.260000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 75.28, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 75.28, + "z": 23.260000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 58.34, + "y": 74.24, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": -1.0399999999999991, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 58.34, + "y": 74.24, + "z": 23.260000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 73.19999999999999, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 73.19999999999999, + "z": 23.260000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.390000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 27.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 34.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 69.42, + "y": 74.24, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 69.42, + "y": 74.24, + "z": 23.260000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 75.28, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 75.28, + "z": 23.260000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 67.33999999999999, + "y": 74.24, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 67.33999999999999, + "y": 74.24, + "z": 23.260000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 73.19999999999999, + "z": 23.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -11.39 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 73.19999999999999, + "z": 23.260000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 20.870000000000005 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.390000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 27.260000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 34.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 74.24, + "z": 39.650000000000006 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1600.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 60.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.0 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 180.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transferring Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.530000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 39.17 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.530000000000001 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.24, + "z": 39.17 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.38, + "y": 181.24, + "z": 39.92 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.530000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 39.17 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.530000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.24, + "z": 39.17 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.38, + "y": 181.24, + "z": 39.92 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.530000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 39.17 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.530000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.24, + "z": 39.17 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.38, + "y": 181.24, + "z": 39.92 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 15 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "Flex_P1000MLeft_P50MRight_HS_TM_MM_TC_2_15_ABR4_Illumina_DNA_Prep_24x.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_3200ml_fixed/1", + "loadName": "opentrons_1_trash_3200ml_fixed", + "location": { + "slotName": "A3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "D2" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C2" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "C3" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "loadName": "opentrons_flex_96_tiprack_50ul", + "location": { + "slotName": "B3" + } + } + ], + "liquids": [], + "metadata": { + "author": "Opentrons ", + "protocolName": "Illumina DNA Prep 24x", + "source": "Protocol Library" + }, + "modules": [ + { + "location": { + "slotName": "D1" + }, + "model": "heaterShakerModuleV1" + }, + { + "location": { + "slotName": "D3" + }, + "model": "temperatureModuleV2" + }, + { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + }, + { + "location": { + "slotName": "B1" + }, + "model": "thermocyclerModuleV2" + } + ], + "pipettes": [ + { + "mount": "right", + "pipetteName": "p1000_multi_flex" + }, + { + "mount": "left", + "pipetteName": "p50_multi_flex" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0ac062e151][OT2_P20S_P300M_HS_6_1_HS_WithCollision_Error].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0ac062e151][OT2_P20S_P300M_HS_6_1_HS_WithCollision_Error].json new file mode 100644 index 00000000000..b4d6b231532 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0ac062e151][OT2_P20S_P300M_HS_6_1_HS_WithCollision_Error].json @@ -0,0 +1,5323 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "H/S", + "loadName": "opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 42.25 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deepwell Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 Deep Well Adapter with NEST Deep Well Plate 2 mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 300 µL (1)", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "1", + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Thermo Scientific", + "brandId": [ + "AB2396" + ], + "links": [ + "https://www.fishersci.com/shop/products/armadillo-96-well-pcr-plate-1/AB2396" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 16 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Armadillo 96 Well Plate 200 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.24, + "z": 1.05 + }, + "A10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.24, + "z": 1.05 + }, + "A11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.24, + "z": 1.05 + }, + "A12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.24, + "z": 1.05 + }, + "A2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.24, + "z": 1.05 + }, + "A3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.24, + "z": 1.05 + }, + "A4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.24, + "z": 1.05 + }, + "A5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.24, + "z": 1.05 + }, + "A6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.24, + "z": 1.05 + }, + "A7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.24, + "z": 1.05 + }, + "A8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.24, + "z": 1.05 + }, + "A9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.24, + "z": 1.05 + }, + "B1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.24, + "z": 1.05 + }, + "B10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.24, + "z": 1.05 + }, + "B11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.24, + "z": 1.05 + }, + "B12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.24, + "z": 1.05 + }, + "B2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.24, + "z": 1.05 + }, + "B3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.24, + "z": 1.05 + }, + "B4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.24, + "z": 1.05 + }, + "B5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.24, + "z": 1.05 + }, + "B6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.24, + "z": 1.05 + }, + "B7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.24, + "z": 1.05 + }, + "B8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.24, + "z": 1.05 + }, + "B9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.24, + "z": 1.05 + }, + "C1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.24, + "z": 1.05 + }, + "C10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.24, + "z": 1.05 + }, + "C11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.24, + "z": 1.05 + }, + "C12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.24, + "z": 1.05 + }, + "C2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.24, + "z": 1.05 + }, + "C3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.24, + "z": 1.05 + }, + "C4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.24, + "z": 1.05 + }, + "C5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.24, + "z": 1.05 + }, + "C6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.24, + "z": 1.05 + }, + "C7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.24, + "z": 1.05 + }, + "C8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.24, + "z": 1.05 + }, + "C9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.24, + "z": 1.05 + }, + "D1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.24, + "z": 1.05 + }, + "D10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.24, + "z": 1.05 + }, + "D11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.24, + "z": 1.05 + }, + "D12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.24, + "z": 1.05 + }, + "D2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.24, + "z": 1.05 + }, + "D3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.24, + "z": 1.05 + }, + "D4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.24, + "z": 1.05 + }, + "D5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.24, + "z": 1.05 + }, + "D6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.24, + "z": 1.05 + }, + "D7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.24, + "z": 1.05 + }, + "D8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.24, + "z": 1.05 + }, + "D9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.24, + "z": 1.05 + }, + "E1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.24, + "z": 1.05 + }, + "E10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.24, + "z": 1.05 + }, + "E11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.24, + "z": 1.05 + }, + "E12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.24, + "z": 1.05 + }, + "E2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.24, + "z": 1.05 + }, + "E3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.24, + "z": 1.05 + }, + "E4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.24, + "z": 1.05 + }, + "E5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.24, + "z": 1.05 + }, + "E6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.24, + "z": 1.05 + }, + "E7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.24, + "z": 1.05 + }, + "E8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.24, + "z": 1.05 + }, + "E9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.24, + "z": 1.05 + }, + "F1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.24, + "z": 1.05 + }, + "F10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.24, + "z": 1.05 + }, + "F11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.24, + "z": 1.05 + }, + "F12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.24, + "z": 1.05 + }, + "F2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.24, + "z": 1.05 + }, + "F3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.24, + "z": 1.05 + }, + "F4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.24, + "z": 1.05 + }, + "F5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.24, + "z": 1.05 + }, + "F6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.24, + "z": 1.05 + }, + "F7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.24, + "z": 1.05 + }, + "F8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.24, + "z": 1.05 + }, + "F9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.24, + "z": 1.05 + }, + "G1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.24, + "z": 1.05 + }, + "G10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.24, + "z": 1.05 + }, + "G11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.24, + "z": 1.05 + }, + "G12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.24, + "z": 1.05 + }, + "G2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.24, + "z": 1.05 + }, + "G3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.24, + "z": 1.05 + }, + "G4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.24, + "z": 1.05 + }, + "G5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.24, + "z": 1.05 + }, + "G6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.24, + "z": 1.05 + }, + "G7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.24, + "z": 1.05 + }, + "G8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.24, + "z": 1.05 + }, + "G9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.24, + "z": 1.05 + }, + "H1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.24, + "z": 1.05 + }, + "H10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.24, + "z": 1.05 + }, + "H11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.24, + "z": 1.05 + }, + "H12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.24, + "z": 1.05 + }, + "H2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.24, + "z": 1.05 + }, + "H3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.24, + "z": 1.05 + }, + "H4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.24, + "z": 1.05 + }, + "H5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.24, + "z": 1.05 + }, + "H6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.24, + "z": 1.05 + }, + "H7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.24, + "z": 1.05 + }, + "H8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.24, + "z": 1.05 + }, + "H9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.24, + "z": 1.05 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 100.0, + "A2": 100.0, + "A3": 100.0, + "B1": 100.0, + "B2": 100.0, + "B3": 100.0, + "C1": 100.0, + "C2": 100.0, + "C3": 100.0, + "D1": 100.0, + "D2": 100.0, + "D3": 100.0, + "E1": 100.0, + "E2": 100.0, + "E3": 100.0, + "F1": 100.0, + "F2": 100.0, + "F3": 100.0, + "G1": 100.0, + "G2": 100.0, + "G3": 100.0, + "H1": 100.0, + "H2": 100.0, + "H3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateHeater", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "protocolType": "json", + "schemaVersion": 6 + }, + "errors": [], + "files": [ + { + "name": "OT2_P20S_P300M_HS_6_1_HS_WithCollision_Error.json", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "2" + } + }, + { + "definitionUri": "opentrons/opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep/1", + "displayName": "H/S", + "loadName": "opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "Opentrons 96 Tip Rack 300 µL (1)", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "4" + } + }, + { + "definitionUri": "opentrons/armadillo_96_wellplate_200ul_pcr_full_skirt/1", + "displayName": "1", + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "location": { + "slotName": "5" + } + } + ], + "liquids": [ + { + "description": "", + "displayColor": "#b925ff", + "displayName": "Water" + } + ], + "metadata": { + "author": "", + "category": null, + "description": "", + "protocolName": "HS Collision", + "subcategory": null, + "tags": [] + }, + "modules": [ + { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_single_gen2" + }, + { + "mount": "right", + "pipetteName": "p300_multi_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0f31fd0836][OT2_P1000SLeft_None_6_1_SimpleTransfer].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0f31fd0836][OT2_P1000SLeft_None_6_1_SimpleTransfer].json new file mode 100644 index 00000000000..8e5e354275c --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0f31fd0836][OT2_P1000SLeft_None_6_1_SimpleTransfer].json @@ -0,0 +1,1907 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p1000_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 1000 µL", + "loadName": "opentrons_96_tiprack_1000ul", + "location": { + "slotName": "1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-1000ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 97.47 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_1000ul", + "tipLength": 88, + "tipOverlap": 7.95 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.24, + "z": 9.47 + }, + "A10": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.24, + "z": 9.47 + }, + "A11": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.24, + "z": 9.47 + }, + "A12": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.24, + "z": 9.47 + }, + "A2": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.24, + "z": 9.47 + }, + "A3": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.24, + "z": 9.47 + }, + "A4": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.24, + "z": 9.47 + }, + "A5": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.24, + "z": 9.47 + }, + "A6": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.24, + "z": 9.47 + }, + "A7": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.24, + "z": 9.47 + }, + "A8": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.24, + "z": 9.47 + }, + "A9": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.24, + "z": 9.47 + }, + "B1": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.24, + "z": 9.47 + }, + "B10": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.24, + "z": 9.47 + }, + "B11": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.24, + "z": 9.47 + }, + "B12": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.24, + "z": 9.47 + }, + "B2": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.24, + "z": 9.47 + }, + "B3": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.24, + "z": 9.47 + }, + "B4": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.24, + "z": 9.47 + }, + "B5": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.24, + "z": 9.47 + }, + "B6": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.24, + "z": 9.47 + }, + "B7": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.24, + "z": 9.47 + }, + "B8": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.24, + "z": 9.47 + }, + "B9": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.24, + "z": 9.47 + }, + "C1": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.24, + "z": 9.47 + }, + "C10": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.24, + "z": 9.47 + }, + "C11": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.24, + "z": 9.47 + }, + "C12": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.24, + "z": 9.47 + }, + "C2": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.24, + "z": 9.47 + }, + "C3": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.24, + "z": 9.47 + }, + "C4": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.24, + "z": 9.47 + }, + "C5": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.24, + "z": 9.47 + }, + "C6": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.24, + "z": 9.47 + }, + "C7": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.24, + "z": 9.47 + }, + "C8": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.24, + "z": 9.47 + }, + "C9": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.24, + "z": 9.47 + }, + "D1": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.24, + "z": 9.47 + }, + "D10": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.24, + "z": 9.47 + }, + "D11": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.24, + "z": 9.47 + }, + "D12": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.24, + "z": 9.47 + }, + "D2": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.24, + "z": 9.47 + }, + "D3": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.24, + "z": 9.47 + }, + "D4": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.24, + "z": 9.47 + }, + "D5": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.24, + "z": 9.47 + }, + "D6": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.24, + "z": 9.47 + }, + "D7": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.24, + "z": 9.47 + }, + "D8": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.24, + "z": 9.47 + }, + "D9": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.24, + "z": 9.47 + }, + "E1": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.24, + "z": 9.47 + }, + "E10": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.24, + "z": 9.47 + }, + "E11": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.24, + "z": 9.47 + }, + "E12": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.24, + "z": 9.47 + }, + "E2": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.24, + "z": 9.47 + }, + "E3": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.24, + "z": 9.47 + }, + "E4": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.24, + "z": 9.47 + }, + "E5": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.24, + "z": 9.47 + }, + "E6": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.24, + "z": 9.47 + }, + "E7": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.24, + "z": 9.47 + }, + "E8": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.24, + "z": 9.47 + }, + "E9": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.24, + "z": 9.47 + }, + "F1": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.24, + "z": 9.47 + }, + "F10": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.24, + "z": 9.47 + }, + "F11": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.24, + "z": 9.47 + }, + "F12": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.24, + "z": 9.47 + }, + "F2": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.24, + "z": 9.47 + }, + "F3": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.24, + "z": 9.47 + }, + "F4": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.24, + "z": 9.47 + }, + "F5": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.24, + "z": 9.47 + }, + "F6": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.24, + "z": 9.47 + }, + "F7": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.24, + "z": 9.47 + }, + "F8": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.24, + "z": 9.47 + }, + "F9": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.24, + "z": 9.47 + }, + "G1": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.24, + "z": 9.47 + }, + "G10": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.24, + "z": 9.47 + }, + "G11": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.24, + "z": 9.47 + }, + "G12": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.24, + "z": 9.47 + }, + "G2": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.24, + "z": 9.47 + }, + "G3": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.24, + "z": 9.47 + }, + "G4": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.24, + "z": 9.47 + }, + "G5": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.24, + "z": 9.47 + }, + "G6": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.24, + "z": 9.47 + }, + "G7": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.24, + "z": 9.47 + }, + "G8": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.24, + "z": 9.47 + }, + "G9": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.24, + "z": 9.47 + }, + "H1": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.24, + "z": 9.47 + }, + "H10": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.24, + "z": 9.47 + }, + "H11": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.24, + "z": 9.47 + }, + "H12": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.24, + "z": 9.47 + }, + "H2": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.24, + "z": 9.47 + }, + "H3": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.24, + "z": 9.47 + }, + "H4": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.24, + "z": 9.47 + }, + "H5": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.24, + "z": 9.47 + }, + "H6": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.24, + "z": 9.47 + }, + "H7": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.24, + "z": 9.47 + }, + "H8": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.24, + "z": 9.47 + }, + "H9": { + "depth": 88, + "diameter": 7.23, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.24, + "z": 9.47 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "gold", + "loadName": "axygen_1_reservoir_90ml", + "location": { + "slotName": "7" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Axygen", + "brandId": [ + "RES-SW1-LP" + ], + "links": [ + "https://ecatalog.corning.com/life-sciences/b2c/US/en/Genomics-%26-Molecular-Biology/Automation-Consumables/Automation-Reservoirs/Axygen%C2%AE-Reagent-Reservoirs/p/RES-SW1-LP?clear=true" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.47, + "zDimension": 19.05 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "flat" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "Axygen 1 Well Reservoir 90 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "axygen_1_reservoir_90ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 12.42, + "shape": "rectangular", + "totalLiquidVolume": 90000, + "x": 63.88, + "xDimension": 106.76, + "y": 42.735, + "yDimension": 70.52, + "z": 6.63 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "SILVER", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "8" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "round", + "loadName": "corning_6_wellplate_16.8ml_flat", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Corning", + "brandId": [ + "3335", + "3471", + "3506", + "3516" + ], + "links": [ + "https://ecatalog.corning.com/life-sciences/b2c/US/en/Microplates/Assay-Microplates/96-Well-Microplates/Costar%C2%AE-Multiple-Well-Cell-Culture-Plates/p/3335" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.47, + "zDimension": 20.27 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "flat" + }, + "wells": [ + "A1", + "A2", + "A3", + "B1", + "B2", + "B3" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Corning 6 Well Plate 16.8 mL Flat", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1" + ], + [ + "A2", + "B2" + ], + [ + "A3", + "B3" + ] + ], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "corning_6_wellplate_16.8ml_flat" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 17.4, + "diameter": 35.43, + "shape": "circular", + "totalLiquidVolume": 16800, + "x": 24.76, + "y": 62.28, + "z": 2.87 + }, + "A2": { + "depth": 17.4, + "diameter": 35.43, + "shape": "circular", + "totalLiquidVolume": 16800, + "x": 63.88, + "y": 62.28, + "z": 2.87 + }, + "A3": { + "depth": 17.4, + "diameter": 35.43, + "shape": "circular", + "totalLiquidVolume": 16800, + "x": 103, + "y": 62.28, + "z": 2.87 + }, + "B1": { + "depth": 17.4, + "diameter": 35.43, + "shape": "circular", + "totalLiquidVolume": 16800, + "x": 24.76, + "y": 23.16, + "z": 2.87 + }, + "B2": { + "depth": 17.4, + "diameter": 35.43, + "shape": "circular", + "totalLiquidVolume": 16800, + "x": 63.88, + "y": 23.16, + "z": 2.87 + }, + "B3": { + "depth": 17.4, + "diameter": 35.43, + "shape": "circular", + "totalLiquidVolume": 16800, + "x": 103, + "y": 23.16, + "z": 2.87 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A10": 1000.0, + "A5": 1000.0, + "A6": 1000.0, + "A7": 1000.0, + "A8": 1000.0, + "A9": 1000.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 5000.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 97.47 + }, + "tipDiameter": 7.23, + "tipLength": 76.5, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 137.35, + "volume": 400.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.735, + "z": 7.63 + }, + "volume": 400.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 137.35, + "volume": 400.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 328.88, + "y": 23.16, + "z": 3.37 + }, + "volume": 400.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 137.35, + "volume": 400.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.735, + "z": 7.63 + }, + "volume": 400.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 137.35, + "volume": 400.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 368.0, + "y": 62.28, + "z": 3.37 + }, + "volume": 400.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + } + ], + "config": { + "protocolType": "json", + "schemaVersion": 6 + }, + "errors": [], + "files": [ + { + "name": "OT2_P1000SLeft_None_6_1_SimpleTransfer.json", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_1000ul/1", + "displayName": "Opentrons 96 Tip Rack 1000 µL", + "loadName": "opentrons_96_tiprack_1000ul", + "location": { + "slotName": "1" + } + }, + { + "definitionUri": "opentrons/axygen_1_reservoir_90ml/1", + "displayName": "gold", + "loadName": "axygen_1_reservoir_90ml", + "location": { + "slotName": "7" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "SILVER", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "8" + } + }, + { + "definitionUri": "opentrons/corning_6_wellplate_16.8ml_flat/1", + "displayName": "round", + "loadName": "corning_6_wellplate_16.8ml_flat", + "location": { + "slotName": "3" + } + } + ], + "liquids": [ + { + "description": "", + "displayColor": "#b925ff", + "displayName": "GOLD" + }, + { + "description": "", + "displayColor": "#ffd600", + "displayName": "SILVER" + } + ], + "metadata": { + "author": "", + "category": null, + "description": "", + "protocolName": "Need Pipette", + "subcategory": null, + "tags": [] + }, + "modules": [], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p1000_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0f71566d05][OT2_P20S_None_2_7_Walkthrough].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0f71566d05][OT2_P20S_None_2_7_Walkthrough].json new file mode 100644 index 00000000000..8400c75fe71 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0f71566d05][OT2_P20S_None_2_7_Walkthrough].json @@ -0,0 +1,4282 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_200ul_flat", + "location": { + "slotName": "1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "701011" + ], + "links": [ + "https://www.nest-biotech.com/cell-culture-plates/59415537.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.56, + "yDimension": 85.36, + "zDimension": 14.3 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "flat" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 200 µL Flat", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_96_wellplate_200ul_flat" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.28, + "y": 74.18, + "z": 3.5 + }, + "A10": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.28, + "y": 74.18, + "z": 3.5 + }, + "A11": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.28, + "y": 74.18, + "z": 3.5 + }, + "A12": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.28, + "y": 74.18, + "z": 3.5 + }, + "A2": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.28, + "y": 74.18, + "z": 3.5 + }, + "A3": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.28, + "y": 74.18, + "z": 3.5 + }, + "A4": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.28, + "y": 74.18, + "z": 3.5 + }, + "A5": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.28, + "y": 74.18, + "z": 3.5 + }, + "A6": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.28, + "y": 74.18, + "z": 3.5 + }, + "A7": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.28, + "y": 74.18, + "z": 3.5 + }, + "A8": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.28, + "y": 74.18, + "z": 3.5 + }, + "A9": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.28, + "y": 74.18, + "z": 3.5 + }, + "B1": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.28, + "y": 65.18, + "z": 3.5 + }, + "B10": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.28, + "y": 65.18, + "z": 3.5 + }, + "B11": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.28, + "y": 65.18, + "z": 3.5 + }, + "B12": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.28, + "y": 65.18, + "z": 3.5 + }, + "B2": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.28, + "y": 65.18, + "z": 3.5 + }, + "B3": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.28, + "y": 65.18, + "z": 3.5 + }, + "B4": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.28, + "y": 65.18, + "z": 3.5 + }, + "B5": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.28, + "y": 65.18, + "z": 3.5 + }, + "B6": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.28, + "y": 65.18, + "z": 3.5 + }, + "B7": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.28, + "y": 65.18, + "z": 3.5 + }, + "B8": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.28, + "y": 65.18, + "z": 3.5 + }, + "B9": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.28, + "y": 65.18, + "z": 3.5 + }, + "C1": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.28, + "y": 56.18, + "z": 3.5 + }, + "C10": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.28, + "y": 56.18, + "z": 3.5 + }, + "C11": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.28, + "y": 56.18, + "z": 3.5 + }, + "C12": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.28, + "y": 56.18, + "z": 3.5 + }, + "C2": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.28, + "y": 56.18, + "z": 3.5 + }, + "C3": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.28, + "y": 56.18, + "z": 3.5 + }, + "C4": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.28, + "y": 56.18, + "z": 3.5 + }, + "C5": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.28, + "y": 56.18, + "z": 3.5 + }, + "C6": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.28, + "y": 56.18, + "z": 3.5 + }, + "C7": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.28, + "y": 56.18, + "z": 3.5 + }, + "C8": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.28, + "y": 56.18, + "z": 3.5 + }, + "C9": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.28, + "y": 56.18, + "z": 3.5 + }, + "D1": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.28, + "y": 47.18, + "z": 3.5 + }, + "D10": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.28, + "y": 47.18, + "z": 3.5 + }, + "D11": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.28, + "y": 47.18, + "z": 3.5 + }, + "D12": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.28, + "y": 47.18, + "z": 3.5 + }, + "D2": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.28, + "y": 47.18, + "z": 3.5 + }, + "D3": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.28, + "y": 47.18, + "z": 3.5 + }, + "D4": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.28, + "y": 47.18, + "z": 3.5 + }, + "D5": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.28, + "y": 47.18, + "z": 3.5 + }, + "D6": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.28, + "y": 47.18, + "z": 3.5 + }, + "D7": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.28, + "y": 47.18, + "z": 3.5 + }, + "D8": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.28, + "y": 47.18, + "z": 3.5 + }, + "D9": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.28, + "y": 47.18, + "z": 3.5 + }, + "E1": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.28, + "y": 38.18, + "z": 3.5 + }, + "E10": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.28, + "y": 38.18, + "z": 3.5 + }, + "E11": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.28, + "y": 38.18, + "z": 3.5 + }, + "E12": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.28, + "y": 38.18, + "z": 3.5 + }, + "E2": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.28, + "y": 38.18, + "z": 3.5 + }, + "E3": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.28, + "y": 38.18, + "z": 3.5 + }, + "E4": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.28, + "y": 38.18, + "z": 3.5 + }, + "E5": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.28, + "y": 38.18, + "z": 3.5 + }, + "E6": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.28, + "y": 38.18, + "z": 3.5 + }, + "E7": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.28, + "y": 38.18, + "z": 3.5 + }, + "E8": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.28, + "y": 38.18, + "z": 3.5 + }, + "E9": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.28, + "y": 38.18, + "z": 3.5 + }, + "F1": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.28, + "y": 29.18, + "z": 3.5 + }, + "F10": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.28, + "y": 29.18, + "z": 3.5 + }, + "F11": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.28, + "y": 29.18, + "z": 3.5 + }, + "F12": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.28, + "y": 29.18, + "z": 3.5 + }, + "F2": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.28, + "y": 29.18, + "z": 3.5 + }, + "F3": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.28, + "y": 29.18, + "z": 3.5 + }, + "F4": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.28, + "y": 29.18, + "z": 3.5 + }, + "F5": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.28, + "y": 29.18, + "z": 3.5 + }, + "F6": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.28, + "y": 29.18, + "z": 3.5 + }, + "F7": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.28, + "y": 29.18, + "z": 3.5 + }, + "F8": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.28, + "y": 29.18, + "z": 3.5 + }, + "F9": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.28, + "y": 29.18, + "z": 3.5 + }, + "G1": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.28, + "y": 20.18, + "z": 3.5 + }, + "G10": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.28, + "y": 20.18, + "z": 3.5 + }, + "G11": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.28, + "y": 20.18, + "z": 3.5 + }, + "G12": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.28, + "y": 20.18, + "z": 3.5 + }, + "G2": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.28, + "y": 20.18, + "z": 3.5 + }, + "G3": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.28, + "y": 20.18, + "z": 3.5 + }, + "G4": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.28, + "y": 20.18, + "z": 3.5 + }, + "G5": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.28, + "y": 20.18, + "z": 3.5 + }, + "G6": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.28, + "y": 20.18, + "z": 3.5 + }, + "G7": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.28, + "y": 20.18, + "z": 3.5 + }, + "G8": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.28, + "y": 20.18, + "z": 3.5 + }, + "G9": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.28, + "y": 20.18, + "z": 3.5 + }, + "H1": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.28, + "y": 11.18, + "z": 3.5 + }, + "H10": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.28, + "y": 11.18, + "z": 3.5 + }, + "H11": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.28, + "y": 11.18, + "z": 3.5 + }, + "H12": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.28, + "y": 11.18, + "z": 3.5 + }, + "H2": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.28, + "y": 11.18, + "z": 3.5 + }, + "H3": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.28, + "y": 11.18, + "z": 3.5 + }, + "H4": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.28, + "y": 11.18, + "z": 3.5 + }, + "H5": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.28, + "y": 11.18, + "z": 3.5 + }, + "H6": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.28, + "y": 11.18, + "z": 3.5 + }, + "H7": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.28, + "y": 11.18, + "z": 3.5 + }, + "H8": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.28, + "y": 11.18, + "z": 3.5 + }, + "H9": { + "depth": 10.8, + "diameter": 6.85, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.28, + "y": 11.18, + "z": 3.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of NEST 96 Well Plate 200 µL Flat on 1", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 3.78, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of NEST 96 Well Plate 200 µL Flat on 1", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 4.444444444444445, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 4.444444444444445 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 6.666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 5.0 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 4.444444444444445, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 4.444444444444445 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 6.666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 5.0 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 4.444444444444445, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 4.444444444444445 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 6.666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 5.0 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333334, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333334 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 2.5, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 2.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 2.5, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 2.5 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 5.0 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 13.333333333333332, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333332 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 14.333333333333332, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 14.333333333333332 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 15.12, + "volume": 1.6666666666666667, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 1.6666666666666667 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 7 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "OT2_P20S_None_2_7_Walkthrough.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_200ul_flat/1", + "loadName": "nest_96_wellplate_200ul_flat", + "location": { + "slotName": "1" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "2" + } + } + ], + "liquids": [], + "metadata": { + "apiLevel": "2.7", + "author": "Opentrons ", + "protocolName": "OT-2 Guided Walk-through", + "source": "Custom Protocol Request" + }, + "modules": [], + "pipettes": [ + { + "mount": "right", + "pipetteName": "p20_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1312a4eb81][Flex_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1312a4eb81][Flex_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria].json new file mode 100644 index 00000000000..5f6c32dbb33 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1312a4eb81][Flex_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria].json @@ -0,0 +1,13334 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "D1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 42.25 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deepwell Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 Deep Well Heater-Shaker Adapter with NEST Deep Well Plate 2 mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep", + "quirks": [ + "gripperIncompatible" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 45.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Magnetic Block GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 0.0, + "z": 38.0 + }, + "model": "magneticBlockV1", + "moduleType": "magneticBlockType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": {}, + "ot2_standard": {}, + "ot3_standard": {} + } + }, + "model": "magneticBlockV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "D3" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_pcr_adapter_armadillo_wellplate_200ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 18.9 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "Thermo Scientific", + "brandId": [ + "AB2396" + ], + "links": [ + "https://www.fishersci.com/shop/products/armadillo-96-well-pcr-plate-1/AB2396" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Armadillo 96 Well Plate 200 µL PCR Full Skirt", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 PCR Heater-Shaker Adapter with Armadillo Well Plate 200 µl", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_pcr_adapter_armadillo_wellplate_200ul", + "quirks": [ + "gripperIncompatible" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.24, + "z": 3.95 + }, + "A10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.24, + "z": 3.95 + }, + "A11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.24, + "z": 3.95 + }, + "A12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.24, + "z": 3.95 + }, + "A2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.24, + "z": 3.95 + }, + "A3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.24, + "z": 3.95 + }, + "A4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.24, + "z": 3.95 + }, + "A5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.24, + "z": 3.95 + }, + "A6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.24, + "z": 3.95 + }, + "A7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.24, + "z": 3.95 + }, + "A8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.24, + "z": 3.95 + }, + "A9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.24, + "z": 3.95 + }, + "B1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.24, + "z": 3.95 + }, + "B10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.24, + "z": 3.95 + }, + "B11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.24, + "z": 3.95 + }, + "B12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.24, + "z": 3.95 + }, + "B2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.24, + "z": 3.95 + }, + "B3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.24, + "z": 3.95 + }, + "B4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.24, + "z": 3.95 + }, + "B5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.24, + "z": 3.95 + }, + "B6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.24, + "z": 3.95 + }, + "B7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.24, + "z": 3.95 + }, + "B8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.24, + "z": 3.95 + }, + "B9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.24, + "z": 3.95 + }, + "C1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.24, + "z": 3.95 + }, + "C10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.24, + "z": 3.95 + }, + "C11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.24, + "z": 3.95 + }, + "C12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.24, + "z": 3.95 + }, + "C2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.24, + "z": 3.95 + }, + "C3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.24, + "z": 3.95 + }, + "C4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.24, + "z": 3.95 + }, + "C5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.24, + "z": 3.95 + }, + "C6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.24, + "z": 3.95 + }, + "C7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.24, + "z": 3.95 + }, + "C8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.24, + "z": 3.95 + }, + "C9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.24, + "z": 3.95 + }, + "D1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.24, + "z": 3.95 + }, + "D10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.24, + "z": 3.95 + }, + "D11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.24, + "z": 3.95 + }, + "D12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.24, + "z": 3.95 + }, + "D2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.24, + "z": 3.95 + }, + "D3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.24, + "z": 3.95 + }, + "D4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.24, + "z": 3.95 + }, + "D5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.24, + "z": 3.95 + }, + "D6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.24, + "z": 3.95 + }, + "D7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.24, + "z": 3.95 + }, + "D8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.24, + "z": 3.95 + }, + "D9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.24, + "z": 3.95 + }, + "E1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.24, + "z": 3.95 + }, + "E10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.24, + "z": 3.95 + }, + "E11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.24, + "z": 3.95 + }, + "E12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.24, + "z": 3.95 + }, + "E2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.24, + "z": 3.95 + }, + "E3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.24, + "z": 3.95 + }, + "E4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.24, + "z": 3.95 + }, + "E5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.24, + "z": 3.95 + }, + "E6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.24, + "z": 3.95 + }, + "E7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.24, + "z": 3.95 + }, + "E8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.24, + "z": 3.95 + }, + "E9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.24, + "z": 3.95 + }, + "F1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.24, + "z": 3.95 + }, + "F10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.24, + "z": 3.95 + }, + "F11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.24, + "z": 3.95 + }, + "F12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.24, + "z": 3.95 + }, + "F2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.24, + "z": 3.95 + }, + "F3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.24, + "z": 3.95 + }, + "F4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.24, + "z": 3.95 + }, + "F5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.24, + "z": 3.95 + }, + "F6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.24, + "z": 3.95 + }, + "F7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.24, + "z": 3.95 + }, + "F8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.24, + "z": 3.95 + }, + "F9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.24, + "z": 3.95 + }, + "G1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.24, + "z": 3.95 + }, + "G10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.24, + "z": 3.95 + }, + "G11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.24, + "z": 3.95 + }, + "G12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.24, + "z": 3.95 + }, + "G2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.24, + "z": 3.95 + }, + "G3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.24, + "z": 3.95 + }, + "G4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.24, + "z": 3.95 + }, + "G5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.24, + "z": 3.95 + }, + "G6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.24, + "z": 3.95 + }, + "G7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.24, + "z": 3.95 + }, + "G8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.24, + "z": 3.95 + }, + "G9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.24, + "z": 3.95 + }, + "H1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.24, + "z": 3.95 + }, + "H10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.24, + "z": 3.95 + }, + "H11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.24, + "z": 3.95 + }, + "H12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.24, + "z": 3.95 + }, + "H2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.24, + "z": 3.95 + }, + "H3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.24, + "z": 3.95 + }, + "H4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.24, + "z": 3.95 + }, + "H5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.24, + "z": 3.95 + }, + "H6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.24, + "z": 3.95 + }, + "H7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.24, + "z": 3.95 + }, + "H8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.24, + "z": 3.95 + }, + "H9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.24, + "z": 3.95 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "D2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C3" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "B1" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "location": { + "slotName": "B3" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Thermo Scientific", + "brandId": [ + "AB2396" + ], + "links": [ + "https://www.fishersci.com/shop/products/armadillo-96-well-pcr-plate-1/AB2396" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 16.0 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.0, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Armadillo 96 Well Plate 200 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.95 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 11.91 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 3.54 + }, + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.7 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.24, + "z": 1.05 + }, + "A10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.24, + "z": 1.05 + }, + "A11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.24, + "z": 1.05 + }, + "A12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.24, + "z": 1.05 + }, + "A2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.24, + "z": 1.05 + }, + "A3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.24, + "z": 1.05 + }, + "A4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.24, + "z": 1.05 + }, + "A5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.24, + "z": 1.05 + }, + "A6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.24, + "z": 1.05 + }, + "A7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.24, + "z": 1.05 + }, + "A8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.24, + "z": 1.05 + }, + "A9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.24, + "z": 1.05 + }, + "B1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.24, + "z": 1.05 + }, + "B10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.24, + "z": 1.05 + }, + "B11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.24, + "z": 1.05 + }, + "B12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.24, + "z": 1.05 + }, + "B2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.24, + "z": 1.05 + }, + "B3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.24, + "z": 1.05 + }, + "B4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.24, + "z": 1.05 + }, + "B5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.24, + "z": 1.05 + }, + "B6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.24, + "z": 1.05 + }, + "B7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.24, + "z": 1.05 + }, + "B8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.24, + "z": 1.05 + }, + "B9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.24, + "z": 1.05 + }, + "C1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.24, + "z": 1.05 + }, + "C10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.24, + "z": 1.05 + }, + "C11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.24, + "z": 1.05 + }, + "C12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.24, + "z": 1.05 + }, + "C2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.24, + "z": 1.05 + }, + "C3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.24, + "z": 1.05 + }, + "C4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.24, + "z": 1.05 + }, + "C5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.24, + "z": 1.05 + }, + "C6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.24, + "z": 1.05 + }, + "C7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.24, + "z": 1.05 + }, + "C8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.24, + "z": 1.05 + }, + "C9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.24, + "z": 1.05 + }, + "D1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.24, + "z": 1.05 + }, + "D10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.24, + "z": 1.05 + }, + "D11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.24, + "z": 1.05 + }, + "D12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.24, + "z": 1.05 + }, + "D2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.24, + "z": 1.05 + }, + "D3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.24, + "z": 1.05 + }, + "D4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.24, + "z": 1.05 + }, + "D5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.24, + "z": 1.05 + }, + "D6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.24, + "z": 1.05 + }, + "D7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.24, + "z": 1.05 + }, + "D8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.24, + "z": 1.05 + }, + "D9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.24, + "z": 1.05 + }, + "E1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.24, + "z": 1.05 + }, + "E10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.24, + "z": 1.05 + }, + "E11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.24, + "z": 1.05 + }, + "E12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.24, + "z": 1.05 + }, + "E2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.24, + "z": 1.05 + }, + "E3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.24, + "z": 1.05 + }, + "E4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.24, + "z": 1.05 + }, + "E5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.24, + "z": 1.05 + }, + "E6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.24, + "z": 1.05 + }, + "E7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.24, + "z": 1.05 + }, + "E8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.24, + "z": 1.05 + }, + "E9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.24, + "z": 1.05 + }, + "F1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.24, + "z": 1.05 + }, + "F10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.24, + "z": 1.05 + }, + "F11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.24, + "z": 1.05 + }, + "F12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.24, + "z": 1.05 + }, + "F2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.24, + "z": 1.05 + }, + "F3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.24, + "z": 1.05 + }, + "F4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.24, + "z": 1.05 + }, + "F5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.24, + "z": 1.05 + }, + "F6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.24, + "z": 1.05 + }, + "F7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.24, + "z": 1.05 + }, + "F8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.24, + "z": 1.05 + }, + "F9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.24, + "z": 1.05 + }, + "G1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.24, + "z": 1.05 + }, + "G10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.24, + "z": 1.05 + }, + "G11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.24, + "z": 1.05 + }, + "G12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.24, + "z": 1.05 + }, + "G2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.24, + "z": 1.05 + }, + "G3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.24, + "z": 1.05 + }, + "G4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.24, + "z": 1.05 + }, + "G5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.24, + "z": 1.05 + }, + "G6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.24, + "z": 1.05 + }, + "G7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.24, + "z": 1.05 + }, + "G8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.24, + "z": 1.05 + }, + "G9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.24, + "z": 1.05 + }, + "H1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.24, + "z": 1.05 + }, + "H10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.24, + "z": 1.05 + }, + "H11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.24, + "z": 1.05 + }, + "H12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.24, + "z": 1.05 + }, + "H2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.24, + "z": 1.05 + }, + "H3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.24, + "z": 1.05 + }, + "H4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.24, + "z": 1.05 + }, + "H5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.24, + "z": 1.05 + }, + "H6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.24, + "z": 1.05 + }, + "H7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.24, + "z": 1.05 + }, + "H8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.24, + "z": 1.05 + }, + "H9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.24, + "z": 1.05 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "B2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_ot3_96_tiprack_1000ul_rss", + "location": { + "slotName": "A1" + }, + "namespace": "custom_beta", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [ + "RSS_made" + ] + }, + "cornerOffsetFromSlot": { + "x": -14.375, + "y": -3.625, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL with adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "custom_beta", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_ot3_96_tiprack_1000ul_rss", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 78, + "z": 12.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 78, + "z": 12.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 78, + "z": 12.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 78, + "z": 12.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 78, + "z": 12.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 78, + "z": 12.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 78, + "z": 12.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 78, + "z": 12.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 78, + "z": 12.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 78, + "z": 12.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 78, + "z": 12.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 78, + "z": 12.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 69, + "z": 12.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 69, + "z": 12.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 69, + "z": 12.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 69, + "z": 12.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 69, + "z": 12.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 69, + "z": 12.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 69, + "z": 12.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 69, + "z": 12.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 69, + "z": 12.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 69, + "z": 12.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 69, + "z": 12.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 69, + "z": 12.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 60, + "z": 12.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 60, + "z": 12.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 60, + "z": 12.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 60, + "z": 12.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 60, + "z": 12.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 60, + "z": 12.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 60, + "z": 12.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 60, + "z": 12.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 60, + "z": 12.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 60, + "z": 12.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 60, + "z": 12.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 60, + "z": 12.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 51, + "z": 12.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 51, + "z": 12.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 51, + "z": 12.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 51, + "z": 12.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 51, + "z": 12.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 51, + "z": 12.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 51, + "z": 12.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 51, + "z": 12.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 51, + "z": 12.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 51, + "z": 12.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 51, + "z": 12.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 51, + "z": 12.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 42, + "z": 12.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 42, + "z": 12.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 42, + "z": 12.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 42, + "z": 12.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 42, + "z": 12.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 42, + "z": 12.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 42, + "z": 12.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 42, + "z": 12.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 42, + "z": 12.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 42, + "z": 12.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 42, + "z": 12.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 42, + "z": 12.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 33, + "z": 12.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 33, + "z": 12.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 33, + "z": 12.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 33, + "z": 12.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 33, + "z": 12.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 33, + "z": 12.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 33, + "z": 12.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 33, + "z": 12.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 33, + "z": 12.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 33, + "z": 12.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 33, + "z": 12.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 33, + "z": 12.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 24, + "z": 12.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 24, + "z": 12.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 24, + "z": 12.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 24, + "z": 12.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 24, + "z": 12.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 24, + "z": 12.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 24, + "z": 12.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 24, + "z": 12.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 24, + "z": 12.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 24, + "z": 12.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 24, + "z": 12.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 24, + "z": 12.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 15, + "z": 12.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 15, + "z": 12.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 15, + "z": 12.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 15, + "z": 12.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 15, + "z": 12.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 15, + "z": 12.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 15, + "z": 12.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 15, + "z": 12.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 15, + "z": 12.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 15, + "z": 12.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 15, + "z": 12.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 15, + "z": 12.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_ot3_96_tiprack_1000ul_rss", + "location": { + "slotName": "A2" + }, + "namespace": "custom_beta", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [ + "RSS_made" + ] + }, + "cornerOffsetFromSlot": { + "x": -14.375, + "y": -3.625, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL with adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "custom_beta", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_ot3_96_tiprack_1000ul_rss", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 78, + "z": 12.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 78, + "z": 12.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 78, + "z": 12.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 78, + "z": 12.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 78, + "z": 12.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 78, + "z": 12.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 78, + "z": 12.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 78, + "z": 12.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 78, + "z": 12.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 78, + "z": 12.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 78, + "z": 12.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 78, + "z": 12.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 69, + "z": 12.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 69, + "z": 12.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 69, + "z": 12.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 69, + "z": 12.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 69, + "z": 12.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 69, + "z": 12.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 69, + "z": 12.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 69, + "z": 12.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 69, + "z": 12.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 69, + "z": 12.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 69, + "z": 12.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 69, + "z": 12.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 60, + "z": 12.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 60, + "z": 12.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 60, + "z": 12.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 60, + "z": 12.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 60, + "z": 12.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 60, + "z": 12.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 60, + "z": 12.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 60, + "z": 12.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 60, + "z": 12.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 60, + "z": 12.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 60, + "z": 12.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 60, + "z": 12.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 51, + "z": 12.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 51, + "z": 12.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 51, + "z": 12.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 51, + "z": 12.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 51, + "z": 12.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 51, + "z": 12.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 51, + "z": 12.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 51, + "z": 12.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 51, + "z": 12.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 51, + "z": 12.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 51, + "z": 12.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 51, + "z": 12.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 42, + "z": 12.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 42, + "z": 12.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 42, + "z": 12.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 42, + "z": 12.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 42, + "z": 12.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 42, + "z": 12.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 42, + "z": 12.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 42, + "z": 12.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 42, + "z": 12.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 42, + "z": 12.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 42, + "z": 12.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 42, + "z": 12.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 33, + "z": 12.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 33, + "z": 12.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 33, + "z": 12.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 33, + "z": 12.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 33, + "z": 12.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 33, + "z": 12.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 33, + "z": 12.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 33, + "z": 12.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 33, + "z": 12.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 33, + "z": 12.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 33, + "z": 12.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 33, + "z": 12.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 24, + "z": 12.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 24, + "z": 12.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 24, + "z": 12.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 24, + "z": 12.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 24, + "z": 12.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 24, + "z": 12.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 24, + "z": 12.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 24, + "z": 12.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 24, + "z": 12.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 24, + "z": 12.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 24, + "z": 12.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 24, + "z": 12.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 15, + "z": 12.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 15, + "z": 12.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 15, + "z": 12.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 15, + "z": 12.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 15, + "z": 12.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 15, + "z": 12.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 15, + "z": 12.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 15, + "z": 12.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 15, + "z": 12.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 15, + "z": 12.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 15, + "z": 12.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 15, + "z": 12.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p1000_96" + }, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 15 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "UnsuitableTiprackForPipetteMotion [line 254]: Error 2004 MOTION_PLANNING_FAILURE (UnsuitableTiprackForPipetteMotion): Opentrons Flex 96 Tip Rack 1000 µL with adapter must be on an Opentrons Flex 96 Tip Rack Adapter in order to pick up or return all 96 tips simultaneously.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "Opentrons Flex 96 Tip Rack 1000 µL with adapter must be on an Opentrons Flex 96 Tip Rack Adapter in order to pick up or return all 96 tips simultaneously.", + "errorCode": "2004", + "errorInfo": {}, + "errorType": "UnsuitableTiprackForPipetteMotion", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "Flex_P100_96_HS_TM_2_15_Quick_Zymo_RNA_Bacteria.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_3200ml_fixed/1", + "loadName": "opentrons_1_trash_3200ml_fixed", + "location": { + "slotName": "A3" + } + }, + { + "definitionUri": "opentrons/opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep/1", + "loadName": "opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_96_pcr_adapter_armadillo_wellplate_200ul/1", + "loadName": "opentrons_96_pcr_adapter_armadillo_wellplate_200ul", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "D2" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C2" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "B1" + } + }, + { + "definitionUri": "opentrons/armadillo_96_wellplate_200ul_pcr_full_skirt/2", + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "location": { + "slotName": "B3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "B2" + } + }, + { + "definitionUri": "custom_beta/opentrons_ot3_96_tiprack_1000ul_rss/1", + "loadName": "opentrons_ot3_96_tiprack_1000ul_rss", + "location": { + "slotName": "A1" + } + }, + { + "definitionUri": "custom_beta/opentrons_ot3_96_tiprack_1000ul_rss/1", + "loadName": "opentrons_ot3_96_tiprack_1000ul_rss", + "location": { + "slotName": "A2" + } + } + ], + "liquids": [], + "metadata": { + "author": "Zach Galluzzo ", + "protocolName": "Quick Zymo Magbead RNA Extraction with Lysis: Bacteria 96 Channel Deletion Test" + }, + "modules": [ + { + "location": { + "slotName": "D1" + }, + "model": "heaterShakerModuleV1" + }, + { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + }, + { + "location": { + "slotName": "D3" + }, + "model": "temperatureModuleV2" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p1000_96" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[20cefcac62][OT2_P300M_P20S_TC_HS_TM_2_13_SmokeTestV3].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[20cefcac62][OT2_P300M_P20S_TC_HS_TM_2_13_SmokeTestV3].json new file mode 100644 index 00000000000..57aa824ef3d --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[20cefcac62][OT2_P300M_P20S_TC_HS_TM_2_13_SmokeTestV3].json @@ -0,0 +1,12460 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Let there be light! True 🌠🌠🌠", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Is the door is closed? True 🚪🚪🚪", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Is this a simulation? True 🔮🔮🔮", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Running against API Version: 2.13", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "9" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 108.96, + "lidHeight": 61.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 5.6 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.6 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 68.8, + "z": 108.96 + }, + "model": "thermocyclerModuleV2", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot3_standard": { + "B1": { + "cornerOffsetFromSlot": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ], + "labwareOffset": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "thermocyclerModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Temperature-Controlled plate", + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/hardware-modules/products/aluminum-block-set" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.45, + "zDimension": 21.2 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "quirks": [ + "gripperIncompatible" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.2, + "z": 6.42 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.2, + "z": 6.42 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.2, + "z": 6.42 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.2, + "z": 6.42 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.2, + "z": 6.42 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.2, + "z": 6.42 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.2, + "z": 6.42 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.2, + "z": 6.42 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.2, + "z": 6.42 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.2, + "z": 6.42 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.2, + "z": 6.42 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.2, + "z": 6.42 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.2, + "z": 6.42 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.2, + "z": 6.42 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.2, + "z": 6.42 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.2, + "z": 6.42 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.2, + "z": 6.42 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.2, + "z": 6.42 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.2, + "z": 6.42 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.2, + "z": 6.42 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.2, + "z": 6.42 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.2, + "z": 6.42 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.2, + "z": 6.42 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.2, + "z": 6.42 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.2, + "z": 6.42 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.2, + "z": 6.42 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.2, + "z": 6.42 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.2, + "z": 6.42 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.2, + "z": 6.42 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.2, + "z": 6.42 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.2, + "z": 6.42 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.2, + "z": 6.42 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.2, + "z": 6.42 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.2, + "z": 6.42 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.2, + "z": 6.42 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.2, + "z": 6.42 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.2, + "z": 6.42 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.2, + "z": 6.42 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.2, + "z": 6.42 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.2, + "z": 6.42 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.2, + "z": 6.42 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.2, + "z": 6.42 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.2, + "z": 6.42 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.2, + "z": 6.42 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.2, + "z": 6.42 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.2, + "z": 6.42 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.2, + "z": 6.42 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.2, + "z": 6.42 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.2, + "z": 6.42 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.2, + "z": 6.42 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.2, + "z": 6.42 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.2, + "z": 6.42 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.2, + "z": 6.42 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.2, + "z": 6.42 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.2, + "z": 6.42 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.2, + "z": 6.42 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.2, + "z": 6.42 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.2, + "z": 6.42 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.2, + "z": 6.42 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.2, + "z": 6.42 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.2, + "z": 6.42 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.2, + "z": 6.42 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.2, + "z": 6.42 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.2, + "z": 6.42 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.2, + "z": 6.42 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.2, + "z": 6.42 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.2, + "z": 6.42 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.2, + "z": 6.42 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.2, + "z": 6.42 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.2, + "z": 6.42 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.2, + "z": 6.42 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.2, + "z": 6.42 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.2, + "z": 6.42 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.2, + "z": 6.42 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.2, + "z": 6.42 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.2, + "z": 6.42 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.2, + "z": 6.42 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.2, + "z": 6.42 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.2, + "z": 6.42 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.2, + "z": 6.42 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.2, + "z": 6.42 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.2, + "z": 6.42 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.2, + "z": 6.42 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.2, + "z": 6.42 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.2, + "z": 6.42 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.2, + "z": 6.42 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.2, + "z": 6.42 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.2, + "z": 6.42 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.2, + "z": 6.42 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.2, + "z": 6.42 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.2, + "z": 6.42 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.2, + "z": 6.42 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.2, + "z": 6.42 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.2, + "z": 6.42 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.2, + "z": 6.42 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.2, + "z": 6.42 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 19.35 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 PCR Heater-Shaker Adapter with NEST Well Plate 100 µl", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt", + "quirks": [ + "gripperIncompatible" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 3.57 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 3.57 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 3.57 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 3.57 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 3.57 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 3.57 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 3.57 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 3.57 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 3.57 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 3.57 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 3.57 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 3.57 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 3.57 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 3.57 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 3.57 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 3.57 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 3.57 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 3.57 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 3.57 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 3.57 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 3.57 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 3.57 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 3.57 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 3.57 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 3.57 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 3.57 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 3.57 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 3.57 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 3.57 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 3.57 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 3.57 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 3.57 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 3.57 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 3.57 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 3.57 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 3.57 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 3.57 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 3.57 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 3.57 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 3.57 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 3.57 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 3.57 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 3.57 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 3.57 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 3.57 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 3.57 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 3.57 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 3.57 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 3.57 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 3.57 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 3.57 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 3.57 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 3.57 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 3.57 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 3.57 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 3.57 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 3.57 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 3.57 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 3.57 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 3.57 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 3.57 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 3.57 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 3.57 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 3.57 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 3.57 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 3.57 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 3.57 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 3.57 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 3.57 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 3.57 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 3.57 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 3.57 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 3.57 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 3.57 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 3.57 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 3.57 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 3.57 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 3.57 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 3.57 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 3.57 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 3.57 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 3.57 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 3.57 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 3.57 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 3.57 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 3.57 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 3.57 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 3.57 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 3.57 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 3.57 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 3.57 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 3.57 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 3.57 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 3.57 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 3.57 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 3.57 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "4 tubes", + "loadName": "cpx_4_tuberack_100ul", + "location": { + "slotName": "6" + }, + "namespace": "custom_beta", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "cpx", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127, + "yDimension": 85, + "zDimension": 40 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "cpx", + "brandId": [] + }, + "metadata": { + "displayCategory": "tubeRack", + "wellBottomShape": "u" + }, + "wells": [ + "A1", + "A2", + "B1", + "B2" + ] + } + ], + "metadata": { + "displayCategory": "tubeRack", + "displayName": "cpx 4 Tube Rack with cpx 0.1 mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "custom_beta", + "ordering": [ + [ + "A1", + "B1" + ], + [ + "A2", + "B2" + ] + ], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "cpx_4_tuberack_100ul", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 20, + "y": 65, + "z": 17 + }, + "A2": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50, + "y": 65, + "z": 17 + }, + "B1": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 20, + "y": 35, + "z": 17 + }, + "B2": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50, + "y": 35, + "z": 17 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "logo destination", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Latching labware on Heater-Shaker", + "legacyCommandType": "command.HEATER_SHAKER_CLOSE_LABWARE_LATCH" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 3.0 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to E12 of logo destination on 2", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to E11 of logo destination on 2", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Touching tip", + "legacyCommandType": "command.TOUCH_TIP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Waiting for Temperature Module to reach temperature 25.0 °C (rounded off to nearest integer)", + "legacyCommandType": "command.TEMPDECK_AWAIT_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Heater-Shaker to Shake at 466 RPM and waiting until reached", + "legacyCommandType": "command.HEATER_SHAKER_SET_AND_WAIT_FOR_SHAKE_SPEED" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 5.0 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Target Temperature of Heater-Shaker to 38 °C", + "legacyCommandType": "command.HEATER_SHAKER_SET_TARGET_TEMPERATURE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Waiting for Heater-Shaker to reach target temperature", + "legacyCommandType": "command.HEATER_SHAKER_WAIT_FOR_TEMPERATURE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Opening Thermocycler lid", + "legacyCommandType": "command.THERMOCYCLER_OPEN" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Closing Thermocycler lid", + "legacyCommandType": "command.THERMOCYCLER_CLOSE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Thermocycler lid temperature to 38.0 °C", + "legacyCommandType": "command.THERMOCYCLER_SET_LID_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Thermocycler well block temperature to 28.0 °C with a hold time of 5 seconds", + "legacyCommandType": "command.THERMOCYCLER_SET_BLOCK_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Deactivating Thermocycler well block heating", + "legacyCommandType": "command.THERMOCYCLER_DEACTIVATE_BLOCK" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Deactivating Thermocycler lid heating", + "legacyCommandType": "command.THERMOCYCLER_DEACTIVATE_LID" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Opening Thermocycler lid", + "legacyCommandType": "command.THERMOCYCLER_OPEN" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Deactivating Shaker", + "legacyCommandType": "command.HEATER_SHAKER_DEACTIVATE_SHAKER" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "This is a pause" + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Heater-Shaker to Shake at 350 RPM and waiting until reached", + "legacyCommandType": "command.HEATER_SHAKER_SET_AND_WAIT_FOR_SHAKE_SPEED" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 5.0 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Deactivating Shaker", + "legacyCommandType": "command.HEATER_SHAKER_DEACTIVATE_SHAKER" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 11.34, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 13 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "OT2_P300M_P20S_TC_HS_TM_2_13_SmokeTestV3.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "4" + } + }, + { + "definitionUri": "opentrons/opentrons_96_aluminumblock_nest_wellplate_100ul/1", + "displayName": "Temperature-Controlled plate", + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt/1", + "loadName": "opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "custom_beta/cpx_4_tuberack_100ul/1", + "displayName": "4 tubes", + "loadName": "cpx_4_tuberack_100ul", + "location": { + "slotName": "6" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", + "displayName": "logo destination", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "2" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + } + } + ], + "liquids": [], + "metadata": { + "author": "Opentrons Engineering ", + "description": "Description of the protocol that is longish \n has \n returns and \n emoji 😊 ⬆️ ", + "protocolName": "🛠️ 2.13 Smoke Test V3 🪄", + "source": "Software Testing Team" + }, + "modules": [ + { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + }, + { + "location": { + "slotName": "9" + }, + "model": "temperatureModuleV2" + }, + { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV2" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + { + "mount": "right", + "pipetteName": "p20_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2251879791][OT2_P300M_P20S_None_2_12_FailOnRun].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2251879791][OT2_P300M_P20S_None_2_12_FailOnRun].json new file mode 100644 index 00000000000..44943a3a477 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2251879791][OT2_P300M_P20S_None_2_12_FailOnRun].json @@ -0,0 +1,2656 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "one comment", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 12 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "OT2_P300M_P20S_None_2_12_FailOnRun.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "1" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "2" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + } + } + ], + "liquids": [], + "metadata": { + "apiLevel": "2.12", + "author": "Opentrons Engineering ", + "description": "A single comment", + "protocolName": "Will fail on run", + "source": "Software Testing Team" + }, + "modules": [], + "pipettes": [ + { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + { + "mount": "left", + "pipetteName": "p300_multi_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[240b279ac3][OT2_P300S_Thermocycler_Moam_Error].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[240b279ac3][OT2_P300S_Thermocycler_Moam_Error].json new file mode 100644 index 00000000000..8d1f181519f --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[240b279ac3][OT2_P300S_Thermocycler_Moam_Error].json @@ -0,0 +1,2758 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p300_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 108.96, + "lidHeight": 61.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 5.6 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.6 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 68.8, + "z": 108.96 + }, + "model": "thermocyclerModuleV2", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot3_standard": { + "B1": { + "cornerOffsetFromSlot": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ], + "labwareOffset": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "thermocyclerModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 11 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "DeckConflictError [line 19]: thermocyclerModuleV2 in slot 7 prevents thermocyclerModuleV1 from using slot 7.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "opentrons.motion_planning.deck_conflict.DeckConflictError: thermocyclerModuleV2 in slot 7 prevents thermocyclerModuleV1 from using slot 7.", + "errorCode": "4000", + "errorInfo": { + "args": "('thermocyclerModuleV2 in slot 7 prevents thermocyclerModuleV1 from using slot 7.',)", + "class": "DeckConflictError", + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 69, in run_python\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"OT2_P300S_Thermocycler_Moam_Error.py\", line 19, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 818, in load_module\n module_core = self._core.load_module(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/legacy/legacy_protocol_core.py\", line 335, in load_module\n self._deck_layout[resolved_location] = geometry\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/legacy/deck.py\", line 186, in __setitem__\n deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/motion_planning/deck_conflict.py\", line 211, in check\n raise DeckConflictError(\n" + }, + "errorType": "PythonException", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "OT2_P300S_Thermocycler_Moam_Error.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "2" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + } + ], + "liquids": [], + "metadata": { + "apiLevel": "2.11" + }, + "modules": [ + { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV2" + } + ], + "pipettes": [ + { + "mount": "right", + "pipetteName": "p300_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[25f79fd65e][Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol3].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[25f79fd65e][Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol3].json new file mode 100644 index 00000000000..5dd0f2c0346 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[25f79fd65e][Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol3].json @@ -0,0 +1,625 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_1_reservoir_290ml", + "location": { + "addressableAreaName": "C4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360206", + "360266" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.47, + "zDimension": 44.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 1 Well Reservoir 290 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_1_reservoir_290ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.55, + "shape": "rectangular", + "totalLiquidVolume": 290000, + "x": 63.88, + "xDimension": 106.8, + "y": 42.74, + "yDimension": 71.2, + "z": 4.85 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "C3" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "DeckConflictError [line 17]: nest_1_reservoir_290ml in slot C4 prevents temperatureModuleV2 from using slot C3.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "opentrons.motion_planning.deck_conflict.DeckConflictError: nest_1_reservoir_290ml in slot C4 prevents temperatureModuleV2 from using slot C3.", + "errorCode": "4000", + "errorInfo": { + "args": "('nest_1_reservoir_290ml in slot C4 prevents temperatureModuleV2 from using slot C3.',)", + "class": "DeckConflictError", + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 69, in run_python\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol3.py\", line 17, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 818, in load_module\n module_core = self._core.load_module(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/protocol.py\", line 435, in load_module\n deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/deck_conflict.py\", line 190, in check\n wrapped_deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/motion_planning/deck_conflict.py\", line 224, in check\n raise DeckConflictError(\n" + }, + "errorType": "PythonException", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol3.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/nest_1_reservoir_290ml/1", + "loadName": "nest_1_reservoir_290ml", + "location": { + "addressableAreaName": "C4" + } + } + ], + "liquids": [], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Analysis Error - Module in Staging Area Column 3" + }, + "modules": [ + { + "location": { + "slotName": "C3" + }, + "model": "temperatureModuleV2" + } + ], + "pipettes": [], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2a185c4e1c][Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_Smoke].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2a185c4e1c][Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_Smoke].json new file mode 100644 index 00000000000..f363e79201f --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2a185c4e1c][Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_Smoke].json @@ -0,0 +1,12674 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "B1" + }, + "model": "thermocyclerModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 108.96, + "lidHeight": 61.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 5.6 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.6 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 68.8, + "z": 108.96 + }, + "model": "thermocyclerModuleV2", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot3_standard": { + "B1": { + "cornerOffsetFromSlot": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ], + "labwareOffset": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "thermocyclerModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 45.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Magnetic Block GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 0.0, + "z": 38.0 + }, + "model": "magneticBlockV1", + "moduleType": "magneticBlockType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": {}, + "ot2_standard": {}, + "ot3_standard": {} + } + }, + "model": "magneticBlockV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "A3" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "D1" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_well_aluminum_block", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 18.16 + }, + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + } + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons 96 Well Aluminum Block", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_well_aluminum_block", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 74.24, + "z": 3.38 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 74.24, + "z": 3.38 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 74.24, + "z": 3.38 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 74.24, + "z": 3.38 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 74.24, + "z": 3.38 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 74.24, + "z": 3.38 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 74.24, + "z": 3.38 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 74.24, + "z": 3.38 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 74.24, + "z": 3.38 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 74.24, + "z": 3.38 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 74.24, + "z": 3.38 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 74.24, + "z": 3.38 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 65.24, + "z": 3.38 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 65.24, + "z": 3.38 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 65.24, + "z": 3.38 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 65.24, + "z": 3.38 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 65.24, + "z": 3.38 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 65.24, + "z": 3.38 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 65.24, + "z": 3.38 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 65.24, + "z": 3.38 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 65.24, + "z": 3.38 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 65.24, + "z": 3.38 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 65.24, + "z": 3.38 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 65.24, + "z": 3.38 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 56.24, + "z": 3.38 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 56.24, + "z": 3.38 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 56.24, + "z": 3.38 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 56.24, + "z": 3.38 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 56.24, + "z": 3.38 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 56.24, + "z": 3.38 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 56.24, + "z": 3.38 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 56.24, + "z": 3.38 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 56.24, + "z": 3.38 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 56.24, + "z": 3.38 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 56.24, + "z": 3.38 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 56.24, + "z": 3.38 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 47.24, + "z": 3.38 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 47.24, + "z": 3.38 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 47.24, + "z": 3.38 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 47.24, + "z": 3.38 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 47.24, + "z": 3.38 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 47.24, + "z": 3.38 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 47.24, + "z": 3.38 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 47.24, + "z": 3.38 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 47.24, + "z": 3.38 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 47.24, + "z": 3.38 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 47.24, + "z": 3.38 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 47.24, + "z": 3.38 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 38.24, + "z": 3.38 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 38.24, + "z": 3.38 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 38.24, + "z": 3.38 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 38.24, + "z": 3.38 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 38.24, + "z": 3.38 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 38.24, + "z": 3.38 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 38.24, + "z": 3.38 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 38.24, + "z": 3.38 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 38.24, + "z": 3.38 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 38.24, + "z": 3.38 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 38.24, + "z": 3.38 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 38.24, + "z": 3.38 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 29.24, + "z": 3.38 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 29.24, + "z": 3.38 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 29.24, + "z": 3.38 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 29.24, + "z": 3.38 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 29.24, + "z": 3.38 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 29.24, + "z": 3.38 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 29.24, + "z": 3.38 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 29.24, + "z": 3.38 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 29.24, + "z": 3.38 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 29.24, + "z": 3.38 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 29.24, + "z": 3.38 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 29.24, + "z": 3.38 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 20.24, + "z": 3.38 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 20.24, + "z": 3.38 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 20.24, + "z": 3.38 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 20.24, + "z": 3.38 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 20.24, + "z": 3.38 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 20.24, + "z": 3.38 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 20.24, + "z": 3.38 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 20.24, + "z": 3.38 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 20.24, + "z": 3.38 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 20.24, + "z": 3.38 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 20.24, + "z": 3.38 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 20.24, + "z": 3.38 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 11.24, + "z": 3.38 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 11.24, + "z": 3.38 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 11.24, + "z": 3.38 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 11.24, + "z": 3.38 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 11.24, + "z": 3.38 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 11.24, + "z": 3.38 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 11.24, + "z": 3.38 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 11.24, + "z": 3.38 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 11.24, + "z": 3.38 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 11.24, + "z": 3.38 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 11.24, + "z": 3.38 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 11.24, + "z": 3.38 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_pcr_adapter", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 8.5, + "y": 5.5, + "z": 0 + }, + "dimensions": { + "xDimension": 111, + "yDimension": 75, + "zDimension": 13.85 + }, + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + } + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons 96 PCR Heater-Shaker Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_pcr_adapter", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 69, + "z": 1.85 + }, + "A10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 69, + "z": 1.85 + }, + "A11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 69, + "z": 1.85 + }, + "A12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 69, + "z": 1.85 + }, + "A2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 69, + "z": 1.85 + }, + "A3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 69, + "z": 1.85 + }, + "A4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 69, + "z": 1.85 + }, + "A5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 69, + "z": 1.85 + }, + "A6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 69, + "z": 1.85 + }, + "A7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 69, + "z": 1.85 + }, + "A8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 69, + "z": 1.85 + }, + "A9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 69, + "z": 1.85 + }, + "B1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 60, + "z": 1.85 + }, + "B10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 60, + "z": 1.85 + }, + "B11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 60, + "z": 1.85 + }, + "B12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 60, + "z": 1.85 + }, + "B2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 60, + "z": 1.85 + }, + "B3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 60, + "z": 1.85 + }, + "B4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 60, + "z": 1.85 + }, + "B5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 60, + "z": 1.85 + }, + "B6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 60, + "z": 1.85 + }, + "B7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 60, + "z": 1.85 + }, + "B8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 60, + "z": 1.85 + }, + "B9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 60, + "z": 1.85 + }, + "C1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 51, + "z": 1.85 + }, + "C10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 51, + "z": 1.85 + }, + "C11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 51, + "z": 1.85 + }, + "C12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 51, + "z": 1.85 + }, + "C2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 51, + "z": 1.85 + }, + "C3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 51, + "z": 1.85 + }, + "C4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 51, + "z": 1.85 + }, + "C5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 51, + "z": 1.85 + }, + "C6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 51, + "z": 1.85 + }, + "C7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 51, + "z": 1.85 + }, + "C8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 51, + "z": 1.85 + }, + "C9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 51, + "z": 1.85 + }, + "D1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 42, + "z": 1.85 + }, + "D10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 42, + "z": 1.85 + }, + "D11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 42, + "z": 1.85 + }, + "D12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 42, + "z": 1.85 + }, + "D2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 42, + "z": 1.85 + }, + "D3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 42, + "z": 1.85 + }, + "D4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 42, + "z": 1.85 + }, + "D5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 42, + "z": 1.85 + }, + "D6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 42, + "z": 1.85 + }, + "D7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 42, + "z": 1.85 + }, + "D8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 42, + "z": 1.85 + }, + "D9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 42, + "z": 1.85 + }, + "E1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 33, + "z": 1.85 + }, + "E10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 33, + "z": 1.85 + }, + "E11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 33, + "z": 1.85 + }, + "E12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 33, + "z": 1.85 + }, + "E2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 33, + "z": 1.85 + }, + "E3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 33, + "z": 1.85 + }, + "E4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 33, + "z": 1.85 + }, + "E5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 33, + "z": 1.85 + }, + "E6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 33, + "z": 1.85 + }, + "E7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 33, + "z": 1.85 + }, + "E8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 33, + "z": 1.85 + }, + "E9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 33, + "z": 1.85 + }, + "F1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 24, + "z": 1.85 + }, + "F10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 24, + "z": 1.85 + }, + "F11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 24, + "z": 1.85 + }, + "F12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 24, + "z": 1.85 + }, + "F2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 24, + "z": 1.85 + }, + "F3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 24, + "z": 1.85 + }, + "F4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 24, + "z": 1.85 + }, + "F5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 24, + "z": 1.85 + }, + "F6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 24, + "z": 1.85 + }, + "F7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 24, + "z": 1.85 + }, + "F8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 24, + "z": 1.85 + }, + "F9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 24, + "z": 1.85 + }, + "G1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 15, + "z": 1.85 + }, + "G10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 15, + "z": 1.85 + }, + "G11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 15, + "z": 1.85 + }, + "G12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 15, + "z": 1.85 + }, + "G2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 15, + "z": 1.85 + }, + "G3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 15, + "z": 1.85 + }, + "G4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 15, + "z": 1.85 + }, + "G5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 15, + "z": 1.85 + }, + "G6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 15, + "z": 1.85 + }, + "G7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 15, + "z": 1.85 + }, + "G8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 15, + "z": 1.85 + }, + "G9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 15, + "z": 1.85 + }, + "H1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 6, + "z": 1.85 + }, + "H10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 6, + "z": 1.85 + }, + "H11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 6, + "z": 1.85 + }, + "H12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 6, + "z": 1.85 + }, + "H2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 6, + "z": 1.85 + }, + "H3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 6, + "z": 1.85 + }, + "H4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 6, + "z": 1.85 + }, + "H5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 6, + "z": 1.85 + }, + "H6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 6, + "z": 1.85 + }, + "H7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 6, + "z": 1.85 + }, + "H8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 6, + "z": 1.85 + }, + "H9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 6, + "z": 1.85 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_1_reservoir_290ml", + "location": { + "slotName": "D2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360206", + "360266" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.47, + "zDimension": 44.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 1 Well Reservoir 290 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_1_reservoir_290ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.55, + "shape": "rectangular", + "totalLiquidVolume": 290000, + "x": 63.88, + "xDimension": 106.8, + "y": 42.74, + "yDimension": 71.2, + "z": 4.85 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "A2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons Flex 96 Tip Rack Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_flex_96_tiprack_adapter", + "quirks": [ + "tiprackAdapterFor96Channel" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": {} + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": { + "slotName": "C3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": { + "addressableAreaName": "C4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p1000_96" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 29000.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "configureNozzleLayout", + "params": { + "configurationParams": { + "primaryNozzle": "A12", + "style": "COLUMN" + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashB3", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 466.25, + "y": 257.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashB3", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 402.25, + "y": 257.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashB3", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 466.25, + "y": 257.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashB3", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 402.25, + "y": 257.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashB3", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 466.25, + "y": 257.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashB3", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 402.25, + "y": 257.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashB3", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 466.25, + "y": 257.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashB3", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 402.25, + "y": 257.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashB3", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 466.25, + "y": 257.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashB3", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 402.25, + "y": 257.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashB3", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 466.25, + "y": 257.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashB3", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 402.25, + "y": 257.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "configureNozzleLayout", + "params": { + "configurationParams": { + "style": "ALL" + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 395.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 29.999999999999993 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 74.39999999999998 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 995.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 29.999999999999993 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 74.39999999999998 + }, + "volume": 995.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableArea", + "params": { + "addressableAreaName": "96ChannelWasteChute", + "forceDirect": false, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "stayAtHighestPossibleZ": false + }, + "result": { + "position": { + "x": 391.945, + "y": 10.585, + "z": 114.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowOutInPlace", + "params": { + "flowRate": 80.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 29.999999999999993 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 74.39999999999998 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 995.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 29.999999999999993 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 74.39999999999998 + }, + "volume": 995.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashB3", + "alternateDropLocation": false, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 434.25, + "y": 257.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowOutInPlace", + "params": { + "flowRate": 80.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "pushOut": 0.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "pushOut": 0.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "pushOut": 0.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "pushOut": 0.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 395.38, + "z": 90.88 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": "offDeck", + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 395.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "pushOut": 0.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "pushOut": 0.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashB3", + "alternateDropLocation": false, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 434.25, + "y": 257.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowOutInPlace", + "params": { + "flowRate": 80.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 395.38, + "z": 90.88 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": "offDeck", + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "B2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "B2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "C4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "C4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "B2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "B2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "C4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "C4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "B2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "B2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "C4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "C4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "B2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "B2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "C4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "C4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "B2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "B2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "C4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "C4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "B2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "B2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "C4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "C4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "B2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "B2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "C4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "C4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/closeLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetBlockTemperature", + "params": { + "celsius": 75.0, + "holdTimeSeconds": 5.0 + }, + "result": { + "targetBlockTemperature": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForBlockTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetLidTemperature", + "params": { + "celsius": 80.0 + }, + "result": { + "targetLidTemperature": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForLidTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/deactivateBlock", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/deactivateLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setTargetTemperature", + "params": { + "celsius": 75.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1000.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/waitForTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateHeater", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "temperatureModule/setTargetTemperature", + "params": { + "celsius": 80.0 + }, + "result": { + "targetTemperature": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "temperatureModule/waitForTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "temperatureModule/setTargetTemperature", + "params": { + "celsius": 10.0 + }, + "result": { + "targetTemperature": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "temperatureModule/waitForTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "temperatureModule/deactivate", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_Smoke.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_96_well_aluminum_block/1", + "loadName": "opentrons_96_well_aluminum_block", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_96_pcr_adapter/1", + "loadName": "opentrons_96_pcr_adapter", + "location": {} + }, + { + "definitionUri": "opentrons/nest_1_reservoir_290ml/1", + "loadName": "nest_1_reservoir_290ml", + "location": { + "addressableAreaName": "D4" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_adapter/1", + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "A2" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + } + ], + "liquids": [ + { + "description": "High Quality H₂O", + "displayColor": "#42AB2D", + "displayName": "water" + } + ], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - MEGAAA PROTOCOL - LETS BREAK, I MEAN TEST, EVERYTHING!!!!!" + }, + "modules": [ + { + "location": { + "slotName": "B1" + }, + "model": "thermocyclerModuleV2" + }, + { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + }, + { + "location": { + "slotName": "A3" + }, + "model": "heaterShakerModuleV1" + }, + { + "location": { + "slotName": "D1" + }, + "model": "temperatureModuleV2" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p1000_96" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2a32a763f5][Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModules].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2a32a763f5][Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModules].json new file mode 100644 index 00000000000..e1749edf244 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2a32a763f5][Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModules].json @@ -0,0 +1,11165 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "B2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "C3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons Flex 96 Tip Rack Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_flex_96_tiprack_adapter", + "quirks": [ + "tiprackAdapterFor96Channel" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": {} + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "D2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons Flex 96 Tip Rack Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_flex_96_tiprack_adapter", + "quirks": [ + "tiprackAdapterFor96Channel" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": {} + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": { + "addressableAreaName": "C4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": { + "addressableAreaName": "D4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p1000_96" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableArea", + "params": { + "addressableAreaName": "96ChannelWasteChute", + "forceDirect": false, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "stayAtHighestPossibleZ": false + }, + "result": { + "position": { + "x": 391.945, + "y": 10.585, + "z": 114.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashC1", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 54.25, + "y": 150.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableArea", + "params": { + "addressableAreaName": "96ChannelWasteChute", + "forceDirect": false, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "stayAtHighestPossibleZ": false + }, + "result": { + "position": { + "x": 391.945, + "y": 10.585, + "z": 114.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashD1", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 54.25, + "y": 43.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableArea", + "params": { + "addressableAreaName": "96ChannelWasteChute", + "forceDirect": false, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "stayAtHighestPossibleZ": false + }, + "result": { + "position": { + "x": 391.945, + "y": 10.585, + "z": 114.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableArea", + "params": { + "addressableAreaName": "96ChannelWasteChute", + "forceDirect": false, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "stayAtHighestPossibleZ": false + }, + "result": { + "position": { + "x": 391.945, + "y": 10.585, + "z": 114.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModules.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_adapter/1", + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "C3" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_adapter/1", + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "D2" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + } + ], + "liquids": [ + { + "description": "High Quality H₂O", + "displayColor": "#42AB2D", + "displayName": "water" + }, + { + "description": "C₃H₆O", + "displayColor": "#38588a", + "displayName": "acetone" + } + ], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Deck Configuration 1 - No Modules" + }, + "modules": [], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p1000_96" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2dbe35fede][Flex_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2dbe35fede][Flex_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right].json new file mode 100644 index 00000000000..85a635a8d6d --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2dbe35fede][Flex_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right].json @@ -0,0 +1,95783 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "THIS IS A REACTION RUN", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "THIS IS A NO MODULE RUN", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "D1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "D3" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "C1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_200ul", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_200ul", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "C3" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "B1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_200ul", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "B2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_200ul", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "B3" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "A1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_200ul", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "A2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_200ul", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p1000_single_flex" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Adding Dye Sample Plate 1", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 342.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 342.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 342.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 342.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 342.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 342.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 342.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 351.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 351.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 351.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 351.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 351.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 351.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 351.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 360.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 360.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 360.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 360.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 360.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 360.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 360.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 369.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 369.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 369.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 369.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 369.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 369.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 369.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 378.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 378.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 378.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 378.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 378.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 378.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 378.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 387.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 387.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 387.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 387.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 387.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 387.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 387.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 396.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 396.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 396.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 396.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 396.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 396.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 396.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 405.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 405.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 405.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 405.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 405.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 405.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 405.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 414.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 414.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 414.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 414.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 414.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 414.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 414.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 423.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 423.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 423.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 423.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 423.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 423.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 423.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 432.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 432.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 432.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 432.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 432.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 432.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 432.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 441.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 441.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 441.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 441.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 441.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 441.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 441.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Adding Diluent Sample Plate 1", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 14.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 342.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 14.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 14.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 342.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 14.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 14.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 342.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 14.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 14.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 342.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 14.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 14.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 342.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 14.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 14.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 342.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 14.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 14.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 342.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 14.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 23.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 351.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 23.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 23.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 351.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 23.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 23.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 351.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 23.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 23.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 351.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 23.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 23.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 351.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 23.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 23.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 351.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 23.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 23.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 351.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 23.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 32.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 360.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 32.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 32.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 360.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 32.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 32.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 360.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 32.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 32.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 360.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 32.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 32.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 360.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 32.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 32.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 360.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 32.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 32.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 360.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 32.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 41.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 369.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 41.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 41.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 369.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 41.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 41.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 369.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 41.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 41.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 369.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 41.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 41.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 369.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 41.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 41.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 369.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 41.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 41.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 369.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 41.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 50.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 378.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 50.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 50.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 378.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 50.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 50.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 378.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 50.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 50.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 378.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 50.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 50.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 378.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 50.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 50.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 378.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 50.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 50.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 378.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 50.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 59.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 387.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 59.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 59.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 387.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 59.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 59.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 387.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 59.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 59.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 387.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 59.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 59.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 387.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 59.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 59.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 387.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 59.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 59.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 387.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 59.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 68.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 396.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 68.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 68.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 396.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 68.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 68.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 396.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 68.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 68.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 396.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 68.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 68.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 396.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 68.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 68.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 396.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 68.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 68.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 396.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 68.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 77.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 405.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 77.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 77.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 405.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 77.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 77.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 405.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 77.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 77.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 405.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 77.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 77.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 405.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 77.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 77.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 405.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 77.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 77.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 405.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 77.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 86.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 414.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 86.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 86.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 414.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 86.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 86.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 414.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 86.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 86.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 414.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 86.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 86.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 414.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 86.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 86.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 414.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 86.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 86.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 414.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 86.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 95.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 423.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 95.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 95.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 423.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 95.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 95.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 423.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 95.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 95.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 423.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 95.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 95.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 423.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 95.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 95.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 423.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 95.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 95.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 423.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 95.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 104.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 432.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 104.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 104.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 432.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 104.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 104.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 432.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 104.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 104.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 432.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 104.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 104.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 432.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 104.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 104.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 432.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 104.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 104.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 432.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 104.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 113.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 441.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 113.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 113.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 441.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 113.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 113.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 441.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 113.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 113.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 441.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 113.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 113.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 441.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 113.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 113.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 441.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 113.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 113.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 441.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 113.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Adding Dye Sample Plate 2", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 342.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 342.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 342.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 342.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 342.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 342.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 342.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 351.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 351.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 351.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 351.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 351.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 351.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 351.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 360.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 360.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 360.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 360.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 360.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 360.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 360.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 369.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 369.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 369.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 369.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 369.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 369.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 369.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 378.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 378.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 378.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 378.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 378.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 378.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 378.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 387.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 387.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 387.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 387.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 387.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 387.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 387.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 396.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 396.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 396.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 396.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 396.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 396.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 396.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 405.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 405.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 405.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 405.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 405.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 405.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 405.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 414.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 414.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 414.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 414.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 414.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 414.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 414.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 423.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 423.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 423.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 423.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 423.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 423.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 423.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 432.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 432.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 432.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 432.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 432.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 432.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 432.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 441.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 441.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 441.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 441.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 441.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 441.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 441.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Adding Diluent Sample Plate 2", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 178.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 342.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 178.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 178.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 342.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 178.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 178.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 342.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 178.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 178.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 342.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 178.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 178.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 342.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 178.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 178.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 342.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 178.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 178.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 342.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 178.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 187.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 351.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 187.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 187.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 351.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 187.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 187.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 351.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 187.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 187.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 351.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 187.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 187.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 351.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 187.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 187.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 351.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 187.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 187.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 351.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 187.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 196.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 360.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 196.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 196.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 360.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 196.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 196.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 360.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 196.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 196.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 360.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 196.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 196.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 360.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 196.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 196.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 360.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 196.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 196.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 360.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 196.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 205.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 369.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 205.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 205.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 369.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 205.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 205.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 369.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 205.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 205.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 369.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 205.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 205.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 369.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 205.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 205.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 369.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 205.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 205.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 369.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 205.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 214.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 378.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 214.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 214.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 378.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 214.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 214.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 378.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 214.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 214.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 378.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 214.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 214.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 378.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 214.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 214.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 378.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 214.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 214.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 378.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 214.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 223.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 387.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 223.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 223.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 387.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 223.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 223.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 387.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 223.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 223.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 387.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 223.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 223.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 387.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 223.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 223.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 387.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 223.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 223.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 387.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 223.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 232.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 396.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 232.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 232.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 396.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 232.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 232.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 396.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 232.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 232.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 396.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 232.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 232.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 396.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 232.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 232.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 396.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 232.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 232.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 396.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 232.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 241.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 405.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 241.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 241.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 405.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 241.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 241.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 405.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 241.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 241.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 405.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 241.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 241.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 405.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 241.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 241.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 405.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 241.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 241.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 405.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 241.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 250.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 414.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 250.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 250.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 414.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 250.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 250.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 414.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 250.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 250.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 414.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 250.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 250.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 414.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 250.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 250.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 414.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 250.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 250.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 414.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 250.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 259.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 423.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 259.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 259.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 423.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 259.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 259.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 423.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 259.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 259.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 423.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 259.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 259.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 423.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 259.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 259.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 423.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 259.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 259.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 423.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 259.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 268.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 432.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 268.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 268.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 432.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 268.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 268.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 432.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 268.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 268.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 432.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 268.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 268.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 432.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 268.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 268.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 432.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 268.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 268.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 432.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 268.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 277.38, + "y": 172.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 441.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 277.38, + "y": 172.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 277.38, + "y": 163.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 441.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 277.38, + "y": 163.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 277.38, + "y": 154.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 441.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 277.38, + "y": 154.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 277.38, + "y": 145.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 441.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 277.38, + "y": 145.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 277.38, + "y": 136.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 441.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 277.38, + "y": 136.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 277.38, + "y": 127.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 441.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 277.38, + "y": 127.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 277.38, + "y": 118.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 441.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 277.38, + "y": 118.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Adding Dye Sample Plate 3", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 342.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 342.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 342.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 342.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 342.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 342.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 342.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 351.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 351.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 351.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 351.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 351.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 351.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 351.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 360.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 360.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 360.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 360.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 360.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 360.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 360.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 369.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 369.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 369.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 369.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 369.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 369.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 369.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 378.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 378.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 378.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 378.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 378.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 378.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 378.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 387.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 387.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 387.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 387.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 387.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 387.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 387.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 396.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 396.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 396.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 396.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 396.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 396.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 396.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 405.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 405.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 405.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 405.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 405.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 405.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 405.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 414.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 414.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 414.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 414.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 414.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 414.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 414.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 423.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 423.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 423.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 423.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 423.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 423.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 423.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 432.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 432.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 432.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 432.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 432.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 432.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 432.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 441.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 441.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 441.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 441.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 441.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 441.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 441.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Adding Diluent Sample Plate 3", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 14.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 342.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 14.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 14.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 342.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 14.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 14.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 342.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 14.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 14.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 342.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 14.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 14.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 342.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 14.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 14.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 342.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 14.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 14.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 342.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 14.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 23.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 351.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 23.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 23.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 351.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 23.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 23.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 351.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 23.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 23.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 351.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 23.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 23.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 351.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 23.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 23.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 351.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 23.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 23.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 351.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 23.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 32.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 360.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 32.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 32.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 360.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 32.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 32.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 360.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 32.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 32.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 360.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 32.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 32.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 360.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 32.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 32.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 360.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 32.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 32.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 360.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 32.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 41.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 369.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 41.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 41.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 369.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 41.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 41.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 369.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 41.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 41.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 369.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 41.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 41.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 369.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 41.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 41.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 369.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 41.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 41.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 369.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 41.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 50.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 378.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 50.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 50.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 378.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 50.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 50.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 378.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 50.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 50.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 378.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 50.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 50.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 378.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 50.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 50.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 378.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 50.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 50.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 378.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 50.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 59.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 387.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 59.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 59.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 387.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 59.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 59.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 387.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 59.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 59.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 387.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 59.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 59.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 387.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 59.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 59.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 387.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 59.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 59.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 387.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 59.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 68.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 396.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 68.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 68.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 396.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 68.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 68.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 396.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 68.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 68.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 396.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 68.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 68.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 396.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 68.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 68.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 396.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 68.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 68.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 396.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 68.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 77.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 405.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 77.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 77.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 405.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 77.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 77.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 405.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 77.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 77.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 405.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 77.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 77.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 405.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 77.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 77.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 405.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 77.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 77.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 405.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 77.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 86.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 414.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 86.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 86.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 414.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 86.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 86.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 414.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 86.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 86.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 414.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 86.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 86.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 414.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 86.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 86.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 414.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 86.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 86.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 414.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 86.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 95.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 423.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 95.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 95.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 423.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 95.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 95.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 423.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 95.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 95.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 423.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 95.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 95.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 423.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 95.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 95.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 423.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 95.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 95.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 423.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 95.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 104.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 432.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 104.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 104.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 432.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 104.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 104.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 432.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 104.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 104.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 432.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 104.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 104.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 432.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 104.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 104.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 432.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 104.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 104.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 432.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 104.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 113.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 441.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 113.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 113.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 441.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 113.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 113.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 441.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 113.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 113.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 441.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 113.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 113.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 441.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 113.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 113.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 441.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 113.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 113.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 441.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 113.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Adding Dye Sample Plate 1", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 342.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 342.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 342.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 342.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 342.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 342.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 342.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 351.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 351.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 351.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 351.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 351.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 351.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 351.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 360.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 360.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 360.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 360.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 360.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 360.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 360.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 369.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 369.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 369.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 369.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 369.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 369.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 369.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 378.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 378.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 378.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 378.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 378.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 378.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 378.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 387.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 387.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 387.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 387.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 387.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 387.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 387.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 396.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 396.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 396.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 396.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 396.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 396.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 396.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 405.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 405.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 405.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 405.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 405.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 405.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 405.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 414.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 414.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 414.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 414.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 414.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 414.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 414.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 423.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 423.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 423.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 423.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 423.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 423.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 423.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 432.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 432.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 432.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 432.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 432.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 432.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 432.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 16.7 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 441.38, + "y": 65.24, + "z": 16.7 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 441.38, + "y": 56.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 441.38, + "y": 47.24, + "z": 16.7 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 441.38, + "y": 38.24, + "z": 16.7 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 441.38, + "y": 29.24, + "z": 16.7 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 441.38, + "y": 20.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 441.38, + "y": 11.24, + "z": 16.7 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Adding Diluent Sample Plate 1", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 178.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 342.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 178.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 178.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 342.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 178.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 178.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 342.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 178.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 178.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 342.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 178.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 178.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 342.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 178.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 178.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 342.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 178.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 178.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 342.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 178.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 187.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 351.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 187.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 187.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 351.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 187.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 187.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 351.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 187.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 187.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 351.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 187.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 187.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 351.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 187.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 187.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 351.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 187.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 187.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 351.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 187.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 196.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 360.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 196.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 196.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 360.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 196.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 196.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 360.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 196.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 196.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 360.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 196.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 196.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 360.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 196.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 196.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 360.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 196.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 196.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 360.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 196.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 205.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 369.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 205.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 205.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 369.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 205.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 205.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 369.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 205.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 205.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 369.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 205.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 205.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 369.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 205.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 205.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 369.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 205.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 205.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 369.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 205.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 214.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 378.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 214.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 214.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 378.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 214.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 214.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 378.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 214.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 214.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 378.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 214.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 214.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 378.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 214.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 214.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 378.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 214.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 214.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 378.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 214.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 223.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 387.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 223.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 223.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 387.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 223.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 223.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 387.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 223.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 223.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 387.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 223.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 223.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 387.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 223.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 223.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 387.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 223.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 223.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 387.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 223.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 232.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 396.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 232.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 232.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 396.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 232.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 232.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 396.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 232.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 232.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 396.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 232.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 232.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 396.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 232.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 232.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 396.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 232.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 232.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 396.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 232.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 241.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 405.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 241.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 241.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 405.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 241.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 241.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 405.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 241.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 241.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 405.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 241.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 241.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 405.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 241.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 241.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 405.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 241.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 241.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 405.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 241.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 250.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 414.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 250.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 250.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 414.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 250.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 250.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 414.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 250.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 250.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 414.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 250.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 250.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 414.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 250.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 250.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 414.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 250.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 250.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 414.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 250.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 259.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 423.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 259.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 259.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 423.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 259.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 259.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 423.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 259.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 259.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 423.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 259.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 259.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 423.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 259.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 259.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 423.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 259.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 259.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 423.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 259.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 268.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 432.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 268.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 268.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 432.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 268.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 268.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 432.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 268.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 268.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 432.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 268.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 268.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 432.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 268.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 268.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 432.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 268.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 268.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 432.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 268.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 15.899999999999999 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 277.38, + "y": 279.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 441.38, + "y": 65.24, + "z": 15.899999999999999 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 277.38, + "y": 279.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 277.38, + "y": 270.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 441.38, + "y": 56.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 277.38, + "y": 270.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 277.38, + "y": 261.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 441.38, + "y": 47.24, + "z": 15.899999999999999 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 277.38, + "y": 261.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 277.38, + "y": 252.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 441.38, + "y": 38.24, + "z": 15.899999999999999 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 277.38, + "y": 252.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 277.38, + "y": 243.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 441.38, + "y": 29.24, + "z": 15.899999999999999 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 277.38, + "y": 243.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 277.38, + "y": 234.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 441.38, + "y": 20.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 277.38, + "y": 234.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 277.38, + "y": 225.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 441.38, + "y": 11.24, + "z": 15.899999999999999 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 277.38, + "y": 225.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Adding Dye Sample Plate 2", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 342.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 342.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 342.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 342.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 342.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 342.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 342.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 351.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 351.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 351.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 351.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 351.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 351.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 351.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 360.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 360.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 360.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 360.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 360.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 360.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 360.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 369.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 369.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 369.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 369.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 369.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 369.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 369.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 378.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 378.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 378.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 378.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 378.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 378.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 378.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 387.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 387.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 387.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 387.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 387.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 387.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 387.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 396.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 396.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 396.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 396.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 396.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 396.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 396.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 405.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 405.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 405.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 405.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 405.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 405.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 405.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 414.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 414.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 414.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 414.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 414.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 414.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 414.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 423.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 423.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 423.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 423.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 423.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 423.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 423.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 432.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 432.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 432.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 432.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 432.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 432.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 432.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 181.24, + "z": 16.7 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 441.38, + "y": 172.24, + "z": 16.7 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 441.38, + "y": 163.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 441.38, + "y": 154.24, + "z": 16.7 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 441.38, + "y": 145.24, + "z": 16.7 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 441.38, + "y": 136.24, + "z": 16.7 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 441.38, + "y": 127.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 441.38, + "y": 118.24, + "z": 16.7 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Adding Diluent Sample Plate 2", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 14.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 342.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 14.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 14.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 342.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 14.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 14.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 342.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 14.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 14.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 342.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 14.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 14.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 342.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 14.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 14.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 342.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 14.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 14.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 342.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 14.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 23.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 351.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 23.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 23.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 351.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 23.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 23.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 351.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 23.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 23.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 351.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 23.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 23.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 351.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 23.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 23.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 351.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 23.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 23.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 351.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 23.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 32.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 360.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 32.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 32.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 360.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 32.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 32.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 360.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 32.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 32.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 360.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 32.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 32.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 360.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 32.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 32.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 360.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 32.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 32.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 360.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 32.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 41.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 369.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 41.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 41.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 369.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 41.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 41.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 369.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 41.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 41.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 369.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 41.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 41.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 369.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 41.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 41.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 369.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 41.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 41.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 369.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 41.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 50.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 378.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 50.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 50.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 378.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 50.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 50.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 378.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 50.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 50.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 378.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 50.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 50.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 378.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 50.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 50.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 378.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 50.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 50.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 378.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 50.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 59.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 387.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 59.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 59.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 387.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 59.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 59.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 387.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 59.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 59.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 387.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 59.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 59.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 387.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 59.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 59.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 387.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 59.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 59.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 387.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 59.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 68.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 396.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 68.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 68.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 396.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 68.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 68.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 396.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 68.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 68.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 396.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 68.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 68.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 396.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 68.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 68.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 396.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 68.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 68.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 396.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 68.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 77.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 405.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 77.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 77.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 405.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 77.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 77.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 405.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 77.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 77.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 405.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 77.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 77.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 405.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 77.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 77.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 405.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 77.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 77.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 405.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 77.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 86.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 414.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 86.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 86.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 414.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 86.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 86.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 414.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 86.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 86.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 414.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 86.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 86.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 414.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 86.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 86.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 414.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 86.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 86.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 414.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 86.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 95.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 423.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 95.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 95.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 423.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 95.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 95.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 423.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 95.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 95.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 423.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 95.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 95.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 423.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 95.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 95.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 423.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 95.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 95.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 423.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 95.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 104.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 432.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 104.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 104.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 432.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 104.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 104.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 432.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 104.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 104.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 432.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 104.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 104.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 432.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 104.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 104.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 432.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 104.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 104.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 432.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 104.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 181.24, + "z": 15.899999999999999 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 113.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 441.38, + "y": 172.24, + "z": 15.899999999999999 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 113.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 113.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 441.38, + "y": 163.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 113.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 113.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 441.38, + "y": 154.24, + "z": 15.899999999999999 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 113.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 113.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 441.38, + "y": 145.24, + "z": 15.899999999999999 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 113.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 113.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 441.38, + "y": 136.24, + "z": 15.899999999999999 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 113.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 113.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 441.38, + "y": 127.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 113.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 113.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 441.38, + "y": 118.24, + "z": 15.899999999999999 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 113.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Adding Dye Sample Plate 3", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 342.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 342.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 342.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 342.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 342.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 342.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 342.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 351.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 351.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 351.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 351.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 351.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 351.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 351.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 360.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 360.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 360.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 360.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 360.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 360.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 360.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 369.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 369.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 369.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 369.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 369.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 369.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 369.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 378.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 378.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 378.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 378.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 378.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 378.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 378.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 387.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 387.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 387.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 387.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 387.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 387.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 387.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 396.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 396.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 396.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 396.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 396.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 396.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 396.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 405.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 405.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 405.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 405.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 405.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 405.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 405.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 414.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 414.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 414.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 414.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 414.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 414.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 414.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 423.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 423.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 423.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 423.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 423.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 423.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 423.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 432.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 432.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 432.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 432.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 432.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 432.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 432.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 288.24, + "z": 16.7 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 441.38, + "y": 279.24, + "z": 16.7 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 441.38, + "y": 270.24, + "z": 16.7 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 441.38, + "y": 261.24, + "z": 16.7 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 441.38, + "y": 252.24, + "z": 16.7 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 441.38, + "y": 243.24, + "z": 16.7 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 441.38, + "y": 234.24, + "z": 16.7 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 441.38, + "y": 225.24, + "z": 16.7 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Adding Diluent Sample Plate 3", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 178.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 342.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 178.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 178.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 342.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 178.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 178.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 342.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 178.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 178.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 342.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 178.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 178.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 342.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 178.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 178.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 342.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 178.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 178.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 342.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 178.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 35.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 35.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 187.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 351.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 187.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 187.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 351.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 187.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 187.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 92.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 351.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 92.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 187.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 187.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 88.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 351.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 88.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 187.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 187.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 351.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 187.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 187.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 351.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 187.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 187.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 351.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 187.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 87.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 87.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 196.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 82.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 360.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 82.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 196.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 196.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 36.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 360.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 36.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 196.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 196.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 78.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 360.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 78.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 196.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 196.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 360.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 196.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 196.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 360.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 196.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 196.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 63.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 360.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 63.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 196.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 196.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 360.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 196.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 205.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 369.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 205.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 205.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 369.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 205.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 205.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 369.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 205.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 205.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 369.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 205.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 205.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 369.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 205.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 205.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 52.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 369.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 52.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 205.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 205.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 369.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 205.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 214.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 86.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 378.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 86.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 214.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 214.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 378.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 214.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 214.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 378.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 214.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 214.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 96.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 378.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 96.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 214.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 214.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 72.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 378.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 72.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 214.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 214.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 378.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 214.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 214.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 378.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 214.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 41.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 41.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 223.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 387.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 223.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 223.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 387.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 223.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 223.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 387.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 223.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 223.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 387.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 223.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 223.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 42.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 387.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 42.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 223.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 223.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 387.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 223.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 223.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 48.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 387.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 48.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 223.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 73.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 73.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 232.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 84.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 396.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 84.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 232.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 232.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 40.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 396.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 40.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 232.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 232.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 74.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 396.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 74.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 232.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 232.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 396.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 232.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 232.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 396.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 232.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 232.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 396.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 232.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 232.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 396.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 232.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 241.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 405.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 241.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 241.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 405.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 241.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 241.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 405.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 241.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 241.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 405.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 241.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 241.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 405.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 241.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 241.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 405.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 241.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 241.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 405.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 241.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 44.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 44.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 250.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 89.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 414.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 89.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 250.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 250.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 414.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C9" + }, + "result": { + "position": { + "x": 250.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 250.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 67.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 414.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 67.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D9" + }, + "result": { + "position": { + "x": 250.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 250.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 414.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 250.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 250.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 79.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 414.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 79.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 250.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 250.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 414.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G9" + }, + "result": { + "position": { + "x": 250.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 250.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 414.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H9" + }, + "result": { + "position": { + "x": 250.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 26.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 26.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 259.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 423.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 259.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 259.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 423.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C10" + }, + "result": { + "position": { + "x": 259.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 259.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 38.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 423.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D10" + }, + "result": { + "position": { + "x": 259.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 259.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 99.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 423.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 99.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E10" + }, + "result": { + "position": { + "x": 259.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 259.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 423.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 21.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F10" + }, + "result": { + "position": { + "x": 259.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 259.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 59.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 423.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 59.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G10" + }, + "result": { + "position": { + "x": 259.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 259.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 423.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H10" + }, + "result": { + "position": { + "x": 259.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 268.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 28.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 432.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 268.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 268.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 51.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 432.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 51.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 268.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 268.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 34.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 432.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 34.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D11" + }, + "result": { + "position": { + "x": 268.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 268.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 27.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 432.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 27.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 268.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 268.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 432.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F11" + }, + "result": { + "position": { + "x": 268.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 268.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 33.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 432.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 33.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G11" + }, + "result": { + "position": { + "x": 268.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 268.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 61.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 432.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 61.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 268.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 69.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 288.24, + "z": 15.899999999999999 + }, + "volume": 69.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 277.38, + "y": 386.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 47.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 441.38, + "y": 279.24, + "z": 15.899999999999999 + }, + "volume": 47.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 277.38, + "y": 386.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 277.38, + "y": 377.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 441.38, + "y": 270.24, + "z": 15.899999999999999 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 277.38, + "y": 377.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 277.38, + "y": 368.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 93.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 441.38, + "y": 261.24, + "z": 15.899999999999999 + }, + "volume": 93.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 277.38, + "y": 368.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 277.38, + "y": 359.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 54.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 441.38, + "y": 252.24, + "z": 15.899999999999999 + }, + "volume": 54.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 277.38, + "y": 359.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 277.38, + "y": 350.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 65.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 441.38, + "y": 243.24, + "z": 15.899999999999999 + }, + "volume": 65.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 277.38, + "y": 350.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 277.38, + "y": 341.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 441.38, + "y": 234.24, + "z": 15.899999999999999 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 277.38, + "y": 341.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 277.38, + "y": 332.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 47.85, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 37.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.1999999999999993 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 441.38, + "y": 225.24, + "z": 15.899999999999999 + }, + "volume": 37.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 277.38, + "y": 332.38, + "z": 57.5715 + } + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 15 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "Flex_P1000SRight_None_2_15_ABR_Simple_Normalize_Long_Right.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_3200ml_fixed/1", + "loadName": "opentrons_1_trash_3200ml_fixed", + "location": { + "slotName": "A3" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "D1" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "D3" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "C1" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "C2" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "C3" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "B1" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "B2" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "B3" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "A1" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "A2" + } + } + ], + "liquids": [], + "metadata": { + "author": "Opentrons Engineering ", + "description": "OT3 ABR Simple Normalize Long", + "protocolName": "OT3 ABR Simple Normalize Long", + "source": "Software Testing Team" + }, + "modules": [], + "pipettes": [ + { + "mount": "right", + "pipetteName": "p1000_single_flex" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3369b24214][Flex_P300Gen2_None_2_16_AnalysisError_OT2PipetteInFlexProtocol].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3369b24214][Flex_P300Gen2_None_2_16_AnalysisError_OT2PipetteInFlexProtocol].json new file mode 100644 index 00000000000..b0d5b1371e1 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3369b24214][Flex_P300Gen2_None_2_16_AnalysisError_OT2PipetteInFlexProtocol].json @@ -0,0 +1,1247 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "A1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "error": { + "detail": "Cannot load a Gen2 pipette on a Flex.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "InvalidSpecificationForRobotTypeError", + "wrappedErrors": [] + }, + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "status": "failed" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "ProtocolCommandFailedError [line 22]: Error 4000 GENERAL_ERROR (ProtocolCommandFailedError): InvalidSpecificationForRobotTypeError: Cannot load a Gen2 pipette on a Flex.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "InvalidSpecificationForRobotTypeError: Cannot load a Gen2 pipette on a Flex.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ProtocolCommandFailedError", + "wrappedErrors": [ + { + "detail": "Cannot load a Gen2 pipette on a Flex.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "InvalidSpecificationForRobotTypeError", + "wrappedErrors": [] + } + ] + } + ] + } + ], + "files": [ + { + "name": "Flex_P300Gen2_None_2_16_AnalysisError_OT2PipetteInFlexProtocol.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "A1" + } + } + ], + "liquids": [], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Analysis Error - OT-2 Pipette in Flex Protocol" + }, + "modules": [], + "pipettes": [], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3758150ec1][Flex_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3758150ec1][Flex_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR].json new file mode 100644 index 00000000000..527e98299ba --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3758150ec1][Flex_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR].json @@ -0,0 +1,11133 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "THIS IS A DRY RUN", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "USED TIPS WILL BE RE-RACKED", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "D1" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "D2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "D3" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 45.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Magnetic Block GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 0.0, + "z": 38.0 + }, + "model": "magneticBlockV1", + "moduleType": "magneticBlockType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": {}, + "ot2_standard": {}, + "ot3_standard": {} + } + }, + "model": "magneticBlockV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_ot3_96_tiprack_50ul_rss", + "location": { + "slotName": "C3" + }, + "namespace": "custom_beta", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [ + "RSS_made" + ] + }, + "cornerOffsetFromSlot": { + "x": -14.375, + "y": -3.625, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 50 µL with adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "custom_beta", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_ot3_96_tiprack_50ul_rss", + "quirks": [], + "tipLength": 57.9, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 28.75, + "y": 78, + "z": 12.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 109.75, + "y": 78, + "z": 12.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 118.75, + "y": 78, + "z": 12.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 127.75, + "y": 78, + "z": 12.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 37.75, + "y": 78, + "z": 12.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 46.75, + "y": 78, + "z": 12.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 55.75, + "y": 78, + "z": 12.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 64.75, + "y": 78, + "z": 12.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 73.75, + "y": 78, + "z": 12.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 82.75, + "y": 78, + "z": 12.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 91.75, + "y": 78, + "z": 12.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 100.75, + "y": 78, + "z": 12.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 28.75, + "y": 69, + "z": 12.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 109.75, + "y": 69, + "z": 12.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 118.75, + "y": 69, + "z": 12.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 127.75, + "y": 69, + "z": 12.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 37.75, + "y": 69, + "z": 12.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 46.75, + "y": 69, + "z": 12.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 55.75, + "y": 69, + "z": 12.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 64.75, + "y": 69, + "z": 12.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 73.75, + "y": 69, + "z": 12.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 82.75, + "y": 69, + "z": 12.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 91.75, + "y": 69, + "z": 12.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 100.75, + "y": 69, + "z": 12.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 28.75, + "y": 60, + "z": 12.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 109.75, + "y": 60, + "z": 12.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 118.75, + "y": 60, + "z": 12.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 127.75, + "y": 60, + "z": 12.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 37.75, + "y": 60, + "z": 12.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 46.75, + "y": 60, + "z": 12.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 55.75, + "y": 60, + "z": 12.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 64.75, + "y": 60, + "z": 12.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 73.75, + "y": 60, + "z": 12.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 82.75, + "y": 60, + "z": 12.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 91.75, + "y": 60, + "z": 12.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 100.75, + "y": 60, + "z": 12.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 28.75, + "y": 51, + "z": 12.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 109.75, + "y": 51, + "z": 12.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 118.75, + "y": 51, + "z": 12.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 127.75, + "y": 51, + "z": 12.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 37.75, + "y": 51, + "z": 12.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 46.75, + "y": 51, + "z": 12.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 55.75, + "y": 51, + "z": 12.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 64.75, + "y": 51, + "z": 12.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 73.75, + "y": 51, + "z": 12.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 82.75, + "y": 51, + "z": 12.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 91.75, + "y": 51, + "z": 12.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 100.75, + "y": 51, + "z": 12.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 28.75, + "y": 42, + "z": 12.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 109.75, + "y": 42, + "z": 12.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 118.75, + "y": 42, + "z": 12.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 127.75, + "y": 42, + "z": 12.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 37.75, + "y": 42, + "z": 12.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 46.75, + "y": 42, + "z": 12.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 55.75, + "y": 42, + "z": 12.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 64.75, + "y": 42, + "z": 12.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 73.75, + "y": 42, + "z": 12.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 82.75, + "y": 42, + "z": 12.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 91.75, + "y": 42, + "z": 12.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 100.75, + "y": 42, + "z": 12.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 28.75, + "y": 33, + "z": 12.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 109.75, + "y": 33, + "z": 12.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 118.75, + "y": 33, + "z": 12.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 127.75, + "y": 33, + "z": 12.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 37.75, + "y": 33, + "z": 12.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 46.75, + "y": 33, + "z": 12.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 55.75, + "y": 33, + "z": 12.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 64.75, + "y": 33, + "z": 12.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 73.75, + "y": 33, + "z": 12.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 82.75, + "y": 33, + "z": 12.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 91.75, + "y": 33, + "z": 12.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 100.75, + "y": 33, + "z": 12.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 28.75, + "y": 24, + "z": 12.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 109.75, + "y": 24, + "z": 12.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 118.75, + "y": 24, + "z": 12.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 127.75, + "y": 24, + "z": 12.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 37.75, + "y": 24, + "z": 12.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 46.75, + "y": 24, + "z": 12.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 55.75, + "y": 24, + "z": 12.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 64.75, + "y": 24, + "z": 12.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 73.75, + "y": 24, + "z": 12.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 82.75, + "y": 24, + "z": 12.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 91.75, + "y": 24, + "z": 12.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 100.75, + "y": 24, + "z": 12.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 28.75, + "y": 15, + "z": 12.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 109.75, + "y": 15, + "z": 12.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 118.75, + "y": 15, + "z": 12.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 127.75, + "y": 15, + "z": 12.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 37.75, + "y": 15, + "z": 12.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 46.75, + "y": 15, + "z": 12.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 55.75, + "y": 15, + "z": 12.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 64.75, + "y": 15, + "z": 12.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 73.75, + "y": 15, + "z": 12.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 82.75, + "y": 15, + "z": 12.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 91.75, + "y": 15, + "z": 12.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 100.75, + "y": 15, + "z": 12.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "B1" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "B2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_ot3_96_tiprack_200ul_rss", + "location": { + "slotName": "B3" + }, + "namespace": "custom_beta", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [ + "RSS_made" + ] + }, + "cornerOffsetFromSlot": { + "x": -14.375, + "y": -3.625, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL with adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "custom_beta", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_ot3_96_tiprack_200ul_rss", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 78, + "z": 12.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 78, + "z": 12.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 78, + "z": 12.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 78, + "z": 12.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 78, + "z": 12.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 78, + "z": 12.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 78, + "z": 12.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 78, + "z": 12.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 78, + "z": 12.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 78, + "z": 12.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 78, + "z": 12.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 78, + "z": 12.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 69, + "z": 12.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 69, + "z": 12.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 69, + "z": 12.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 69, + "z": 12.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 69, + "z": 12.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 69, + "z": 12.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 69, + "z": 12.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 69, + "z": 12.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 69, + "z": 12.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 69, + "z": 12.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 69, + "z": 12.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 69, + "z": 12.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 60, + "z": 12.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 60, + "z": 12.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 60, + "z": 12.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 60, + "z": 12.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 60, + "z": 12.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 60, + "z": 12.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 60, + "z": 12.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 60, + "z": 12.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 60, + "z": 12.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 60, + "z": 12.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 60, + "z": 12.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 60, + "z": 12.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 51, + "z": 12.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 51, + "z": 12.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 51, + "z": 12.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 51, + "z": 12.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 51, + "z": 12.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 51, + "z": 12.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 51, + "z": 12.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 51, + "z": 12.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 51, + "z": 12.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 51, + "z": 12.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 51, + "z": 12.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 51, + "z": 12.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 42, + "z": 12.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 42, + "z": 12.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 42, + "z": 12.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 42, + "z": 12.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 42, + "z": 12.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 42, + "z": 12.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 42, + "z": 12.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 42, + "z": 12.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 42, + "z": 12.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 42, + "z": 12.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 42, + "z": 12.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 42, + "z": 12.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 33, + "z": 12.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 33, + "z": 12.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 33, + "z": 12.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 33, + "z": 12.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 33, + "z": 12.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 33, + "z": 12.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 33, + "z": 12.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 33, + "z": 12.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 33, + "z": 12.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 33, + "z": 12.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 33, + "z": 12.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 33, + "z": 12.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 24, + "z": 12.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 24, + "z": 12.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 24, + "z": 12.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 24, + "z": 12.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 24, + "z": 12.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 24, + "z": 12.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 24, + "z": 12.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 24, + "z": 12.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 24, + "z": 12.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 24, + "z": 12.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 24, + "z": 12.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 24, + "z": 12.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 15, + "z": 12.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 15, + "z": 12.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 15, + "z": 12.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 15, + "z": 12.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 15, + "z": 12.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 15, + "z": 12.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 15, + "z": 12.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 15, + "z": 12.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 15, + "z": 12.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 15, + "z": 12.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 15, + "z": 12.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 15, + "z": 12.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "A2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p1000_96" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Ready" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Fragmenting / End Repair / A-Tailing", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding FRERAT", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 15 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "UnsuitableTiprackForPipetteMotion [line 183]: Error 2004 MOTION_PLANNING_FAILURE (UnsuitableTiprackForPipetteMotion): Opentrons Flex 96 Tip Rack 50 µL with adapter must be on an Opentrons Flex 96 Tip Rack Adapter in order to pick up or return all 96 tips simultaneously.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "Opentrons Flex 96 Tip Rack 50 µL with adapter must be on an Opentrons Flex 96 Tip Rack Adapter in order to pick up or return all 96 tips simultaneously.", + "errorCode": "2004", + "errorInfo": {}, + "errorType": "UnsuitableTiprackForPipetteMotion", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "Flex_P1000_96_None_2_15_ABR5_6_IDT_xGen_EZ_96x_Head_PART_I_III_ABR.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_3200ml_fixed/1", + "loadName": "opentrons_1_trash_3200ml_fixed", + "location": { + "slotName": "A3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "D1" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "D2" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "D3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C2" + } + }, + { + "definitionUri": "custom_beta/opentrons_ot3_96_tiprack_50ul_rss/1", + "loadName": "opentrons_ot3_96_tiprack_50ul_rss", + "location": { + "slotName": "C3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "B1" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "B2" + } + }, + { + "definitionUri": "custom_beta/opentrons_ot3_96_tiprack_200ul_rss/1", + "loadName": "opentrons_ot3_96_tiprack_200ul_rss", + "location": { + "slotName": "B3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "A2" + } + } + ], + "liquids": [], + "metadata": { + "author": "Opentrons ", + "protocolName": "IDT xGen EZ 96x Head PART I-III ABR", + "source": "Protocol Library" + }, + "modules": [ + { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p1000_96" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[37c9086bf4][Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[37c9086bf4][Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4].json new file mode 100644 index 00000000000..d50b7be1a89 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[37c9086bf4][Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4].json @@ -0,0 +1,82633 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "THIS IS A ABR RUN WITH 3 REPEATS", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "THIS IS A DRY RUN", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "USED TIPS WILL BE RE-RACKED", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "D1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "D2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "D3" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_200ul", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_50ul", + "location": { + "slotName": "C3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 50 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_50ul", + "quirks": [], + "tipLength": 57.9, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "B1" + }, + "model": "thermocyclerModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 108.96, + "lidHeight": 61.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 5.6 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.6 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 68.8, + "z": 108.96 + }, + "model": "thermocyclerModuleV2", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot3_standard": { + "B1": { + "cornerOffsetFromSlot": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ], + "labwareOffset": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "thermocyclerModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "B2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_200ul", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_50ul", + "location": { + "slotName": "B3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 50 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_50ul", + "quirks": [], + "tipLength": 57.9, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "A2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_200ul", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p1000_multi_flex" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p50_multi_flex" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Ready" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Capture", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Hybridization", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/closeLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ADDING SMB", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 52.95 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 52.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 52.95 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 52.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 52.95 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 52.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 2000.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> WASH", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove SUPERNATANT", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 7.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 7.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 7.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 7.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 7.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 7.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Repeating 3 washes", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Hybridization", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.200000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.200000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.200000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.200000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.200000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.200000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 395.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 395.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Residual", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ELUTE", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Elute", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Elution", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding ET2", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> AMPLIFICATION", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding PPC", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EPM", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Cleanup", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Elution", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ADDING AMPure (0.8x)", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 61.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 61.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 61.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Residual ETOH", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding RSB", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 69.34, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 69.34, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 75.19000000000001, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 75.19000000000001, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 67.25999999999999, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 67.25999999999999, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 73.11, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 73.11, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -19.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 40.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 78.34, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 78.34, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 75.19000000000001, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 75.19000000000001, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 76.25999999999999, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 76.25999999999999, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 73.11, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 73.11, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -19.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 40.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 87.34, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 87.34, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 75.19000000000001, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 75.19000000000001, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 85.25999999999999, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 85.25999999999999, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 73.11, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 73.11, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -19.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 40.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transferring Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 48.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 57.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 66.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Resetting Run", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 120.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 120.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 120.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 120.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 12.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 12.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 12.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 12.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 48.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 57.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 66.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Ready" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Capture", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Hybridization", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/closeLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ADDING SMB", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 52.95 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 52.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 52.95 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 52.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 52.95 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 52.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 2000.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> WASH", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove SUPERNATANT", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 7.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 7.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 7.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 7.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 7.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 7.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Repeating 3 washes", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Hybridization", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.200000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.200000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.200000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.200000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.200000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.200000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Residual", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ELUTE", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Elute", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Elution", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding ET2", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> AMPLIFICATION", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding PPC", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EPM", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Cleanup", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Elution", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ADDING AMPure (0.8x)", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 61.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 61.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 61.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Residual ETOH", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding RSB", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 69.34, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 69.34, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 75.19000000000001, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 75.19000000000001, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 67.25999999999999, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 67.25999999999999, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 73.11, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 73.11, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -19.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 40.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 78.34, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 78.34, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 75.19000000000001, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 75.19000000000001, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 76.25999999999999, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 76.25999999999999, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 73.11, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 73.11, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -19.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 40.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 87.34, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 87.34, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 75.19000000000001, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 75.19000000000001, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 85.25999999999999, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 85.25999999999999, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 73.11, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 73.11, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -19.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 40.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transferring Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 48.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 57.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 66.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Resetting Run", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 120.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 120.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 120.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 120.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 12.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 12.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 12.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 12.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 48.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 57.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 66.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Ready" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Capture", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Hybridization", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/closeLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ADDING SMB", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 52.95 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 52.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 52.95 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 52.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 52.95 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 52.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 2000.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> WASH", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove SUPERNATANT", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 7.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 7.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 7.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 7.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 7.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 7.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Repeating 3 washes", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Hybridization", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.200000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.3, + "y": 74.15, + "z": 22.200000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.200000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.3, + "y": 74.15, + "z": 22.200000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.200000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.200000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.5 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 41.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Residual", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ELUTE", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Elute", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Elution", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding ET2", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> AMPLIFICATION", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding PPC", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EPM", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Cleanup", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Elution", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 21.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 39.375, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ADDING AMPure (0.8x)", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 61.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 61.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 61.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 39.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 6.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.5 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 43.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Residual ETOH", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 34.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding RSB", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 69.34, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 69.34, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 75.19000000000001, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 75.19000000000001, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 67.25999999999999, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 67.25999999999999, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 73.11, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 73.11, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -19.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 40.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 78.34, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 78.34, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 75.19000000000001, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 75.19000000000001, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 76.25999999999999, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 76.25999999999999, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 73.11, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 73.11, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -19.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 40.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 87.34, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 87.34, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 75.19000000000001, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 75.19000000000001, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 85.25999999999999, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": -1.0400000000000063, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 85.25999999999999, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 73.11, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 73.11, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -19.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 40.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.1, + "y": -0.25, + "z": 35.0 + }, + "newLocation": { + "slotName": "C1" + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transferring Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 48.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 57.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.25 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 66.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Resetting Run", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 34.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 121.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 121.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 120.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 120.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 120.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 120.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 12.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 12.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 12.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 12.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000003 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 10.919999999999996 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 48.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 57.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 66.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 3.375, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 74.15, + "z": 4.0 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 15 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment_v4.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_3200ml_fixed/1", + "loadName": "opentrons_1_trash_3200ml_fixed", + "location": { + "slotName": "A3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "D2" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "C2" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "loadName": "opentrons_flex_96_tiprack_50ul", + "location": { + "slotName": "C3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "B2" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "loadName": "opentrons_flex_96_tiprack_50ul", + "location": { + "slotName": "B3" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "A2" + } + } + ], + "liquids": [], + "metadata": { + "author": "Opentrons ", + "protocolName": "Illumina DNA Enrichment v4", + "source": "Protocol Library" + }, + "modules": [ + { + "location": { + "slotName": "D1" + }, + "model": "heaterShakerModuleV1" + }, + { + "location": { + "slotName": "D3" + }, + "model": "temperatureModuleV2" + }, + { + "location": { + "slotName": "B1" + }, + "model": "thermocyclerModuleV2" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p1000_multi_flex" + }, + { + "mount": "right", + "pipetteName": "p50_multi_flex" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4017e085e6][OT2_P300M_P20S_TC_HS_TM_2_14_SmokeTestV3].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4017e085e6][OT2_P300M_P20S_TC_HS_TM_2_14_SmokeTestV3].json new file mode 100644 index 00000000000..b1492e7d1a6 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4017e085e6][OT2_P300M_P20S_TC_HS_TM_2_14_SmokeTestV3].json @@ -0,0 +1,12664 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "setRailLights", + "params": { + "on": true + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Let there be light! True 🌠🌠🌠", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Is the door is closed? True 🚪🚪🚪", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Is this a simulation? True 🔮🔮🔮", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Running against API Version: 2.14", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "9" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 108.96, + "lidHeight": 61.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 5.6 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.6 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 68.8, + "z": 108.96 + }, + "model": "thermocyclerModuleV2", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot3_standard": { + "B1": { + "cornerOffsetFromSlot": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ], + "labwareOffset": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "thermocyclerModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Temperature-Controlled plate", + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/hardware-modules/products/aluminum-block-set" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.45, + "zDimension": 21.2 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "quirks": [ + "gripperIncompatible" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.2, + "z": 6.42 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.2, + "z": 6.42 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.2, + "z": 6.42 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.2, + "z": 6.42 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.2, + "z": 6.42 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.2, + "z": 6.42 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.2, + "z": 6.42 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.2, + "z": 6.42 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.2, + "z": 6.42 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.2, + "z": 6.42 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.2, + "z": 6.42 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.2, + "z": 6.42 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.2, + "z": 6.42 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.2, + "z": 6.42 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.2, + "z": 6.42 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.2, + "z": 6.42 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.2, + "z": 6.42 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.2, + "z": 6.42 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.2, + "z": 6.42 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.2, + "z": 6.42 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.2, + "z": 6.42 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.2, + "z": 6.42 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.2, + "z": 6.42 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.2, + "z": 6.42 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.2, + "z": 6.42 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.2, + "z": 6.42 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.2, + "z": 6.42 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.2, + "z": 6.42 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.2, + "z": 6.42 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.2, + "z": 6.42 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.2, + "z": 6.42 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.2, + "z": 6.42 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.2, + "z": 6.42 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.2, + "z": 6.42 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.2, + "z": 6.42 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.2, + "z": 6.42 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.2, + "z": 6.42 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.2, + "z": 6.42 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.2, + "z": 6.42 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.2, + "z": 6.42 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.2, + "z": 6.42 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.2, + "z": 6.42 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.2, + "z": 6.42 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.2, + "z": 6.42 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.2, + "z": 6.42 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.2, + "z": 6.42 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.2, + "z": 6.42 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.2, + "z": 6.42 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.2, + "z": 6.42 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.2, + "z": 6.42 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.2, + "z": 6.42 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.2, + "z": 6.42 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.2, + "z": 6.42 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.2, + "z": 6.42 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.2, + "z": 6.42 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.2, + "z": 6.42 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.2, + "z": 6.42 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.2, + "z": 6.42 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.2, + "z": 6.42 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.2, + "z": 6.42 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.2, + "z": 6.42 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.2, + "z": 6.42 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.2, + "z": 6.42 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.2, + "z": 6.42 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.2, + "z": 6.42 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.2, + "z": 6.42 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.2, + "z": 6.42 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.2, + "z": 6.42 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.2, + "z": 6.42 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.2, + "z": 6.42 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.2, + "z": 6.42 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.2, + "z": 6.42 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.2, + "z": 6.42 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.2, + "z": 6.42 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.2, + "z": 6.42 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.2, + "z": 6.42 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.2, + "z": 6.42 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.2, + "z": 6.42 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.2, + "z": 6.42 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.2, + "z": 6.42 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.2, + "z": 6.42 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.2, + "z": 6.42 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.2, + "z": 6.42 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.2, + "z": 6.42 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.2, + "z": 6.42 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.2, + "z": 6.42 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.2, + "z": 6.42 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.2, + "z": 6.42 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.2, + "z": 6.42 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.2, + "z": 6.42 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.2, + "z": 6.42 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.2, + "z": 6.42 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.2, + "z": 6.42 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.2, + "z": 6.42 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.2, + "z": 6.42 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.2, + "z": 6.42 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 19.35 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 PCR Heater-Shaker Adapter with NEST Well Plate 100 µl", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt", + "quirks": [ + "gripperIncompatible" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 3.57 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 3.57 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 3.57 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 3.57 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 3.57 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 3.57 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 3.57 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 3.57 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 3.57 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 3.57 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 3.57 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 3.57 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 3.57 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 3.57 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 3.57 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 3.57 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 3.57 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 3.57 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 3.57 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 3.57 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 3.57 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 3.57 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 3.57 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 3.57 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 3.57 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 3.57 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 3.57 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 3.57 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 3.57 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 3.57 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 3.57 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 3.57 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 3.57 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 3.57 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 3.57 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 3.57 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 3.57 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 3.57 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 3.57 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 3.57 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 3.57 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 3.57 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 3.57 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 3.57 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 3.57 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 3.57 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 3.57 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 3.57 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 3.57 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 3.57 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 3.57 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 3.57 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 3.57 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 3.57 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 3.57 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 3.57 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 3.57 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 3.57 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 3.57 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 3.57 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 3.57 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 3.57 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 3.57 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 3.57 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 3.57 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 3.57 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 3.57 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 3.57 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 3.57 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 3.57 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 3.57 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 3.57 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 3.57 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 3.57 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 3.57 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 3.57 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 3.57 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 3.57 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 3.57 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 3.57 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 3.57 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 3.57 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 3.57 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 3.57 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 3.57 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 3.57 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 3.57 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 3.57 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 3.57 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 3.57 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 3.57 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 3.57 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 3.57 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 3.57 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 3.57 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 3.57 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "4 custom tubes", + "loadName": "cpx_4_tuberack_100ul", + "location": { + "slotName": "6" + }, + "namespace": "custom_beta", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "cpx", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127, + "yDimension": 85, + "zDimension": 40 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "cpx", + "brandId": [] + }, + "metadata": { + "displayCategory": "tubeRack", + "wellBottomShape": "u" + }, + "wells": [ + "A1", + "A2", + "B1", + "B2" + ] + } + ], + "metadata": { + "displayCategory": "tubeRack", + "displayName": "cpx 4 Tube Rack with cpx 0.1 mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "custom_beta", + "ordering": [ + [ + "A1", + "B1" + ], + [ + "A2", + "B2" + ] + ], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "cpx_4_tuberack_100ul", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 20, + "y": 65, + "z": 17 + }, + "A2": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50, + "y": 65, + "z": 17 + }, + "B1": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 20, + "y": 35, + "z": 17 + }, + "B2": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50, + "y": 35, + "z": 17 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "logo destination", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 4000.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A2": 2000.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A5": 555.55555 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A8": 900.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A8": 1001.11 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 164.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 200.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 191.88, + "y": 47.24, + "z": 1.92 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 200.88, + "y": 47.24, + "z": 1.92 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 209.88, + "y": 47.24, + "z": 1.92 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 182.88, + "y": 38.24, + "z": 1.92 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 14.38, + "y": 155.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 14.38, + "y": 155.74, + "z": 45.09 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 14.38, + "y": 146.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0000000000000036 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 20.700000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0000000000000036 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 20.700000000000003 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 3.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 236.88, + "y": 11.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 245.88, + "y": 38.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 236.88, + "y": 38.24, + "z": 0.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 236.88, + "y": 38.24, + "z": 0.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 146.88, + "y": 11.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Is the pipette tip in the middle of the well?" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 14.38, + "y": 146.74, + "z": 45.09 + } + }, + "status": "succeeded" + }, + { + "commandType": "temperatureModule/waitForTemperature", + "params": { + "celsius": 25.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 466.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 5.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setTargetTemperature", + "params": { + "celsius": 38.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/waitForTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/closeLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetLidTemperature", + "params": { + "celsius": 38.0 + }, + "result": { + "targetLidTemperature": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForLidTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetBlockTemperature", + "params": { + "celsius": 28.0, + "holdTimeSeconds": 5.0 + }, + "result": { + "targetBlockTemperature": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForBlockTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/deactivateBlock", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/deactivateLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 14.38, + "y": 137.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 280.53, + "y": 255.05, + "z": 87.51 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 146.88, + "y": 164.74, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.255, + "y": 75.365, + "z": 72.845 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 350.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 5.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 14.38, + "y": 128.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 11.34, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -22.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 315.0, + "y": 125.5, + "z": 18.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 324.04, + "z": 100.08 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 14 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "OT2_P300M_P20S_TC_HS_TM_2_14_SmokeTestV3.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "4" + } + }, + { + "definitionUri": "opentrons/opentrons_96_aluminumblock_nest_wellplate_100ul/1", + "displayName": "Temperature-Controlled plate", + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt/1", + "loadName": "opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "custom_beta/cpx_4_tuberack_100ul/1", + "displayName": "4 custom tubes", + "loadName": "cpx_4_tuberack_100ul", + "location": { + "slotName": "6" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "displayName": "logo destination", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "2" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + } + } + ], + "liquids": [ + { + "description": "H₂O", + "displayColor": "#42AB2D", + "displayName": "water" + }, + { + "description": "C₃H₆O", + "displayColor": "#38588a", + "displayName": "acetone" + } + ], + "metadata": { + "author": "Opentrons Engineering ", + "description": "Description of the protocol that is longish \n has \n returns and \n emoji 😊 ⬆️ ", + "protocolName": "🛠️ 2.14 Smoke Test V3 🪄", + "source": "Software Testing Team" + }, + "modules": [ + { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + }, + { + "location": { + "slotName": "9" + }, + "model": "temperatureModuleV2" + }, + { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV2" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + { + "mount": "right", + "pipetteName": "p20_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4835239037][OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40Error].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4835239037][OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40Error].json new file mode 100644 index 00000000000..ac2117946a3 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4835239037][OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40Error].json @@ -0,0 +1,7095 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "1" + }, + "model": "magneticModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 124.875, + "y": 2.75, + "z": 82.25 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 110.152, + "overLabwareHeight": 4.052 + }, + "displayName": "Magnetic Module GEN2", + "gripperOffsets": {}, + "labwareOffset": { + "x": -1.175, + "y": -0.125, + "z": 82.25 + }, + "model": "magneticModuleV2", + "moduleType": "magneticModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "magneticModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "3" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [ + "thermocyclerModuleV1" + ], + "dimensions": { + "bareOverallHeight": 98.0, + "lidHeight": 37.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN1", + "gripperOffsets": {}, + "labwareOffset": { + "x": 0.0, + "y": 82.56, + "z": 97.8 + }, + "model": "thermocyclerModuleV1", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": {} + }, + "model": "thermocyclerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Trash", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons" + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 172.86, + "yDimension": 165.86, + "zDimension": 82 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "trash", + "displayName": "Opentrons Fixed Trash", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trash", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_1_trash_1100ml_fixed", + "quirks": [ + "centerMultichannelOnWells", + "fixedTrash", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 0, + "shape": "rectangular", + "totalLiquidVolume": 1100000, + "x": 82.84, + "xDimension": 107.11, + "y": 80, + "yDimension": 165.67, + "z": 82 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 10 µL", + "loadName": "opentrons_96_tiprack_10ul", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 10 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_10ul", + "tipLength": 39.2, + "tipOverlap": 3.29 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "A1", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Agilent", + "brandId": [ + "201252-100" + ], + "links": [ + "https://www.agilent.com/store/en_US/Prod-201252-100/201252-100" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.57, + "zDimension": 44.04 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "Agilent 1 Well Reservoir 290 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "agilent_1_reservoir_290ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.22, + "shape": "rectangular", + "totalLiquidVolume": 290000, + "x": 63.88, + "xDimension": 108, + "y": 42.785, + "yDimension": 72, + "z": 4.82 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "A2", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "6" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Mag Labware", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "TempDeck LW", + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/hardware-modules/products/aluminum-block-set" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.45, + "zDimension": 21.2 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.2, + "z": 6.42 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.2, + "z": 6.42 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.2, + "z": 6.42 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.2, + "z": 6.42 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.2, + "z": 6.42 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.2, + "z": 6.42 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.2, + "z": 6.42 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.2, + "z": 6.42 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.2, + "z": 6.42 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.2, + "z": 6.42 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.2, + "z": 6.42 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.2, + "z": 6.42 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.2, + "z": 6.42 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.2, + "z": 6.42 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.2, + "z": 6.42 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.2, + "z": 6.42 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.2, + "z": 6.42 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.2, + "z": 6.42 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.2, + "z": 6.42 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.2, + "z": 6.42 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.2, + "z": 6.42 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.2, + "z": 6.42 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.2, + "z": 6.42 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.2, + "z": 6.42 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.2, + "z": 6.42 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.2, + "z": 6.42 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.2, + "z": 6.42 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.2, + "z": 6.42 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.2, + "z": 6.42 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.2, + "z": 6.42 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.2, + "z": 6.42 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.2, + "z": 6.42 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.2, + "z": 6.42 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.2, + "z": 6.42 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.2, + "z": 6.42 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.2, + "z": 6.42 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.2, + "z": 6.42 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.2, + "z": 6.42 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.2, + "z": 6.42 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.2, + "z": 6.42 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.2, + "z": 6.42 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.2, + "z": 6.42 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.2, + "z": 6.42 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.2, + "z": 6.42 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.2, + "z": 6.42 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.2, + "z": 6.42 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.2, + "z": 6.42 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.2, + "z": 6.42 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.2, + "z": 6.42 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.2, + "z": 6.42 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.2, + "z": 6.42 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.2, + "z": 6.42 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.2, + "z": 6.42 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.2, + "z": 6.42 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.2, + "z": 6.42 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.2, + "z": 6.42 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.2, + "z": 6.42 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.2, + "z": 6.42 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.2, + "z": 6.42 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.2, + "z": 6.42 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.2, + "z": 6.42 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.2, + "z": 6.42 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.2, + "z": 6.42 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.2, + "z": 6.42 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.2, + "z": 6.42 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.2, + "z": 6.42 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.2, + "z": 6.42 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.2, + "z": 6.42 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.2, + "z": 6.42 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.2, + "z": 6.42 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.2, + "z": 6.42 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.2, + "z": 6.42 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.2, + "z": 6.42 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.2, + "z": 6.42 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.2, + "z": 6.42 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.2, + "z": 6.42 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.2, + "z": 6.42 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.2, + "z": 6.42 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.2, + "z": 6.42 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.2, + "z": 6.42 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.2, + "z": 6.42 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.2, + "z": 6.42 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.2, + "z": 6.42 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.2, + "z": 6.42 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.2, + "z": 6.42 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.2, + "z": 6.42 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.2, + "z": 6.42 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.2, + "z": 6.42 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.2, + "z": 6.42 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.2, + "z": 6.42 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.2, + "z": 6.42 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.2, + "z": 6.42 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.2, + "z": 6.42 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.2, + "z": 6.42 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.2, + "z": 6.42 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.2, + "z": 6.42 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 20 µL", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "9" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "error": { + "detail": "Cannot aspirate more than pipette max volume", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "LegacyContextCommandError", + "wrappedErrors": [ + { + "detail": "AssertionError: Cannot aspirate more than pipette max volume", + "errorCode": "4000", + "errorInfo": { + "args": "('Cannot aspirate more than pipette max volume',)", + "class": "AssertionError", + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/commands/publisher.py\", line 113, in publish_context\n yield\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/instrument_context.py\", line 267, in aspirate\n self._core.aspirate(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py\", line 119, in aspirate\n new_volume <= self._pipette_dict[\"working_volume\"]\n" + }, + "errorType": "PythonException", + "wrappedErrors": [] + } + ] + }, + "params": { + "flowRate": 94.0, + "volume": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "status": "failed" + } + ], + "config": { + "protocolType": "json", + "schemaVersion": 4 + }, + "errors": [ + { + "detail": "Cannot aspirate more than pipette max volume", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "UnexpectedProtocolError", + "wrappedErrors": [ + { + "detail": "AssertionError: Cannot aspirate more than pipette max volume", + "errorCode": "4000", + "errorInfo": { + "args": "('Cannot aspirate more than pipette max volume',)", + "class": "AssertionError", + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_runner/task_queue.py\", line 90, in _run\n await self._run_func()\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_runner/legacy_wrappers.py\", line 173, in execute\n await to_thread.run_sync(run_protocol, protocol, context)\n\n File \"/usr/local/lib/python3.10/site-packages/anyio/to_thread.py\", line 33, in run_sync\n return await get_asynclib().run_sync_in_worker_thread(\n\n File \"/usr/local/lib/python3.10/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n return await future\n\n File \"/usr/local/lib/python3.10/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n result = context.run(func, *args)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute.py\", line 45, in run_protocol\n execute_json_v4.dispatch_json(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_json_v4.py\", line 272, in dispatch_json\n pipette_command_map[command_type]( # type: ignore\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_json_v3.py\", line 159, in _aspirate\n pipette.aspirate(volume, location)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/instrument_context.py\", line 267, in aspirate\n self._core.aspirate(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py\", line 119, in aspirate\n new_volume <= self._pipette_dict[\"working_volume\"]\n" + }, + "errorType": "PythonException", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40Error.json", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "displayName": "Trash", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_10ul/1", + "displayName": "Opentrons 96 Tip Rack 10 µL", + "loadName": "opentrons_96_tiprack_10ul", + "location": { + "slotName": "2" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "4" + } + }, + { + "definitionUri": "opentrons/agilent_1_reservoir_290ml/1", + "displayName": "A1", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "5" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "A2", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "6" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", + "displayName": "Mag Labware", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_96_aluminumblock_nest_wellplate_100ul/1", + "displayName": "TempDeck LW", + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "displayName": "Opentrons 96 Tip Rack 20 µL", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "9" + } + } + ], + "liquids": [], + "metadata": { + "author": "NN MM", + "category": null, + "description": "Protocol for e2e tests", + "protocolName": "script_pur_sample_1", + "subcategory": null, + "tags": [] + }, + "modules": [ + { + "location": { + "slotName": "1" + }, + "model": "magneticModuleV2" + }, + { + "location": { + "slotName": "3" + }, + "model": "temperatureModuleV2" + }, + { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV1" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + { + "mount": "right", + "pipetteName": "p20_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[49c3817e54][OT2_P300M_P300S_HS_6_1_HS_NormalUseWithTransfer].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[49c3817e54][OT2_P300M_P300S_HS_6_1_HS_NormalUseWithTransfer].json new file mode 100644 index 00000000000..ba5bd4dd683 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[49c3817e54][OT2_P300M_P300S_HS_6_1_HS_NormalUseWithTransfer].json @@ -0,0 +1,6407 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p300_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "H/S", + "loadName": "opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 42.25 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deepwell Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 Deep Well Adapter with NEST Deep Well Plate 2 mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Single", + "loadName": "opentrons_24_aluminumblock_generic_2ml_screwcap", + "location": { + "slotName": "6" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/hardware-modules/products/aluminum-block-set" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.5, + "zDimension": 42 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "generic", + "brandId": [], + "links": [] + }, + "metadata": { + "displayCategory": "tubeRack", + "displayName": "Generic 2 mL Screwcap", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A2", + "A3", + "A4", + "A5", + "A6", + "B1", + "B2", + "B3", + "B4", + "B5", + "B6", + "C1", + "C2", + "C3", + "C4", + "C5", + "C6", + "D1", + "D2", + "D3", + "D4", + "D5", + "D6" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1" + ], + [ + "A2", + "B2", + "C2", + "D2" + ], + [ + "A3", + "B3", + "C3", + "D3" + ], + [ + "A4", + "B4", + "C4", + "D4" + ], + [ + "A5", + "B5", + "C5", + "D5" + ], + [ + "A6", + "B6", + "C6", + "D6" + ] + ], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_24_aluminumblock_generic_2ml_screwcap" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 68.63, + "z": 6.7 + }, + "A2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 68.63, + "z": 6.7 + }, + "A3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 68.63, + "z": 6.7 + }, + "A4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 68.63, + "z": 6.7 + }, + "A5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 68.63, + "z": 6.7 + }, + "A6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 68.63, + "z": 6.7 + }, + "B1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 51.38, + "z": 6.7 + }, + "B2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 51.38, + "z": 6.7 + }, + "B3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 51.38, + "z": 6.7 + }, + "B4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 51.38, + "z": 6.7 + }, + "B5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 51.38, + "z": 6.7 + }, + "B6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 51.38, + "z": 6.7 + }, + "C1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 34.13, + "z": 6.7 + }, + "C2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 34.13, + "z": 6.7 + }, + "C3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 34.13, + "z": 6.7 + }, + "C4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 34.13, + "z": 6.7 + }, + "C5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 34.13, + "z": 6.7 + }, + "C6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 34.13, + "z": 6.7 + }, + "D1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 16.88, + "z": 6.7 + }, + "D2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 16.88, + "z": 6.7 + }, + "D3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 16.88, + "z": 6.7 + }, + "D4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 16.88, + "z": 6.7 + }, + "D5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 16.88, + "z": 6.7 + }, + "D6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 16.88, + "z": 6.7 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Multi", + "loadName": "biorad_96_wellplate_200ul_pcr", + "location": { + "slotName": "9" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Bio-Rad", + "brandId": [ + "hsp9601" + ], + "links": [ + "http://www.bio-rad.com/en-us/sku/hsp9601-hard-shell-96-well-pcr-plates-low-profile-thin-wall-skirted-white-clear?ID=hsp9601" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 16.06 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Bio-Rad 96 Well Plate 200 µL PCR", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "biorad_96_wellplate_200ul_pcr", + "magneticModuleEngageHeight": 18 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.24, + "z": 1.25 + }, + "A10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.24, + "z": 1.25 + }, + "A11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.24, + "z": 1.25 + }, + "A12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.24, + "z": 1.25 + }, + "A2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.24, + "z": 1.25 + }, + "A3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.24, + "z": 1.25 + }, + "A4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.24, + "z": 1.25 + }, + "A5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.24, + "z": 1.25 + }, + "A6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.24, + "z": 1.25 + }, + "A7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.24, + "z": 1.25 + }, + "A8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.24, + "z": 1.25 + }, + "A9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.24, + "z": 1.25 + }, + "B1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.24, + "z": 1.25 + }, + "B10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.24, + "z": 1.25 + }, + "B11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.24, + "z": 1.25 + }, + "B12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.24, + "z": 1.25 + }, + "B2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.24, + "z": 1.25 + }, + "B3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.24, + "z": 1.25 + }, + "B4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.24, + "z": 1.25 + }, + "B5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.24, + "z": 1.25 + }, + "B6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.24, + "z": 1.25 + }, + "B7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.24, + "z": 1.25 + }, + "B8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.24, + "z": 1.25 + }, + "B9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.24, + "z": 1.25 + }, + "C1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.24, + "z": 1.25 + }, + "C10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.24, + "z": 1.25 + }, + "C11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.24, + "z": 1.25 + }, + "C12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.24, + "z": 1.25 + }, + "C2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.24, + "z": 1.25 + }, + "C3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.24, + "z": 1.25 + }, + "C4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.24, + "z": 1.25 + }, + "C5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.24, + "z": 1.25 + }, + "C6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.24, + "z": 1.25 + }, + "C7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.24, + "z": 1.25 + }, + "C8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.24, + "z": 1.25 + }, + "C9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.24, + "z": 1.25 + }, + "D1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.24, + "z": 1.25 + }, + "D10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.24, + "z": 1.25 + }, + "D11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.24, + "z": 1.25 + }, + "D12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.24, + "z": 1.25 + }, + "D2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.24, + "z": 1.25 + }, + "D3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.24, + "z": 1.25 + }, + "D4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.24, + "z": 1.25 + }, + "D5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.24, + "z": 1.25 + }, + "D6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.24, + "z": 1.25 + }, + "D7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.24, + "z": 1.25 + }, + "D8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.24, + "z": 1.25 + }, + "D9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.24, + "z": 1.25 + }, + "E1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.24, + "z": 1.25 + }, + "E10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.24, + "z": 1.25 + }, + "E11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.24, + "z": 1.25 + }, + "E12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.24, + "z": 1.25 + }, + "E2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.24, + "z": 1.25 + }, + "E3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.24, + "z": 1.25 + }, + "E4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.24, + "z": 1.25 + }, + "E5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.24, + "z": 1.25 + }, + "E6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.24, + "z": 1.25 + }, + "E7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.24, + "z": 1.25 + }, + "E8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.24, + "z": 1.25 + }, + "E9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.24, + "z": 1.25 + }, + "F1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.24, + "z": 1.25 + }, + "F10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.24, + "z": 1.25 + }, + "F11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.24, + "z": 1.25 + }, + "F12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.24, + "z": 1.25 + }, + "F2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.24, + "z": 1.25 + }, + "F3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.24, + "z": 1.25 + }, + "F4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.24, + "z": 1.25 + }, + "F5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.24, + "z": 1.25 + }, + "F6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.24, + "z": 1.25 + }, + "F7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.24, + "z": 1.25 + }, + "F8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.24, + "z": 1.25 + }, + "F9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.24, + "z": 1.25 + }, + "G1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.24, + "z": 1.25 + }, + "G10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.24, + "z": 1.25 + }, + "G11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.24, + "z": 1.25 + }, + "G12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.24, + "z": 1.25 + }, + "G2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.24, + "z": 1.25 + }, + "G3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.24, + "z": 1.25 + }, + "G4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.24, + "z": 1.25 + }, + "G5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.24, + "z": 1.25 + }, + "G6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.24, + "z": 1.25 + }, + "G7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.24, + "z": 1.25 + }, + "G8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.24, + "z": 1.25 + }, + "G9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.24, + "z": 1.25 + }, + "H1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.24, + "z": 1.25 + }, + "H10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.24, + "z": 1.25 + }, + "H11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.24, + "z": 1.25 + }, + "H12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.24, + "z": 1.25 + }, + "H2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.24, + "z": 1.25 + }, + "H3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.24, + "z": 1.25 + }, + "H4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.24, + "z": 1.25 + }, + "H5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.24, + "z": 1.25 + }, + "H6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.24, + "z": 1.25 + }, + "H7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.24, + "z": 1.25 + }, + "H8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.24, + "z": 1.25 + }, + "H9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.24, + "z": 1.25 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Mis", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "7" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Agilent", + "brandId": [ + "201252-100" + ], + "links": [ + "https://www.agilent.com/store/en_US/Prod-201252-100/201252-100" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.57, + "zDimension": 44.04 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "Agilent 1 Well Reservoir 290 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "agilent_1_reservoir_290ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.22, + "shape": "rectangular", + "totalLiquidVolume": 290000, + "x": 63.88, + "xDimension": 108, + "y": 42.785, + "yDimension": 72, + "z": 4.82 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 200.0, + "A10": 200.0, + "A11": 200.0, + "A12": 200.0, + "A2": 200.0, + "A3": 200.0, + "A4": 200.0, + "A5": 200.0, + "A6": 200.0, + "A7": 200.0, + "A8": 200.0, + "A9": 200.0, + "B1": 200.0, + "B10": 200.0, + "B11": 200.0, + "B12": 200.0, + "B2": 200.0, + "B3": 200.0, + "B4": 200.0, + "B5": 200.0, + "B6": 200.0, + "B7": 200.0, + "B8": 200.0, + "B9": 200.0, + "C1": 200.0, + "C10": 200.0, + "C11": 200.0, + "C12": 200.0, + "C2": 200.0, + "C3": 200.0, + "C4": 200.0, + "C5": 200.0, + "C6": 200.0, + "C7": 200.0, + "C8": 200.0, + "C9": 200.0, + "D1": 200.0, + "D10": 200.0, + "D11": 200.0, + "D12": 200.0, + "D2": 200.0, + "D3": 200.0, + "D4": 200.0, + "D5": 200.0, + "D6": 200.0, + "D7": 200.0, + "D8": 200.0, + "D9": 200.0, + "E1": 200.0, + "E10": 200.0, + "E11": 200.0, + "E12": 200.0, + "E2": 200.0, + "E3": 200.0, + "E4": 200.0, + "E5": 200.0, + "E6": 200.0, + "E7": 200.0, + "E8": 200.0, + "E9": 200.0, + "F1": 200.0, + "F10": 200.0, + "F11": 200.0, + "F12": 200.0, + "F2": 200.0, + "F3": 200.0, + "F4": 200.0, + "F5": 200.0, + "F6": 200.0, + "F7": 200.0, + "F8": 200.0, + "F9": 200.0, + "G1": 200.0, + "G10": 200.0, + "G11": 200.0, + "G12": 200.0, + "G2": 200.0, + "G3": 200.0, + "G4": 200.0, + "G5": 200.0, + "G6": 200.0, + "G7": 200.0, + "G8": 200.0, + "G9": 200.0, + "H1": 200.0, + "H10": 200.0, + "H11": 200.0, + "H12": 200.0, + "H2": 200.0, + "H3": 200.0, + "H4": 200.0, + "H5": 200.0, + "H6": 200.0, + "H7": 200.0, + "H8": 200.0, + "H9": 200.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 100.0, + "A2": 100.0, + "A3": 100.0, + "A4": 100.0, + "A5": 100.0, + "A6": 100.0, + "B1": 100.0, + "B2": 100.0, + "B3": 100.0, + "B4": 100.0, + "B5": 100.0, + "B6": 100.0, + "C1": 100.0, + "C2": 100.0, + "C3": 100.0, + "C4": 100.0, + "C5": 100.0, + "C6": 100.0, + "D1": 100.0, + "D2": 100.0, + "D3": 100.0, + "D4": 100.0, + "D5": 100.0, + "D6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateHeater", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 74.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 255.24, + "z": 2.25 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.175, + "y": 75.275, + "z": 73.025 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 74.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 285.75, + "y": 159.13, + "z": 7.7 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.175, + "y": 75.275, + "z": 73.025 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 288.38, + "y": 65.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 285.75, + "y": 141.88, + "z": 7.7 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 59.175, + "y": 66.275, + "z": 73.025 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 288.38, + "y": 56.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 285.75, + "y": 124.63, + "z": 7.7 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 59.175, + "y": 57.275, + "z": 73.025 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 288.38, + "y": 47.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 285.75, + "y": 107.38, + "z": 7.7 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 59.175, + "y": 48.275, + "z": 73.025 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setTargetTemperature", + "params": { + "celsius": 80.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/waitForTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 400.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/waitForTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateHeater", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 297.38, + "y": 74.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.175, + "y": 75.275, + "z": 73.525 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 288.38, + "y": 38.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 70.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.175, + "y": 75.275, + "z": 73.525 + }, + "volume": 70.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 70.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 70.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 288.38, + "y": 29.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 70.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 59.175, + "y": 66.275, + "z": 73.525 + }, + "volume": 70.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 70.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 70.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 288.38, + "y": 20.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 70.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 59.175, + "y": 57.275, + "z": 73.525 + }, + "volume": 70.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 70.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 70.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 288.38, + "y": 11.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 70.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 59.175, + "y": 48.275, + "z": 73.525 + }, + "volume": 70.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 70.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 70.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 306.38, + "y": 74.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 306.38, + "y": 65.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 270.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 270.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.175, + "y": 75.275, + "z": 73.025 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 23.175, + "y": 66.275, + "z": 73.025 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 23.175, + "y": 57.275, + "z": 73.025 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 23.175, + "y": 48.275, + "z": 73.025 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 23.175, + "y": 39.275, + "z": 73.025 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 46.43, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 170.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 170.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 23.175, + "y": 30.275, + "z": 73.025 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 23.175, + "y": 21.275, + "z": 73.025 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 23.175, + "y": 12.275, + "z": 73.025 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 46.43, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + } + ], + "config": { + "protocolType": "json", + "schemaVersion": 6 + }, + "errors": [], + "files": [ + { + "name": "OT2_P300M_P300S_HS_6_1_HS_NormalUseWithTransfer.json", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "3" + } + }, + { + "definitionUri": "opentrons/opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep/1", + "displayName": "H/S", + "loadName": "opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", + "displayName": "Single", + "loadName": "opentrons_24_aluminumblock_generic_2ml_screwcap", + "location": { + "slotName": "6" + } + }, + { + "definitionUri": "opentrons/biorad_96_wellplate_200ul_pcr/1", + "displayName": "Multi", + "loadName": "biorad_96_wellplate_200ul_pcr", + "location": { + "slotName": "9" + } + }, + { + "definitionUri": "opentrons/agilent_1_reservoir_290ml/1", + "displayName": "Mis", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "7" + } + } + ], + "liquids": [ + { + "description": "", + "displayColor": "#b925ff", + "displayName": "L1" + }, + { + "description": "", + "displayColor": "#ffd600", + "displayName": "L2" + } + ], + "metadata": { + "author": "", + "category": null, + "description": "", + "protocolName": "H/S normal use", + "subcategory": null, + "tags": [] + }, + "modules": [ + { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + { + "mount": "right", + "pipetteName": "p300_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[512a897a47][Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol4].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[512a897a47][Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol4].json new file mode 100644 index 00000000000..3d92ecf3ec2 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[512a897a47][Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol4].json @@ -0,0 +1,73 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "ValueError [line 15]: Cannot load a module onto a staging slot.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "ValueError: Cannot load a module onto a staging slot.", + "errorCode": "4000", + "errorInfo": { + "args": "('Cannot load a module onto a staging slot.',)", + "class": "ValueError", + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 69, in run_python\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol4.py\", line 15, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 816, in load_module\n raise ValueError(\"Cannot load a module onto a staging slot.\")\n" + }, + "errorType": "PythonException", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "Flex_None_None_TM_2_16_AnalysisError_ModuleInStagingAreaCol4.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [], + "liquids": [], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Analysis Error - Module in Staging Area Column 4" + }, + "modules": [], + "pipettes": [], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[52a42597a5][OT2_P300M_P20S_MM_HS_TD_TC_6_1_AllMods_Error].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[52a42597a5][OT2_P300M_P20S_MM_HS_TD_TC_6_1_AllMods_Error].json new file mode 100644 index 00000000000..384508e6c68 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[52a42597a5][OT2_P300M_P20S_MM_HS_TD_TC_6_1_AllMods_Error].json @@ -0,0 +1,7371 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p300_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "9" + }, + "model": "magneticModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 124.875, + "y": 2.75, + "z": 82.25 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 110.152, + "overLabwareHeight": 4.052 + }, + "displayName": "Magnetic Module GEN1", + "gripperOffsets": {}, + "labwareOffset": { + "x": 0.125, + "y": -0.125, + "z": 82.25 + }, + "model": "magneticModuleV1", + "moduleType": "magneticModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": {} + }, + "model": "magneticModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "3" + }, + "model": "temperatureModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV2" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN1", + "gripperOffsets": {}, + "labwareOffset": { + "x": -0.15, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV1", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": {} + }, + "model": "temperatureModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [ + "thermocyclerModuleV1" + ], + "dimensions": { + "bareOverallHeight": 98.0, + "lidHeight": 37.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN1", + "gripperOffsets": {}, + "labwareOffset": { + "x": 0.0, + "y": 82.56, + "z": 97.8 + }, + "model": "thermocyclerModuleV1", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": {} + }, + "model": "thermocyclerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "H/S", + "loadName": "opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 42.25 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deepwell Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 Deep Well Adapter with NEST Deep Well Plate 2 mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Temp", + "loadName": "opentrons_24_aluminumblock_generic_2ml_screwcap", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/hardware-modules/products/aluminum-block-set" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.5, + "zDimension": 42 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "generic", + "brandId": [], + "links": [] + }, + "metadata": { + "displayCategory": "tubeRack", + "displayName": "Generic 2 mL Screwcap", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A2", + "A3", + "A4", + "A5", + "A6", + "B1", + "B2", + "B3", + "B4", + "B5", + "B6", + "C1", + "C2", + "C3", + "C4", + "C5", + "C6", + "D1", + "D2", + "D3", + "D4", + "D5", + "D6" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1" + ], + [ + "A2", + "B2", + "C2", + "D2" + ], + [ + "A3", + "B3", + "C3", + "D3" + ], + [ + "A4", + "B4", + "C4", + "D4" + ], + [ + "A5", + "B5", + "C5", + "D5" + ], + [ + "A6", + "B6", + "C6", + "D6" + ] + ], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_24_aluminumblock_generic_2ml_screwcap" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 68.63, + "z": 6.7 + }, + "A2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 68.63, + "z": 6.7 + }, + "A3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 68.63, + "z": 6.7 + }, + "A4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 68.63, + "z": 6.7 + }, + "A5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 68.63, + "z": 6.7 + }, + "A6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 68.63, + "z": 6.7 + }, + "B1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 51.38, + "z": 6.7 + }, + "B2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 51.38, + "z": 6.7 + }, + "B3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 51.38, + "z": 6.7 + }, + "B4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 51.38, + "z": 6.7 + }, + "B5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 51.38, + "z": 6.7 + }, + "B6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 51.38, + "z": 6.7 + }, + "C1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 34.13, + "z": 6.7 + }, + "C2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 34.13, + "z": 6.7 + }, + "C3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 34.13, + "z": 6.7 + }, + "C4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 34.13, + "z": 6.7 + }, + "C5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 34.13, + "z": 6.7 + }, + "C6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 34.13, + "z": 6.7 + }, + "D1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 16.88, + "z": 6.7 + }, + "D2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 16.88, + "z": 6.7 + }, + "D3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 16.88, + "z": 6.7 + }, + "D4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 16.88, + "z": 6.7 + }, + "D5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 16.88, + "z": 6.7 + }, + "D6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 16.88, + "z": 6.7 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Mag", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Themo", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "L1", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "6" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Agilent", + "brandId": [ + "201252-100" + ], + "links": [ + "https://www.agilent.com/store/en_US/Prod-201252-100/201252-100" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.57, + "zDimension": 44.04 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "Agilent 1 Well Reservoir 290 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "agilent_1_reservoir_290ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.22, + "shape": "rectangular", + "totalLiquidVolume": 290000, + "x": 63.88, + "xDimension": 108, + "y": 42.785, + "yDimension": 72, + "z": 4.82 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 300.0, + "A2": 300.0, + "B1": 300.0, + "B2": 300.0, + "C1": 300.0, + "C2": 300.0, + "D1": 300.0, + "D2": 300.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 20.0, + "A2": 20.0, + "A3": 20.0, + "B1": 20.0, + "B2": 20.0, + "B3": 20.0, + "C1": 20.0, + "C2": 20.0, + "C3": 20.0, + "D1": 20.0, + "D2": 20.0, + "D3": 20.0, + "E1": 20.0, + "E2": 20.0, + "E3": 20.0, + "F1": 20.0, + "F2": 20.0, + "F3": 20.0, + "G1": 20.0, + "G2": 20.0, + "G3": 20.0, + "H1": 20.0, + "H2": 20.0, + "H3": 20.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 100.0, + "A2": 100.0, + "A3": 100.0, + "A4": 100.0, + "A5": 100.0, + "A6": 100.0, + "B1": 100.0, + "B2": 100.0, + "B3": 100.0, + "B4": 100.0, + "B5": 100.0, + "B6": 100.0, + "C1": 100.0, + "C2": 100.0, + "C3": 100.0, + "C4": 100.0, + "C5": 100.0, + "C6": 100.0, + "D1": 100.0, + "D2": 100.0, + "D3": 100.0, + "D4": 100.0, + "D5": 100.0, + "D6": 100.0, + "E1": 100.0, + "E2": 100.0, + "E3": 100.0, + "E4": 100.0, + "E5": 100.0, + "E6": 100.0, + "F1": 100.0, + "F2": 100.0, + "F3": 100.0, + "F4": 100.0, + "F5": 100.0, + "F6": 100.0, + "G1": 100.0, + "G2": 100.0, + "G3": 100.0, + "G4": 100.0, + "G5": 100.0, + "G6": 100.0, + "H1": 100.0, + "H2": 100.0, + "H3": 100.0, + "H4": 100.0, + "H5": 100.0, + "H6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 100.0, + "A2": 100.0, + "A3": 100.0, + "A4": 100.0, + "A5": 100.0, + "A6": 100.0, + "B1": 100.0, + "B2": 100.0, + "B3": 100.0, + "B4": 100.0, + "B5": 100.0, + "B6": 100.0, + "C1": 100.0, + "C2": 100.0, + "C3": 100.0, + "C4": 100.0, + "C5": 100.0, + "C6": 100.0, + "D1": 100.0, + "D2": 100.0, + "D3": 100.0, + "D4": 100.0, + "D5": 100.0, + "D6": 100.0, + "E1": 100.0, + "E2": 100.0, + "E3": 100.0, + "E4": 100.0, + "E5": 100.0, + "E6": 100.0, + "F1": 100.0, + "F2": 100.0, + "F3": 100.0, + "F4": 100.0, + "F5": 100.0, + "F6": 100.0, + "G1": 100.0, + "G2": 100.0, + "G3": 100.0, + "G4": 100.0, + "G5": 100.0, + "G6": 100.0, + "H1": 100.0, + "H2": 100.0, + "H3": 100.0, + "H4": 100.0, + "H5": 100.0, + "H6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 29000.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateHeater", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 146.88, + "y": 164.74, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.175, + "y": 75.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 155.88, + "y": 164.74, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 333.505, + "y": 255.115, + "z": 83.67 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 164.88, + "y": 164.74, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 25.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 25.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 25.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 320.1, + "y": 68.47999999999999, + "z": 87.29 + }, + "volume": 25.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 164.88, + "y": 155.74, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 25.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 25.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 25.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 320.1, + "y": 51.230000000000004, + "z": 87.29 + }, + "volume": 25.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 164.88, + "y": 146.74, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 25.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 25.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 25.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 320.1, + "y": 33.980000000000004, + "z": 87.29 + }, + "volume": 25.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 164.88, + "y": 137.74, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 25.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 25.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 25.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 320.1, + "y": 16.73, + "z": 87.29 + }, + "volume": 25.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 164.88, + "y": 128.74, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 337.8, + "z": 88.52 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 164.88, + "y": 119.74, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 68.38, + "y": 328.8, + "z": 88.52 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 164.88, + "y": 110.74, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 68.38, + "y": 319.8, + "z": 88.52 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 164.88, + "y": 101.74, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 337.8, + "z": 88.52 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 173.88, + "y": 164.74, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 77.38, + "y": 328.8, + "z": 88.52 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 173.88, + "y": 155.74, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 77.38, + "y": 319.8, + "z": 88.52 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/closeLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetBlockTemperature", + "params": { + "celsius": 55.0 + }, + "result": { + "targetBlockTemperature": 55.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForBlockTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetLidTemperature", + "params": { + "celsius": 50.0 + }, + "result": { + "targetLidTemperature": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForLidTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setTargetTemperature", + "params": { + "celsius": 55.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/waitForTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1000.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/waitForTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "magneticModule/engage", + "params": { + "height": 12.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "temperatureModule/setTargetTemperature", + "params": { + "celsius": 80.0 + }, + "result": { + "targetTemperature": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/waitForTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "error": { + "detail": "Heater-Shaker cannot open its labware latch while it is shaking.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "CannotPerformModuleAction", + "wrappedErrors": [] + }, + "params": {}, + "status": "failed" + }, + { + "commandType": "heaterShaker/deactivateHeater", + "params": {}, + "status": "failed" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "status": "failed" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "status": "failed" + }, + { + "commandType": "thermocycler/deactivateBlock", + "params": {}, + "status": "failed" + }, + { + "commandType": "thermocycler/deactivateLid", + "params": {}, + "status": "failed" + } + ], + "config": { + "protocolType": "json", + "schemaVersion": 6 + }, + "errors": [ + { + "detail": "Heater-Shaker cannot open its labware latch while it is shaking.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "CannotPerformModuleAction", + "wrappedErrors": [] + } + ], + "files": [ + { + "name": "OT2_P300M_P20S_MM_HS_TD_TC_6_1_AllMods_Error.json", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + } + }, + { + "definitionUri": "opentrons/opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep/1", + "displayName": "H/S", + "loadName": "opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", + "displayName": "Temp", + "loadName": "opentrons_24_aluminumblock_generic_2ml_screwcap", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", + "displayName": "Mag", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", + "displayName": "Themo", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/agilent_1_reservoir_290ml/1", + "displayName": "L1", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "6" + } + } + ], + "liquids": [ + { + "description": "", + "displayColor": "#b925ff", + "displayName": "L1" + }, + { + "description": "", + "displayColor": "#ffd600", + "displayName": "L2" + } + ], + "metadata": { + "author": "", + "category": null, + "description": "", + "protocolName": "All mods", + "subcategory": null, + "tags": [] + }, + "modules": [ + { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + }, + { + "location": { + "slotName": "9" + }, + "model": "magneticModuleV1" + }, + { + "location": { + "slotName": "3" + }, + "model": "temperatureModuleV1" + }, + { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV1" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + { + "mount": "right", + "pipetteName": "p300_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[53e75c4553][Flex_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[53e75c4553][Flex_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel].json new file mode 100644 index 00000000000..e22986e0fdb --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[53e75c4553][Flex_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel].json @@ -0,0 +1,13455 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "D1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C3" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "D3" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Thermo Scientific", + "brandId": [ + "AB2396" + ], + "links": [ + "https://www.fishersci.com/shop/products/armadillo-96-well-pcr-plate-1/AB2396" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 16.0 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.0, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Armadillo 96 Well Plate 200 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.95 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 11.91 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 3.54 + }, + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.7 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.24, + "z": 1.05 + }, + "A10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.24, + "z": 1.05 + }, + "A11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.24, + "z": 1.05 + }, + "A12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.24, + "z": 1.05 + }, + "A2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.24, + "z": 1.05 + }, + "A3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.24, + "z": 1.05 + }, + "A4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.24, + "z": 1.05 + }, + "A5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.24, + "z": 1.05 + }, + "A6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.24, + "z": 1.05 + }, + "A7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.24, + "z": 1.05 + }, + "A8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.24, + "z": 1.05 + }, + "A9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.24, + "z": 1.05 + }, + "B1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.24, + "z": 1.05 + }, + "B10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.24, + "z": 1.05 + }, + "B11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.24, + "z": 1.05 + }, + "B12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.24, + "z": 1.05 + }, + "B2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.24, + "z": 1.05 + }, + "B3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.24, + "z": 1.05 + }, + "B4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.24, + "z": 1.05 + }, + "B5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.24, + "z": 1.05 + }, + "B6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.24, + "z": 1.05 + }, + "B7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.24, + "z": 1.05 + }, + "B8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.24, + "z": 1.05 + }, + "B9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.24, + "z": 1.05 + }, + "C1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.24, + "z": 1.05 + }, + "C10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.24, + "z": 1.05 + }, + "C11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.24, + "z": 1.05 + }, + "C12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.24, + "z": 1.05 + }, + "C2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.24, + "z": 1.05 + }, + "C3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.24, + "z": 1.05 + }, + "C4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.24, + "z": 1.05 + }, + "C5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.24, + "z": 1.05 + }, + "C6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.24, + "z": 1.05 + }, + "C7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.24, + "z": 1.05 + }, + "C8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.24, + "z": 1.05 + }, + "C9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.24, + "z": 1.05 + }, + "D1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.24, + "z": 1.05 + }, + "D10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.24, + "z": 1.05 + }, + "D11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.24, + "z": 1.05 + }, + "D12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.24, + "z": 1.05 + }, + "D2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.24, + "z": 1.05 + }, + "D3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.24, + "z": 1.05 + }, + "D4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.24, + "z": 1.05 + }, + "D5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.24, + "z": 1.05 + }, + "D6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.24, + "z": 1.05 + }, + "D7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.24, + "z": 1.05 + }, + "D8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.24, + "z": 1.05 + }, + "D9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.24, + "z": 1.05 + }, + "E1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.24, + "z": 1.05 + }, + "E10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.24, + "z": 1.05 + }, + "E11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.24, + "z": 1.05 + }, + "E12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.24, + "z": 1.05 + }, + "E2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.24, + "z": 1.05 + }, + "E3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.24, + "z": 1.05 + }, + "E4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.24, + "z": 1.05 + }, + "E5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.24, + "z": 1.05 + }, + "E6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.24, + "z": 1.05 + }, + "E7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.24, + "z": 1.05 + }, + "E8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.24, + "z": 1.05 + }, + "E9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.24, + "z": 1.05 + }, + "F1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.24, + "z": 1.05 + }, + "F10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.24, + "z": 1.05 + }, + "F11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.24, + "z": 1.05 + }, + "F12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.24, + "z": 1.05 + }, + "F2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.24, + "z": 1.05 + }, + "F3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.24, + "z": 1.05 + }, + "F4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.24, + "z": 1.05 + }, + "F5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.24, + "z": 1.05 + }, + "F6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.24, + "z": 1.05 + }, + "F7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.24, + "z": 1.05 + }, + "F8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.24, + "z": 1.05 + }, + "F9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.24, + "z": 1.05 + }, + "G1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.24, + "z": 1.05 + }, + "G10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.24, + "z": 1.05 + }, + "G11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.24, + "z": 1.05 + }, + "G12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.24, + "z": 1.05 + }, + "G2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.24, + "z": 1.05 + }, + "G3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.24, + "z": 1.05 + }, + "G4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.24, + "z": 1.05 + }, + "G5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.24, + "z": 1.05 + }, + "G6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.24, + "z": 1.05 + }, + "G7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.24, + "z": 1.05 + }, + "G8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.24, + "z": 1.05 + }, + "G9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.24, + "z": 1.05 + }, + "H1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.24, + "z": 1.05 + }, + "H10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.24, + "z": 1.05 + }, + "H11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.24, + "z": 1.05 + }, + "H12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.24, + "z": 1.05 + }, + "H2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.24, + "z": 1.05 + }, + "H3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.24, + "z": 1.05 + }, + "H4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.24, + "z": 1.05 + }, + "H5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.24, + "z": 1.05 + }, + "H6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.24, + "z": 1.05 + }, + "H7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.24, + "z": 1.05 + }, + "H8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.24, + "z": 1.05 + }, + "H9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.24, + "z": 1.05 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 45.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Magnetic Block GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 0.0, + "z": 38.0 + }, + "model": "magneticBlockV1", + "moduleType": "magneticBlockType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": {}, + "ot2_standard": {}, + "ot3_standard": {} + } + }, + "model": "magneticBlockV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "D2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "B1" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "B2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "B3" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_ot3_96_tiprack_1000ul_rss", + "location": { + "slotName": "A1" + }, + "namespace": "custom_beta", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [ + "RSS_made" + ] + }, + "cornerOffsetFromSlot": { + "x": -14.375, + "y": -3.625, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL with adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "custom_beta", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_ot3_96_tiprack_1000ul_rss", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 78, + "z": 12.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 78, + "z": 12.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 78, + "z": 12.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 78, + "z": 12.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 78, + "z": 12.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 78, + "z": 12.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 78, + "z": 12.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 78, + "z": 12.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 78, + "z": 12.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 78, + "z": 12.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 78, + "z": 12.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 78, + "z": 12.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 69, + "z": 12.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 69, + "z": 12.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 69, + "z": 12.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 69, + "z": 12.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 69, + "z": 12.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 69, + "z": 12.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 69, + "z": 12.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 69, + "z": 12.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 69, + "z": 12.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 69, + "z": 12.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 69, + "z": 12.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 69, + "z": 12.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 60, + "z": 12.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 60, + "z": 12.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 60, + "z": 12.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 60, + "z": 12.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 60, + "z": 12.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 60, + "z": 12.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 60, + "z": 12.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 60, + "z": 12.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 60, + "z": 12.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 60, + "z": 12.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 60, + "z": 12.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 60, + "z": 12.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 51, + "z": 12.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 51, + "z": 12.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 51, + "z": 12.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 51, + "z": 12.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 51, + "z": 12.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 51, + "z": 12.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 51, + "z": 12.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 51, + "z": 12.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 51, + "z": 12.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 51, + "z": 12.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 51, + "z": 12.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 51, + "z": 12.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 42, + "z": 12.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 42, + "z": 12.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 42, + "z": 12.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 42, + "z": 12.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 42, + "z": 12.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 42, + "z": 12.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 42, + "z": 12.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 42, + "z": 12.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 42, + "z": 12.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 42, + "z": 12.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 42, + "z": 12.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 42, + "z": 12.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 33, + "z": 12.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 33, + "z": 12.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 33, + "z": 12.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 33, + "z": 12.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 33, + "z": 12.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 33, + "z": 12.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 33, + "z": 12.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 33, + "z": 12.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 33, + "z": 12.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 33, + "z": 12.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 33, + "z": 12.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 33, + "z": 12.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 24, + "z": 12.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 24, + "z": 12.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 24, + "z": 12.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 24, + "z": 12.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 24, + "z": 12.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 24, + "z": 12.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 24, + "z": 12.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 24, + "z": 12.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 24, + "z": 12.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 24, + "z": 12.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 24, + "z": 12.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 24, + "z": 12.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 15, + "z": 12.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 15, + "z": 12.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 15, + "z": 12.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 15, + "z": 12.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 15, + "z": 12.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 15, + "z": 12.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 15, + "z": 12.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 15, + "z": 12.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 15, + "z": 12.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 15, + "z": 12.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 15, + "z": 12.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 15, + "z": 12.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_ot3_96_tiprack_1000ul_rss", + "location": { + "slotName": "A2" + }, + "namespace": "custom_beta", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [ + "RSS_made" + ] + }, + "cornerOffsetFromSlot": { + "x": -14.375, + "y": -3.625, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL with adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "custom_beta", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_ot3_96_tiprack_1000ul_rss", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 78, + "z": 12.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 78, + "z": 12.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 78, + "z": 12.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 78, + "z": 12.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 78, + "z": 12.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 78, + "z": 12.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 78, + "z": 12.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 78, + "z": 12.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 78, + "z": 12.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 78, + "z": 12.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 78, + "z": 12.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 78, + "z": 12.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 69, + "z": 12.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 69, + "z": 12.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 69, + "z": 12.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 69, + "z": 12.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 69, + "z": 12.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 69, + "z": 12.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 69, + "z": 12.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 69, + "z": 12.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 69, + "z": 12.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 69, + "z": 12.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 69, + "z": 12.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 69, + "z": 12.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 60, + "z": 12.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 60, + "z": 12.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 60, + "z": 12.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 60, + "z": 12.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 60, + "z": 12.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 60, + "z": 12.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 60, + "z": 12.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 60, + "z": 12.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 60, + "z": 12.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 60, + "z": 12.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 60, + "z": 12.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 60, + "z": 12.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 51, + "z": 12.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 51, + "z": 12.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 51, + "z": 12.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 51, + "z": 12.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 51, + "z": 12.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 51, + "z": 12.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 51, + "z": 12.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 51, + "z": 12.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 51, + "z": 12.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 51, + "z": 12.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 51, + "z": 12.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 51, + "z": 12.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 42, + "z": 12.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 42, + "z": 12.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 42, + "z": 12.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 42, + "z": 12.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 42, + "z": 12.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 42, + "z": 12.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 42, + "z": 12.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 42, + "z": 12.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 42, + "z": 12.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 42, + "z": 12.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 42, + "z": 12.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 42, + "z": 12.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 33, + "z": 12.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 33, + "z": 12.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 33, + "z": 12.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 33, + "z": 12.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 33, + "z": 12.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 33, + "z": 12.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 33, + "z": 12.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 33, + "z": 12.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 33, + "z": 12.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 33, + "z": 12.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 33, + "z": 12.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 33, + "z": 12.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 24, + "z": 12.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 24, + "z": 12.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 24, + "z": 12.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 24, + "z": 12.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 24, + "z": 12.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 24, + "z": 12.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 24, + "z": 12.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 24, + "z": 12.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 24, + "z": 12.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 24, + "z": 12.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 24, + "z": 12.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 24, + "z": 12.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 28.75, + "y": 15, + "z": 12.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 109.75, + "y": 15, + "z": 12.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 118.75, + "y": 15, + "z": 12.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 127.75, + "y": 15, + "z": 12.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 37.75, + "y": 15, + "z": 12.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 46.75, + "y": 15, + "z": 12.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 55.75, + "y": 15, + "z": 12.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 64.75, + "y": 15, + "z": 12.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 73.75, + "y": 15, + "z": 12.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 82.75, + "y": 15, + "z": 12.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 91.75, + "y": 15, + "z": 12.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 100.75, + "y": 15, + "z": 12.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p1000_96" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 15 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "UnsuitableTiprackForPipetteMotion [line 276]: Error 2004 MOTION_PLANNING_FAILURE (UnsuitableTiprackForPipetteMotion): Opentrons Flex 96 Tip Rack 1000 µL with adapter must be on an Opentrons Flex 96 Tip Rack Adapter in order to pick up or return all 96 tips simultaneously.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "Opentrons Flex 96 Tip Rack 1000 µL with adapter must be on an Opentrons Flex 96 Tip Rack Adapter in order to pick up or return all 96 tips simultaneously.", + "errorCode": "2004", + "errorInfo": {}, + "errorType": "UnsuitableTiprackForPipetteMotion", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "Flex_P1000_96_HS_TM_MM_2_15_ABR5_6_HDQ_Bacteria_ParkTips_96_channel.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_3200ml_fixed/1", + "loadName": "opentrons_1_trash_3200ml_fixed", + "location": { + "slotName": "A3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C3" + } + }, + { + "definitionUri": "opentrons/armadillo_96_wellplate_200ul_pcr_full_skirt/2", + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "D2" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C2" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "B1" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "B2" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "B3" + } + }, + { + "definitionUri": "custom_beta/opentrons_ot3_96_tiprack_1000ul_rss/1", + "loadName": "opentrons_ot3_96_tiprack_1000ul_rss", + "location": { + "slotName": "A1" + } + }, + { + "definitionUri": "custom_beta/opentrons_ot3_96_tiprack_1000ul_rss/1", + "loadName": "opentrons_ot3_96_tiprack_1000ul_rss", + "location": { + "slotName": "A2" + } + } + ], + "liquids": [], + "metadata": { + "author": "Zach Galluzzo ", + "protocolName": "Omega HDQ DNA Extraction: Bacteria 96 FOR ABR TESTING" + }, + "modules": [ + { + "location": { + "slotName": "D1" + }, + "model": "heaterShakerModuleV1" + }, + { + "location": { + "slotName": "D3" + }, + "model": "temperatureModuleV2" + }, + { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p1000_96" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5635695ed6][OT2_P300SLeft_MM_TM_TM_5_2_6_MOAMTemps].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5635695ed6][OT2_P300SLeft_MM_TM_TM_5_2_6_MOAMTemps].json new file mode 100644 index 00000000000..473fb658845 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5635695ed6][OT2_P300SLeft_MM_TM_TM_5_2_6_MOAMTemps].json @@ -0,0 +1,2546 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "1" + }, + "model": "magneticModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 124.875, + "y": 2.75, + "z": 82.25 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 110.152, + "overLabwareHeight": 4.052 + }, + "displayName": "Magnetic Module GEN2", + "gripperOffsets": {}, + "labwareOffset": { + "x": -1.175, + "y": -0.125, + "z": 82.25 + }, + "model": "magneticModuleV2", + "moduleType": "magneticModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "magneticModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "3" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "6" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Trash", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons" + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 172.86, + "yDimension": 165.86, + "zDimension": 82 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "trash", + "displayName": "Opentrons Fixed Trash", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trash", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_1_trash_1100ml_fixed", + "quirks": [ + "centerMultichannelOnWells", + "fixedTrash", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 0, + "shape": "rectangular", + "totalLiquidVolume": 1100000, + "x": 82.84, + "xDimension": 107.11, + "y": 80, + "yDimension": 165.67, + "z": 82 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + } + ], + "config": { + "protocolType": "json", + "schemaVersion": 4 + }, + "errors": [], + "files": [ + { + "name": "OT2_P300SLeft_MM_TM_TM_5_2_6_MOAMTemps.json", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "displayName": "Trash", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + } + } + ], + "liquids": [], + "metadata": { + "author": "AA BB", + "category": null, + "description": "Module - PUR", + "protocolName": "MoaM", + "subcategory": null, + "tags": [] + }, + "modules": [ + { + "location": { + "slotName": "1" + }, + "model": "magneticModuleV2" + }, + { + "location": { + "slotName": "3" + }, + "model": "temperatureModuleV2" + }, + { + "location": { + "slotName": "6" + }, + "model": "temperatureModuleV2" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[56ce1419a7][OT2_P300SLeft_MM1_MM_TM_2_3_Mix].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[56ce1419a7][OT2_P300SLeft_MM1_MM_TM_2_3_Mix].json new file mode 100644 index 00000000000..864e66a8cd9 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[56ce1419a7][OT2_P300SLeft_MM1_MM_TM_2_3_Mix].json @@ -0,0 +1,3350 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "corning_96_wellplate_360ul_flat", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Corning", + "brandId": [ + "2503", + "2507", + "2509", + "3300", + "3361", + "3362", + "3370", + "3474", + "3585", + "3590", + "3591", + "3595", + "3596", + "3598", + "3599", + "3600", + "3628", + "3641", + "3650", + "3665", + "3912", + "3915", + "3916", + "3917", + "3922", + "3925", + "3977", + "9017", + "9018" + ], + "links": [ + "https://ecatalog.corning.com/life-sciences/b2c/US/en/Microplates/Assay-Microplates/96-Well-Microplates/Corning%C2%AE-96-well-Solid-Black-and-White-Polystyrene-Microplates/p/corning96WellSolidBlackAndWhitePolystyreneMicroplates" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.47, + "zDimension": 14.22 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "flat" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Corning 96 Well Plate 360 µL Flat", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "corning_96_wellplate_360ul_flat" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 74.24, + "z": 3.55 + }, + "A10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 74.24, + "z": 3.55 + }, + "A11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 74.24, + "z": 3.55 + }, + "A12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 74.24, + "z": 3.55 + }, + "A2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 74.24, + "z": 3.55 + }, + "A3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 74.24, + "z": 3.55 + }, + "A4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 74.24, + "z": 3.55 + }, + "A5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 74.24, + "z": 3.55 + }, + "A6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 74.24, + "z": 3.55 + }, + "A7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 74.24, + "z": 3.55 + }, + "A8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 74.24, + "z": 3.55 + }, + "A9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 74.24, + "z": 3.55 + }, + "B1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 65.24, + "z": 3.55 + }, + "B10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 65.24, + "z": 3.55 + }, + "B11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 65.24, + "z": 3.55 + }, + "B12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 65.24, + "z": 3.55 + }, + "B2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 65.24, + "z": 3.55 + }, + "B3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 65.24, + "z": 3.55 + }, + "B4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 65.24, + "z": 3.55 + }, + "B5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 65.24, + "z": 3.55 + }, + "B6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 65.24, + "z": 3.55 + }, + "B7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 65.24, + "z": 3.55 + }, + "B8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 65.24, + "z": 3.55 + }, + "B9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 65.24, + "z": 3.55 + }, + "C1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 56.24, + "z": 3.55 + }, + "C10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 56.24, + "z": 3.55 + }, + "C11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 56.24, + "z": 3.55 + }, + "C12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 56.24, + "z": 3.55 + }, + "C2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 56.24, + "z": 3.55 + }, + "C3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 56.24, + "z": 3.55 + }, + "C4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 56.24, + "z": 3.55 + }, + "C5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 56.24, + "z": 3.55 + }, + "C6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 56.24, + "z": 3.55 + }, + "C7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 56.24, + "z": 3.55 + }, + "C8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 56.24, + "z": 3.55 + }, + "C9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 56.24, + "z": 3.55 + }, + "D1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 47.24, + "z": 3.55 + }, + "D10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 47.24, + "z": 3.55 + }, + "D11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 47.24, + "z": 3.55 + }, + "D12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 47.24, + "z": 3.55 + }, + "D2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 47.24, + "z": 3.55 + }, + "D3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 47.24, + "z": 3.55 + }, + "D4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 47.24, + "z": 3.55 + }, + "D5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 47.24, + "z": 3.55 + }, + "D6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 47.24, + "z": 3.55 + }, + "D7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 47.24, + "z": 3.55 + }, + "D8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 47.24, + "z": 3.55 + }, + "D9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 47.24, + "z": 3.55 + }, + "E1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 38.24, + "z": 3.55 + }, + "E10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 38.24, + "z": 3.55 + }, + "E11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 38.24, + "z": 3.55 + }, + "E12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 38.24, + "z": 3.55 + }, + "E2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 38.24, + "z": 3.55 + }, + "E3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 38.24, + "z": 3.55 + }, + "E4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 38.24, + "z": 3.55 + }, + "E5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 38.24, + "z": 3.55 + }, + "E6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 38.24, + "z": 3.55 + }, + "E7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 38.24, + "z": 3.55 + }, + "E8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 38.24, + "z": 3.55 + }, + "E9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 38.24, + "z": 3.55 + }, + "F1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 29.24, + "z": 3.55 + }, + "F10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 29.24, + "z": 3.55 + }, + "F11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 29.24, + "z": 3.55 + }, + "F12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 29.24, + "z": 3.55 + }, + "F2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 29.24, + "z": 3.55 + }, + "F3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 29.24, + "z": 3.55 + }, + "F4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 29.24, + "z": 3.55 + }, + "F5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 29.24, + "z": 3.55 + }, + "F6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 29.24, + "z": 3.55 + }, + "F7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 29.24, + "z": 3.55 + }, + "F8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 29.24, + "z": 3.55 + }, + "F9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 29.24, + "z": 3.55 + }, + "G1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 20.24, + "z": 3.55 + }, + "G10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 20.24, + "z": 3.55 + }, + "G11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 20.24, + "z": 3.55 + }, + "G12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 20.24, + "z": 3.55 + }, + "G2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 20.24, + "z": 3.55 + }, + "G3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 20.24, + "z": 3.55 + }, + "G4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 20.24, + "z": 3.55 + }, + "G5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 20.24, + "z": 3.55 + }, + "G6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 20.24, + "z": 3.55 + }, + "G7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 20.24, + "z": 3.55 + }, + "G8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 20.24, + "z": 3.55 + }, + "G9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 20.24, + "z": 3.55 + }, + "H1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 11.24, + "z": 3.55 + }, + "H10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 11.24, + "z": 3.55 + }, + "H11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 11.24, + "z": 3.55 + }, + "H12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 11.24, + "z": 3.55 + }, + "H2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 11.24, + "z": 3.55 + }, + "H3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 11.24, + "z": 3.55 + }, + "H4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 11.24, + "z": 3.55 + }, + "H5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 11.24, + "z": 3.55 + }, + "H6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 11.24, + "z": 3.55 + }, + "H7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 11.24, + "z": 3.55 + }, + "H8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 11.24, + "z": 3.55 + }, + "H9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 11.24, + "z": 3.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "1" + }, + "model": "magneticModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 124.875, + "y": 2.75, + "z": 82.25 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 110.152, + "overLabwareHeight": 4.052 + }, + "displayName": "Magnetic Module GEN1", + "gripperOffsets": {}, + "labwareOffset": { + "x": 0.125, + "y": -0.125, + "z": 82.25 + }, + "model": "magneticModuleV1", + "moduleType": "magneticModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": {} + }, + "model": "magneticModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "4" + }, + "model": "magneticModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 124.875, + "y": 2.75, + "z": 82.25 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 110.152, + "overLabwareHeight": 4.052 + }, + "displayName": "Magnetic Module GEN2", + "gripperOffsets": {}, + "labwareOffset": { + "x": -1.175, + "y": -0.125, + "z": 82.25 + }, + "model": "magneticModuleV2", + "moduleType": "magneticModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "magneticModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "6" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 46.43, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 46.43, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 3 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "OT2_P300SLeft_MM1_MM_TM_2_3_Mix.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/corning_96_wellplate_360ul_flat/1", + "loadName": "corning_96_wellplate_360ul_flat", + "location": { + "slotName": "2" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + } + } + ], + "liquids": [], + "metadata": { + "apiLevel": "2.3" + }, + "modules": [ + { + "location": { + "slotName": "1" + }, + "model": "magneticModuleV1" + }, + { + "location": { + "slotName": "4" + }, + "model": "magneticModuleV2" + }, + { + "location": { + "slotName": "6" + }, + "model": "temperatureModuleV2" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5887e734b5][OT2_P10S_P300M_TC1_TM_MM_2_11_Swift].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5887e734b5][OT2_P10S_P300M_TC1_TM_MM_2_11_Swift].json new file mode 100644 index 00000000000..c23effc8a2a --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5887e734b5][OT2_P10S_P300M_TC1_TM_MM_2_11_Swift].json @@ -0,0 +1,13955 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "6" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p10_single" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "1" + }, + "model": "magneticModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 124.875, + "y": 2.75, + "z": 82.25 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 110.152, + "overLabwareHeight": 4.052 + }, + "displayName": "Magnetic Module GEN2", + "gripperOffsets": {}, + "labwareOffset": { + "x": -1.175, + "y": -0.125, + "z": 82.25 + }, + "model": "magneticModuleV2", + "moduleType": "magneticModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "magneticModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "4" + }, + "model": "temperatureModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV2" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN1", + "gripperOffsets": {}, + "labwareOffset": { + "x": -0.15, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV1", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": {} + }, + "model": "temperatureModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_24_aluminumblock_generic_2ml_screwcap", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/hardware-modules/products/aluminum-block-set" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.5, + "zDimension": 42 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "generic", + "brandId": [], + "links": [] + }, + "metadata": { + "displayCategory": "tubeRack", + "displayName": "Generic 2 mL Screwcap", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A2", + "A3", + "A4", + "A5", + "A6", + "B1", + "B2", + "B3", + "B4", + "B5", + "B6", + "C1", + "C2", + "C3", + "C4", + "C5", + "C6", + "D1", + "D2", + "D3", + "D4", + "D5", + "D6" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1" + ], + [ + "A2", + "B2", + "C2", + "D2" + ], + [ + "A3", + "B3", + "C3", + "D3" + ], + [ + "A4", + "B4", + "C4", + "D4" + ], + [ + "A5", + "B5", + "C5", + "D5" + ], + [ + "A6", + "B6", + "C6", + "D6" + ] + ], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_24_aluminumblock_generic_2ml_screwcap" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 68.63, + "z": 6.7 + }, + "A2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 68.63, + "z": 6.7 + }, + "A3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 68.63, + "z": 6.7 + }, + "A4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 68.63, + "z": 6.7 + }, + "A5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 68.63, + "z": 6.7 + }, + "A6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 68.63, + "z": 6.7 + }, + "B1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 51.38, + "z": 6.7 + }, + "B2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 51.38, + "z": 6.7 + }, + "B3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 51.38, + "z": 6.7 + }, + "B4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 51.38, + "z": 6.7 + }, + "B5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 51.38, + "z": 6.7 + }, + "B6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 51.38, + "z": 6.7 + }, + "C1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 34.13, + "z": 6.7 + }, + "C2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 34.13, + "z": 6.7 + }, + "C3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 34.13, + "z": 6.7 + }, + "C4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 34.13, + "z": 6.7 + }, + "C5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 34.13, + "z": 6.7 + }, + "C6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 34.13, + "z": 6.7 + }, + "D1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 16.88, + "z": 6.7 + }, + "D2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 16.88, + "z": 6.7 + }, + "D3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 16.88, + "z": 6.7 + }, + "D4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 16.88, + "z": 6.7 + }, + "D5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 16.88, + "z": 6.7 + }, + "D6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 16.88, + "z": 6.7 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [ + "thermocyclerModuleV1" + ], + "dimensions": { + "bareOverallHeight": 98.0, + "lidHeight": 37.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN1", + "gripperOffsets": {}, + "labwareOffset": { + "x": 0.0, + "y": 82.56, + "z": 97.8 + }, + "model": "thermocyclerModuleV1", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": {} + }, + "model": "thermocyclerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Temperature Module temperature to 40.0 °C (rounded off to nearest integer)", + "legacyCommandType": "command.TEMPDECK_SET_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Thermocycler well block temperature to 30.0 °C", + "legacyCommandType": "command.THERMOCYCLER_SET_BLOCK_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A2 of NEST 96 Well Plate 100 µL PCR Full Skirt on Thermocycler Module GEN1 on 7", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.5 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to B2 of NEST 96 Well Plate 100 µL PCR Full Skirt on Thermocycler Module GEN1 on 7", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.5 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to C2 of NEST 96 Well Plate 100 µL PCR Full Skirt on Thermocycler Module GEN1 on 7", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.5 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to D2 of NEST 96 Well Plate 100 µL PCR Full Skirt on Thermocycler Module GEN1 on 7", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.5 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to E2 of NEST 96 Well Plate 100 µL PCR Full Skirt on Thermocycler Module GEN1 on 7", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.5 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to F2 of NEST 96 Well Plate 100 µL PCR Full Skirt on Thermocycler Module GEN1 on 7", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.5 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to G2 of NEST 96 Well Plate 100 µL PCR Full Skirt on Thermocycler Module GEN1 on 7", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.5 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to H2 of NEST 96 Well Plate 100 µL PCR Full Skirt on Thermocycler Module GEN1 on 7", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.5 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Closing Thermocycler lid", + "legacyCommandType": "command.THERMOCYCLER_CLOSE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Thermocycler well block temperature to 70.0 °C", + "legacyCommandType": "command.THERMOCYCLER_SET_BLOCK_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Thermocycler well block temperature to 32.0 °C with a hold time of 1.0 minutes and 0 seconds", + "legacyCommandType": "command.THERMOCYCLER_SET_BLOCK_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Thermocycler well block temperature to 64.5 °C with a hold time of 1.0 minutes and 0 seconds", + "legacyCommandType": "command.THERMOCYCLER_SET_BLOCK_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Thermocycler well block temperature to 4.0 °C", + "legacyCommandType": "command.THERMOCYCLER_SET_BLOCK_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Deactivating Thermocycler lid heating", + "legacyCommandType": "command.THERMOCYCLER_DEACTIVATE_LID" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Opening Thermocycler lid", + "legacyCommandType": "command.THERMOCYCLER_OPEN" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Homing pipette plunger on mount right", + "legacyCommandType": "command.HOME" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 10.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 94.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 75.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 75.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 75.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 75.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 10.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A2 of NEST 96 Deep Well Plate 2mL on Magnetic Module GEN2 on 1", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 10.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 94.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 50.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 50.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 94.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 75.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 50.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 30.0 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 75.0, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 50.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 75.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 30.0 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Disengaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_DISENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 10.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 50.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 94.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Disengaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_DISENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 35.910000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 8.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 8.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 1000.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Thermocycler well block temperature to 4.0 °C", + "legacyCommandType": "command.THERMOCYCLER_SET_BLOCK_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Thermocycler lid temperature to 105.0 °C", + "legacyCommandType": "command.THERMOCYCLER_SET_LID_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Closing Thermocycler lid", + "legacyCommandType": "command.THERMOCYCLER_CLOSE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Thermocycler well block temperature to 97.0 °C with a hold time of 5 seconds", + "legacyCommandType": "command.THERMOCYCLER_SET_BLOCK_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Thermocycler starting 5 repetitions of cycle composed of the following steps: [{'temperature': 97, 'hold_time_seconds': 5}, {'temperature': 59.5, 'hold_time_seconds': 5}, {'temperature': 67.3, 'hold_time_seconds': 5}]", + "legacyCommandType": "command.THERMOCYCLER_EXECUTE_PROFILE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Opening Thermocycler lid", + "legacyCommandType": "command.THERMOCYCLER_OPEN" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 10.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 50.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 94.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Deactivating Temperature Module", + "legacyCommandType": "command.TEMPDECK_DEACTIVATE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Disengaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_DISENGAGE" + }, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 11 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "OT2_P10S_P300M_TC1_TM_MM_2_11_Swift.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "2" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "3" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "5" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "6" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/1", + "loadName": "nest_96_wellplate_2ml_deep", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", + "loadName": "opentrons_24_aluminumblock_generic_2ml_screwcap", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + } + ], + "liquids": [], + "metadata": { + "apiLevel": "2.11" + }, + "modules": [ + { + "location": { + "slotName": "1" + }, + "model": "magneticModuleV2" + }, + { + "location": { + "slotName": "4" + }, + "model": "temperatureModuleV1" + }, + { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV1" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p10_single" + }, + { + "mount": "right", + "pipetteName": "p300_multi_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5eb46a4f85][Flex_P1000_96_GRIPPER_2_16_AnalysisError_DropLabwareIntoTrashBin].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5eb46a4f85][Flex_P1000_96_GRIPPER_2_16_AnalysisError_DropLabwareIntoTrashBin].json new file mode 100644 index 00000000000..af05109c1e0 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5eb46a4f85][Flex_P1000_96_GRIPPER_2_16_AnalysisError_DropLabwareIntoTrashBin].json @@ -0,0 +1,1385 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "A1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons Flex 96 Tip Rack Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_flex_96_tiprack_adapter", + "quirks": [ + "tiprackAdapterFor96Channel" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": {} + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p1000_96" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 395.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashC3", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 466.25, + "y": 150.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "error": { + "detail": "Cannot use Slot C3, not compatible with one or more of the following fixtures: Trash Bin in C3", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "IncompatibleAddressableAreaError", + "wrappedErrors": [] + }, + "params": { + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "status": "failed" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "ProtocolCommandFailedError [line 20]: Error 4000 GENERAL_ERROR (ProtocolCommandFailedError): IncompatibleAddressableAreaError: Cannot use Slot C3, not compatible with one or more of the following fixtures: Trash Bin in C3", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "IncompatibleAddressableAreaError: Cannot use Slot C3, not compatible with one or more of the following fixtures: Trash Bin in C3", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ProtocolCommandFailedError", + "wrappedErrors": [ + { + "detail": "Cannot use Slot C3, not compatible with one or more of the following fixtures: Trash Bin in C3", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "IncompatibleAddressableAreaError", + "wrappedErrors": [] + } + ] + } + ] + } + ], + "files": [ + { + "name": "Flex_P1000_96_GRIPPER_2_16_AnalysisError_DropLabwareIntoTrashBin.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_adapter/1", + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "A1" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {} + } + ], + "liquids": [], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Analysis Error - Drop Labware in Trash Bin" + }, + "modules": [], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p1000_96" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5fa61df9e2][OT2_P300M_P20S_NoMod_6_1_MixTransferManyLiquids].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5fa61df9e2][OT2_P300M_P20S_NoMod_6_1_MixTransferManyLiquids].json new file mode 100644 index 00000000000..131a55cc052 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5fa61df9e2][OT2_P300M_P20S_NoMod_6_1_MixTransferManyLiquids].json @@ -0,0 +1,5315 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Filter Tip Rack 20 µL", + "loadName": "opentrons_96_filtertiprack_20ul", + "location": { + "slotName": "1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Filter Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_filtertiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 3.29 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 74.26, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 74.26, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 74.26, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 74.26, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 74.26, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 74.26, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 74.26, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 74.26, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 74.26, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 74.26, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 74.26, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 74.26, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 65.26, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 65.26, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 65.26, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 65.26, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 65.26, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 65.26, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 65.26, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 65.26, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 65.26, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 65.26, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 65.26, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 65.26, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 56.26, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 56.26, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 56.26, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 56.26, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 56.26, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 56.26, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 56.26, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 56.26, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 56.26, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 56.26, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 56.26, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 56.26, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 47.26, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 47.26, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 47.26, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 47.26, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 47.26, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 47.26, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 47.26, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 47.26, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 47.26, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 47.26, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 47.26, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 47.26, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 38.26, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 38.26, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 38.26, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 38.26, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 38.26, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 38.26, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 38.26, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 38.26, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 38.26, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 38.26, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 38.26, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 38.26, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 29.26, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 29.26, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 29.26, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 29.26, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 29.26, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 29.26, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 29.26, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 29.26, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 29.26, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 29.26, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 29.26, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 29.26, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 20.26, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 20.26, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 20.26, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 20.26, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 20.26, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 20.26, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 20.26, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 20.26, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 20.26, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 20.26, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 20.26, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 20.26, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 11.26, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 11.26, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 11.26, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 11.26, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 11.26, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 11.26, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 11.26, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 11.26, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 11.26, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 11.26, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 11.26, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 11.26, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "290ml", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "10" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Agilent", + "brandId": [ + "201252-100" + ], + "links": [ + "https://www.agilent.com/store/en_US/Prod-201252-100/201252-100" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.57, + "zDimension": 44.04 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "Agilent 1 Well Reservoir 290 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "agilent_1_reservoir_290ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.22, + "shape": "rectangular", + "totalLiquidVolume": 290000, + "x": 63.88, + "xDimension": 108, + "y": 42.785, + "yDimension": 72, + "z": 4.82 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "290-2", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "11" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Agilent", + "brandId": [ + "201252-100" + ], + "links": [ + "https://www.agilent.com/store/en_US/Prod-201252-100/201252-100" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.57, + "zDimension": 44.04 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "Agilent 1 Well Reservoir 290 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "agilent_1_reservoir_290ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.22, + "shape": "rectangular", + "totalLiquidVolume": 290000, + "x": 63.88, + "xDimension": 108, + "y": 42.785, + "yDimension": 72, + "z": 4.82 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Agilent 1 Well Reservoir 290 mL", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "7" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Agilent", + "brandId": [ + "201252-100" + ], + "links": [ + "https://www.agilent.com/store/en_US/Prod-201252-100/201252-100" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.57, + "zDimension": 44.04 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "Agilent 1 Well Reservoir 290 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "agilent_1_reservoir_290ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.22, + "shape": "rectangular", + "totalLiquidVolume": 290000, + "x": 63.88, + "xDimension": 108, + "y": 42.785, + "yDimension": 72, + "z": 4.82 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "many", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "8" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "mix", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "6" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Agilent", + "brandId": [ + "201252-100" + ], + "links": [ + "https://www.agilent.com/store/en_US/Prod-201252-100/201252-100" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.57, + "zDimension": 44.04 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "Agilent 1 Well Reservoir 290 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "agilent_1_reservoir_290ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.22, + "shape": "rectangular", + "totalLiquidVolume": 290000, + "x": 63.88, + "xDimension": 108, + "y": 42.785, + "yDimension": 72, + "z": 4.82 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "mix/transfer", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A10": 400.0, + "A11": 400.0, + "A12": 400.0, + "A5": 400.0, + "A6": 400.0, + "A7": 400.0, + "A8": 400.0, + "A9": 400.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A4": 200.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A3": 200.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A2": 200.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 200.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 29000.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 29000.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 29000.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 146.88, + "y": 74.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 314.28499999999997, + "z": 5.82 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 155.88, + "y": 74.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 196.38, + "y": 314.28499999999997, + "z": 5.82 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 164.88, + "y": 74.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.36, + "y": 74.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 146.88, + "y": 223.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 14.36, + "y": 65.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 155.88, + "y": 223.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 14.36, + "y": 56.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 164.88, + "y": 223.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 14.36, + "y": 47.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 173.88, + "y": 223.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 14.36, + "y": 38.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 200.88, + "y": 223.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 173.88, + "y": 74.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.32 + }, + "volume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 14.36, + "y": 29.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 133.28, + "z": 5.05 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 14.36, + "y": 20.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 133.28, + "z": 5.05 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 14.36, + "y": 11.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 133.28, + "z": 5.05 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.36, + "y": 74.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 133.28, + "z": 5.05 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 23.36, + "y": 65.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 133.28, + "z": 5.05 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 23.36, + "y": 56.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 328.88, + "y": 133.285, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 133.28, + "z": 5.05 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + } + ], + "config": { + "protocolType": "json", + "schemaVersion": 6 + }, + "errors": [], + "files": [ + { + "name": "OT2_P300M_P20S_NoMod_6_1_MixTransferManyLiquids.json", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_filtertiprack_20ul/1", + "displayName": "Opentrons 96 Filter Tip Rack 20 µL", + "loadName": "opentrons_96_filtertiprack_20ul", + "location": { + "slotName": "1" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "2" + } + }, + { + "definitionUri": "opentrons/agilent_1_reservoir_290ml/1", + "displayName": "290ml", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "10" + } + }, + { + "definitionUri": "opentrons/agilent_1_reservoir_290ml/1", + "displayName": "290-2", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "11" + } + }, + { + "definitionUri": "opentrons/agilent_1_reservoir_290ml/1", + "displayName": "Agilent 1 Well Reservoir 290 mL", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "7" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "many", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "8" + } + }, + { + "definitionUri": "opentrons/agilent_1_reservoir_290ml/1", + "displayName": "mix", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "6" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "mix/transfer", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "4" + } + } + ], + "liquids": [ + { + "description": "", + "displayColor": "#b925ff", + "displayName": "1" + }, + { + "description": "", + "displayColor": "#ffd600", + "displayName": "2" + }, + { + "description": "", + "displayColor": "#9dffd8", + "displayName": "3" + }, + { + "description": "", + "displayColor": "#ff9900", + "displayName": "4" + }, + { + "description": "", + "displayColor": "#50d5ff", + "displayName": "5" + }, + { + "description": "", + "displayColor": "#ff80f5", + "displayName": "6" + }, + { + "description": "", + "displayColor": "#7eff42", + "displayName": "7" + }, + { + "description": "", + "displayColor": "#ff4f4f", + "displayName": "8" + } + ], + "metadata": { + "author": "", + "category": null, + "description": "", + "protocolName": "Mix/transfer- several liquids", + "subcategory": null, + "tags": [] + }, + "modules": [], + "pipettes": [ + { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + { + "mount": "left", + "pipetteName": "p300_multi_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5fc4f3adbc][OT2_P20SRight_None_6_1_SimpleTransferError].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5fc4f3adbc][OT2_P20SRight_None_6_1_SimpleTransferError].json new file mode 100644 index 00000000000..4d9d9a5485d --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5fc4f3adbc][OT2_P20SRight_None_6_1_SimpleTransferError].json @@ -0,0 +1,1859 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "gold", + "loadName": "axygen_1_reservoir_90ml", + "location": { + "slotName": "7" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Axygen", + "brandId": [ + "RES-SW1-LP" + ], + "links": [ + "https://ecatalog.corning.com/life-sciences/b2c/US/en/Genomics-%26-Molecular-Biology/Automation-Consumables/Automation-Reservoirs/Axygen%C2%AE-Reagent-Reservoirs/p/RES-SW1-LP?clear=true" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.47, + "zDimension": 19.05 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "flat" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "Axygen 1 Well Reservoir 90 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "axygen_1_reservoir_90ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 12.42, + "shape": "rectangular", + "totalLiquidVolume": 90000, + "x": 63.88, + "xDimension": 106.76, + "y": 42.735, + "yDimension": 70.52, + "z": 6.63 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "SILVER", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "8" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "round", + "loadName": "corning_6_wellplate_16.8ml_flat", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Corning", + "brandId": [ + "3335", + "3471", + "3506", + "3516" + ], + "links": [ + "https://ecatalog.corning.com/life-sciences/b2c/US/en/Microplates/Assay-Microplates/96-Well-Microplates/Costar%C2%AE-Multiple-Well-Cell-Culture-Plates/p/3335" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.47, + "zDimension": 20.27 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "flat" + }, + "wells": [ + "A1", + "A2", + "A3", + "B1", + "B2", + "B3" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Corning 6 Well Plate 16.8 mL Flat", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1" + ], + [ + "A2", + "B2" + ], + [ + "A3", + "B3" + ] + ], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "corning_6_wellplate_16.8ml_flat" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 17.4, + "diameter": 35.43, + "shape": "circular", + "totalLiquidVolume": 16800, + "x": 24.76, + "y": 62.28, + "z": 2.87 + }, + "A2": { + "depth": 17.4, + "diameter": 35.43, + "shape": "circular", + "totalLiquidVolume": 16800, + "x": 63.88, + "y": 62.28, + "z": 2.87 + }, + "A3": { + "depth": 17.4, + "diameter": 35.43, + "shape": "circular", + "totalLiquidVolume": 16800, + "x": 103, + "y": 62.28, + "z": 2.87 + }, + "B1": { + "depth": 17.4, + "diameter": 35.43, + "shape": "circular", + "totalLiquidVolume": 16800, + "x": 24.76, + "y": 23.16, + "z": 2.87 + }, + "B2": { + "depth": 17.4, + "diameter": 35.43, + "shape": "circular", + "totalLiquidVolume": 16800, + "x": 63.88, + "y": 23.16, + "z": 2.87 + }, + "B3": { + "depth": 17.4, + "diameter": 35.43, + "shape": "circular", + "totalLiquidVolume": 16800, + "x": 103, + "y": 23.16, + "z": 2.87 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 20 µL", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A10": 1000.0, + "A5": 1000.0, + "A6": 1000.0, + "A7": 1000.0, + "A8": 1000.0, + "A9": 1000.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 5000.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "error": { + "detail": "Cannot aspirate 21.0 µL when only 20.0 is available.", + "errorCode": "4000", + "errorInfo": { + "attempted_aspirate_volume": 21.0, + "available_volume": 20.0, + "max_pipette_volume": 20, + "max_tip_volume": 20.0 + }, + "errorType": "InvalidAspirateVolumeError", + "wrappedErrors": [] + }, + "params": { + "flowRate": 3.78, + "volume": 21.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "status": "failed" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B1" + }, + "status": "failed" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "status": "failed" + } + ], + "config": { + "protocolType": "json", + "schemaVersion": 6 + }, + "errors": [ + { + "detail": "Cannot aspirate 21.0 µL when only 20.0 is available.", + "errorCode": "4000", + "errorInfo": { + "attempted_aspirate_volume": 21.0, + "available_volume": 20.0, + "max_pipette_volume": 20, + "max_tip_volume": 20.0 + }, + "errorType": "InvalidAspirateVolumeError", + "wrappedErrors": [] + } + ], + "files": [ + { + "name": "OT2_P20SRight_None_6_1_SimpleTransferError.json", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/axygen_1_reservoir_90ml/1", + "displayName": "gold", + "loadName": "axygen_1_reservoir_90ml", + "location": { + "slotName": "7" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "SILVER", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "8" + } + }, + { + "definitionUri": "opentrons/corning_6_wellplate_16.8ml_flat/1", + "displayName": "round", + "loadName": "corning_6_wellplate_16.8ml_flat", + "location": { + "slotName": "3" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "displayName": "Opentrons 96 Tip Rack 20 µL", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "1" + } + } + ], + "liquids": [ + { + "description": "", + "displayColor": "#b925ff", + "displayName": "GOLD" + }, + { + "description": "", + "displayColor": "#ffd600", + "displayName": "SILVER" + } + ], + "metadata": { + "author": "", + "category": null, + "description": "", + "protocolName": "Have Pipette", + "subcategory": null, + "tags": [] + }, + "modules": [], + "pipettes": [ + { + "mount": "right", + "pipetteName": "p20_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6248d65532][OT2_P300M_P20S_TC_HS_TM_2_15_SmokeTestV3].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6248d65532][OT2_P300M_P20S_TC_HS_TM_2_15_SmokeTestV3].json new file mode 100644 index 00000000000..aab5713bb15 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6248d65532][OT2_P300M_P20S_TC_HS_TM_2_15_SmokeTestV3].json @@ -0,0 +1,15223 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "setRailLights", + "params": { + "on": true + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Let there be light! True 🌠🌠🌠", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Is the door is closed? True 🚪🚪🚪", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Is this a simulation? True 🔮🔮🔮", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Running against API Version: 2.15", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "9" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 108.96, + "lidHeight": 61.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 5.6 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.6 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 68.8, + "z": 108.96 + }, + "model": "thermocyclerModuleV2", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot3_standard": { + "B1": { + "cornerOffsetFromSlot": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ], + "labwareOffset": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "thermocyclerModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_well_aluminum_block", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 18.16 + }, + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + } + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons 96 Well Aluminum Block", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_well_aluminum_block", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 74.24, + "z": 3.38 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 74.24, + "z": 3.38 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 74.24, + "z": 3.38 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 74.24, + "z": 3.38 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 74.24, + "z": 3.38 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 74.24, + "z": 3.38 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 74.24, + "z": 3.38 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 74.24, + "z": 3.38 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 74.24, + "z": 3.38 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 74.24, + "z": 3.38 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 74.24, + "z": 3.38 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 74.24, + "z": 3.38 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 65.24, + "z": 3.38 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 65.24, + "z": 3.38 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 65.24, + "z": 3.38 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 65.24, + "z": 3.38 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 65.24, + "z": 3.38 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 65.24, + "z": 3.38 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 65.24, + "z": 3.38 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 65.24, + "z": 3.38 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 65.24, + "z": 3.38 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 65.24, + "z": 3.38 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 65.24, + "z": 3.38 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 65.24, + "z": 3.38 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 56.24, + "z": 3.38 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 56.24, + "z": 3.38 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 56.24, + "z": 3.38 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 56.24, + "z": 3.38 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 56.24, + "z": 3.38 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 56.24, + "z": 3.38 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 56.24, + "z": 3.38 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 56.24, + "z": 3.38 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 56.24, + "z": 3.38 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 56.24, + "z": 3.38 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 56.24, + "z": 3.38 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 56.24, + "z": 3.38 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 47.24, + "z": 3.38 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 47.24, + "z": 3.38 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 47.24, + "z": 3.38 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 47.24, + "z": 3.38 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 47.24, + "z": 3.38 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 47.24, + "z": 3.38 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 47.24, + "z": 3.38 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 47.24, + "z": 3.38 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 47.24, + "z": 3.38 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 47.24, + "z": 3.38 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 47.24, + "z": 3.38 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 47.24, + "z": 3.38 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 38.24, + "z": 3.38 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 38.24, + "z": 3.38 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 38.24, + "z": 3.38 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 38.24, + "z": 3.38 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 38.24, + "z": 3.38 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 38.24, + "z": 3.38 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 38.24, + "z": 3.38 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 38.24, + "z": 3.38 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 38.24, + "z": 3.38 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 38.24, + "z": 3.38 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 38.24, + "z": 3.38 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 38.24, + "z": 3.38 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 29.24, + "z": 3.38 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 29.24, + "z": 3.38 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 29.24, + "z": 3.38 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 29.24, + "z": 3.38 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 29.24, + "z": 3.38 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 29.24, + "z": 3.38 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 29.24, + "z": 3.38 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 29.24, + "z": 3.38 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 29.24, + "z": 3.38 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 29.24, + "z": 3.38 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 29.24, + "z": 3.38 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 29.24, + "z": 3.38 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 20.24, + "z": 3.38 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 20.24, + "z": 3.38 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 20.24, + "z": 3.38 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 20.24, + "z": 3.38 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 20.24, + "z": 3.38 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 20.24, + "z": 3.38 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 20.24, + "z": 3.38 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 20.24, + "z": 3.38 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 20.24, + "z": 3.38 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 20.24, + "z": 3.38 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 20.24, + "z": 3.38 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 20.24, + "z": 3.38 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 11.24, + "z": 3.38 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 11.24, + "z": 3.38 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 11.24, + "z": 3.38 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 11.24, + "z": 3.38 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 11.24, + "z": 3.38 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 11.24, + "z": 3.38 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 11.24, + "z": 3.38 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 11.24, + "z": 3.38 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 11.24, + "z": 3.38 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 11.24, + "z": 3.38 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 11.24, + "z": 3.38 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 11.24, + "z": 3.38 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Temperature-Controlled plate", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_pcr_adapter", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 8.5, + "y": 5.5, + "z": 0 + }, + "dimensions": { + "xDimension": 111, + "yDimension": 75, + "zDimension": 13.85 + }, + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + } + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons 96 PCR Heater-Shaker Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_pcr_adapter", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 69, + "z": 1.85 + }, + "A10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 69, + "z": 1.85 + }, + "A11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 69, + "z": 1.85 + }, + "A12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 69, + "z": 1.85 + }, + "A2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 69, + "z": 1.85 + }, + "A3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 69, + "z": 1.85 + }, + "A4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 69, + "z": 1.85 + }, + "A5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 69, + "z": 1.85 + }, + "A6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 69, + "z": 1.85 + }, + "A7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 69, + "z": 1.85 + }, + "A8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 69, + "z": 1.85 + }, + "A9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 69, + "z": 1.85 + }, + "B1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 60, + "z": 1.85 + }, + "B10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 60, + "z": 1.85 + }, + "B11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 60, + "z": 1.85 + }, + "B12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 60, + "z": 1.85 + }, + "B2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 60, + "z": 1.85 + }, + "B3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 60, + "z": 1.85 + }, + "B4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 60, + "z": 1.85 + }, + "B5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 60, + "z": 1.85 + }, + "B6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 60, + "z": 1.85 + }, + "B7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 60, + "z": 1.85 + }, + "B8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 60, + "z": 1.85 + }, + "B9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 60, + "z": 1.85 + }, + "C1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 51, + "z": 1.85 + }, + "C10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 51, + "z": 1.85 + }, + "C11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 51, + "z": 1.85 + }, + "C12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 51, + "z": 1.85 + }, + "C2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 51, + "z": 1.85 + }, + "C3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 51, + "z": 1.85 + }, + "C4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 51, + "z": 1.85 + }, + "C5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 51, + "z": 1.85 + }, + "C6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 51, + "z": 1.85 + }, + "C7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 51, + "z": 1.85 + }, + "C8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 51, + "z": 1.85 + }, + "C9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 51, + "z": 1.85 + }, + "D1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 42, + "z": 1.85 + }, + "D10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 42, + "z": 1.85 + }, + "D11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 42, + "z": 1.85 + }, + "D12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 42, + "z": 1.85 + }, + "D2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 42, + "z": 1.85 + }, + "D3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 42, + "z": 1.85 + }, + "D4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 42, + "z": 1.85 + }, + "D5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 42, + "z": 1.85 + }, + "D6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 42, + "z": 1.85 + }, + "D7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 42, + "z": 1.85 + }, + "D8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 42, + "z": 1.85 + }, + "D9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 42, + "z": 1.85 + }, + "E1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 33, + "z": 1.85 + }, + "E10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 33, + "z": 1.85 + }, + "E11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 33, + "z": 1.85 + }, + "E12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 33, + "z": 1.85 + }, + "E2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 33, + "z": 1.85 + }, + "E3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 33, + "z": 1.85 + }, + "E4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 33, + "z": 1.85 + }, + "E5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 33, + "z": 1.85 + }, + "E6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 33, + "z": 1.85 + }, + "E7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 33, + "z": 1.85 + }, + "E8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 33, + "z": 1.85 + }, + "E9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 33, + "z": 1.85 + }, + "F1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 24, + "z": 1.85 + }, + "F10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 24, + "z": 1.85 + }, + "F11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 24, + "z": 1.85 + }, + "F12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 24, + "z": 1.85 + }, + "F2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 24, + "z": 1.85 + }, + "F3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 24, + "z": 1.85 + }, + "F4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 24, + "z": 1.85 + }, + "F5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 24, + "z": 1.85 + }, + "F6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 24, + "z": 1.85 + }, + "F7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 24, + "z": 1.85 + }, + "F8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 24, + "z": 1.85 + }, + "F9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 24, + "z": 1.85 + }, + "G1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 15, + "z": 1.85 + }, + "G10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 15, + "z": 1.85 + }, + "G11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 15, + "z": 1.85 + }, + "G12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 15, + "z": 1.85 + }, + "G2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 15, + "z": 1.85 + }, + "G3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 15, + "z": 1.85 + }, + "G4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 15, + "z": 1.85 + }, + "G5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 15, + "z": 1.85 + }, + "G6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 15, + "z": 1.85 + }, + "G7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 15, + "z": 1.85 + }, + "G8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 15, + "z": 1.85 + }, + "G9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 15, + "z": 1.85 + }, + "H1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 6, + "z": 1.85 + }, + "H10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 6, + "z": 1.85 + }, + "H11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 6, + "z": 1.85 + }, + "H12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 6, + "z": 1.85 + }, + "H2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 6, + "z": 1.85 + }, + "H3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 6, + "z": 1.85 + }, + "H4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 6, + "z": 1.85 + }, + "H5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 6, + "z": 1.85 + }, + "H6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 6, + "z": 1.85 + }, + "H7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 6, + "z": 1.85 + }, + "H8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 6, + "z": 1.85 + }, + "H9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 6, + "z": 1.85 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "4 custom tubes", + "loadName": "cpx_4_tuberack_100ul", + "location": { + "slotName": "6" + }, + "namespace": "custom_beta", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "cpx", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127, + "yDimension": 85, + "zDimension": 40 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "cpx", + "brandId": [] + }, + "metadata": { + "displayCategory": "tubeRack", + "wellBottomShape": "u" + }, + "wells": [ + "A1", + "A2", + "B1", + "B2" + ] + } + ], + "metadata": { + "displayCategory": "tubeRack", + "displayName": "cpx 4 Tube Rack with cpx 0.1 mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "custom_beta", + "ordering": [ + [ + "A1", + "B1" + ], + [ + "A2", + "B2" + ] + ], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "cpx_4_tuberack_100ul", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 20, + "y": 65, + "z": 17 + }, + "A2": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50, + "y": 65, + "z": 17 + }, + "B1": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 20, + "y": 35, + "z": 17 + }, + "B2": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50, + "y": 35, + "z": 17 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "logo destination", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 4000.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A2": 2000.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A5": 555.55555 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A8": 900.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A8": 1001.11 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 164.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": "offDeck", + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "2" + }, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 146.88, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Is the pipette tip in the middle of reservoir A1 in slot 2?" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "3" + }, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Is the pipette tip in the middle of reservoir A1 in slot 3?" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "2" + }, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 152.5, + "y": 65.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Is the pipette tip in the middle of custom labware A1 in slot 2?" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "6" + }, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 285.0, + "y": 155.5, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Is the pipette tip in the middle of custom labware A1 in slot 6?" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "2" + }, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 146.88, + "y": 74.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Is the pipette tip in the middle of well A1 in slot 2?" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 200.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 191.88, + "y": 47.24, + "z": 1.92 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 200.88, + "y": 47.24, + "z": 1.92 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 209.88, + "y": 47.24, + "z": 1.92 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 182.88, + "y": 38.24, + "z": 1.92 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": true, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 363.895, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 14.38, + "y": 155.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 14.38, + "y": 155.74, + "z": 45.09 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 14.38, + "y": 146.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0000000000000036 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 20.700000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0000000000000036 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 20.700000000000003 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 3.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 236.88, + "y": 11.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 245.88, + "y": 38.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 236.88, + "y": 38.24, + "z": 0.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 236.88, + "y": 38.24, + "z": 0.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 146.88, + "y": 11.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Is the pipette tip in the middle of the well?" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 14.38, + "y": 146.74, + "z": 45.09 + } + }, + "status": "succeeded" + }, + { + "commandType": "temperatureModule/waitForTemperature", + "params": { + "celsius": 25.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 466.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 5.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setTargetTemperature", + "params": { + "celsius": 38.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/waitForTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/closeLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetLidTemperature", + "params": { + "celsius": 38.0 + }, + "result": { + "targetLidTemperature": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForLidTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetBlockTemperature", + "params": { + "celsius": 28.0, + "holdTimeSeconds": 5.0 + }, + "result": { + "targetBlockTemperature": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForBlockTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/deactivateBlock", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/deactivateLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 14.38, + "y": 137.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 280.53, + "y": 255.08999999999997, + "z": 87.51 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": true, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 331.78499999999997, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 146.88, + "y": 164.74, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.255, + "y": 75.365, + "z": 73.84500000000001 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 350.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 5.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 14.38, + "y": 128.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 11.34, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -22.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 315.0, + "y": 125.5, + "z": 18.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": true, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 363.895, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 324.04, + "z": 100.08 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": true, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 331.78499999999997, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 15 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "OT2_P300M_P20S_TC_HS_TM_2_15_SmokeTestV3.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "4" + } + }, + { + "definitionUri": "opentrons/opentrons_96_well_aluminum_block/1", + "loadName": "opentrons_96_well_aluminum_block", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "displayName": "Temperature-Controlled plate", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_96_pcr_adapter/1", + "loadName": "opentrons_96_pcr_adapter", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "custom_beta/cpx_4_tuberack_100ul/1", + "displayName": "4 custom tubes", + "loadName": "cpx_4_tuberack_100ul", + "location": { + "slotName": "6" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "displayName": "logo destination", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "2" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + } + } + ], + "liquids": [ + { + "description": "H₂O", + "displayColor": "#42AB2D", + "displayName": "water" + }, + { + "description": "C₃H₆O", + "displayColor": "#38588a", + "displayName": "acetone" + } + ], + "metadata": { + "author": "Opentrons Engineering ", + "description": "Description of the protocol that is longish \n has \n returns and \n emoji 😊 ⬆️ ", + "protocolName": "🛠️ 2.15 Smoke Test V3 🪄", + "source": "Software Testing Team" + }, + "modules": [ + { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + }, + { + "location": { + "slotName": "9" + }, + "model": "temperatureModuleV2" + }, + { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV2" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + { + "mount": "right", + "pipetteName": "p20_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6258435dc4][OT2_P300M_P20S_TC_MM_TM_2_13_Smoke620Release].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6258435dc4][OT2_P300M_P20S_TC_MM_TM_2_13_Smoke620Release].json new file mode 100644 index 00000000000..f8f4aa80670 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6258435dc4][OT2_P300M_P20S_TC_MM_TM_2_13_Smoke620Release].json @@ -0,0 +1,9839 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "9" + }, + "model": "magneticModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 124.875, + "y": 2.75, + "z": 82.25 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 110.152, + "overLabwareHeight": 4.052 + }, + "displayName": "Magnetic Module GEN2", + "gripperOffsets": {}, + "labwareOffset": { + "x": -1.175, + "y": -0.125, + "z": 82.25 + }, + "model": "magneticModuleV2", + "moduleType": "magneticModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "magneticModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "4" + }, + "model": "temperatureModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV2" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN1", + "gripperOffsets": {}, + "labwareOffset": { + "x": -0.15, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV1", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": {} + }, + "model": "temperatureModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 108.96, + "lidHeight": 61.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 5.6 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.6 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 68.8, + "z": 108.96 + }, + "model": "thermocyclerModuleV2", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot3_standard": { + "B1": { + "cornerOffsetFromSlot": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ], + "labwareOffset": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "thermocyclerModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Temperature-Controlled plate", + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/hardware-modules/products/aluminum-block-set" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.45, + "zDimension": 21.2 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "quirks": [ + "gripperIncompatible" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.2, + "z": 6.42 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.2, + "z": 6.42 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.2, + "z": 6.42 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.2, + "z": 6.42 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.2, + "z": 6.42 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.2, + "z": 6.42 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.2, + "z": 6.42 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.2, + "z": 6.42 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.2, + "z": 6.42 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.2, + "z": 6.42 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.2, + "z": 6.42 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.2, + "z": 6.42 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.2, + "z": 6.42 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.2, + "z": 6.42 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.2, + "z": 6.42 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.2, + "z": 6.42 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.2, + "z": 6.42 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.2, + "z": 6.42 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.2, + "z": 6.42 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.2, + "z": 6.42 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.2, + "z": 6.42 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.2, + "z": 6.42 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.2, + "z": 6.42 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.2, + "z": 6.42 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.2, + "z": 6.42 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.2, + "z": 6.42 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.2, + "z": 6.42 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.2, + "z": 6.42 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.2, + "z": 6.42 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.2, + "z": 6.42 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.2, + "z": 6.42 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.2, + "z": 6.42 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.2, + "z": 6.42 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.2, + "z": 6.42 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.2, + "z": 6.42 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.2, + "z": 6.42 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.2, + "z": 6.42 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.2, + "z": 6.42 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.2, + "z": 6.42 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.2, + "z": 6.42 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.2, + "z": 6.42 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.2, + "z": 6.42 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.2, + "z": 6.42 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.2, + "z": 6.42 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.2, + "z": 6.42 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.2, + "z": 6.42 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.2, + "z": 6.42 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.2, + "z": 6.42 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.2, + "z": 6.42 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.2, + "z": 6.42 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.2, + "z": 6.42 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.2, + "z": 6.42 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.2, + "z": 6.42 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.2, + "z": 6.42 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.2, + "z": 6.42 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.2, + "z": 6.42 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.2, + "z": 6.42 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.2, + "z": 6.42 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.2, + "z": 6.42 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.2, + "z": 6.42 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.2, + "z": 6.42 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.2, + "z": 6.42 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.2, + "z": 6.42 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.2, + "z": 6.42 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.2, + "z": 6.42 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.2, + "z": 6.42 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.2, + "z": 6.42 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.2, + "z": 6.42 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.2, + "z": 6.42 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.2, + "z": 6.42 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.2, + "z": 6.42 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.2, + "z": 6.42 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.2, + "z": 6.42 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.2, + "z": 6.42 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.2, + "z": 6.42 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.2, + "z": 6.42 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.2, + "z": 6.42 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.2, + "z": 6.42 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.2, + "z": 6.42 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.2, + "z": 6.42 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.2, + "z": 6.42 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.2, + "z": 6.42 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.2, + "z": 6.42 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.2, + "z": 6.42 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.2, + "z": 6.42 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.2, + "z": 6.42 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.2, + "z": 6.42 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.2, + "z": 6.42 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.2, + "z": 6.42 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.2, + "z": 6.42 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.2, + "z": 6.42 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.2, + "z": 6.42 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.2, + "z": 6.42 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.2, + "z": 6.42 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.2, + "z": 6.42 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.2, + "z": 6.42 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "4 tubes", + "loadName": "cpx_4_tuberack_100ul", + "location": { + "slotName": "6" + }, + "namespace": "custom_beta", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "cpx", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127, + "yDimension": 85, + "zDimension": 40 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "cpx", + "brandId": [] + }, + "metadata": { + "displayCategory": "tubeRack", + "wellBottomShape": "u" + }, + "wells": [ + "A1", + "A2", + "B1", + "B2" + ] + } + ], + "metadata": { + "displayCategory": "tubeRack", + "displayName": "cpx 4 Tube Rack with cpx 0.1 mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "custom_beta", + "ordering": [ + [ + "A1", + "B1" + ], + [ + "A2", + "B2" + ] + ], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "cpx_4_tuberack_100ul", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 20, + "y": 65, + "z": 17 + }, + "A2": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50, + "y": 65, + "z": 17 + }, + "B1": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 20, + "y": 35, + "z": 17 + }, + "B2": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50, + "y": 35, + "z": 17 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "logo destination", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Waiting for Temperature Module to reach temperature 25.0 °C (rounded off to nearest integer)", + "legacyCommandType": "command.TEMPDECK_AWAIT_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 0 minutes and 0.3 seconds", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Disengaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_DISENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Opening Thermocycler lid", + "legacyCommandType": "command.THERMOCYCLER_OPEN" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Closing Thermocycler lid", + "legacyCommandType": "command.THERMOCYCLER_CLOSE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Thermocycler lid temperature to 38.0 °C", + "legacyCommandType": "command.THERMOCYCLER_SET_LID_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Thermocycler well block temperature to 28.0 °C with a hold time of 5 seconds", + "legacyCommandType": "command.THERMOCYCLER_SET_BLOCK_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Deactivating Thermocycler well block heating", + "legacyCommandType": "command.THERMOCYCLER_DEACTIVATE_BLOCK" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Deactivating Thermocycler lid heating", + "legacyCommandType": "command.THERMOCYCLER_DEACTIVATE_LID" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Opening Thermocycler lid", + "legacyCommandType": "command.THERMOCYCLER_OPEN" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 11.34, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 13 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "OT2_P300M_P20S_TC_MM_TM_2_13_Smoke620Release.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "1" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "5" + } + }, + { + "definitionUri": "opentrons/opentrons_96_aluminumblock_nest_wellplate_100ul/1", + "displayName": "Temperature-Controlled plate", + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "custom_beta/cpx_4_tuberack_100ul/1", + "displayName": "4 tubes", + "loadName": "cpx_4_tuberack_100ul", + "location": { + "slotName": "6" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", + "displayName": "logo destination", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "3" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "2" + } + } + ], + "liquids": [], + "metadata": { + "apiLevel": "2.13", + "author": "Opentrons Engineering ", + "description": "Description of the protocol that is longish \n has \n returns and \n emoji 😊 ⬆️ ", + "protocolName": "🛠 Logo-Modules-CustomLabware 🛠", + "source": "Software Testing Team" + }, + "modules": [ + { + "location": { + "slotName": "9" + }, + "model": "magneticModuleV2" + }, + { + "location": { + "slotName": "4" + }, + "model": "temperatureModuleV1" + }, + { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV2" + } + ], + "pipettes": [ + { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + { + "mount": "left", + "pipetteName": "p300_multi_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6b4d75cb04][OT2_P20S_P300M_NoMods_6_1_TransferReTransferLiquid].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6b4d75cb04][OT2_P20S_P300M_NoMods_6_1_TransferReTransferLiquid].json new file mode 100644 index 00000000000..ebd39948382 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6b4d75cb04][OT2_P20S_P300M_NoMods_6_1_TransferReTransferLiquid].json @@ -0,0 +1,10536 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p20_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Filter Tip Rack 20 µL", + "loadName": "opentrons_96_filtertiprack_20ul", + "location": { + "slotName": "1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Filter Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_filtertiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 3.29 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 74.26, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 74.26, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 74.26, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 74.26, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 74.26, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 74.26, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 74.26, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 74.26, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 74.26, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 74.26, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 74.26, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 74.26, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 65.26, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 65.26, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 65.26, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 65.26, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 65.26, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 65.26, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 65.26, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 65.26, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 65.26, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 65.26, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 65.26, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 65.26, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 56.26, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 56.26, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 56.26, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 56.26, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 56.26, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 56.26, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 56.26, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 56.26, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 56.26, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 56.26, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 56.26, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 56.26, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 47.26, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 47.26, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 47.26, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 47.26, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 47.26, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 47.26, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 47.26, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 47.26, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 47.26, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 47.26, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 47.26, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 47.26, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 38.26, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 38.26, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 38.26, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 38.26, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 38.26, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 38.26, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 38.26, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 38.26, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 38.26, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 38.26, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 38.26, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 38.26, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 29.26, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 29.26, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 29.26, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 29.26, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 29.26, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 29.26, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 29.26, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 29.26, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 29.26, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 29.26, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 29.26, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 29.26, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 20.26, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 20.26, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 20.26, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 20.26, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 20.26, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 20.26, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 20.26, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 20.26, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 20.26, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 20.26, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 20.26, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 20.26, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.36, + "y": 11.26, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.36, + "y": 11.26, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.36, + "y": 11.26, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.36, + "y": 11.26, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.36, + "y": 11.26, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.36, + "y": 11.26, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.36, + "y": 11.26, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.36, + "y": 11.26, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.36, + "y": 11.26, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.36, + "y": 11.26, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.36, + "y": 11.26, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.36, + "y": 11.26, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 15 Tube Rack with NEST 15 mL Conical", + "loadName": "opentrons_15_tuberack_nest_15ml_conical", + "location": { + "slotName": "10" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 124.65 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [ + "601052" + ], + "links": [ + "https://www.nest-biotech.com/centrifuge-tube/59282837.html" + ] + }, + "metadata": { + "displayCategory": "tubeRack", + "displayName": "NEST 15x15 mL Conical", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A2", + "A3", + "A4", + "A5", + "B1", + "B2", + "B3", + "B4", + "B5", + "C1", + "C2", + "C3", + "C4", + "C5" + ] + } + ], + "metadata": { + "displayCategory": "tubeRack", + "displayName": "Opentrons 15 Tube Rack with NEST 15 mL Conical", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1" + ], + [ + "A2", + "B2", + "C2" + ], + [ + "A3", + "B3", + "C3" + ], + [ + "A4", + "B4", + "C4" + ], + [ + "A5", + "B5", + "C5" + ] + ], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_15_tuberack_nest_15ml_conical" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 117.8, + "diameter": 15.5, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 13.88, + "y": 67.74, + "z": 6.85 + }, + "A2": { + "depth": 117.8, + "diameter": 15.5, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 38.88, + "y": 67.74, + "z": 6.85 + }, + "A3": { + "depth": 117.8, + "diameter": 15.5, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 63.88, + "y": 67.74, + "z": 6.85 + }, + "A4": { + "depth": 117.8, + "diameter": 15.5, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 88.88, + "y": 67.74, + "z": 6.85 + }, + "A5": { + "depth": 117.8, + "diameter": 15.5, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 113.88, + "y": 67.74, + "z": 6.85 + }, + "B1": { + "depth": 117.8, + "diameter": 15.5, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 13.88, + "y": 42.74, + "z": 6.85 + }, + "B2": { + "depth": 117.8, + "diameter": 15.5, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 38.88, + "y": 42.74, + "z": 6.85 + }, + "B3": { + "depth": 117.8, + "diameter": 15.5, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 63.88, + "y": 42.74, + "z": 6.85 + }, + "B4": { + "depth": 117.8, + "diameter": 15.5, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 88.88, + "y": 42.74, + "z": 6.85 + }, + "B5": { + "depth": 117.8, + "diameter": 15.5, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 113.88, + "y": 42.74, + "z": 6.85 + }, + "C1": { + "depth": 117.8, + "diameter": 15.5, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 13.88, + "y": 17.74, + "z": 6.85 + }, + "C2": { + "depth": 117.8, + "diameter": 15.5, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 38.88, + "y": 17.74, + "z": 6.85 + }, + "C3": { + "depth": 117.8, + "diameter": 15.5, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 63.88, + "y": 17.74, + "z": 6.85 + }, + "C4": { + "depth": 117.8, + "diameter": 15.5, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 88.88, + "y": 17.74, + "z": 6.85 + }, + "C5": { + "depth": 117.8, + "diameter": 15.5, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 113.88, + "y": 17.74, + "z": 6.85 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Bio-Rad 96 Well Plate 200 µL PCR", + "loadName": "biorad_96_wellplate_200ul_pcr", + "location": { + "slotName": "8" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Bio-Rad", + "brandId": [ + "hsp9601" + ], + "links": [ + "http://www.bio-rad.com/en-us/sku/hsp9601-hard-shell-96-well-pcr-plates-low-profile-thin-wall-skirted-white-clear?ID=hsp9601" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 16.06 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Bio-Rad 96 Well Plate 200 µL PCR", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "biorad_96_wellplate_200ul_pcr", + "magneticModuleEngageHeight": 18 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.24, + "z": 1.25 + }, + "A10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.24, + "z": 1.25 + }, + "A11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.24, + "z": 1.25 + }, + "A12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.24, + "z": 1.25 + }, + "A2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.24, + "z": 1.25 + }, + "A3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.24, + "z": 1.25 + }, + "A4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.24, + "z": 1.25 + }, + "A5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.24, + "z": 1.25 + }, + "A6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.24, + "z": 1.25 + }, + "A7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.24, + "z": 1.25 + }, + "A8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.24, + "z": 1.25 + }, + "A9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.24, + "z": 1.25 + }, + "B1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.24, + "z": 1.25 + }, + "B10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.24, + "z": 1.25 + }, + "B11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.24, + "z": 1.25 + }, + "B12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.24, + "z": 1.25 + }, + "B2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.24, + "z": 1.25 + }, + "B3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.24, + "z": 1.25 + }, + "B4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.24, + "z": 1.25 + }, + "B5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.24, + "z": 1.25 + }, + "B6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.24, + "z": 1.25 + }, + "B7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.24, + "z": 1.25 + }, + "B8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.24, + "z": 1.25 + }, + "B9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.24, + "z": 1.25 + }, + "C1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.24, + "z": 1.25 + }, + "C10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.24, + "z": 1.25 + }, + "C11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.24, + "z": 1.25 + }, + "C12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.24, + "z": 1.25 + }, + "C2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.24, + "z": 1.25 + }, + "C3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.24, + "z": 1.25 + }, + "C4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.24, + "z": 1.25 + }, + "C5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.24, + "z": 1.25 + }, + "C6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.24, + "z": 1.25 + }, + "C7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.24, + "z": 1.25 + }, + "C8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.24, + "z": 1.25 + }, + "C9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.24, + "z": 1.25 + }, + "D1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.24, + "z": 1.25 + }, + "D10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.24, + "z": 1.25 + }, + "D11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.24, + "z": 1.25 + }, + "D12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.24, + "z": 1.25 + }, + "D2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.24, + "z": 1.25 + }, + "D3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.24, + "z": 1.25 + }, + "D4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.24, + "z": 1.25 + }, + "D5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.24, + "z": 1.25 + }, + "D6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.24, + "z": 1.25 + }, + "D7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.24, + "z": 1.25 + }, + "D8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.24, + "z": 1.25 + }, + "D9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.24, + "z": 1.25 + }, + "E1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.24, + "z": 1.25 + }, + "E10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.24, + "z": 1.25 + }, + "E11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.24, + "z": 1.25 + }, + "E12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.24, + "z": 1.25 + }, + "E2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.24, + "z": 1.25 + }, + "E3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.24, + "z": 1.25 + }, + "E4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.24, + "z": 1.25 + }, + "E5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.24, + "z": 1.25 + }, + "E6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.24, + "z": 1.25 + }, + "E7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.24, + "z": 1.25 + }, + "E8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.24, + "z": 1.25 + }, + "E9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.24, + "z": 1.25 + }, + "F1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.24, + "z": 1.25 + }, + "F10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.24, + "z": 1.25 + }, + "F11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.24, + "z": 1.25 + }, + "F12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.24, + "z": 1.25 + }, + "F2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.24, + "z": 1.25 + }, + "F3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.24, + "z": 1.25 + }, + "F4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.24, + "z": 1.25 + }, + "F5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.24, + "z": 1.25 + }, + "F6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.24, + "z": 1.25 + }, + "F7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.24, + "z": 1.25 + }, + "F8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.24, + "z": 1.25 + }, + "F9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.24, + "z": 1.25 + }, + "G1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.24, + "z": 1.25 + }, + "G10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.24, + "z": 1.25 + }, + "G11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.24, + "z": 1.25 + }, + "G12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.24, + "z": 1.25 + }, + "G2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.24, + "z": 1.25 + }, + "G3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.24, + "z": 1.25 + }, + "G4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.24, + "z": 1.25 + }, + "G5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.24, + "z": 1.25 + }, + "G6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.24, + "z": 1.25 + }, + "G7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.24, + "z": 1.25 + }, + "G8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.24, + "z": 1.25 + }, + "G9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.24, + "z": 1.25 + }, + "H1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.24, + "z": 1.25 + }, + "H10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.24, + "z": 1.25 + }, + "H11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.24, + "z": 1.25 + }, + "H12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.24, + "z": 1.25 + }, + "H2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.24, + "z": 1.25 + }, + "H3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.24, + "z": 1.25 + }, + "H4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.24, + "z": 1.25 + }, + "H5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.24, + "z": 1.25 + }, + "H6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.24, + "z": 1.25 + }, + "H7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.24, + "z": 1.25 + }, + "H8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.24, + "z": 1.25 + }, + "H9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.24, + "z": 1.25 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "2", + "loadName": "opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical", + "location": { + "slotName": "6" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.5, + "zDimension": 124.35 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "Falcon", + "brandId": [ + "352095", + "352096", + "352097", + "352099", + "352196" + ], + "links": [ + "https://ecatalog.corning.com/life-sciences/b2c/US/en/Liquid-Handling/Tubes,-Liquid-Handling/Centrifuge-Tubes/Falcon%C2%AE-Conical-Centrifuge-Tubes/p/falconConicalTubes" + ] + }, + "metadata": { + "displayCategory": "tubeRack", + "displayName": "Falcon 6x15 mL Conical", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A2", + "B1", + "B2", + "C1", + "C2" + ] + }, + { + "brand": { + "brand": "Falcon", + "brandId": [ + "352070", + "352098" + ], + "links": [ + "https://ecatalog.corning.com/life-sciences/b2c/US/en/Liquid-Handling/Tubes,-Liquid-Handling/Centrifuge-Tubes/Falcon%C2%AE-Conical-Centrifuge-Tubes/p/falconConicalTubes" + ] + }, + "metadata": { + "displayCategory": "tubeRack", + "displayName": "Falcon 4x50 mL Conical", + "wellBottomShape": "v" + }, + "wells": [ + "A3", + "A4", + "B3", + "B4" + ] + } + ], + "metadata": { + "displayCategory": "tubeRack", + "displayName": "Opentrons 10 Tube Rack with Falcon 4x50 mL, 6x15 mL Conical", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1" + ], + [ + "A2", + "B2", + "C2" + ], + [ + "A3", + "B3" + ], + [ + "A4", + "B4" + ] + ], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 117.5, + "diameter": 14.9, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 13.88, + "y": 67.75, + "z": 6.85 + }, + "A2": { + "depth": 117.5, + "diameter": 14.9, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 38.88, + "y": 67.75, + "z": 6.85 + }, + "A3": { + "depth": 113, + "diameter": 27.81, + "shape": "circular", + "totalLiquidVolume": 50000, + "x": 71.38, + "y": 60.25, + "z": 7.3 + }, + "A4": { + "depth": 113, + "diameter": 27.81, + "shape": "circular", + "totalLiquidVolume": 50000, + "x": 106.38, + "y": 60.25, + "z": 7.3 + }, + "B1": { + "depth": 117.5, + "diameter": 14.9, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 13.88, + "y": 42.75, + "z": 6.85 + }, + "B2": { + "depth": 117.5, + "diameter": 14.9, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 38.88, + "y": 42.75, + "z": 6.85 + }, + "B3": { + "depth": 113, + "diameter": 27.81, + "shape": "circular", + "totalLiquidVolume": 50000, + "x": 71.38, + "y": 25.25, + "z": 7.3 + }, + "B4": { + "depth": 113, + "diameter": 27.81, + "shape": "circular", + "totalLiquidVolume": 50000, + "x": 106.38, + "y": 25.25, + "z": 7.3 + }, + "C1": { + "depth": 117.5, + "diameter": 14.9, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 13.88, + "y": 17.75, + "z": 6.85 + }, + "C2": { + "depth": 117.5, + "diameter": 14.9, + "shape": "circular", + "totalLiquidVolume": 15000, + "x": 38.88, + "y": 17.75, + "z": 6.85 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B3": 200.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B2": 200.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B1": 200.0, + "C1": 200.0, + "C2": 200.0, + "C3": 200.0, + "C4": 200.0, + "C5": 200.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A5": 200.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A4": 200.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A3": 200.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A2": 200.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 200.0, + "B4": 200.0, + "B5": 200.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.36, + "y": 74.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 13.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 146.88, + "y": 255.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 14.36, + "y": 65.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 13.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 146.88, + "y": 246.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 14.36, + "y": 56.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 13.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 146.88, + "y": 237.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 14.36, + "y": 47.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 13.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 146.88, + "y": 228.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 14.36, + "y": 38.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 13.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 146.88, + "y": 219.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 14.36, + "y": 29.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 13.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 146.88, + "y": 210.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 14.36, + "y": 20.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 13.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 146.88, + "y": 201.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 14.36, + "y": 11.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 13.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 146.88, + "y": 192.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.36, + "y": 74.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 38.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 155.88, + "y": 255.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 23.36, + "y": 65.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 38.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 155.88, + "y": 246.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 23.36, + "y": 56.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 38.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 155.88, + "y": 237.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 23.36, + "y": 47.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 38.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 155.88, + "y": 228.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 23.36, + "y": 38.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 38.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 155.88, + "y": 219.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 23.36, + "y": 29.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 38.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 155.88, + "y": 210.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 23.36, + "y": 20.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 38.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 155.88, + "y": 201.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 23.36, + "y": 11.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 38.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 155.88, + "y": 192.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.36, + "y": 74.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 63.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 164.88, + "y": 255.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 32.36, + "y": 65.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 63.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 164.88, + "y": 246.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 32.36, + "y": 56.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 63.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 164.88, + "y": 237.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 32.36, + "y": 47.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 63.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 164.88, + "y": 228.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 32.36, + "y": 38.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 63.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "E3" + }, + "result": { + "position": { + "x": 164.88, + "y": 219.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 32.36, + "y": 29.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 63.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "F3" + }, + "result": { + "position": { + "x": 164.88, + "y": 210.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 32.36, + "y": 20.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 63.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "G3" + }, + "result": { + "position": { + "x": 164.88, + "y": 201.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 32.36, + "y": 11.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 63.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "H3" + }, + "result": { + "position": { + "x": 164.88, + "y": 192.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.36, + "y": 74.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 88.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 173.88, + "y": 255.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 41.36, + "y": 65.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 88.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 173.88, + "y": 246.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 41.36, + "y": 56.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 88.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 173.88, + "y": 237.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 41.36, + "y": 47.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 88.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 173.88, + "y": 228.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 41.36, + "y": 38.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 88.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "E4" + }, + "result": { + "position": { + "x": 173.88, + "y": 219.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 41.36, + "y": 29.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 88.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "F4" + }, + "result": { + "position": { + "x": 173.88, + "y": 210.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 41.36, + "y": 20.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 88.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "G4" + }, + "result": { + "position": { + "x": 173.88, + "y": 201.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 41.36, + "y": 11.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 88.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "H4" + }, + "result": { + "position": { + "x": 173.88, + "y": 192.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.36, + "y": 74.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 113.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 182.88, + "y": 255.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 50.36, + "y": 65.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 113.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 182.88, + "y": 246.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 50.36, + "y": 56.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 113.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 182.88, + "y": 237.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 50.36, + "y": 47.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 113.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 182.88, + "y": 228.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 50.36, + "y": 38.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 113.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 182.88, + "y": 219.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 50.36, + "y": 29.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 113.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "F5" + }, + "result": { + "position": { + "x": 182.88, + "y": 210.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 50.36, + "y": 20.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 113.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "G5" + }, + "result": { + "position": { + "x": 182.88, + "y": 201.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 50.36, + "y": 11.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 113.88, + "y": 339.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "H5" + }, + "result": { + "position": { + "x": 182.88, + "y": 192.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.36, + "y": 74.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 13.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 191.88, + "y": 255.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 59.36, + "y": 65.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 13.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 191.88, + "y": 246.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 59.36, + "y": 56.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 13.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 191.88, + "y": 237.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 59.36, + "y": 47.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 13.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 191.88, + "y": 228.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 59.36, + "y": 38.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 13.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "E6" + }, + "result": { + "position": { + "x": 191.88, + "y": 219.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 59.36, + "y": 29.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 13.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "F6" + }, + "result": { + "position": { + "x": 191.88, + "y": 210.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 59.36, + "y": 20.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 13.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "G6" + }, + "result": { + "position": { + "x": 191.88, + "y": 201.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 59.36, + "y": 11.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 13.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "H6" + }, + "result": { + "position": { + "x": 191.88, + "y": 192.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.36, + "y": 74.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 38.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 200.88, + "y": 255.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 68.36, + "y": 65.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 38.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 200.88, + "y": 246.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 68.36, + "y": 56.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 38.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 200.88, + "y": 237.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 68.36, + "y": 47.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 38.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 200.88, + "y": 228.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 68.36, + "y": 38.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 38.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "E7" + }, + "result": { + "position": { + "x": 200.88, + "y": 219.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 68.36, + "y": 29.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 38.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "F7" + }, + "result": { + "position": { + "x": 200.88, + "y": 210.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 68.36, + "y": 20.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 38.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "G7" + }, + "result": { + "position": { + "x": 200.88, + "y": 201.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 68.36, + "y": 11.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 38.88, + "y": 314.24, + "z": 7.85 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "H7" + }, + "result": { + "position": { + "x": 200.88, + "y": 192.24, + "z": 1.75 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.36, + "y": 74.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 146.88, + "y": 255.24, + "z": 2.25 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 278.88, + "y": 158.25, + "z": 7.35 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 77.36, + "y": 65.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 146.88, + "y": 246.24, + "z": 2.25 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 278.88, + "y": 158.25, + "z": 7.35 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C8" + }, + "result": { + "position": { + "x": 77.36, + "y": 56.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 146.88, + "y": 237.24, + "z": 2.25 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 278.88, + "y": 158.25, + "z": 7.35 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 77.36, + "y": 47.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 146.88, + "y": 228.24, + "z": 2.25 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 278.88, + "y": 158.25, + "z": 7.35 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E8" + }, + "result": { + "position": { + "x": 77.36, + "y": 38.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 146.88, + "y": 192.24, + "z": 2.25 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 278.88, + "y": 158.25, + "z": 7.35 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F8" + }, + "result": { + "position": { + "x": 77.36, + "y": 29.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 155.88, + "y": 255.24, + "z": 2.25 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 278.88, + "y": 158.25, + "z": 7.35 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G8" + }, + "result": { + "position": { + "x": 77.36, + "y": 20.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 155.88, + "y": 246.24, + "z": 2.25 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 278.88, + "y": 158.25, + "z": 7.35 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H8" + }, + "result": { + "position": { + "x": 77.36, + "y": 11.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 164.88, + "y": 237.24, + "z": 2.25 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 278.88, + "y": 158.25, + "z": 7.35 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.36, + "y": 74.26, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 164.88, + "y": 228.24, + "z": 2.25 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 278.88, + "y": 158.25, + "z": 7.35 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + } + ], + "config": { + "protocolType": "json", + "schemaVersion": 6 + }, + "errors": [], + "files": [ + { + "name": "OT2_P20S_P300M_NoMods_6_1_TransferReTransferLiquid.json", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_filtertiprack_20ul/1", + "displayName": "Opentrons 96 Filter Tip Rack 20 µL", + "loadName": "opentrons_96_filtertiprack_20ul", + "location": { + "slotName": "1" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "2" + } + }, + { + "definitionUri": "opentrons/opentrons_15_tuberack_nest_15ml_conical/1", + "displayName": "Opentrons 15 Tube Rack with NEST 15 mL Conical", + "loadName": "opentrons_15_tuberack_nest_15ml_conical", + "location": { + "slotName": "10" + } + }, + { + "definitionUri": "opentrons/biorad_96_wellplate_200ul_pcr/1", + "displayName": "Bio-Rad 96 Well Plate 200 µL PCR", + "loadName": "biorad_96_wellplate_200ul_pcr", + "location": { + "slotName": "8" + } + }, + { + "definitionUri": "opentrons/opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical/1", + "displayName": "2", + "loadName": "opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical", + "location": { + "slotName": "6" + } + } + ], + "liquids": [ + { + "description": "", + "displayColor": "#b925ff", + "displayName": "1" + }, + { + "description": "", + "displayColor": "#ffd600", + "displayName": "2" + }, + { + "description": "", + "displayColor": "#9dffd8", + "displayName": "3" + }, + { + "description": "", + "displayColor": "#ff9900", + "displayName": "4" + }, + { + "description": "", + "displayColor": "#50d5ff", + "displayName": "5" + }, + { + "description": "", + "displayColor": "#ff80f5", + "displayName": "6" + }, + { + "description": "", + "displayColor": "#7eff42", + "displayName": "7" + }, + { + "description": "", + "displayColor": "#ff4f4f", + "displayName": "8" + } + ], + "metadata": { + "author": "", + "category": null, + "description": "", + "protocolName": "Transfer- Multi liquid (retransfer)", + "subcategory": null, + "tags": [] + }, + "modules": [], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p20_single_gen2" + }, + { + "mount": "right", + "pipetteName": "p300_multi_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[753ac8811f][OT2_None_None_2_13_PythonSyntaxError].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[753ac8811f][OT2_None_None_2_13_PythonSyntaxError].json new file mode 100644 index 00000000000..c2eba70dccc --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[753ac8811f][OT2_None_None_2_13_PythonSyntaxError].json @@ -0,0 +1,87 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 13 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "No module named 'superspecialmagic'", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "UnexpectedProtocolError", + "wrappedErrors": [ + { + "detail": "ModuleNotFoundError: No module named 'superspecialmagic'", + "errorCode": "4000", + "errorInfo": { + "args": "(\"No module named 'superspecialmagic'\",)", + "class": "ModuleNotFoundError", + "msg": "No module named 'superspecialmagic'", + "name": "superspecialmagic", + "path": "None", + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_runner/task_queue.py\", line 90, in _run\n await self._run_func()\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_runner/legacy_wrappers.py\", line 173, in execute\n await to_thread.run_sync(run_protocol, protocol, context)\n\n File \"/usr/local/lib/python3.10/site-packages/anyio/to_thread.py\", line 33, in run_sync\n return await get_asynclib().run_sync_in_worker_thread(\n\n File \"/usr/local/lib/python3.10/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n return await future\n\n File \"/usr/local/lib/python3.10/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n result = context.run(func, *args)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute.py\", line 27, in run_protocol\n run_python(protocol, context)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 46, in run_python\n exec(proto.contents, new_globs)\n\n File \"OT2_None_None_2_13_PythonSyntaxError.py\", line 4, in \n" + }, + "errorType": "PythonException", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "OT2_None_None_2_13_PythonSyntaxError.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + } + ], + "liquids": [], + "metadata": { + "apiLevel": "2.13", + "author": "Opentrons Engineering ", + "description": "import superspecialmagic", + "protocolName": "bad import", + "source": "Software Testing Team" + }, + "modules": [], + "pipettes": [], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[78960c4c8e][OT2_P300S_Twinning_Error].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[78960c4c8e][OT2_P300S_Twinning_Error].json new file mode 100644 index 00000000000..8eba5b6559c --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[78960c4c8e][OT2_P300S_Twinning_Error].json @@ -0,0 +1,2790 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "usascientific_12_reservoir_22ml", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "USA Scientific", + "brandId": [ + "1061-8150" + ], + "links": [ + "https://www.usascientific.com/12-channel-automation-reservoir.aspx" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.8, + "zDimension": 44.45 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "USA Scientific 12 Well Reservoir 22 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "usascientific_12_reservoir_22ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 13.94, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29 + }, + "A10": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 95.75, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29 + }, + "A11": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 104.84, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29 + }, + "A12": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 113.93, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29 + }, + "A2": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 23.03, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29 + }, + "A3": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 32.12, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29 + }, + "A4": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 41.21, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29 + }, + "A5": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 50.3, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29 + }, + "A6": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 59.39, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29 + }, + "A7": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 68.48, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29 + }, + "A8": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 77.57, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29 + }, + "A9": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 86.66, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "corning_96_wellplate_360ul_flat", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Corning", + "brandId": [ + "2503", + "2507", + "2509", + "3300", + "3361", + "3362", + "3370", + "3474", + "3585", + "3590", + "3591", + "3595", + "3596", + "3598", + "3599", + "3600", + "3628", + "3641", + "3650", + "3665", + "3912", + "3915", + "3916", + "3917", + "3922", + "3925", + "3977", + "9017", + "9018" + ], + "links": [ + "https://ecatalog.corning.com/life-sciences/b2c/US/en/Microplates/Assay-Microplates/96-Well-Microplates/Corning%C2%AE-96-well-Solid-Black-and-White-Polystyrene-Microplates/p/corning96WellSolidBlackAndWhitePolystyreneMicroplates" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.47, + "zDimension": 14.22 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "flat" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Corning 96 Well Plate 360 µL Flat", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "corning_96_wellplate_360ul_flat" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 74.24, + "z": 3.55 + }, + "A10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 74.24, + "z": 3.55 + }, + "A11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 74.24, + "z": 3.55 + }, + "A12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 74.24, + "z": 3.55 + }, + "A2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 74.24, + "z": 3.55 + }, + "A3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 74.24, + "z": 3.55 + }, + "A4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 74.24, + "z": 3.55 + }, + "A5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 74.24, + "z": 3.55 + }, + "A6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 74.24, + "z": 3.55 + }, + "A7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 74.24, + "z": 3.55 + }, + "A8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 74.24, + "z": 3.55 + }, + "A9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 74.24, + "z": 3.55 + }, + "B1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 65.24, + "z": 3.55 + }, + "B10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 65.24, + "z": 3.55 + }, + "B11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 65.24, + "z": 3.55 + }, + "B12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 65.24, + "z": 3.55 + }, + "B2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 65.24, + "z": 3.55 + }, + "B3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 65.24, + "z": 3.55 + }, + "B4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 65.24, + "z": 3.55 + }, + "B5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 65.24, + "z": 3.55 + }, + "B6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 65.24, + "z": 3.55 + }, + "B7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 65.24, + "z": 3.55 + }, + "B8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 65.24, + "z": 3.55 + }, + "B9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 65.24, + "z": 3.55 + }, + "C1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 56.24, + "z": 3.55 + }, + "C10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 56.24, + "z": 3.55 + }, + "C11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 56.24, + "z": 3.55 + }, + "C12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 56.24, + "z": 3.55 + }, + "C2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 56.24, + "z": 3.55 + }, + "C3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 56.24, + "z": 3.55 + }, + "C4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 56.24, + "z": 3.55 + }, + "C5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 56.24, + "z": 3.55 + }, + "C6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 56.24, + "z": 3.55 + }, + "C7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 56.24, + "z": 3.55 + }, + "C8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 56.24, + "z": 3.55 + }, + "C9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 56.24, + "z": 3.55 + }, + "D1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 47.24, + "z": 3.55 + }, + "D10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 47.24, + "z": 3.55 + }, + "D11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 47.24, + "z": 3.55 + }, + "D12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 47.24, + "z": 3.55 + }, + "D2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 47.24, + "z": 3.55 + }, + "D3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 47.24, + "z": 3.55 + }, + "D4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 47.24, + "z": 3.55 + }, + "D5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 47.24, + "z": 3.55 + }, + "D6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 47.24, + "z": 3.55 + }, + "D7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 47.24, + "z": 3.55 + }, + "D8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 47.24, + "z": 3.55 + }, + "D9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 47.24, + "z": 3.55 + }, + "E1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 38.24, + "z": 3.55 + }, + "E10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 38.24, + "z": 3.55 + }, + "E11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 38.24, + "z": 3.55 + }, + "E12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 38.24, + "z": 3.55 + }, + "E2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 38.24, + "z": 3.55 + }, + "E3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 38.24, + "z": 3.55 + }, + "E4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 38.24, + "z": 3.55 + }, + "E5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 38.24, + "z": 3.55 + }, + "E6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 38.24, + "z": 3.55 + }, + "E7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 38.24, + "z": 3.55 + }, + "E8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 38.24, + "z": 3.55 + }, + "E9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 38.24, + "z": 3.55 + }, + "F1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 29.24, + "z": 3.55 + }, + "F10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 29.24, + "z": 3.55 + }, + "F11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 29.24, + "z": 3.55 + }, + "F12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 29.24, + "z": 3.55 + }, + "F2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 29.24, + "z": 3.55 + }, + "F3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 29.24, + "z": 3.55 + }, + "F4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 29.24, + "z": 3.55 + }, + "F5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 29.24, + "z": 3.55 + }, + "F6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 29.24, + "z": 3.55 + }, + "F7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 29.24, + "z": 3.55 + }, + "F8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 29.24, + "z": 3.55 + }, + "F9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 29.24, + "z": 3.55 + }, + "G1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 20.24, + "z": 3.55 + }, + "G10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 20.24, + "z": 3.55 + }, + "G11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 20.24, + "z": 3.55 + }, + "G12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 20.24, + "z": 3.55 + }, + "G2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 20.24, + "z": 3.55 + }, + "G3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 20.24, + "z": 3.55 + }, + "G4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 20.24, + "z": 3.55 + }, + "G5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 20.24, + "z": 3.55 + }, + "G6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 20.24, + "z": 3.55 + }, + "G7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 20.24, + "z": 3.55 + }, + "G8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 20.24, + "z": 3.55 + }, + "G9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 20.24, + "z": 3.55 + }, + "H1": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 14.38, + "y": 11.24, + "z": 3.55 + }, + "H10": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 95.38, + "y": 11.24, + "z": 3.55 + }, + "H11": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 104.38, + "y": 11.24, + "z": 3.55 + }, + "H12": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 113.38, + "y": 11.24, + "z": 3.55 + }, + "H2": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 23.38, + "y": 11.24, + "z": 3.55 + }, + "H3": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 32.38, + "y": 11.24, + "z": 3.55 + }, + "H4": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 41.38, + "y": 11.24, + "z": 3.55 + }, + "H5": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 50.38, + "y": 11.24, + "z": 3.55 + }, + "H6": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 59.38, + "y": 11.24, + "z": 3.55 + }, + "H7": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 68.38, + "y": 11.24, + "z": 3.55 + }, + "H8": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 77.38, + "y": 11.24, + "z": 3.55 + }, + "H9": { + "depth": 10.67, + "diameter": 6.86, + "shape": "circular", + "totalLiquidVolume": 360, + "x": 86.38, + "y": 11.24, + "z": 3.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p300_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 92.86, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 92.86, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 7 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "AttributeError [line 23]: 'InstrumentContext' object has no attribute 'pair_with'", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "AttributeError: 'InstrumentContext' object has no attribute 'pair_with'", + "errorCode": "4000", + "errorInfo": { + "args": "(\"'InstrumentContext' object has no attribute 'pair_with'\",)", + "class": "AttributeError", + "name": "pair_with", + "obj": "P300 Single-Channel GEN2 on left mount", + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 69, in run_python\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"OT2_P300S_Twinning_Error.py\", line 23, in run\n" + }, + "errorType": "PythonException", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "OT2_P300S_Twinning_Error.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "1" + } + }, + { + "definitionUri": "opentrons/usascientific_12_reservoir_22ml/1", + "loadName": "usascientific_12_reservoir_22ml", + "location": { + "slotName": "2" + } + }, + { + "definitionUri": "opentrons/corning_96_wellplate_360ul_flat/1", + "loadName": "corning_96_wellplate_360ul_flat", + "location": { + "slotName": "3" + } + } + ], + "liquids": [], + "metadata": { + "apiLevel": "2.7", + "author": "Name ", + "description": "Simple paired pipette protocol", + "protocolName": "My Protocol" + }, + "modules": [], + "pipettes": [ + { + "mount": "right", + "pipetteName": "p300_single_gen2" + }, + { + "mount": "left", + "pipetteName": "p300_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7be98bf838][Flex_None_None_2_16_AnalysisError_TrashBinInCol2].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7be98bf838][Flex_None_None_2_16_AnalysisError_TrashBinInCol2].json new file mode 100644 index 00000000000..4f74800bb2d --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7be98bf838][Flex_None_None_2_16_AnalysisError_TrashBinInCol2].json @@ -0,0 +1,73 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "InvalidTrashBinLocationError [line 15]: Invalid location for trash bin: C2.\nValid slots: Any slot in column 1 or 3.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "opentrons.protocol_api.validation.InvalidTrashBinLocationError: Invalid location for trash bin: C2.\nValid slots: Any slot in column 1 or 3.", + "errorCode": "4000", + "errorInfo": { + "args": "('Invalid location for trash bin: C2.\\nValid slots: Any slot in column 1 or 3.',)", + "class": "InvalidTrashBinLocationError", + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 69, in run_python\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_None_None_2_16_AnalysisError_TrashBinInCol2.py\", line 15, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 512, in load_trash_bin\n addressable_area_name = validation.ensure_and_convert_trash_bin_location(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/validation.py\", line 328, in ensure_and_convert_trash_bin_location\n raise InvalidTrashBinLocationError(\n" + }, + "errorType": "PythonException", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "Flex_None_None_2_16_AnalysisError_TrashBinInCol2.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [], + "liquids": [], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Analysis Error - Trash Bin in Column 2" + }, + "modules": [], + "pipettes": [], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7d76f2144c][OT2_P300M_P20S_TC_HS_TM_2_16_aspirateDispenseMix0Volume].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7d76f2144c][OT2_P300M_P20S_TC_HS_TM_2_16_aspirateDispenseMix0Volume].json new file mode 100644 index 00000000000..0596bb920a3 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7d76f2144c][OT2_P300M_P20S_TC_HS_TM_2_16_aspirateDispenseMix0Volume].json @@ -0,0 +1,2787 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "setRailLights", + "params": { + "on": true + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 20.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 164.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 0.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 0.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 0.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 0.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 0.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 0.0 + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "OT2_P300M_P20S_TC_HS_TM_2_16_aspirateDispenseMix0Volume.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "4" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + } + } + ], + "liquids": [ + { + "description": "H₂O", + "displayColor": "#42AB2D", + "displayName": "water" + } + ], + "metadata": { + "author": "Opentrons Engineering ", + "protocolName": "API 2.16 Aspirate Dispense Mix 0 Volume", + "source": "Software Testing Team" + }, + "modules": [], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + { + "mount": "right", + "pipetteName": "p20_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7ea2fdcec4][Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7ea2fdcec4][Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment].json new file mode 100644 index 00000000000..7c73103a12b --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7ea2fdcec4][Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment].json @@ -0,0 +1,18001 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "THIS IS A DRY RUN", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "D1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "D2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_200ul", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "D3" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 45.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Magnetic Block GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 0.0, + "z": 38.0 + }, + "model": "magneticBlockV1", + "moduleType": "magneticBlockType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": {}, + "ot2_standard": {}, + "ot3_standard": {} + } + }, + "model": "magneticBlockV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "C3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_200ul", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "B1" + }, + "model": "thermocyclerModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 108.96, + "lidHeight": 61.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 5.6 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.6 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 68.8, + "z": 108.96 + }, + "model": "thermocyclerModuleV2", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot3_standard": { + "B1": { + "cornerOffsetFromSlot": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ], + "labwareOffset": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "thermocyclerModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_50ul", + "location": { + "slotName": "B3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 50 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_50ul", + "quirks": [], + "tipLength": 57.9, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p1000_multi_flex" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p50_multi_flex" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Ready" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Quick Vol Pool", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Capture", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding NHB2", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Panel", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EHB2", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 90.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 90.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Hybridize on Deck", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/closeLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Heating EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 121.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 121.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 121.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 121.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 121.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 121.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 121.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 121.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 121.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 121.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 121.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 121.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 121.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.3, + "y": 181.15, + "z": 3.25 + }, + "volume": 121.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 121.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 121.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Hybridization", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 101.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 101.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/closeLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ADDING SMB", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 61.95 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 125.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 125.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 61.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.0 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> WASH", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove SUPERNATANT", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 42.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 42.34 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 46.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 46.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Repeating 3 washes", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 57.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1600.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 240.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.0 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 41.84 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 41.84 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 38.84 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 38.84 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 78.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 66.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1600.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 240.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.0 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 41.84 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 41.84 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 38.84 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 38.84 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 78.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 75.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1600.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 240.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.0 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 41.84 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 41.84 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 38.84 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 38.84 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 181.15, + "z": 78.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EEW", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 74.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 84.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 21.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 74.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1600.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Hybridization", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.200000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.3, + "y": 74.15, + "z": 22.200000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 300.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.0 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 41.84 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 41.84 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 38.84 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 38.84 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 78.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Residual", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 38.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 38.34 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ELUTE", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EE1", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 23.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 38.34 + }, + "volume": 23.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1600.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.0 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Elution", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 38.59 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.3, + "y": 181.15, + "z": 38.59 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 22.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 2.079999999999993 + }, + "volume": 22.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding ET2", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 4.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 4.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 84.375, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 84.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 84.375, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> AMPLIFICATION", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding PPC", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding EPM", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.780000000000003 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 9.919999999999996 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 45.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.079999999999993 + }, + "volume": 45.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateHeater", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Cleanup", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transfer Elution", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 288.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.53 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.375000000000004, + "y": 356.2, + "z": 1.329999999999993 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 8.0, + "volume": 46.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 46.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 288.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ADDING AMPure (0.8x)", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 50.5 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 40.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 40.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 26.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 30.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -33.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 26.950000000000003 + }, + "volume": 30.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 61.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1800.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.0 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 41.84 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 41.84 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 38.84 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 38.84 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 78.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 74.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 74.34 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 74.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 81.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 76.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 81.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 378.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 41.84 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 41.84 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 38.84 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 38.84 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 78.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 74.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 150.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 74.34 + }, + "volume": 150.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 74.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 81.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 76.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 81.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Remove ETOH Wash", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 41.84 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -34.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 41.84 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 38.84 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.5 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 38.84 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 78.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Removing Residual ETOH", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 38.34 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 38.34 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -5.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 36.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.3, + "y": 181.15, + "z": 41.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": -0.5, + "z": 2.5 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding RSB", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.3, + "y": 181.15, + "z": 4.0 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 1.0399999999999991, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 51.339999999999996, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 1.0399999999999991, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 51.339999999999996, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 75.19000000000001, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 75.19000000000001, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": -1.0399999999999991, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 49.26, + "y": 74.15, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": -1.0399999999999991, + "y": 0.0, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 49.26, + "y": 74.15, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 73.11, + "z": 36.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": -1.0400000000000063, + "z": -23.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 73.11, + "z": 36.95 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 32.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 22.950000000000003 + }, + "volume": 32.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -19.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 40.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 59.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 74.15, + "z": 64.95 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 1600.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 6.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "params": {}, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.0 + }, + "newLocation": {}, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 3.5 + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Transferring Supernatant", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 38.59 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.75 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.3, + "y": 181.15, + "z": 38.59 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 31.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -37.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.3, + "y": 181.15, + "z": 39.34 + }, + "volume": 31.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 15 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "Flex_P1000MLeft_P50MRight_HS_MM_TC_TM_2_15_ABR3_Illumina_DNA_Enrichment.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_3200ml_fixed/1", + "loadName": "opentrons_1_trash_3200ml_fixed", + "location": { + "slotName": "A3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "D2" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C2" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "C3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "loadName": "opentrons_flex_96_tiprack_50ul", + "location": { + "slotName": "B3" + } + } + ], + "liquids": [], + "metadata": { + "author": "Opentrons ", + "protocolName": "Illumina DNA Enrichment", + "source": "Protocol Library" + }, + "modules": [ + { + "location": { + "slotName": "D1" + }, + "model": "heaterShakerModuleV1" + }, + { + "location": { + "slotName": "D3" + }, + "model": "temperatureModuleV2" + }, + { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + }, + { + "location": { + "slotName": "B1" + }, + "model": "thermocyclerModuleV2" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p1000_multi_flex" + }, + { + "mount": "right", + "pipetteName": "p50_multi_flex" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7fa902bfa1][OT2_P300SG1_None_5_2_6_Gen1PipetteSimple].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7fa902bfa1][OT2_P300SG1_None_5_2_6_Gen1PipetteSimple].json new file mode 100644 index 00000000000..91fe817101f --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7fa902bfa1][OT2_P300SG1_None_5_2_6_Gen1PipetteSimple].json @@ -0,0 +1,5778 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p300_single" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Trash", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons" + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 172.86, + "yDimension": 165.86, + "zDimension": 82 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "trash", + "displayName": "Opentrons Fixed Trash", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trash", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_1_trash_1100ml_fixed", + "quirks": [ + "centerMultichannelOnWells", + "fixedTrash", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 0, + "shape": "rectangular", + "totalLiquidVolume": 1100000, + "x": 82.84, + "xDimension": 107.11, + "y": 80, + "yDimension": 165.67, + "z": 82 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 10 µL", + "loadName": "opentrons_96_tiprack_10ul", + "location": { + "slotName": "1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 10 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_10ul", + "tipLength": 39.2, + "tipOverlap": 3.29 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "NEST 1 Well Reservoir 195 mL", + "loadName": "nest_1_reservoir_195ml", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360103" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 1 Well Reservoir 195 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_1_reservoir_195ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 25, + "shape": "rectangular", + "totalLiquidVolume": 195000, + "x": 63.88, + "xDimension": 106.8, + "y": 42.74, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "USA Scientific 96 Deep Well Plate 2.4 mL", + "loadName": "usascientific_96_wellplate_2.4ml_deep", + "location": { + "slotName": "4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "USA Scientific", + "brandId": [ + "1896-2000" + ], + "links": [ + "https://www.usascientific.com/2ml-deep96-well-plateone-bulk.aspx" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.8, + "yDimension": 85.5, + "zDimension": 44.1 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "u" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "USA Scientific 96 Deep Well Plate 2.4 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "usascientific_96_wellplate_2.4ml_deep", + "magneticModuleEngageHeight": 14.94 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 14.4, + "xDimension": 8.2, + "y": 74.2, + "yDimension": 8.2, + "z": 2.8 + }, + "A10": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 95.4, + "xDimension": 8.2, + "y": 74.2, + "yDimension": 8.2, + "z": 2.8 + }, + "A11": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 104.4, + "xDimension": 8.2, + "y": 74.2, + "yDimension": 8.2, + "z": 2.8 + }, + "A12": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 113.4, + "xDimension": 8.2, + "y": 74.2, + "yDimension": 8.2, + "z": 2.8 + }, + "A2": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 23.4, + "xDimension": 8.2, + "y": 74.2, + "yDimension": 8.2, + "z": 2.8 + }, + "A3": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 32.4, + "xDimension": 8.2, + "y": 74.2, + "yDimension": 8.2, + "z": 2.8 + }, + "A4": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 41.4, + "xDimension": 8.2, + "y": 74.2, + "yDimension": 8.2, + "z": 2.8 + }, + "A5": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 50.4, + "xDimension": 8.2, + "y": 74.2, + "yDimension": 8.2, + "z": 2.8 + }, + "A6": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 59.4, + "xDimension": 8.2, + "y": 74.2, + "yDimension": 8.2, + "z": 2.8 + }, + "A7": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 68.4, + "xDimension": 8.2, + "y": 74.2, + "yDimension": 8.2, + "z": 2.8 + }, + "A8": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 77.4, + "xDimension": 8.2, + "y": 74.2, + "yDimension": 8.2, + "z": 2.8 + }, + "A9": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 86.4, + "xDimension": 8.2, + "y": 74.2, + "yDimension": 8.2, + "z": 2.8 + }, + "B1": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 14.4, + "xDimension": 8.2, + "y": 65.2, + "yDimension": 8.2, + "z": 2.8 + }, + "B10": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 95.4, + "xDimension": 8.2, + "y": 65.2, + "yDimension": 8.2, + "z": 2.8 + }, + "B11": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 104.4, + "xDimension": 8.2, + "y": 65.2, + "yDimension": 8.2, + "z": 2.8 + }, + "B12": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 113.4, + "xDimension": 8.2, + "y": 65.2, + "yDimension": 8.2, + "z": 2.8 + }, + "B2": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 23.4, + "xDimension": 8.2, + "y": 65.2, + "yDimension": 8.2, + "z": 2.8 + }, + "B3": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 32.4, + "xDimension": 8.2, + "y": 65.2, + "yDimension": 8.2, + "z": 2.8 + }, + "B4": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 41.4, + "xDimension": 8.2, + "y": 65.2, + "yDimension": 8.2, + "z": 2.8 + }, + "B5": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 50.4, + "xDimension": 8.2, + "y": 65.2, + "yDimension": 8.2, + "z": 2.8 + }, + "B6": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 59.4, + "xDimension": 8.2, + "y": 65.2, + "yDimension": 8.2, + "z": 2.8 + }, + "B7": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 68.4, + "xDimension": 8.2, + "y": 65.2, + "yDimension": 8.2, + "z": 2.8 + }, + "B8": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 77.4, + "xDimension": 8.2, + "y": 65.2, + "yDimension": 8.2, + "z": 2.8 + }, + "B9": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 86.4, + "xDimension": 8.2, + "y": 65.2, + "yDimension": 8.2, + "z": 2.8 + }, + "C1": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 14.4, + "xDimension": 8.2, + "y": 56.2, + "yDimension": 8.2, + "z": 2.8 + }, + "C10": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 95.4, + "xDimension": 8.2, + "y": 56.2, + "yDimension": 8.2, + "z": 2.8 + }, + "C11": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 104.4, + "xDimension": 8.2, + "y": 56.2, + "yDimension": 8.2, + "z": 2.8 + }, + "C12": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 113.4, + "xDimension": 8.2, + "y": 56.2, + "yDimension": 8.2, + "z": 2.8 + }, + "C2": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 23.4, + "xDimension": 8.2, + "y": 56.2, + "yDimension": 8.2, + "z": 2.8 + }, + "C3": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 32.4, + "xDimension": 8.2, + "y": 56.2, + "yDimension": 8.2, + "z": 2.8 + }, + "C4": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 41.4, + "xDimension": 8.2, + "y": 56.2, + "yDimension": 8.2, + "z": 2.8 + }, + "C5": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 50.4, + "xDimension": 8.2, + "y": 56.2, + "yDimension": 8.2, + "z": 2.8 + }, + "C6": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 59.4, + "xDimension": 8.2, + "y": 56.2, + "yDimension": 8.2, + "z": 2.8 + }, + "C7": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 68.4, + "xDimension": 8.2, + "y": 56.2, + "yDimension": 8.2, + "z": 2.8 + }, + "C8": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 77.4, + "xDimension": 8.2, + "y": 56.2, + "yDimension": 8.2, + "z": 2.8 + }, + "C9": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 86.4, + "xDimension": 8.2, + "y": 56.2, + "yDimension": 8.2, + "z": 2.8 + }, + "D1": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 14.4, + "xDimension": 8.2, + "y": 47.2, + "yDimension": 8.2, + "z": 2.8 + }, + "D10": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 95.4, + "xDimension": 8.2, + "y": 47.2, + "yDimension": 8.2, + "z": 2.8 + }, + "D11": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 104.4, + "xDimension": 8.2, + "y": 47.2, + "yDimension": 8.2, + "z": 2.8 + }, + "D12": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 113.4, + "xDimension": 8.2, + "y": 47.2, + "yDimension": 8.2, + "z": 2.8 + }, + "D2": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 23.4, + "xDimension": 8.2, + "y": 47.2, + "yDimension": 8.2, + "z": 2.8 + }, + "D3": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 32.4, + "xDimension": 8.2, + "y": 47.2, + "yDimension": 8.2, + "z": 2.8 + }, + "D4": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 41.4, + "xDimension": 8.2, + "y": 47.2, + "yDimension": 8.2, + "z": 2.8 + }, + "D5": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 50.4, + "xDimension": 8.2, + "y": 47.2, + "yDimension": 8.2, + "z": 2.8 + }, + "D6": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 59.4, + "xDimension": 8.2, + "y": 47.2, + "yDimension": 8.2, + "z": 2.8 + }, + "D7": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 68.4, + "xDimension": 8.2, + "y": 47.2, + "yDimension": 8.2, + "z": 2.8 + }, + "D8": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 77.4, + "xDimension": 8.2, + "y": 47.2, + "yDimension": 8.2, + "z": 2.8 + }, + "D9": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 86.4, + "xDimension": 8.2, + "y": 47.2, + "yDimension": 8.2, + "z": 2.8 + }, + "E1": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 14.4, + "xDimension": 8.2, + "y": 38.2, + "yDimension": 8.2, + "z": 2.8 + }, + "E10": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 95.4, + "xDimension": 8.2, + "y": 38.2, + "yDimension": 8.2, + "z": 2.8 + }, + "E11": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 104.4, + "xDimension": 8.2, + "y": 38.2, + "yDimension": 8.2, + "z": 2.8 + }, + "E12": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 113.4, + "xDimension": 8.2, + "y": 38.2, + "yDimension": 8.2, + "z": 2.8 + }, + "E2": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 23.4, + "xDimension": 8.2, + "y": 38.2, + "yDimension": 8.2, + "z": 2.8 + }, + "E3": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 32.4, + "xDimension": 8.2, + "y": 38.2, + "yDimension": 8.2, + "z": 2.8 + }, + "E4": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 41.4, + "xDimension": 8.2, + "y": 38.2, + "yDimension": 8.2, + "z": 2.8 + }, + "E5": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 50.4, + "xDimension": 8.2, + "y": 38.2, + "yDimension": 8.2, + "z": 2.8 + }, + "E6": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 59.4, + "xDimension": 8.2, + "y": 38.2, + "yDimension": 8.2, + "z": 2.8 + }, + "E7": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 68.4, + "xDimension": 8.2, + "y": 38.2, + "yDimension": 8.2, + "z": 2.8 + }, + "E8": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 77.4, + "xDimension": 8.2, + "y": 38.2, + "yDimension": 8.2, + "z": 2.8 + }, + "E9": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 86.4, + "xDimension": 8.2, + "y": 38.2, + "yDimension": 8.2, + "z": 2.8 + }, + "F1": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 14.4, + "xDimension": 8.2, + "y": 29.2, + "yDimension": 8.2, + "z": 2.8 + }, + "F10": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 95.4, + "xDimension": 8.2, + "y": 29.2, + "yDimension": 8.2, + "z": 2.8 + }, + "F11": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 104.4, + "xDimension": 8.2, + "y": 29.2, + "yDimension": 8.2, + "z": 2.8 + }, + "F12": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 113.4, + "xDimension": 8.2, + "y": 29.2, + "yDimension": 8.2, + "z": 2.8 + }, + "F2": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 23.4, + "xDimension": 8.2, + "y": 29.2, + "yDimension": 8.2, + "z": 2.8 + }, + "F3": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 32.4, + "xDimension": 8.2, + "y": 29.2, + "yDimension": 8.2, + "z": 2.8 + }, + "F4": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 41.4, + "xDimension": 8.2, + "y": 29.2, + "yDimension": 8.2, + "z": 2.8 + }, + "F5": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 50.4, + "xDimension": 8.2, + "y": 29.2, + "yDimension": 8.2, + "z": 2.8 + }, + "F6": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 59.4, + "xDimension": 8.2, + "y": 29.2, + "yDimension": 8.2, + "z": 2.8 + }, + "F7": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 68.4, + "xDimension": 8.2, + "y": 29.2, + "yDimension": 8.2, + "z": 2.8 + }, + "F8": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 77.4, + "xDimension": 8.2, + "y": 29.2, + "yDimension": 8.2, + "z": 2.8 + }, + "F9": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 86.4, + "xDimension": 8.2, + "y": 29.2, + "yDimension": 8.2, + "z": 2.8 + }, + "G1": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 14.4, + "xDimension": 8.2, + "y": 20.2, + "yDimension": 8.2, + "z": 2.8 + }, + "G10": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 95.4, + "xDimension": 8.2, + "y": 20.2, + "yDimension": 8.2, + "z": 2.8 + }, + "G11": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 104.4, + "xDimension": 8.2, + "y": 20.2, + "yDimension": 8.2, + "z": 2.8 + }, + "G12": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 113.4, + "xDimension": 8.2, + "y": 20.2, + "yDimension": 8.2, + "z": 2.8 + }, + "G2": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 23.4, + "xDimension": 8.2, + "y": 20.2, + "yDimension": 8.2, + "z": 2.8 + }, + "G3": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 32.4, + "xDimension": 8.2, + "y": 20.2, + "yDimension": 8.2, + "z": 2.8 + }, + "G4": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 41.4, + "xDimension": 8.2, + "y": 20.2, + "yDimension": 8.2, + "z": 2.8 + }, + "G5": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 50.4, + "xDimension": 8.2, + "y": 20.2, + "yDimension": 8.2, + "z": 2.8 + }, + "G6": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 59.4, + "xDimension": 8.2, + "y": 20.2, + "yDimension": 8.2, + "z": 2.8 + }, + "G7": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 68.4, + "xDimension": 8.2, + "y": 20.2, + "yDimension": 8.2, + "z": 2.8 + }, + "G8": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 77.4, + "xDimension": 8.2, + "y": 20.2, + "yDimension": 8.2, + "z": 2.8 + }, + "G9": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 86.4, + "xDimension": 8.2, + "y": 20.2, + "yDimension": 8.2, + "z": 2.8 + }, + "H1": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 14.4, + "xDimension": 8.2, + "y": 11.2, + "yDimension": 8.2, + "z": 2.8 + }, + "H10": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 95.4, + "xDimension": 8.2, + "y": 11.2, + "yDimension": 8.2, + "z": 2.8 + }, + "H11": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 104.4, + "xDimension": 8.2, + "y": 11.2, + "yDimension": 8.2, + "z": 2.8 + }, + "H12": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 113.4, + "xDimension": 8.2, + "y": 11.2, + "yDimension": 8.2, + "z": 2.8 + }, + "H2": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 23.4, + "xDimension": 8.2, + "y": 11.2, + "yDimension": 8.2, + "z": 2.8 + }, + "H3": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 32.4, + "xDimension": 8.2, + "y": 11.2, + "yDimension": 8.2, + "z": 2.8 + }, + "H4": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 41.4, + "xDimension": 8.2, + "y": 11.2, + "yDimension": 8.2, + "z": 2.8 + }, + "H5": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 50.4, + "xDimension": 8.2, + "y": 11.2, + "yDimension": 8.2, + "z": 2.8 + }, + "H6": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 59.4, + "xDimension": 8.2, + "y": 11.2, + "yDimension": 8.2, + "z": 2.8 + }, + "H7": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 68.4, + "xDimension": 8.2, + "y": 11.2, + "yDimension": 8.2, + "z": 2.8 + }, + "H8": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 77.4, + "xDimension": 8.2, + "y": 11.2, + "yDimension": 8.2, + "z": 2.8 + }, + "H9": { + "depth": 41.3, + "shape": "rectangular", + "totalLiquidVolume": 2400, + "x": 86.4, + "xDimension": 8.2, + "y": 11.2, + "yDimension": 8.2, + "z": 2.8 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "6" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C4" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D4" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.83, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 300.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + } + ], + "config": { + "protocolType": "json", + "schemaVersion": 3 + }, + "errors": [], + "files": [ + { + "name": "OT2_P300SG1_None_5_2_6_Gen1PipetteSimple.json", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "displayName": "Trash", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_10ul/1", + "displayName": "Opentrons 96 Tip Rack 10 µL", + "loadName": "opentrons_96_tiprack_10ul", + "location": { + "slotName": "1" + } + }, + { + "definitionUri": "opentrons/nest_1_reservoir_195ml/1", + "displayName": "NEST 1 Well Reservoir 195 mL", + "loadName": "nest_1_reservoir_195ml", + "location": { + "slotName": "5" + } + }, + { + "definitionUri": "opentrons/usascientific_96_wellplate_2.4ml_deep/1", + "displayName": "USA Scientific 96 Deep Well Plate 2.4 mL", + "loadName": "usascientific_96_wellplate_2.4ml_deep", + "location": { + "slotName": "4" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "6" + } + } + ], + "liquids": [], + "metadata": { + "author": "", + "category": null, + "description": "", + "protocolName": "gen1 pipette", + "subcategory": null, + "tags": [] + }, + "modules": [], + "pipettes": [ + { + "mount": "right", + "pipetteName": "p300_single" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8df082e960][OT2_P300MLeft_MM_TM_2_4_Zymo].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8df082e960][OT2_P300MLeft_MM_TM_2_4_Zymo].json new file mode 100644 index 00000000000..d14082ef779 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8df082e960][OT2_P300MLeft_MM_TM_2_4_Zymo].json @@ -0,0 +1,68439 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "6" + }, + "model": "magneticModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 124.875, + "y": 2.75, + "z": 82.25 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 110.152, + "overLabwareHeight": 4.052 + }, + "displayName": "Magnetic Module GEN2", + "gripperOffsets": {}, + "labwareOffset": { + "x": -1.175, + "y": -0.125, + "z": 82.25 + }, + "model": "magneticModuleV2", + "moduleType": "magneticModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "magneticModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Disengaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_DISENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "deepwell plate", + "loadName": "nest_96_wellplate_2ml_deep", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "1" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/hardware-modules/products/aluminum-block-set" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.45, + "zDimension": 21.2 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "quirks": [ + "gripperIncompatible" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.2, + "z": 6.42 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.2, + "z": 6.42 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.2, + "z": 6.42 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.2, + "z": 6.42 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.2, + "z": 6.42 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.2, + "z": 6.42 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.2, + "z": 6.42 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.2, + "z": 6.42 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.2, + "z": 6.42 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.2, + "z": 6.42 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.2, + "z": 6.42 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.2, + "z": 6.42 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.2, + "z": 6.42 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.2, + "z": 6.42 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.2, + "z": 6.42 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.2, + "z": 6.42 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.2, + "z": 6.42 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.2, + "z": 6.42 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.2, + "z": 6.42 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.2, + "z": 6.42 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.2, + "z": 6.42 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.2, + "z": 6.42 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.2, + "z": 6.42 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.2, + "z": 6.42 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.2, + "z": 6.42 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.2, + "z": 6.42 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.2, + "z": 6.42 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.2, + "z": 6.42 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.2, + "z": 6.42 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.2, + "z": 6.42 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.2, + "z": 6.42 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.2, + "z": 6.42 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.2, + "z": 6.42 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.2, + "z": 6.42 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.2, + "z": 6.42 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.2, + "z": 6.42 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.2, + "z": 6.42 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.2, + "z": 6.42 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.2, + "z": 6.42 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.2, + "z": 6.42 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.2, + "z": 6.42 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.2, + "z": 6.42 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.2, + "z": 6.42 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.2, + "z": 6.42 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.2, + "z": 6.42 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.2, + "z": 6.42 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.2, + "z": 6.42 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.2, + "z": 6.42 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.2, + "z": 6.42 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.2, + "z": 6.42 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.2, + "z": 6.42 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.2, + "z": 6.42 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.2, + "z": 6.42 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.2, + "z": 6.42 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.2, + "z": 6.42 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.2, + "z": 6.42 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.2, + "z": 6.42 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.2, + "z": 6.42 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.2, + "z": 6.42 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.2, + "z": 6.42 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.2, + "z": 6.42 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.2, + "z": 6.42 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.2, + "z": 6.42 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.2, + "z": 6.42 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.2, + "z": 6.42 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.2, + "z": 6.42 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.2, + "z": 6.42 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.2, + "z": 6.42 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.2, + "z": 6.42 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.2, + "z": 6.42 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.2, + "z": 6.42 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.2, + "z": 6.42 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.2, + "z": 6.42 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.2, + "z": 6.42 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.2, + "z": 6.42 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.2, + "z": 6.42 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.2, + "z": 6.42 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.2, + "z": 6.42 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.2, + "z": 6.42 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.2, + "z": 6.42 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.2, + "z": 6.42 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.2, + "z": 6.42 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.2, + "z": 6.42 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.2, + "z": 6.42 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.2, + "z": 6.42 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.2, + "z": 6.42 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.2, + "z": 6.42 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.2, + "z": 6.42 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.2, + "z": 6.42 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.2, + "z": 6.42 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.2, + "z": 6.42 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.2, + "z": 6.42 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.2, + "z": 6.42 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.2, + "z": 6.42 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.2, + "z": 6.42 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.2, + "z": 6.42 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Liquid Waste", + "loadName": "nest_1_reservoir_195ml", + "location": { + "slotName": "9" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360103" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178416.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 1 Well Reservoir 195 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_1_reservoir_195ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 25, + "shape": "rectangular", + "totalLiquidVolume": 195000, + "x": 63.88, + "xDimension": 106.8, + "y": 42.74, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "reagent reservoir 2", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "reagent reservoir 1", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "200µl filtertiprack", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "200µl filtertiprack", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "7" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "200µl filtertiprack", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "8" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "200µl filtertiprack", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "10" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "200µl filtertiprack", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "11" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "200µl filtertiprack", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Temperature Module temperature to 4.0 °C (rounded off to nearest integer)", + "legacyCommandType": "command.TEMPDECK_SET_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 31.000000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 3.333333333333343, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 3.333333333333343 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 13.333333333333343, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333343 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 3.333333333333343, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 3.333333333333343 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 13.333333333333343, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333343 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 3.333333333333343, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 3.333333333333343 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 13.333333333333343, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 13.333333333333343 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 50.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "mix for 10 minutes off-deck in a heatershaker" + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 7 minutes and 0.0 seconds. Incubating on MagDeck for 7 minutes.", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 31.000000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 6.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 16.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 6.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 16.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 6.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 16.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 6.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 16.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 6.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 16.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Disengaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_DISENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 31.000000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 150.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 7 minutes and 0.0 seconds. Incubating on MagDeck for 7 minutes.", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 31.000000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Disengaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_DISENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 31.000000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 7 minutes and 0.0 seconds. Incubating on MagDeck for 7 minutes.", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 31.000000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Disengaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_DISENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 31.000000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 7 minutes and 0.0 seconds. Incubating on MagDeck for 7 minutes.", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 31.000000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Disengaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_DISENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 31.000000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 7 minutes and 0.0 seconds. Incubating on MagDeck for 7 minutes.", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 31.000000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Disengaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_DISENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 31.000000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Incubating for 10 minutes for DNase 1 treatment with occasional mixing." + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 31.000000000000004, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 6.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 6.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 16.666666666666657, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 16.666666666666657 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Incubating for 10 minutes with occasional mixing for stop reaction" + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 7 minutes and 0.0 seconds. Incubating on MagDeck for 7 minutes.", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 166.66666666666666, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 166.66666666666666 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 176.66666666666666, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 176.66666666666666 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 166.66666666666666, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 166.66666666666666 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 176.66666666666666, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 176.66666666666666 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 166.66666666666666, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 166.66666666666666 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 176.66666666666666, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 176.66666666666666 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 30.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 10 minutes and 0.0 seconds. dry beads for 10 minute", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Moving to A1 of deepwell plate on Magnetic Module GEN2 on 6", + "legacyCommandType": "command.MOVE_TO" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Delaying for 7 minutes and 0.0 seconds. Incubating on MagDeck for 7 minutes.", + "legacyCommandType": "command.DELAY" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 500.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 300.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Air gap", + "legacyCommandType": "command.AIR_GAP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 150.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 4 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "OT2_P300MLeft_MM_TM_2_4_Zymo.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/1", + "displayName": "deepwell plate", + "loadName": "nest_96_wellplate_2ml_deep", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_96_aluminumblock_nest_wellplate_100ul/1", + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "location": {} + }, + { + "definitionUri": "opentrons/nest_1_reservoir_195ml/1", + "displayName": "Liquid Waste", + "loadName": "nest_1_reservoir_195ml", + "location": { + "slotName": "9" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "reagent reservoir 2", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "reagent reservoir 1", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "2" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "200µl filtertiprack", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "200µl filtertiprack", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "7" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "200µl filtertiprack", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "8" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "200µl filtertiprack", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "10" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "200µl filtertiprack", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "11" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "displayName": "200µl filtertiprack", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "4" + } + } + ], + "liquids": [], + "metadata": { + "apiLevel": "2.4", + "author": "Opentrons ", + "protocolName": "Zymo Direct-zol96 Magbead RNA" + }, + "modules": [ + { + "location": { + "slotName": "6" + }, + "model": "magneticModuleV2" + }, + { + "location": { + "slotName": "1" + }, + "model": "temperatureModuleV2" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_multi_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8f2cb4b133][Flex_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8f2cb4b133][Flex_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2].json new file mode 100644 index 00000000000..bba17d746ee --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8f2cb4b133][Flex_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2].json @@ -0,0 +1,140761 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "THIS IS A DRY RUN", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "D1" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "D2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_aluminumblock_biorad_wellplate_200ul", + "location": { + "slotName": "D3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/hardware-modules/products/aluminum-block-set" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 18.81 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "Bio-Rad", + "brandId": [ + "hsp9601" + ], + "links": [ + "http://www.bio-rad.com/en-us/sku/hsp9601-hard-shell-96-well-pcr-plates-low-profile-thin-wall-skirted-white-clear?ID=hsp9601" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Bio-Rad 96 Well Plate 200 µL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 Well Aluminum Block with Bio-Rad Well Plate 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_aluminumblock_biorad_wellplate_200ul", + "quirks": [ + "gripperIncompatible" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.24, + "z": 4 + }, + "A10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.24, + "z": 4 + }, + "A11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.24, + "z": 4 + }, + "A12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.24, + "z": 4 + }, + "A2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.24, + "z": 4 + }, + "A3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.24, + "z": 4 + }, + "A4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.24, + "z": 4 + }, + "A5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.24, + "z": 4 + }, + "A6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.24, + "z": 4 + }, + "A7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.24, + "z": 4 + }, + "A8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.24, + "z": 4 + }, + "A9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.24, + "z": 4 + }, + "B1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.24, + "z": 4 + }, + "B10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.24, + "z": 4 + }, + "B11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.24, + "z": 4 + }, + "B12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.24, + "z": 4 + }, + "B2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.24, + "z": 4 + }, + "B3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.24, + "z": 4 + }, + "B4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.24, + "z": 4 + }, + "B5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.24, + "z": 4 + }, + "B6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.24, + "z": 4 + }, + "B7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.24, + "z": 4 + }, + "B8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.24, + "z": 4 + }, + "B9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.24, + "z": 4 + }, + "C1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.24, + "z": 4 + }, + "C10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.24, + "z": 4 + }, + "C11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.24, + "z": 4 + }, + "C12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.24, + "z": 4 + }, + "C2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.24, + "z": 4 + }, + "C3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.24, + "z": 4 + }, + "C4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.24, + "z": 4 + }, + "C5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.24, + "z": 4 + }, + "C6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.24, + "z": 4 + }, + "C7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.24, + "z": 4 + }, + "C8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.24, + "z": 4 + }, + "C9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.24, + "z": 4 + }, + "D1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.24, + "z": 4 + }, + "D10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.24, + "z": 4 + }, + "D11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.24, + "z": 4 + }, + "D12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.24, + "z": 4 + }, + "D2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.24, + "z": 4 + }, + "D3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.24, + "z": 4 + }, + "D4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.24, + "z": 4 + }, + "D5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.24, + "z": 4 + }, + "D6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.24, + "z": 4 + }, + "D7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.24, + "z": 4 + }, + "D8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.24, + "z": 4 + }, + "D9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.24, + "z": 4 + }, + "E1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.24, + "z": 4 + }, + "E10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.24, + "z": 4 + }, + "E11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.24, + "z": 4 + }, + "E12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.24, + "z": 4 + }, + "E2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.24, + "z": 4 + }, + "E3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.24, + "z": 4 + }, + "E4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.24, + "z": 4 + }, + "E5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.24, + "z": 4 + }, + "E6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.24, + "z": 4 + }, + "E7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.24, + "z": 4 + }, + "E8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.24, + "z": 4 + }, + "E9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.24, + "z": 4 + }, + "F1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.24, + "z": 4 + }, + "F10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.24, + "z": 4 + }, + "F11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.24, + "z": 4 + }, + "F12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.24, + "z": 4 + }, + "F2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.24, + "z": 4 + }, + "F3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.24, + "z": 4 + }, + "F4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.24, + "z": 4 + }, + "F5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.24, + "z": 4 + }, + "F6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.24, + "z": 4 + }, + "F7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.24, + "z": 4 + }, + "F8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.24, + "z": 4 + }, + "F9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.24, + "z": 4 + }, + "G1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.24, + "z": 4 + }, + "G10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.24, + "z": 4 + }, + "G11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.24, + "z": 4 + }, + "G12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.24, + "z": 4 + }, + "G2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.24, + "z": 4 + }, + "G3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.24, + "z": 4 + }, + "G4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.24, + "z": 4 + }, + "G5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.24, + "z": 4 + }, + "G6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.24, + "z": 4 + }, + "G7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.24, + "z": 4 + }, + "G8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.24, + "z": 4 + }, + "G9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.24, + "z": 4 + }, + "H1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.24, + "z": 4 + }, + "H10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.24, + "z": 4 + }, + "H11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.24, + "z": 4 + }, + "H12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.24, + "z": 4 + }, + "H2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.24, + "z": 4 + }, + "H3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.24, + "z": 4 + }, + "H4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.24, + "z": 4 + }, + "H5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.24, + "z": 4 + }, + "H6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.24, + "z": 4 + }, + "H7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.24, + "z": 4 + }, + "H8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.24, + "z": 4 + }, + "H9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.24, + "z": 4 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_50ul", + "location": { + "slotName": "C1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 50 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_50ul", + "quirks": [], + "tipLength": 57.9, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_200ul", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_50ul", + "location": { + "slotName": "C3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 50 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_50ul", + "quirks": [], + "tipLength": 57.9, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.58, + "shape": "circular", + "totalLiquidVolume": 50, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "B1" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_aluminumblock_biorad_wellplate_200ul", + "location": { + "slotName": "B2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/hardware-modules/products/aluminum-block-set" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 18.81 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "Bio-Rad", + "brandId": [ + "hsp9601" + ], + "links": [ + "http://www.bio-rad.com/en-us/sku/hsp9601-hard-shell-96-well-pcr-plates-low-profile-thin-wall-skirted-white-clear?ID=hsp9601" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Bio-Rad 96 Well Plate 200 µL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 Well Aluminum Block with Bio-Rad Well Plate 200 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_aluminumblock_biorad_wellplate_200ul", + "quirks": [ + "gripperIncompatible" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.24, + "z": 4 + }, + "A10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.24, + "z": 4 + }, + "A11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.24, + "z": 4 + }, + "A12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.24, + "z": 4 + }, + "A2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.24, + "z": 4 + }, + "A3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.24, + "z": 4 + }, + "A4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.24, + "z": 4 + }, + "A5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.24, + "z": 4 + }, + "A6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.24, + "z": 4 + }, + "A7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.24, + "z": 4 + }, + "A8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.24, + "z": 4 + }, + "A9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.24, + "z": 4 + }, + "B1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.24, + "z": 4 + }, + "B10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.24, + "z": 4 + }, + "B11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.24, + "z": 4 + }, + "B12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.24, + "z": 4 + }, + "B2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.24, + "z": 4 + }, + "B3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.24, + "z": 4 + }, + "B4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.24, + "z": 4 + }, + "B5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.24, + "z": 4 + }, + "B6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.24, + "z": 4 + }, + "B7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.24, + "z": 4 + }, + "B8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.24, + "z": 4 + }, + "B9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.24, + "z": 4 + }, + "C1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.24, + "z": 4 + }, + "C10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.24, + "z": 4 + }, + "C11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.24, + "z": 4 + }, + "C12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.24, + "z": 4 + }, + "C2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.24, + "z": 4 + }, + "C3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.24, + "z": 4 + }, + "C4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.24, + "z": 4 + }, + "C5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.24, + "z": 4 + }, + "C6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.24, + "z": 4 + }, + "C7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.24, + "z": 4 + }, + "C8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.24, + "z": 4 + }, + "C9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.24, + "z": 4 + }, + "D1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.24, + "z": 4 + }, + "D10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.24, + "z": 4 + }, + "D11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.24, + "z": 4 + }, + "D12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.24, + "z": 4 + }, + "D2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.24, + "z": 4 + }, + "D3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.24, + "z": 4 + }, + "D4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.24, + "z": 4 + }, + "D5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.24, + "z": 4 + }, + "D6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.24, + "z": 4 + }, + "D7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.24, + "z": 4 + }, + "D8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.24, + "z": 4 + }, + "D9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.24, + "z": 4 + }, + "E1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.24, + "z": 4 + }, + "E10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.24, + "z": 4 + }, + "E11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.24, + "z": 4 + }, + "E12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.24, + "z": 4 + }, + "E2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.24, + "z": 4 + }, + "E3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.24, + "z": 4 + }, + "E4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.24, + "z": 4 + }, + "E5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.24, + "z": 4 + }, + "E6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.24, + "z": 4 + }, + "E7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.24, + "z": 4 + }, + "E8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.24, + "z": 4 + }, + "E9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.24, + "z": 4 + }, + "F1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.24, + "z": 4 + }, + "F10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.24, + "z": 4 + }, + "F11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.24, + "z": 4 + }, + "F12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.24, + "z": 4 + }, + "F2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.24, + "z": 4 + }, + "F3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.24, + "z": 4 + }, + "F4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.24, + "z": 4 + }, + "F5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.24, + "z": 4 + }, + "F6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.24, + "z": 4 + }, + "F7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.24, + "z": 4 + }, + "F8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.24, + "z": 4 + }, + "F9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.24, + "z": 4 + }, + "G1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.24, + "z": 4 + }, + "G10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.24, + "z": 4 + }, + "G11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.24, + "z": 4 + }, + "G12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.24, + "z": 4 + }, + "G2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.24, + "z": 4 + }, + "G3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.24, + "z": 4 + }, + "G4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.24, + "z": 4 + }, + "G5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.24, + "z": 4 + }, + "G6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.24, + "z": 4 + }, + "G7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.24, + "z": 4 + }, + "G8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.24, + "z": 4 + }, + "G9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.24, + "z": 4 + }, + "H1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.24, + "z": 4 + }, + "H10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.24, + "z": 4 + }, + "H11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.24, + "z": 4 + }, + "H12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.24, + "z": 4 + }, + "H2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.24, + "z": 4 + }, + "H3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.24, + "z": 4 + }, + "H4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.24, + "z": 4 + }, + "H5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.24, + "z": 4 + }, + "H6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.24, + "z": 4 + }, + "H7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.24, + "z": 4 + }, + "H8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.24, + "z": 4 + }, + "H9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.24, + "z": 4 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "corning_384_wellplate_112ul_flat", + "location": { + "slotName": "B3" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Corning", + "brandId": [ + "3640", + "3662", + "3680", + "3700", + "3701", + "3702" + ], + "links": [ + "https://ecatalog.corning.com/life-sciences/b2c/US/en/Microplates/Assay-Microplates/384-Well-Microplates/Corning%C2%AE-384-well-Clear-Polystyrene-Microplates/p/corning384WellClearPolystyreneMicroplates" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.47, + "zDimension": 14.22 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 12.4, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "flat" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A13", + "A14", + "A15", + "A16", + "A17", + "A18", + "A19", + "A2", + "A20", + "A21", + "A22", + "A23", + "A24", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B13", + "B14", + "B15", + "B16", + "B17", + "B18", + "B19", + "B2", + "B20", + "B21", + "B22", + "B23", + "B24", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C13", + "C14", + "C15", + "C16", + "C17", + "C18", + "C19", + "C2", + "C20", + "C21", + "C22", + "C23", + "C24", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D13", + "D14", + "D15", + "D16", + "D17", + "D18", + "D19", + "D2", + "D20", + "D21", + "D22", + "D23", + "D24", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E13", + "E14", + "E15", + "E16", + "E17", + "E18", + "E19", + "E2", + "E20", + "E21", + "E22", + "E23", + "E24", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F13", + "F14", + "F15", + "F16", + "F17", + "F18", + "F19", + "F2", + "F20", + "F21", + "F22", + "F23", + "F24", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G13", + "G14", + "G15", + "G16", + "G17", + "G18", + "G19", + "G2", + "G20", + "G21", + "G22", + "G23", + "G24", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H13", + "H14", + "H15", + "H16", + "H17", + "H18", + "H19", + "H2", + "H20", + "H21", + "H22", + "H23", + "H24", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9", + "I1", + "I10", + "I11", + "I12", + "I13", + "I14", + "I15", + "I16", + "I17", + "I18", + "I19", + "I2", + "I20", + "I21", + "I22", + "I23", + "I24", + "I3", + "I4", + "I5", + "I6", + "I7", + "I8", + "I9", + "J1", + "J10", + "J11", + "J12", + "J13", + "J14", + "J15", + "J16", + "J17", + "J18", + "J19", + "J2", + "J20", + "J21", + "J22", + "J23", + "J24", + "J3", + "J4", + "J5", + "J6", + "J7", + "J8", + "J9", + "K1", + "K10", + "K11", + "K12", + "K13", + "K14", + "K15", + "K16", + "K17", + "K18", + "K19", + "K2", + "K20", + "K21", + "K22", + "K23", + "K24", + "K3", + "K4", + "K5", + "K6", + "K7", + "K8", + "K9", + "L1", + "L10", + "L11", + "L12", + "L13", + "L14", + "L15", + "L16", + "L17", + "L18", + "L19", + "L2", + "L20", + "L21", + "L22", + "L23", + "L24", + "L3", + "L4", + "L5", + "L6", + "L7", + "L8", + "L9", + "M1", + "M10", + "M11", + "M12", + "M13", + "M14", + "M15", + "M16", + "M17", + "M18", + "M19", + "M2", + "M20", + "M21", + "M22", + "M23", + "M24", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "N1", + "N10", + "N11", + "N12", + "N13", + "N14", + "N15", + "N16", + "N17", + "N18", + "N19", + "N2", + "N20", + "N21", + "N22", + "N23", + "N24", + "N3", + "N4", + "N5", + "N6", + "N7", + "N8", + "N9", + "O1", + "O10", + "O11", + "O12", + "O13", + "O14", + "O15", + "O16", + "O17", + "O18", + "O19", + "O2", + "O20", + "O21", + "O22", + "O23", + "O24", + "O3", + "O4", + "O5", + "O6", + "O7", + "O8", + "O9", + "P1", + "P10", + "P11", + "P12", + "P13", + "P14", + "P15", + "P16", + "P17", + "P18", + "P19", + "P2", + "P20", + "P21", + "P22", + "P23", + "P24", + "P3", + "P4", + "P5", + "P6", + "P7", + "P8", + "P9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Corning 384 Well Plate 112 µL Flat", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "I1", + "J1", + "K1", + "L1", + "M1", + "N1", + "O1", + "P1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "I10", + "J10", + "K10", + "L10", + "M10", + "N10", + "O10", + "P10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "I11", + "J11", + "K11", + "L11", + "M11", + "N11", + "O11", + "P11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + "I12", + "J12", + "K12", + "L12", + "M12", + "N12", + "O12", + "P12" + ], + [ + "A13", + "B13", + "C13", + "D13", + "E13", + "F13", + "G13", + "H13", + "I13", + "J13", + "K13", + "L13", + "M13", + "N13", + "O13", + "P13" + ], + [ + "A14", + "B14", + "C14", + "D14", + "E14", + "F14", + "G14", + "H14", + "I14", + "J14", + "K14", + "L14", + "M14", + "N14", + "O14", + "P14" + ], + [ + "A15", + "B15", + "C15", + "D15", + "E15", + "F15", + "G15", + "H15", + "I15", + "J15", + "K15", + "L15", + "M15", + "N15", + "O15", + "P15" + ], + [ + "A16", + "B16", + "C16", + "D16", + "E16", + "F16", + "G16", + "H16", + "I16", + "J16", + "K16", + "L16", + "M16", + "N16", + "O16", + "P16" + ], + [ + "A17", + "B17", + "C17", + "D17", + "E17", + "F17", + "G17", + "H17", + "I17", + "J17", + "K17", + "L17", + "M17", + "N17", + "O17", + "P17" + ], + [ + "A18", + "B18", + "C18", + "D18", + "E18", + "F18", + "G18", + "H18", + "I18", + "J18", + "K18", + "L18", + "M18", + "N18", + "O18", + "P18" + ], + [ + "A19", + "B19", + "C19", + "D19", + "E19", + "F19", + "G19", + "H19", + "I19", + "J19", + "K19", + "L19", + "M19", + "N19", + "O19", + "P19" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "I2", + "J2", + "K2", + "L2", + "M2", + "N2", + "O2", + "P2" + ], + [ + "A20", + "B20", + "C20", + "D20", + "E20", + "F20", + "G20", + "H20", + "I20", + "J20", + "K20", + "L20", + "M20", + "N20", + "O20", + "P20" + ], + [ + "A21", + "B21", + "C21", + "D21", + "E21", + "F21", + "G21", + "H21", + "I21", + "J21", + "K21", + "L21", + "M21", + "N21", + "O21", + "P21" + ], + [ + "A22", + "B22", + "C22", + "D22", + "E22", + "F22", + "G22", + "H22", + "I22", + "J22", + "K22", + "L22", + "M22", + "N22", + "O22", + "P22" + ], + [ + "A23", + "B23", + "C23", + "D23", + "E23", + "F23", + "G23", + "H23", + "I23", + "J23", + "K23", + "L23", + "M23", + "N23", + "O23", + "P23" + ], + [ + "A24", + "B24", + "C24", + "D24", + "E24", + "F24", + "G24", + "H24", + "I24", + "J24", + "K24", + "L24", + "M24", + "N24", + "O24", + "P24" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "I3", + "J3", + "K3", + "L3", + "M3", + "N3", + "O3", + "P3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "I4", + "J4", + "K4", + "L4", + "M4", + "N4", + "O4", + "P4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "I5", + "J5", + "K5", + "L5", + "M5", + "N5", + "O5", + "P5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "I6", + "J6", + "K6", + "L6", + "M6", + "N6", + "O6", + "P6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "I7", + "J7", + "K7", + "L7", + "M7", + "N7", + "O7", + "P7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "I8", + "J8", + "K8", + "L8", + "M8", + "N8", + "O8", + "P8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "I9", + "J9", + "K9", + "L9", + "M9", + "N9", + "O9", + "P9" + ] + ], + "parameters": { + "format": "384Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "corning_384_wellplate_112ul_flat" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_aluminum_flat_bottom_plate": { + "x": 0, + "y": 0, + "z": 4.4 + }, + "opentrons_universal_flat_adapter": { + "x": 0, + "y": 0, + "z": 8.32 + } + }, + "stackingOffsetWithModule": {}, + "version": 2, + "wells": { + "A1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "B1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "C1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "D1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "E1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "F1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "G1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "H1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "I1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "J1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "K1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "L1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "M1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "N1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "O1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "P1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "corning_384_wellplate_112ul_flat", + "location": { + "slotName": "A1" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Corning", + "brandId": [ + "3640", + "3662", + "3680", + "3700", + "3701", + "3702" + ], + "links": [ + "https://ecatalog.corning.com/life-sciences/b2c/US/en/Microplates/Assay-Microplates/384-Well-Microplates/Corning%C2%AE-384-well-Clear-Polystyrene-Microplates/p/corning384WellClearPolystyreneMicroplates" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.47, + "zDimension": 14.22 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 12.4, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "flat" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A13", + "A14", + "A15", + "A16", + "A17", + "A18", + "A19", + "A2", + "A20", + "A21", + "A22", + "A23", + "A24", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B13", + "B14", + "B15", + "B16", + "B17", + "B18", + "B19", + "B2", + "B20", + "B21", + "B22", + "B23", + "B24", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C13", + "C14", + "C15", + "C16", + "C17", + "C18", + "C19", + "C2", + "C20", + "C21", + "C22", + "C23", + "C24", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D13", + "D14", + "D15", + "D16", + "D17", + "D18", + "D19", + "D2", + "D20", + "D21", + "D22", + "D23", + "D24", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E13", + "E14", + "E15", + "E16", + "E17", + "E18", + "E19", + "E2", + "E20", + "E21", + "E22", + "E23", + "E24", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F13", + "F14", + "F15", + "F16", + "F17", + "F18", + "F19", + "F2", + "F20", + "F21", + "F22", + "F23", + "F24", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G13", + "G14", + "G15", + "G16", + "G17", + "G18", + "G19", + "G2", + "G20", + "G21", + "G22", + "G23", + "G24", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H13", + "H14", + "H15", + "H16", + "H17", + "H18", + "H19", + "H2", + "H20", + "H21", + "H22", + "H23", + "H24", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9", + "I1", + "I10", + "I11", + "I12", + "I13", + "I14", + "I15", + "I16", + "I17", + "I18", + "I19", + "I2", + "I20", + "I21", + "I22", + "I23", + "I24", + "I3", + "I4", + "I5", + "I6", + "I7", + "I8", + "I9", + "J1", + "J10", + "J11", + "J12", + "J13", + "J14", + "J15", + "J16", + "J17", + "J18", + "J19", + "J2", + "J20", + "J21", + "J22", + "J23", + "J24", + "J3", + "J4", + "J5", + "J6", + "J7", + "J8", + "J9", + "K1", + "K10", + "K11", + "K12", + "K13", + "K14", + "K15", + "K16", + "K17", + "K18", + "K19", + "K2", + "K20", + "K21", + "K22", + "K23", + "K24", + "K3", + "K4", + "K5", + "K6", + "K7", + "K8", + "K9", + "L1", + "L10", + "L11", + "L12", + "L13", + "L14", + "L15", + "L16", + "L17", + "L18", + "L19", + "L2", + "L20", + "L21", + "L22", + "L23", + "L24", + "L3", + "L4", + "L5", + "L6", + "L7", + "L8", + "L9", + "M1", + "M10", + "M11", + "M12", + "M13", + "M14", + "M15", + "M16", + "M17", + "M18", + "M19", + "M2", + "M20", + "M21", + "M22", + "M23", + "M24", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "N1", + "N10", + "N11", + "N12", + "N13", + "N14", + "N15", + "N16", + "N17", + "N18", + "N19", + "N2", + "N20", + "N21", + "N22", + "N23", + "N24", + "N3", + "N4", + "N5", + "N6", + "N7", + "N8", + "N9", + "O1", + "O10", + "O11", + "O12", + "O13", + "O14", + "O15", + "O16", + "O17", + "O18", + "O19", + "O2", + "O20", + "O21", + "O22", + "O23", + "O24", + "O3", + "O4", + "O5", + "O6", + "O7", + "O8", + "O9", + "P1", + "P10", + "P11", + "P12", + "P13", + "P14", + "P15", + "P16", + "P17", + "P18", + "P19", + "P2", + "P20", + "P21", + "P22", + "P23", + "P24", + "P3", + "P4", + "P5", + "P6", + "P7", + "P8", + "P9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Corning 384 Well Plate 112 µL Flat", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "I1", + "J1", + "K1", + "L1", + "M1", + "N1", + "O1", + "P1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "I10", + "J10", + "K10", + "L10", + "M10", + "N10", + "O10", + "P10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "I11", + "J11", + "K11", + "L11", + "M11", + "N11", + "O11", + "P11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + "I12", + "J12", + "K12", + "L12", + "M12", + "N12", + "O12", + "P12" + ], + [ + "A13", + "B13", + "C13", + "D13", + "E13", + "F13", + "G13", + "H13", + "I13", + "J13", + "K13", + "L13", + "M13", + "N13", + "O13", + "P13" + ], + [ + "A14", + "B14", + "C14", + "D14", + "E14", + "F14", + "G14", + "H14", + "I14", + "J14", + "K14", + "L14", + "M14", + "N14", + "O14", + "P14" + ], + [ + "A15", + "B15", + "C15", + "D15", + "E15", + "F15", + "G15", + "H15", + "I15", + "J15", + "K15", + "L15", + "M15", + "N15", + "O15", + "P15" + ], + [ + "A16", + "B16", + "C16", + "D16", + "E16", + "F16", + "G16", + "H16", + "I16", + "J16", + "K16", + "L16", + "M16", + "N16", + "O16", + "P16" + ], + [ + "A17", + "B17", + "C17", + "D17", + "E17", + "F17", + "G17", + "H17", + "I17", + "J17", + "K17", + "L17", + "M17", + "N17", + "O17", + "P17" + ], + [ + "A18", + "B18", + "C18", + "D18", + "E18", + "F18", + "G18", + "H18", + "I18", + "J18", + "K18", + "L18", + "M18", + "N18", + "O18", + "P18" + ], + [ + "A19", + "B19", + "C19", + "D19", + "E19", + "F19", + "G19", + "H19", + "I19", + "J19", + "K19", + "L19", + "M19", + "N19", + "O19", + "P19" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "I2", + "J2", + "K2", + "L2", + "M2", + "N2", + "O2", + "P2" + ], + [ + "A20", + "B20", + "C20", + "D20", + "E20", + "F20", + "G20", + "H20", + "I20", + "J20", + "K20", + "L20", + "M20", + "N20", + "O20", + "P20" + ], + [ + "A21", + "B21", + "C21", + "D21", + "E21", + "F21", + "G21", + "H21", + "I21", + "J21", + "K21", + "L21", + "M21", + "N21", + "O21", + "P21" + ], + [ + "A22", + "B22", + "C22", + "D22", + "E22", + "F22", + "G22", + "H22", + "I22", + "J22", + "K22", + "L22", + "M22", + "N22", + "O22", + "P22" + ], + [ + "A23", + "B23", + "C23", + "D23", + "E23", + "F23", + "G23", + "H23", + "I23", + "J23", + "K23", + "L23", + "M23", + "N23", + "O23", + "P23" + ], + [ + "A24", + "B24", + "C24", + "D24", + "E24", + "F24", + "G24", + "H24", + "I24", + "J24", + "K24", + "L24", + "M24", + "N24", + "O24", + "P24" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "I3", + "J3", + "K3", + "L3", + "M3", + "N3", + "O3", + "P3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "I4", + "J4", + "K4", + "L4", + "M4", + "N4", + "O4", + "P4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "I5", + "J5", + "K5", + "L5", + "M5", + "N5", + "O5", + "P5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "I6", + "J6", + "K6", + "L6", + "M6", + "N6", + "O6", + "P6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "I7", + "J7", + "K7", + "L7", + "M7", + "N7", + "O7", + "P7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "I8", + "J8", + "K8", + "L8", + "M8", + "N8", + "O8", + "P8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "I9", + "J9", + "K9", + "L9", + "M9", + "N9", + "O9", + "P9" + ] + ], + "parameters": { + "format": "384Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "corning_384_wellplate_112ul_flat" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_aluminum_flat_bottom_plate": { + "x": 0, + "y": 0, + "z": 4.4 + }, + "opentrons_universal_flat_adapter": { + "x": 0, + "y": 0, + "z": 8.32 + } + }, + "stackingOffsetWithModule": {}, + "version": 2, + "wells": { + "A1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "A9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 76.49, + "yDimension": 3.63, + "z": 2.79 + }, + "B1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "B9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 71.99, + "yDimension": 3.63, + "z": 2.79 + }, + "C1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "C9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 67.49, + "yDimension": 3.63, + "z": 2.79 + }, + "D1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "D9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 62.99, + "yDimension": 3.63, + "z": 2.79 + }, + "E1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "E9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 58.49, + "yDimension": 3.63, + "z": 2.79 + }, + "F1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "F9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 53.99, + "yDimension": 3.63, + "z": 2.79 + }, + "G1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "G9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 49.49, + "yDimension": 3.63, + "z": 2.79 + }, + "H1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "H9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 44.99, + "yDimension": 3.63, + "z": 2.79 + }, + "I1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "I9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 40.49, + "yDimension": 3.63, + "z": 2.79 + }, + "J1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "J9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 35.99, + "yDimension": 3.63, + "z": 2.79 + }, + "K1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "K9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 31.49, + "yDimension": 3.63, + "z": 2.79 + }, + "L1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "L9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 26.99, + "yDimension": 3.63, + "z": 2.79 + }, + "M1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "M9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 22.49, + "yDimension": 3.63, + "z": 2.79 + }, + "N1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "N9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 17.99, + "yDimension": 3.63, + "z": 2.79 + }, + "O1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "O9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 13.49, + "yDimension": 3.63, + "z": 2.79 + }, + "P1": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 12.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P10": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 52.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P11": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 57.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P12": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 61.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P13": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 66.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P14": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 70.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P15": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 75.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P16": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 79.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P17": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 84.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P18": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 88.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P19": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 93.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P2": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 16.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P20": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 97.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P21": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 102.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P22": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 106.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P23": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 111.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P24": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 115.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P3": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 21.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P4": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 25.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P5": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 30.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P6": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 34.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P7": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 39.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P8": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 43.62, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + }, + "P9": { + "depth": 11.43, + "shape": "rectangular", + "totalLiquidVolume": 112, + "x": 48.12, + "xDimension": 3.63, + "y": 8.99, + "yDimension": 3.63, + "z": 2.79 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p50_multi_flex" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p1000_multi_flex" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Flex_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2.py", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "There are 24 Samples", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Dispensing Diluent Part 1 and Part 2", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 4.9999999999999964 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 36.4 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 18.810000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 95.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 95.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 18.810000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 4.9999999999999964 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 36.4 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 18.810000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 95.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 95.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 18.810000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 80.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 4.9999999999999964 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 36.4 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 200.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -26.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 4.55 + }, + "volume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 98.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 98.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 18.810000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 95.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 95.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 18.810000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Sample to Diluent Part 1", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 2.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "volume": 2.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 2.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 2.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 2.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "volume": 2.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 2.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 2.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 2.0, + "volume": 2.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "volume": 2.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 2.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 2.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Mixing", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 18.810000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 18.810000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 18.810000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Diluted Sample to Diluent Part 2", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 360.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 369.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Mixing", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 18.810000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 18.810000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 80.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 80.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 18.810000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding qPCR Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Standards to Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Diluted Sample to Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 86.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 95.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 104.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 113.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Dispensing 384 well", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 340.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 340.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 344.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 344.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 349.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 349.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 353.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 353.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 358.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 358.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 362.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 362.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 340.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 340.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 344.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 344.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 349.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 349.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 353.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 353.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 358.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 358.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 362.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 362.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 367.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 367.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 371.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 371.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 376.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 376.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 380.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 380.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 385.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 385.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 389.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 389.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 367.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 367.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 371.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 371.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 376.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 376.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 380.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 380.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 385.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 385.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 389.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 389.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 12.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 12.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 16.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 16.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 21.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 21.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 25.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 25.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 34.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 34.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 12.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 12.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 16.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 16.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 21.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 21.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 25.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 25.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 30.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 30.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 34.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 34.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 39.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 39.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 43.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 43.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 48.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 48.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 52.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 52.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 57.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 57.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 61.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 61.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 39.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 39.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 43.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 43.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 48.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 48.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 52.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 52.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 57.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 57.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 61.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 61.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding qPCR Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Standards to Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Diluted Sample to Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Dispensing 384 well", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 340.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 340.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 344.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 344.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 349.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 349.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 353.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 353.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 358.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 358.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 362.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 362.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 340.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 340.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 344.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 344.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 349.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 349.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 353.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 353.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 358.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 358.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 362.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 362.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 367.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 367.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 371.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 371.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 376.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 376.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 380.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 380.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 385.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 385.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 389.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 389.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 367.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 367.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 371.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 371.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 376.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 376.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 380.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 380.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 385.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 385.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 389.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 389.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 12.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 12.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 16.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 16.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 21.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 21.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 25.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 25.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 34.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 34.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 12.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 12.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 16.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 16.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 21.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 21.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 25.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 25.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 30.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 30.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 34.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 34.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 39.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 39.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 43.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 43.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 48.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 48.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 52.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 52.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 57.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 57.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 61.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 61.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 39.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 39.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 43.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 43.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 48.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 48.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 52.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 52.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 57.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 57.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 61.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 61.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding qPCR Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Standards to Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Diluted Sample to Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Dispensing 384 well", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 340.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 340.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 344.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 344.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 349.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 349.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 353.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 353.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 358.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 358.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 362.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 362.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 340.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 340.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 344.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 344.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 349.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 349.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 353.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 353.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 358.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 358.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 362.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 362.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 367.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 367.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 371.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 371.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 376.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 376.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 380.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 380.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 385.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 385.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 389.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 389.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 367.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 367.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 371.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 371.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 376.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 376.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 380.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 380.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 385.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 385.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 389.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 389.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 12.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 12.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 16.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 16.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 21.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 21.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 25.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 25.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 34.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 34.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 12.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 12.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 16.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 16.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 21.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 21.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 25.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 25.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 30.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 30.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 34.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 34.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 39.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 39.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 43.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 43.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 48.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 48.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 52.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 52.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 57.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 57.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 61.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 61.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 39.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 39.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 43.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 43.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 48.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 48.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 52.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 52.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 57.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 57.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 61.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 61.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding qPCR Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Standards to Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Diluted Sample to Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Dispensing 384 well", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 340.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 340.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 344.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 344.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 349.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 349.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 353.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 353.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 358.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 358.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 362.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 362.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 340.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 340.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 344.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 344.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 349.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 349.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 353.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 353.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 358.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 358.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 362.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 362.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 367.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 367.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 371.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 371.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 376.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 376.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 380.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 380.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 385.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 385.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 389.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 389.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 367.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 367.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 371.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 371.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 376.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 376.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 380.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 380.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 385.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 385.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 389.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 389.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 12.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 12.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 16.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 16.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 21.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 21.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 25.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 25.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 34.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 34.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 12.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 12.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 16.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 16.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 21.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 21.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 25.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 25.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 30.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 30.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 34.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 34.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 39.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 39.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 43.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 43.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 48.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 48.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 52.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 52.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 57.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 57.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 61.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 61.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 39.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 39.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 43.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 43.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 48.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 48.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 52.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 52.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 57.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 57.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 61.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 61.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding qPCR Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Standards to Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Diluted Sample to Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Dispensing 384 well", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 340.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 340.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 344.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 344.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 349.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 349.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 353.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 353.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 358.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 358.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 362.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 362.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 340.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 340.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 344.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 344.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 349.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 349.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 353.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 353.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 358.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 358.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 362.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 362.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 367.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 367.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 371.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 371.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 376.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 376.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 380.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 380.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 385.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 385.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 389.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 389.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 367.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 367.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 371.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 371.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 376.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 376.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 380.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 380.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 385.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 385.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 389.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 389.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 12.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 12.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 16.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 16.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 21.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 21.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 25.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 25.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 34.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 34.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 12.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 12.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 16.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 16.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 21.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 21.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 25.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 25.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 30.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 30.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 34.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 34.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 39.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 39.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 43.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 43.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 48.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 48.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 52.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 52.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 57.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 57.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 61.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 61.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 39.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 39.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 43.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 43.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 48.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 48.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 52.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 52.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 57.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 57.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 61.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 61.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding qPCR Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Standards to Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 288.24, + "z": 0.92 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Adding Diluted Sample to Mix", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 387.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 32.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 396.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 41.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 405.38, + "y": 74.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 50.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 68.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.58, + "tipLength": 47.849999999999994, + "tipVolume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 288.24, + "z": 11.405 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 4.0, + "volume": 12.5, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 12.5 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -7.405000000000001 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 11.405 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 2.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 77.38, + "y": 181.38, + "z": 57.891000000000005 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "--> Dispensing 384 well", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "==============================================", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 414.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 340.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 340.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 344.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 344.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 349.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 349.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 353.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 353.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 358.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 358.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 362.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 362.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 423.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 340.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 340.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 344.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 344.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 349.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 349.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 353.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 353.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 358.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 358.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 362.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 362.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 187.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 432.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 367.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 367.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 371.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 371.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 376.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 376.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 380.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 380.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 385.12, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 385.12, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 389.62, + "y": 290.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 389.62, + "y": 290.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 196.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 441.38, + "y": 74.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 367.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 367.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 371.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 371.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 376.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 376.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 380.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 380.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 385.12, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 385.12, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 389.62, + "y": 285.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 389.62, + "y": 285.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 205.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 250.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 12.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 12.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 16.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 16.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 21.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A3" + }, + "result": { + "position": { + "x": 21.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 25.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A4" + }, + "result": { + "position": { + "x": 25.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 30.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 34.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 34.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 214.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 259.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 12.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 12.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 16.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 16.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 21.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B3" + }, + "result": { + "position": { + "x": 21.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 25.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B4" + }, + "result": { + "position": { + "x": 25.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 30.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B5" + }, + "result": { + "position": { + "x": 30.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 34.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 34.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 223.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 268.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 39.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 39.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 43.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 43.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 48.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A9" + }, + "result": { + "position": { + "x": 48.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 52.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A10" + }, + "result": { + "position": { + "x": 52.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 57.12, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 57.12, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 61.62, + "y": 397.49, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 61.62, + "y": 397.49, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A7" + }, + "result": { + "position": { + "x": 232.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.59, + "tipLength": 48.25, + "tipVolume": 200.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 58.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 58.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 40.0, + "volume": 62.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.810000000000002 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 277.38, + "y": 288.24, + "z": 3.9999999999999982 + }, + "volume": 62.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 39.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B7" + }, + "result": { + "position": { + "x": 39.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 43.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B8" + }, + "result": { + "position": { + "x": 43.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 48.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B9" + }, + "result": { + "position": { + "x": 48.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 52.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B10" + }, + "result": { + "position": { + "x": 52.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 57.12, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 57.12, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 61.62, + "y": 392.99, + "z": 15.219999999999999 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 40.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -9.68 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 61.62, + "y": 392.99, + "z": 4.54 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 0.2 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A8" + }, + "result": { + "position": { + "x": 241.38, + "y": 181.38, + "z": 57.5715 + } + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 15 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "Flex_P50MLeft_P1000MRight_None_2_15_ABRKAPALibraryQuantLongv2.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_3200ml_fixed/1", + "loadName": "opentrons_1_trash_3200ml_fixed", + "location": { + "slotName": "A3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "D1" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "D2" + } + }, + { + "definitionUri": "opentrons/opentrons_96_aluminumblock_biorad_wellplate_200ul/1", + "loadName": "opentrons_96_aluminumblock_biorad_wellplate_200ul", + "location": { + "slotName": "D3" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "loadName": "opentrons_flex_96_tiprack_50ul", + "location": { + "slotName": "C1" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "loadName": "opentrons_flex_96_tiprack_200ul", + "location": { + "slotName": "C2" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "loadName": "opentrons_flex_96_tiprack_50ul", + "location": { + "slotName": "C3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "B1" + } + }, + { + "definitionUri": "opentrons/opentrons_96_aluminumblock_biorad_wellplate_200ul/1", + "loadName": "opentrons_96_aluminumblock_biorad_wellplate_200ul", + "location": { + "slotName": "B2" + } + }, + { + "definitionUri": "opentrons/corning_384_wellplate_112ul_flat/2", + "loadName": "corning_384_wellplate_112ul_flat", + "location": { + "slotName": "B3" + } + }, + { + "definitionUri": "opentrons/corning_384_wellplate_112ul_flat/2", + "loadName": "corning_384_wellplate_112ul_flat", + "location": { + "slotName": "A1" + } + } + ], + "liquids": [], + "metadata": { + "author": "Opentrons ", + "description": "OT3 ABR KAPA Library Quant v2", + "protocolName": "OT3 ABR KAPA Library Quant v2", + "source": "Protocol Library" + }, + "modules": [], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p50_multi_flex" + }, + { + "mount": "right", + "pipetteName": "p1000_multi_flex" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a01dac3953][Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoFixtures].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a01dac3953][Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoFixtures].json new file mode 100644 index 00000000000..c5529e8c96e --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a01dac3953][Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoFixtures].json @@ -0,0 +1,10409 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "B1" + }, + "model": "thermocyclerModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 108.96, + "lidHeight": 61.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 5.6 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.6 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 68.8, + "z": 108.96 + }, + "model": "thermocyclerModuleV2", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot3_standard": { + "B1": { + "cornerOffsetFromSlot": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ], + "labwareOffset": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "thermocyclerModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "A2" + }, + "model": "magneticBlockV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 45.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Magnetic Block GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 0.0, + "z": 38.0 + }, + "model": "magneticBlockV1", + "moduleType": "magneticBlockType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": {}, + "ot2_standard": {}, + "ot3_standard": {} + } + }, + "model": "magneticBlockV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "B3" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_well_aluminum_block", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 18.16 + }, + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + } + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons 96 Well Aluminum Block", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_well_aluminum_block", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 74.24, + "z": 3.38 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 74.24, + "z": 3.38 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 74.24, + "z": 3.38 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 74.24, + "z": 3.38 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 74.24, + "z": 3.38 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 74.24, + "z": 3.38 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 74.24, + "z": 3.38 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 74.24, + "z": 3.38 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 74.24, + "z": 3.38 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 74.24, + "z": 3.38 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 74.24, + "z": 3.38 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 74.24, + "z": 3.38 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 65.24, + "z": 3.38 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 65.24, + "z": 3.38 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 65.24, + "z": 3.38 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 65.24, + "z": 3.38 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 65.24, + "z": 3.38 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 65.24, + "z": 3.38 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 65.24, + "z": 3.38 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 65.24, + "z": 3.38 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 65.24, + "z": 3.38 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 65.24, + "z": 3.38 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 65.24, + "z": 3.38 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 65.24, + "z": 3.38 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 56.24, + "z": 3.38 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 56.24, + "z": 3.38 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 56.24, + "z": 3.38 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 56.24, + "z": 3.38 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 56.24, + "z": 3.38 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 56.24, + "z": 3.38 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 56.24, + "z": 3.38 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 56.24, + "z": 3.38 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 56.24, + "z": 3.38 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 56.24, + "z": 3.38 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 56.24, + "z": 3.38 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 56.24, + "z": 3.38 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 47.24, + "z": 3.38 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 47.24, + "z": 3.38 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 47.24, + "z": 3.38 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 47.24, + "z": 3.38 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 47.24, + "z": 3.38 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 47.24, + "z": 3.38 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 47.24, + "z": 3.38 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 47.24, + "z": 3.38 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 47.24, + "z": 3.38 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 47.24, + "z": 3.38 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 47.24, + "z": 3.38 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 47.24, + "z": 3.38 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 38.24, + "z": 3.38 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 38.24, + "z": 3.38 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 38.24, + "z": 3.38 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 38.24, + "z": 3.38 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 38.24, + "z": 3.38 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 38.24, + "z": 3.38 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 38.24, + "z": 3.38 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 38.24, + "z": 3.38 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 38.24, + "z": 3.38 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 38.24, + "z": 3.38 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 38.24, + "z": 3.38 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 38.24, + "z": 3.38 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 29.24, + "z": 3.38 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 29.24, + "z": 3.38 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 29.24, + "z": 3.38 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 29.24, + "z": 3.38 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 29.24, + "z": 3.38 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 29.24, + "z": 3.38 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 29.24, + "z": 3.38 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 29.24, + "z": 3.38 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 29.24, + "z": 3.38 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 29.24, + "z": 3.38 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 29.24, + "z": 3.38 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 29.24, + "z": 3.38 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 20.24, + "z": 3.38 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 20.24, + "z": 3.38 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 20.24, + "z": 3.38 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 20.24, + "z": 3.38 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 20.24, + "z": 3.38 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 20.24, + "z": 3.38 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 20.24, + "z": 3.38 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 20.24, + "z": 3.38 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 20.24, + "z": 3.38 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 20.24, + "z": 3.38 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 20.24, + "z": 3.38 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 20.24, + "z": 3.38 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 11.24, + "z": 3.38 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 11.24, + "z": 3.38 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 11.24, + "z": 3.38 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 11.24, + "z": 3.38 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 11.24, + "z": 3.38 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 11.24, + "z": 3.38 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 11.24, + "z": 3.38 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 11.24, + "z": 3.38 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 11.24, + "z": 3.38 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 11.24, + "z": 3.38 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 11.24, + "z": 3.38 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 11.24, + "z": 3.38 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "B2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "C3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons Flex 96 Tip Rack Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_flex_96_tiprack_adapter", + "quirks": [ + "tiprackAdapterFor96Channel" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": {} + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "D2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons Flex 96 Tip Rack Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_flex_96_tiprack_adapter", + "quirks": [ + "tiprackAdapterFor96Channel" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": {} + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p1000_96" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 90.88 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 90.88 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": "offDeck", + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": "offDeck", + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 90.88 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 90.88 + } + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": "offDeck", + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": "offDeck", + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoFixtures.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_96_well_aluminum_block/1", + "loadName": "opentrons_96_well_aluminum_block", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_adapter/1", + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "C3" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_adapter/1", + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "D2" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {} + } + ], + "liquids": [ + { + "description": "High Quality H₂O", + "displayColor": "#42AB2D", + "displayName": "water" + }, + { + "description": "C₃H₆O", + "displayColor": "#38588a", + "displayName": "acetone" + } + ], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Deck Configuration 1 - No Fixtures" + }, + "modules": [ + { + "location": { + "slotName": "B1" + }, + "model": "thermocyclerModuleV2" + }, + { + "location": { + "slotName": "A2" + }, + "model": "magneticBlockV1" + }, + { + "location": { + "slotName": "B3" + }, + "model": "temperatureModuleV2" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p1000_96" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a08dfa462f][OT2_P300SLeft_MM1_MM_2_2_EngageMagHeightFromBase].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a08dfa462f][OT2_P300SLeft_MM1_MM_2_2_EngageMagHeightFromBase].json new file mode 100644 index 00000000000..43b6661ce7f --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a08dfa462f][OT2_P300SLeft_MM1_MM_2_2_EngageMagHeightFromBase].json @@ -0,0 +1,1577 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "1" + }, + "model": "magneticModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 124.875, + "y": 2.75, + "z": 82.25 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 110.152, + "overLabwareHeight": 4.052 + }, + "displayName": "Magnetic Module GEN1", + "gripperOffsets": {}, + "labwareOffset": { + "x": 0.125, + "y": -0.125, + "z": 82.25 + }, + "model": "magneticModuleV1", + "moduleType": "magneticModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": {} + }, + "model": "magneticModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "4" + }, + "model": "magneticModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 124.875, + "y": 2.75, + "z": 82.25 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 110.152, + "overLabwareHeight": 4.052 + }, + "displayName": "Magnetic Module GEN2", + "gripperOffsets": {}, + "labwareOffset": { + "x": -1.175, + "y": -0.125, + "z": 82.25 + }, + "model": "magneticModuleV2", + "moduleType": "magneticModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "magneticModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 2 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "OT2_P300SLeft_MM1_MM_2_2_EngageMagHeightFromBase.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + } + } + ], + "liquids": [], + "metadata": { + "apiLevel": "2.2" + }, + "modules": [ + { + "location": { + "slotName": "1" + }, + "model": "magneticModuleV1" + }, + { + "location": { + "slotName": "4" + }, + "model": "magneticModuleV2" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a23a1de3ce][OT2_P300M_P20S_TC_HS_TM_2_16_SmokeTestV3].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a23a1de3ce][OT2_P300M_P20S_TC_HS_TM_2_16_SmokeTestV3].json new file mode 100644 index 00000000000..0c7c361123c --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a23a1de3ce][OT2_P300M_P20S_TC_HS_TM_2_16_SmokeTestV3].json @@ -0,0 +1,15450 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "setRailLights", + "params": { + "on": true + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Let there be light! True 🌠🌠🌠", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Is the door is closed? True 🚪🚪🚪", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Is this a simulation? True 🔮🔮🔮", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Running against API Version: 2.16", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "9" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 108.96, + "lidHeight": 61.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 5.6 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.6 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 68.8, + "z": 108.96 + }, + "model": "thermocyclerModuleV2", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot3_standard": { + "B1": { + "cornerOffsetFromSlot": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ], + "labwareOffset": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "thermocyclerModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_well_aluminum_block", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 18.16 + }, + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + } + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons 96 Well Aluminum Block", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_well_aluminum_block", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 74.24, + "z": 3.38 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 74.24, + "z": 3.38 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 74.24, + "z": 3.38 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 74.24, + "z": 3.38 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 74.24, + "z": 3.38 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 74.24, + "z": 3.38 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 74.24, + "z": 3.38 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 74.24, + "z": 3.38 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 74.24, + "z": 3.38 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 74.24, + "z": 3.38 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 74.24, + "z": 3.38 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 74.24, + "z": 3.38 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 65.24, + "z": 3.38 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 65.24, + "z": 3.38 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 65.24, + "z": 3.38 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 65.24, + "z": 3.38 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 65.24, + "z": 3.38 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 65.24, + "z": 3.38 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 65.24, + "z": 3.38 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 65.24, + "z": 3.38 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 65.24, + "z": 3.38 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 65.24, + "z": 3.38 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 65.24, + "z": 3.38 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 65.24, + "z": 3.38 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 56.24, + "z": 3.38 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 56.24, + "z": 3.38 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 56.24, + "z": 3.38 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 56.24, + "z": 3.38 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 56.24, + "z": 3.38 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 56.24, + "z": 3.38 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 56.24, + "z": 3.38 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 56.24, + "z": 3.38 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 56.24, + "z": 3.38 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 56.24, + "z": 3.38 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 56.24, + "z": 3.38 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 56.24, + "z": 3.38 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 47.24, + "z": 3.38 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 47.24, + "z": 3.38 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 47.24, + "z": 3.38 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 47.24, + "z": 3.38 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 47.24, + "z": 3.38 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 47.24, + "z": 3.38 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 47.24, + "z": 3.38 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 47.24, + "z": 3.38 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 47.24, + "z": 3.38 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 47.24, + "z": 3.38 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 47.24, + "z": 3.38 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 47.24, + "z": 3.38 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 38.24, + "z": 3.38 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 38.24, + "z": 3.38 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 38.24, + "z": 3.38 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 38.24, + "z": 3.38 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 38.24, + "z": 3.38 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 38.24, + "z": 3.38 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 38.24, + "z": 3.38 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 38.24, + "z": 3.38 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 38.24, + "z": 3.38 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 38.24, + "z": 3.38 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 38.24, + "z": 3.38 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 38.24, + "z": 3.38 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 29.24, + "z": 3.38 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 29.24, + "z": 3.38 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 29.24, + "z": 3.38 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 29.24, + "z": 3.38 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 29.24, + "z": 3.38 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 29.24, + "z": 3.38 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 29.24, + "z": 3.38 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 29.24, + "z": 3.38 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 29.24, + "z": 3.38 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 29.24, + "z": 3.38 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 29.24, + "z": 3.38 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 29.24, + "z": 3.38 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 20.24, + "z": 3.38 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 20.24, + "z": 3.38 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 20.24, + "z": 3.38 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 20.24, + "z": 3.38 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 20.24, + "z": 3.38 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 20.24, + "z": 3.38 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 20.24, + "z": 3.38 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 20.24, + "z": 3.38 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 20.24, + "z": 3.38 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 20.24, + "z": 3.38 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 20.24, + "z": 3.38 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 20.24, + "z": 3.38 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 11.24, + "z": 3.38 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 11.24, + "z": 3.38 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 11.24, + "z": 3.38 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 11.24, + "z": 3.38 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 11.24, + "z": 3.38 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 11.24, + "z": 3.38 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 11.24, + "z": 3.38 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 11.24, + "z": 3.38 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 11.24, + "z": 3.38 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 11.24, + "z": 3.38 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 11.24, + "z": 3.38 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 11.24, + "z": 3.38 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Temperature-Controlled plate", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_pcr_adapter", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 8.5, + "y": 5.5, + "z": 0 + }, + "dimensions": { + "xDimension": 111, + "yDimension": 75, + "zDimension": 13.85 + }, + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + } + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons 96 PCR Heater-Shaker Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_pcr_adapter", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 69, + "z": 1.85 + }, + "A10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 69, + "z": 1.85 + }, + "A11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 69, + "z": 1.85 + }, + "A12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 69, + "z": 1.85 + }, + "A2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 69, + "z": 1.85 + }, + "A3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 69, + "z": 1.85 + }, + "A4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 69, + "z": 1.85 + }, + "A5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 69, + "z": 1.85 + }, + "A6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 69, + "z": 1.85 + }, + "A7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 69, + "z": 1.85 + }, + "A8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 69, + "z": 1.85 + }, + "A9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 69, + "z": 1.85 + }, + "B1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 60, + "z": 1.85 + }, + "B10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 60, + "z": 1.85 + }, + "B11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 60, + "z": 1.85 + }, + "B12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 60, + "z": 1.85 + }, + "B2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 60, + "z": 1.85 + }, + "B3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 60, + "z": 1.85 + }, + "B4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 60, + "z": 1.85 + }, + "B5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 60, + "z": 1.85 + }, + "B6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 60, + "z": 1.85 + }, + "B7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 60, + "z": 1.85 + }, + "B8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 60, + "z": 1.85 + }, + "B9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 60, + "z": 1.85 + }, + "C1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 51, + "z": 1.85 + }, + "C10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 51, + "z": 1.85 + }, + "C11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 51, + "z": 1.85 + }, + "C12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 51, + "z": 1.85 + }, + "C2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 51, + "z": 1.85 + }, + "C3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 51, + "z": 1.85 + }, + "C4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 51, + "z": 1.85 + }, + "C5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 51, + "z": 1.85 + }, + "C6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 51, + "z": 1.85 + }, + "C7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 51, + "z": 1.85 + }, + "C8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 51, + "z": 1.85 + }, + "C9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 51, + "z": 1.85 + }, + "D1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 42, + "z": 1.85 + }, + "D10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 42, + "z": 1.85 + }, + "D11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 42, + "z": 1.85 + }, + "D12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 42, + "z": 1.85 + }, + "D2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 42, + "z": 1.85 + }, + "D3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 42, + "z": 1.85 + }, + "D4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 42, + "z": 1.85 + }, + "D5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 42, + "z": 1.85 + }, + "D6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 42, + "z": 1.85 + }, + "D7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 42, + "z": 1.85 + }, + "D8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 42, + "z": 1.85 + }, + "D9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 42, + "z": 1.85 + }, + "E1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 33, + "z": 1.85 + }, + "E10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 33, + "z": 1.85 + }, + "E11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 33, + "z": 1.85 + }, + "E12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 33, + "z": 1.85 + }, + "E2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 33, + "z": 1.85 + }, + "E3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 33, + "z": 1.85 + }, + "E4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 33, + "z": 1.85 + }, + "E5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 33, + "z": 1.85 + }, + "E6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 33, + "z": 1.85 + }, + "E7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 33, + "z": 1.85 + }, + "E8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 33, + "z": 1.85 + }, + "E9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 33, + "z": 1.85 + }, + "F1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 24, + "z": 1.85 + }, + "F10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 24, + "z": 1.85 + }, + "F11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 24, + "z": 1.85 + }, + "F12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 24, + "z": 1.85 + }, + "F2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 24, + "z": 1.85 + }, + "F3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 24, + "z": 1.85 + }, + "F4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 24, + "z": 1.85 + }, + "F5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 24, + "z": 1.85 + }, + "F6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 24, + "z": 1.85 + }, + "F7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 24, + "z": 1.85 + }, + "F8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 24, + "z": 1.85 + }, + "F9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 24, + "z": 1.85 + }, + "G1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 15, + "z": 1.85 + }, + "G10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 15, + "z": 1.85 + }, + "G11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 15, + "z": 1.85 + }, + "G12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 15, + "z": 1.85 + }, + "G2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 15, + "z": 1.85 + }, + "G3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 15, + "z": 1.85 + }, + "G4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 15, + "z": 1.85 + }, + "G5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 15, + "z": 1.85 + }, + "G6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 15, + "z": 1.85 + }, + "G7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 15, + "z": 1.85 + }, + "G8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 15, + "z": 1.85 + }, + "G9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 15, + "z": 1.85 + }, + "H1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 6, + "z": 1.85 + }, + "H10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 6, + "z": 1.85 + }, + "H11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 6, + "z": 1.85 + }, + "H12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 6, + "z": 1.85 + }, + "H2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 6, + "z": 1.85 + }, + "H3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 6, + "z": 1.85 + }, + "H4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 6, + "z": 1.85 + }, + "H5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 6, + "z": 1.85 + }, + "H6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 6, + "z": 1.85 + }, + "H7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 6, + "z": 1.85 + }, + "H8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 6, + "z": 1.85 + }, + "H9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 6, + "z": 1.85 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "4 custom tubes", + "loadName": "cpx_4_tuberack_100ul", + "location": { + "slotName": "6" + }, + "namespace": "custom_beta", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "cpx", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127, + "yDimension": 85, + "zDimension": 40 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "cpx", + "brandId": [] + }, + "metadata": { + "displayCategory": "tubeRack", + "wellBottomShape": "u" + }, + "wells": [ + "A1", + "A2", + "B1", + "B2" + ] + } + ], + "metadata": { + "displayCategory": "tubeRack", + "displayName": "cpx 4 Tube Rack with cpx 0.1 mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "custom_beta", + "ordering": [ + [ + "A1", + "B1" + ], + [ + "A2", + "B2" + ] + ], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "cpx_4_tuberack_100ul", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 20, + "y": 65, + "z": 17 + }, + "A2": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50, + "y": 65, + "z": 17 + }, + "B1": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 20, + "y": 35, + "z": 17 + }, + "B2": { + "depth": 23, + "diameter": 20, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50, + "y": 35, + "z": 17 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "logo destination", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 4000.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A2": 2000.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A5": 555.55555 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A8": 900.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A8": 1001.11 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 164.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": "offDeck", + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "2" + }, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 146.88, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Is the pipette tip in the middle of reservoir A1 in slot 2?" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "3" + }, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Is the pipette tip in the middle of reservoir A1 in slot 3?" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "2" + }, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 152.5, + "y": 65.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Is the pipette tip in the middle of custom labware A1 in slot 2?" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "6" + }, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 285.0, + "y": 155.5, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Is the pipette tip in the middle of custom labware A1 in slot 6?" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "slotName": "2" + }, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 146.88, + "y": 74.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Is the pipette tip in the middle of well A1 in slot 2?" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "prepareToAspirate", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 42.78, + "z": 6.55 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Testing prepare_to_aspirate - watch pipette until next pause.\n The pipette should only move up out of the well after it has aspirated." + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Did the pipette move up out of the well, only once, after aspirating?" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -24.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 42.78, + "z": 6.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "fixedTrash", + "alternateDropLocation": false, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Is the pipette over the trash? Pipette will home after this pause." + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "fixedTrash", + "alternateDropLocation": false, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Is the pipette over the trash?" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C7" + }, + "result": { + "position": { + "x": 200.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "fixedTrash", + "alternateDropLocation": false, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowOutInPlace", + "params": { + "flowRate": 7.56 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 191.88, + "y": 47.24, + "z": 1.92 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "fixedTrash", + "alternateDropLocation": false, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowOutInPlace", + "params": { + "flowRate": 7.56 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "D7" + }, + "result": { + "position": { + "x": 200.88, + "y": 47.24, + "z": 1.92 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "fixedTrash", + "alternateDropLocation": false, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowOutInPlace", + "params": { + "flowRate": 7.56 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "D8" + }, + "result": { + "position": { + "x": 209.88, + "y": 47.24, + "z": 1.92 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "fixedTrash", + "alternateDropLocation": false, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowOutInPlace", + "params": { + "flowRate": 7.56 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 19.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 19.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "E5" + }, + "result": { + "position": { + "x": 182.88, + "y": 38.24, + "z": 1.92 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "fixedTrash", + "alternateDropLocation": false, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowOutInPlace", + "params": { + "flowRate": 7.56 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "fixedTrash", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 363.89500000000004, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 14.38, + "y": 155.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "pushOut": 0.0, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "B11" + }, + "result": { + "position": { + "x": 236.88, + "y": 65.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "C11" + }, + "result": { + "position": { + "x": 236.88, + "y": 56.24, + "z": 1.92 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A5" + }, + "result": { + "position": { + "x": 315.38, + "y": 42.78, + "z": 31.400000000000002 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 14.38, + "y": 155.74, + "z": 45.09 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 14.38, + "y": 146.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0000000000000036 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 20.700000000000003 + } + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 5.0000000000000036 + }, + "origin": "top" + }, + "wellName": "A11" + }, + "result": { + "position": { + "x": 236.88, + "y": 74.24, + "z": 20.700000000000003 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 3.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "H11" + }, + "result": { + "position": { + "x": 236.88, + "y": 11.24, + "z": 1.92 + }, + "volume": 5.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 245.88, + "y": 38.24, + "z": 15.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "params": { + "forceDirect": false, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 236.88, + "y": 38.24, + "z": 0.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "blowout", + "params": { + "flowRate": 7.56, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -14.78 + }, + "origin": "top" + }, + "wellName": "E11" + }, + "result": { + "position": { + "x": 236.88, + "y": 38.24, + "z": 0.92 + } + }, + "status": "succeeded" + }, + { + "commandType": "touchTip", + "params": { + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 146.88, + "y": 11.24, + "z": 14.7 + } + }, + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "params": { + "message": "Is the pipette tip in the middle of the well?" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 14.38, + "y": 146.74, + "z": 45.09 + } + }, + "status": "succeeded" + }, + { + "commandType": "temperatureModule/waitForTemperature", + "params": { + "celsius": 25.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 466.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 5.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setTargetTemperature", + "params": { + "celsius": 38.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/waitForTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/closeLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetLidTemperature", + "params": { + "celsius": 38.0 + }, + "result": { + "targetLidTemperature": 38.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForLidTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetBlockTemperature", + "params": { + "celsius": 28.0, + "holdTimeSeconds": 5.0 + }, + "result": { + "targetBlockTemperature": 28.0 + }, + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForBlockTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/deactivateBlock", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/deactivateLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 14.38, + "y": 137.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 280.53, + "y": 255.08999999999997, + "z": 87.51 + }, + "volume": 15.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "fixedTrash", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 331.785, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 146.88, + "y": 164.74, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.255, + "y": 75.365, + "z": 73.84500000000001 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 350.0 + }, + "result": { + "pipetteRetracted": true + }, + "status": "succeeded" + }, + { + "commandType": "waitForDuration", + "params": { + "seconds": 5.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 14.38, + "y": 128.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 15.12, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 11.34, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -22.0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 315.0, + "y": 125.5, + "z": 18.0 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "fixedTrash", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 363.89500000000004, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 75.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 75.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.780000000000001 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.38, + "y": 324.04, + "z": 100.08 + }, + "volume": 60.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "fixedTrash", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 331.785, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "OT2_P300M_P20S_TC_HS_TM_2_16_SmokeTestV3.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "4" + } + }, + { + "definitionUri": "opentrons/opentrons_96_well_aluminum_block/1", + "loadName": "opentrons_96_well_aluminum_block", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "displayName": "Temperature-Controlled plate", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_96_pcr_adapter/1", + "loadName": "opentrons_96_pcr_adapter", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "custom_beta/cpx_4_tuberack_100ul/1", + "displayName": "4 custom tubes", + "loadName": "cpx_4_tuberack_100ul", + "location": { + "slotName": "6" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "displayName": "logo destination", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "2" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + } + } + ], + "liquids": [ + { + "description": "H₂O", + "displayColor": "#42AB2D", + "displayName": "water" + }, + { + "description": "C₃H₆O", + "displayColor": "#38588a", + "displayName": "acetone" + } + ], + "metadata": { + "author": "Opentrons Engineering ", + "description": "Description of the protocol that is longish \n has \n returns and \n emoji 😊 ⬆️ ", + "protocolName": "🛠️ 2.16 Smoke Test V3 🪄", + "source": "Software Testing Team" + }, + "modules": [ + { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + }, + { + "location": { + "slotName": "9" + }, + "model": "temperatureModuleV2" + }, + { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV2" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + { + "mount": "right", + "pipetteName": "p20_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a550135de6][Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol3].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a550135de6][Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol3].json new file mode 100644 index 00000000000..785e9011bcd --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a550135de6][Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol3].json @@ -0,0 +1,163 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_1_reservoir_290ml", + "location": { + "addressableAreaName": "C4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360206", + "360266" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.47, + "zDimension": 44.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 1 Well Reservoir 290 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_1_reservoir_290ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.55, + "shape": "rectangular", + "totalLiquidVolume": 290000, + "x": 63.88, + "xDimension": 106.8, + "y": 42.74, + "yDimension": 71.2, + "z": 4.85 + } + } + } + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "IncompatibleAddressableAreaError [line 16]: Error 4000 GENERAL_ERROR (IncompatibleAddressableAreaError): Cannot use Trash Bin in C3, not compatible with one or more of the following fixtures: Slot C4", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "Cannot use Trash Bin in C3, not compatible with one or more of the following fixtures: Slot C4", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "IncompatibleAddressableAreaError", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol3.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/nest_1_reservoir_290ml/1", + "loadName": "nest_1_reservoir_290ml", + "location": { + "addressableAreaName": "C4" + } + } + ], + "liquids": [], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Analysis Error - Trash Bin in Staging Area Column 3" + }, + "modules": [], + "pipettes": [], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[aaab7be350][OT2_P300M_P20S_2_16_aspirateDispenseMix0Volume].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[aaab7be350][OT2_P300M_P20S_2_16_aspirateDispenseMix0Volume].json new file mode 100644 index 00000000000..ac69641482d --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[aaab7be350][OT2_P300M_P20S_2_16_aspirateDispenseMix0Volume].json @@ -0,0 +1,2837 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "setRailLights", + "params": { + "on": true + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons OT-2 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 20.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.38, + "y": 164.74, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 0.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 0.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 0.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 0.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 0.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 0.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 7.56, + "volume": 0.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 0.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 7.56, + "volume": 0.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -25.85 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 42.78, + "z": 5.55 + }, + "volume": 0.0 + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "OT2_P300M_P20S_2_16_aspirateDispenseMix0Volume.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "300ul tips", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "5" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "displayName": "20ul tips", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "4" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "dye container", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "3" + } + } + ], + "liquids": [ + { + "description": "H₂O", + "displayColor": "#42AB2D", + "displayName": "water" + } + ], + "metadata": { + "author": "Opentrons Engineering ", + "protocolName": "QA Protocol - API 2.16 - Aspirate Dispense Mix with 0 Volume", + "source": "Software Testing Team" + }, + "modules": [], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + { + "mount": "right", + "pipetteName": "p20_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac35bb394d][Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol4].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac35bb394d][Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol4].json new file mode 100644 index 00000000000..707cf2e163d --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac35bb394d][Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol4].json @@ -0,0 +1,73 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "ValueError [line 15]: Staging areas not permitted for trash bin.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "ValueError: Staging areas not permitted for trash bin.", + "errorCode": "4000", + "errorInfo": { + "args": "('Staging areas not permitted for trash bin.',)", + "class": "ValueError", + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 69, in run_python\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol4.py\", line 15, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 511, in load_trash_bin\n raise ValueError(\"Staging areas not permitted for trash bin.\")\n" + }, + "errorType": "PythonException", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "Flex_None_None_2_16_AnalysisError_TrashBinInStagingAreaCol4.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [], + "liquids": [], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Analysis Error - Trash Bin in Staging Area Column 4" + }, + "modules": [], + "pipettes": [], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[adca5df246][Flex_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[adca5df246][Flex_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III].json new file mode 100644 index 00000000000..76361297ac1 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[adca5df246][Flex_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III].json @@ -0,0 +1,5852 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "THIS IS A DRY RUN", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "D1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_ot3_96_tiprack_200ul_rss", + "location": { + "slotName": "D2" + }, + "namespace": "custom_beta", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [ + "RSS_made" + ] + }, + "cornerOffsetFromSlot": { + "x": -14.375, + "y": -3.625, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL with adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "custom_beta", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_ot3_96_tiprack_200ul_rss", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 78, + "z": 12.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 78, + "z": 12.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 78, + "z": 12.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 78, + "z": 12.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 78, + "z": 12.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 78, + "z": 12.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 78, + "z": 12.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 78, + "z": 12.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 78, + "z": 12.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 78, + "z": 12.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 78, + "z": 12.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 78, + "z": 12.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 69, + "z": 12.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 69, + "z": 12.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 69, + "z": 12.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 69, + "z": 12.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 69, + "z": 12.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 69, + "z": 12.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 69, + "z": 12.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 69, + "z": 12.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 69, + "z": 12.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 69, + "z": 12.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 69, + "z": 12.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 69, + "z": 12.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 60, + "z": 12.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 60, + "z": 12.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 60, + "z": 12.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 60, + "z": 12.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 60, + "z": 12.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 60, + "z": 12.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 60, + "z": 12.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 60, + "z": 12.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 60, + "z": 12.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 60, + "z": 12.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 60, + "z": 12.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 60, + "z": 12.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 51, + "z": 12.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 51, + "z": 12.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 51, + "z": 12.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 51, + "z": 12.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 51, + "z": 12.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 51, + "z": 12.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 51, + "z": 12.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 51, + "z": 12.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 51, + "z": 12.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 51, + "z": 12.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 51, + "z": 12.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 51, + "z": 12.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 42, + "z": 12.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 42, + "z": 12.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 42, + "z": 12.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 42, + "z": 12.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 42, + "z": 12.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 42, + "z": 12.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 42, + "z": 12.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 42, + "z": 12.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 42, + "z": 12.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 42, + "z": 12.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 42, + "z": 12.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 42, + "z": 12.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 33, + "z": 12.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 33, + "z": 12.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 33, + "z": 12.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 33, + "z": 12.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 33, + "z": 12.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 33, + "z": 12.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 33, + "z": 12.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 33, + "z": 12.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 33, + "z": 12.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 33, + "z": 12.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 33, + "z": 12.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 33, + "z": 12.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 24, + "z": 12.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 24, + "z": 12.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 24, + "z": 12.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 24, + "z": 12.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 24, + "z": 12.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 24, + "z": 12.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 24, + "z": 12.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 24, + "z": 12.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 24, + "z": 12.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 24, + "z": 12.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 24, + "z": 12.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 24, + "z": 12.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 15, + "z": 12.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 15, + "z": 12.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 15, + "z": 12.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 15, + "z": 12.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 15, + "z": 12.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 15, + "z": 12.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 15, + "z": 12.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 15, + "z": 12.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 15, + "z": 12.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 15, + "z": 12.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 15, + "z": 12.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 15, + "z": 12.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "D3" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 45.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Magnetic Block GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 0.0, + "z": 38.0 + }, + "model": "magneticBlockV1", + "moduleType": "magneticBlockType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": {}, + "ot2_standard": {}, + "ot3_standard": {} + } + }, + "model": "magneticBlockV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "error": { + "detail": "Labware nest_96_wellplate_2ml_deep is already present at slotName=.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "LocationIsOccupiedError", + "wrappedErrors": [] + }, + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 2 + }, + "status": "failed" + } + ], + "config": { + "apiVersion": [ + 2, + 15 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "ProtocolCommandFailedError [line 45]: Error 4000 GENERAL_ERROR (ProtocolCommandFailedError): LocationIsOccupiedError: Labware nest_96_wellplate_2ml_deep is already present at slotName=.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "LocationIsOccupiedError: Labware nest_96_wellplate_2ml_deep is already present at slotName=.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ProtocolCommandFailedError", + "wrappedErrors": [ + { + "detail": "Labware nest_96_wellplate_2ml_deep is already present at slotName=.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "LocationIsOccupiedError", + "wrappedErrors": [] + } + ] + } + ] + } + ], + "files": [ + { + "name": "Flex_P1000_96_HS_TM_TC_MM_2_15_ABR5_6_Illumina_DNA_Prep_96x_Head_PART_III.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_3200ml_fixed/1", + "loadName": "opentrons_1_trash_3200ml_fixed", + "location": { + "slotName": "A3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "custom_beta/opentrons_ot3_96_tiprack_200ul_rss/1", + "loadName": "opentrons_ot3_96_tiprack_200ul_rss", + "location": { + "slotName": "D2" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C2" + } + } + ], + "liquids": [], + "metadata": { + "author": "Opentrons ", + "protocolName": "Illumina DNA Prep 96x Head PART III", + "source": "Protocol Library" + }, + "modules": [ + { + "location": { + "slotName": "D1" + }, + "model": "heaterShakerModuleV1" + }, + { + "location": { + "slotName": "D3" + }, + "model": "temperatureModuleV2" + }, + { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + } + ], + "pipettes": [], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[af0b02a5db][OT2_P300M_P20S_HS_6_1_Smoke620release].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[af0b02a5db][OT2_P300M_P20S_HS_6_1_Smoke620release].json new file mode 100644 index 00000000000..1fa8db23b06 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[af0b02a5db][OT2_P300M_P20S_HS_6_1_Smoke620release].json @@ -0,0 +1,8465 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "H/S", + "loadName": "opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 42.25 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deepwell Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 Deep Well Adapter with NEST Deep Well Plate 2 mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 4.25 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Single", + "loadName": "opentrons_24_aluminumblock_generic_2ml_screwcap", + "location": { + "slotName": "6" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/hardware-modules/products/aluminum-block-set" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.5, + "zDimension": 42 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "generic", + "brandId": [], + "links": [] + }, + "metadata": { + "displayCategory": "tubeRack", + "displayName": "Generic 2 mL Screwcap", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A2", + "A3", + "A4", + "A5", + "A6", + "B1", + "B2", + "B3", + "B4", + "B5", + "B6", + "C1", + "C2", + "C3", + "C4", + "C5", + "C6", + "D1", + "D2", + "D3", + "D4", + "D5", + "D6" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1" + ], + [ + "A2", + "B2", + "C2", + "D2" + ], + [ + "A3", + "B3", + "C3", + "D3" + ], + [ + "A4", + "B4", + "C4", + "D4" + ], + [ + "A5", + "B5", + "C5", + "D5" + ], + [ + "A6", + "B6", + "C6", + "D6" + ] + ], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_24_aluminumblock_generic_2ml_screwcap" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 68.63, + "z": 6.7 + }, + "A2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 68.63, + "z": 6.7 + }, + "A3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 68.63, + "z": 6.7 + }, + "A4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 68.63, + "z": 6.7 + }, + "A5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 68.63, + "z": 6.7 + }, + "A6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 68.63, + "z": 6.7 + }, + "B1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 51.38, + "z": 6.7 + }, + "B2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 51.38, + "z": 6.7 + }, + "B3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 51.38, + "z": 6.7 + }, + "B4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 51.38, + "z": 6.7 + }, + "B5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 51.38, + "z": 6.7 + }, + "B6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 51.38, + "z": 6.7 + }, + "C1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 34.13, + "z": 6.7 + }, + "C2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 34.13, + "z": 6.7 + }, + "C3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 34.13, + "z": 6.7 + }, + "C4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 34.13, + "z": 6.7 + }, + "C5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 34.13, + "z": 6.7 + }, + "C6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 34.13, + "z": 6.7 + }, + "D1": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 20.75, + "y": 16.88, + "z": 6.7 + }, + "D2": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 38, + "y": 16.88, + "z": 6.7 + }, + "D3": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 55.25, + "y": 16.88, + "z": 6.7 + }, + "D4": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 72.5, + "y": 16.88, + "z": 6.7 + }, + "D5": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 89.75, + "y": 16.88, + "z": 6.7 + }, + "D6": { + "depth": 42, + "diameter": 8.5, + "shape": "circular", + "totalLiquidVolume": 2000, + "x": 107, + "y": 16.88, + "z": 6.7 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Multi", + "loadName": "biorad_96_wellplate_200ul_pcr", + "location": { + "slotName": "9" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Bio-Rad", + "brandId": [ + "hsp9601" + ], + "links": [ + "http://www.bio-rad.com/en-us/sku/hsp9601-hard-shell-96-well-pcr-plates-low-profile-thin-wall-skirted-white-clear?ID=hsp9601" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 16.06 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Bio-Rad 96 Well Plate 200 µL PCR", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "biorad_96_wellplate_200ul_pcr", + "magneticModuleEngageHeight": 18 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.24, + "z": 1.25 + }, + "A10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.24, + "z": 1.25 + }, + "A11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.24, + "z": 1.25 + }, + "A12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.24, + "z": 1.25 + }, + "A2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.24, + "z": 1.25 + }, + "A3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.24, + "z": 1.25 + }, + "A4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.24, + "z": 1.25 + }, + "A5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.24, + "z": 1.25 + }, + "A6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.24, + "z": 1.25 + }, + "A7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.24, + "z": 1.25 + }, + "A8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.24, + "z": 1.25 + }, + "A9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.24, + "z": 1.25 + }, + "B1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.24, + "z": 1.25 + }, + "B10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.24, + "z": 1.25 + }, + "B11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.24, + "z": 1.25 + }, + "B12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.24, + "z": 1.25 + }, + "B2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.24, + "z": 1.25 + }, + "B3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.24, + "z": 1.25 + }, + "B4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.24, + "z": 1.25 + }, + "B5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.24, + "z": 1.25 + }, + "B6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.24, + "z": 1.25 + }, + "B7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.24, + "z": 1.25 + }, + "B8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.24, + "z": 1.25 + }, + "B9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.24, + "z": 1.25 + }, + "C1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.24, + "z": 1.25 + }, + "C10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.24, + "z": 1.25 + }, + "C11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.24, + "z": 1.25 + }, + "C12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.24, + "z": 1.25 + }, + "C2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.24, + "z": 1.25 + }, + "C3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.24, + "z": 1.25 + }, + "C4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.24, + "z": 1.25 + }, + "C5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.24, + "z": 1.25 + }, + "C6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.24, + "z": 1.25 + }, + "C7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.24, + "z": 1.25 + }, + "C8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.24, + "z": 1.25 + }, + "C9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.24, + "z": 1.25 + }, + "D1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.24, + "z": 1.25 + }, + "D10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.24, + "z": 1.25 + }, + "D11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.24, + "z": 1.25 + }, + "D12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.24, + "z": 1.25 + }, + "D2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.24, + "z": 1.25 + }, + "D3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.24, + "z": 1.25 + }, + "D4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.24, + "z": 1.25 + }, + "D5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.24, + "z": 1.25 + }, + "D6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.24, + "z": 1.25 + }, + "D7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.24, + "z": 1.25 + }, + "D8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.24, + "z": 1.25 + }, + "D9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.24, + "z": 1.25 + }, + "E1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.24, + "z": 1.25 + }, + "E10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.24, + "z": 1.25 + }, + "E11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.24, + "z": 1.25 + }, + "E12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.24, + "z": 1.25 + }, + "E2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.24, + "z": 1.25 + }, + "E3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.24, + "z": 1.25 + }, + "E4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.24, + "z": 1.25 + }, + "E5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.24, + "z": 1.25 + }, + "E6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.24, + "z": 1.25 + }, + "E7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.24, + "z": 1.25 + }, + "E8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.24, + "z": 1.25 + }, + "E9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.24, + "z": 1.25 + }, + "F1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.24, + "z": 1.25 + }, + "F10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.24, + "z": 1.25 + }, + "F11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.24, + "z": 1.25 + }, + "F12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.24, + "z": 1.25 + }, + "F2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.24, + "z": 1.25 + }, + "F3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.24, + "z": 1.25 + }, + "F4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.24, + "z": 1.25 + }, + "F5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.24, + "z": 1.25 + }, + "F6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.24, + "z": 1.25 + }, + "F7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.24, + "z": 1.25 + }, + "F8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.24, + "z": 1.25 + }, + "F9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.24, + "z": 1.25 + }, + "G1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.24, + "z": 1.25 + }, + "G10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.24, + "z": 1.25 + }, + "G11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.24, + "z": 1.25 + }, + "G12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.24, + "z": 1.25 + }, + "G2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.24, + "z": 1.25 + }, + "G3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.24, + "z": 1.25 + }, + "G4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.24, + "z": 1.25 + }, + "G5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.24, + "z": 1.25 + }, + "G6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.24, + "z": 1.25 + }, + "G7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.24, + "z": 1.25 + }, + "G8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.24, + "z": 1.25 + }, + "G9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.24, + "z": 1.25 + }, + "H1": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.24, + "z": 1.25 + }, + "H10": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.24, + "z": 1.25 + }, + "H11": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.24, + "z": 1.25 + }, + "H12": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.24, + "z": 1.25 + }, + "H2": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.24, + "z": 1.25 + }, + "H3": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.24, + "z": 1.25 + }, + "H4": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.24, + "z": 1.25 + }, + "H5": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.24, + "z": 1.25 + }, + "H6": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.24, + "z": 1.25 + }, + "H7": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.24, + "z": 1.25 + }, + "H8": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.24, + "z": 1.25 + }, + "H9": { + "depth": 14.81, + "diameter": 5.46, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.24, + "z": 1.25 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Mis", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "7" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Agilent", + "brandId": [ + "201252-100" + ], + "links": [ + "https://www.agilent.com/store/en_US/Prod-201252-100/201252-100" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.57, + "zDimension": 44.04 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "Agilent 1 Well Reservoir 290 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "agilent_1_reservoir_290ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.22, + "shape": "rectangular", + "totalLiquidVolume": 290000, + "x": 63.88, + "xDimension": 108, + "y": 42.785, + "yDimension": 72, + "z": 4.82 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 20 µL", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "8" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 200.0, + "A10": 200.0, + "A11": 200.0, + "A12": 200.0, + "A2": 200.0, + "A3": 200.0, + "A4": 200.0, + "A5": 200.0, + "A6": 200.0, + "A7": 200.0, + "A8": 200.0, + "A9": 200.0, + "B1": 200.0, + "B10": 200.0, + "B11": 200.0, + "B12": 200.0, + "B2": 200.0, + "B3": 200.0, + "B4": 200.0, + "B5": 200.0, + "B6": 200.0, + "B7": 200.0, + "B8": 200.0, + "B9": 200.0, + "C1": 200.0, + "C10": 200.0, + "C11": 200.0, + "C12": 200.0, + "C2": 200.0, + "C3": 200.0, + "C4": 200.0, + "C5": 200.0, + "C6": 200.0, + "C7": 200.0, + "C8": 200.0, + "C9": 200.0, + "D1": 200.0, + "D10": 200.0, + "D11": 200.0, + "D12": 200.0, + "D2": 200.0, + "D3": 200.0, + "D4": 200.0, + "D5": 200.0, + "D6": 200.0, + "D7": 200.0, + "D8": 200.0, + "D9": 200.0, + "E1": 200.0, + "E10": 200.0, + "E11": 200.0, + "E12": 200.0, + "E2": 200.0, + "E3": 200.0, + "E4": 200.0, + "E5": 200.0, + "E6": 200.0, + "E7": 200.0, + "E8": 200.0, + "E9": 200.0, + "F1": 200.0, + "F10": 200.0, + "F11": 200.0, + "F12": 200.0, + "F2": 200.0, + "F3": 200.0, + "F4": 200.0, + "F5": 200.0, + "F6": 200.0, + "F7": 200.0, + "F8": 200.0, + "F9": 200.0, + "G1": 200.0, + "G10": 200.0, + "G11": 200.0, + "G12": 200.0, + "G2": 200.0, + "G3": 200.0, + "G4": 200.0, + "G5": 200.0, + "G6": 200.0, + "G7": 200.0, + "G8": 200.0, + "G9": 200.0, + "H1": 200.0, + "H10": 200.0, + "H11": 200.0, + "H12": 200.0, + "H2": 200.0, + "H3": 200.0, + "H4": 200.0, + "H5": 200.0, + "H6": 200.0, + "H7": 200.0, + "H8": 200.0, + "H9": 200.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 100.0, + "A2": 100.0, + "A3": 100.0, + "A4": 100.0, + "A5": 100.0, + "A6": 100.0, + "B1": 100.0, + "B2": 100.0, + "B3": 100.0, + "B4": 100.0, + "B5": 100.0, + "B6": 100.0, + "C1": 100.0, + "C2": 100.0, + "C3": 100.0, + "C4": 100.0, + "C5": 100.0, + "C6": 100.0, + "D1": 100.0, + "D2": 100.0, + "D3": 100.0, + "D4": 100.0, + "D5": 100.0, + "D6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateHeater", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 74.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 279.38, + "y": 255.24, + "z": 2.25 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.175, + "y": 75.275, + "z": 73.025 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 146.88, + "y": 255.24, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 285.75, + "y": 159.13, + "z": 7.7 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.175, + "y": 75.275, + "z": 73.025 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 146.88, + "y": 246.24, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 285.75, + "y": 141.88, + "z": 7.7 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 59.175, + "y": 66.275, + "z": 73.025 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 146.88, + "y": 237.24, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 285.75, + "y": 124.63, + "z": 7.7 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 59.175, + "y": 57.275, + "z": 73.025 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 146.88, + "y": 228.24, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 285.75, + "y": 107.38, + "z": 7.7 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 18.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 59.175, + "y": 48.275, + "z": 73.025 + }, + "volume": 18.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setTargetTemperature", + "params": { + "celsius": 80.0 + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/waitForTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "params": { + "rpm": 400.0 + }, + "result": { + "pipetteRetracted": false + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/waitForTemperature", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateHeater", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 288.38, + "y": 74.24, + "z": 64.69 + }, + "tipDiameter": 5.23, + "tipLength": 51.099999999999994, + "tipVolume": 300.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 14.175, + "y": 75.275, + "z": 73.525 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 50.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 50.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 146.88, + "y": 219.24, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 59.175, + "y": 75.275, + "z": 73.525 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 146.88, + "y": 210.24, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "B6" + }, + "result": { + "position": { + "x": 59.175, + "y": 66.275, + "z": 73.525 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 146.88, + "y": 201.24, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "C6" + }, + "result": { + "position": { + "x": 59.175, + "y": 57.275, + "z": 73.525 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 146.88, + "y": 192.24, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "D6" + }, + "result": { + "position": { + "x": 59.175, + "y": 48.275, + "z": 73.525 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 155.88, + "y": 255.24, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 7.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.32 + }, + "volume": 7.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 155.88, + "y": 246.24, + "z": 64.69 + }, + "tipDiameter": 3.27, + "tipLength": 30.950000000000003, + "tipVolume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.175, + "y": 75.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.175, + "y": 75.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 23.175, + "y": 75.275, + "z": 73.025 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 23.175, + "y": 66.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 23.175, + "y": 66.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "B2" + }, + "result": { + "position": { + "x": 23.175, + "y": 66.275, + "z": 73.025 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 23.175, + "y": 57.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 23.175, + "y": 57.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "C2" + }, + "result": { + "position": { + "x": 23.175, + "y": 57.275, + "z": 73.025 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 23.175, + "y": 48.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 23.175, + "y": 48.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "D2" + }, + "result": { + "position": { + "x": 23.175, + "y": 48.275, + "z": 73.025 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 23.175, + "y": 39.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 23.175, + "y": 39.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "E2" + }, + "result": { + "position": { + "x": 23.175, + "y": 39.275, + "z": 73.025 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 23.175, + "y": 30.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 23.175, + "y": 30.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "F2" + }, + "result": { + "position": { + "x": 23.175, + "y": 30.275, + "z": 73.025 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 23.175, + "y": 21.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 23.175, + "y": 21.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "G2" + }, + "result": { + "position": { + "x": 23.175, + "y": 21.275, + "z": 73.025 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 23.175, + "y": 12.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 23.175, + "y": 12.275, + "z": 73.025 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "origin": "bottom" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 63.88, + "y": 223.785, + "z": 5.82 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0.5 + }, + "origin": "bottom" + }, + "wellName": "H2" + }, + "result": { + "position": { + "x": 23.175, + "y": 12.275, + "z": 73.025 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 347.84000000000003, + "y": 351.5, + "z": 82.0 + } + }, + "status": "succeeded" + } + ], + "config": { + "protocolType": "json", + "schemaVersion": 6 + }, + "errors": [], + "files": [ + { + "name": "OT2_P300M_P20S_HS_6_1_Smoke620release.json", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "3" + } + }, + { + "definitionUri": "opentrons/opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep/1", + "displayName": "H/S", + "loadName": "opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", + "displayName": "Single", + "loadName": "opentrons_24_aluminumblock_generic_2ml_screwcap", + "location": { + "slotName": "6" + } + }, + { + "definitionUri": "opentrons/biorad_96_wellplate_200ul_pcr/1", + "displayName": "Multi", + "loadName": "biorad_96_wellplate_200ul_pcr", + "location": { + "slotName": "9" + } + }, + { + "definitionUri": "opentrons/agilent_1_reservoir_290ml/1", + "displayName": "Mis", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "7" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "displayName": "Opentrons 96 Tip Rack 20 µL", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "8" + } + } + ], + "liquids": [ + { + "description": "", + "displayColor": "#b925ff", + "displayName": "L1" + }, + { + "description": "", + "displayColor": "#ffd600", + "displayName": "L2" + } + ], + "metadata": { + "author": "Opentrons QA", + "category": null, + "description": "", + "protocolName": "H/S normal use", + "subcategory": null, + "tags": [] + }, + "modules": [ + { + "location": { + "slotName": "1" + }, + "model": "heaterShakerModuleV1" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + { + "mount": "right", + "pipetteName": "p20_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[afe15b729c][Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[afe15b729c][Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1].json new file mode 100644 index 00000000000..1bb7131a414 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[afe15b729c][Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1].json @@ -0,0 +1,12991 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "B1" + }, + "model": "thermocyclerModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 108.96, + "lidHeight": 61.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 5.6 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.6 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 68.8, + "z": 108.96 + }, + "model": "thermocyclerModuleV2", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot3_standard": { + "B1": { + "cornerOffsetFromSlot": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ], + "labwareOffset": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "thermocyclerModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "A2" + }, + "model": "magneticBlockV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 45.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Magnetic Block GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 0.0, + "z": 38.0 + }, + "model": "magneticBlockV1", + "moduleType": "magneticBlockType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": {}, + "ot2_standard": {}, + "ot3_standard": {} + } + }, + "model": "magneticBlockV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "B3" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_well_aluminum_block", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 18.16 + }, + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + } + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons 96 Well Aluminum Block", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_well_aluminum_block", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 74.24, + "z": 3.38 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 74.24, + "z": 3.38 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 74.24, + "z": 3.38 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 74.24, + "z": 3.38 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 74.24, + "z": 3.38 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 74.24, + "z": 3.38 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 74.24, + "z": 3.38 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 74.24, + "z": 3.38 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 74.24, + "z": 3.38 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 74.24, + "z": 3.38 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 74.24, + "z": 3.38 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 74.24, + "z": 3.38 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 65.24, + "z": 3.38 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 65.24, + "z": 3.38 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 65.24, + "z": 3.38 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 65.24, + "z": 3.38 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 65.24, + "z": 3.38 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 65.24, + "z": 3.38 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 65.24, + "z": 3.38 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 65.24, + "z": 3.38 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 65.24, + "z": 3.38 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 65.24, + "z": 3.38 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 65.24, + "z": 3.38 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 65.24, + "z": 3.38 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 56.24, + "z": 3.38 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 56.24, + "z": 3.38 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 56.24, + "z": 3.38 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 56.24, + "z": 3.38 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 56.24, + "z": 3.38 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 56.24, + "z": 3.38 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 56.24, + "z": 3.38 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 56.24, + "z": 3.38 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 56.24, + "z": 3.38 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 56.24, + "z": 3.38 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 56.24, + "z": 3.38 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 56.24, + "z": 3.38 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 47.24, + "z": 3.38 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 47.24, + "z": 3.38 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 47.24, + "z": 3.38 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 47.24, + "z": 3.38 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 47.24, + "z": 3.38 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 47.24, + "z": 3.38 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 47.24, + "z": 3.38 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 47.24, + "z": 3.38 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 47.24, + "z": 3.38 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 47.24, + "z": 3.38 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 47.24, + "z": 3.38 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 47.24, + "z": 3.38 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 38.24, + "z": 3.38 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 38.24, + "z": 3.38 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 38.24, + "z": 3.38 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 38.24, + "z": 3.38 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 38.24, + "z": 3.38 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 38.24, + "z": 3.38 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 38.24, + "z": 3.38 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 38.24, + "z": 3.38 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 38.24, + "z": 3.38 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 38.24, + "z": 3.38 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 38.24, + "z": 3.38 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 38.24, + "z": 3.38 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 29.24, + "z": 3.38 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 29.24, + "z": 3.38 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 29.24, + "z": 3.38 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 29.24, + "z": 3.38 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 29.24, + "z": 3.38 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 29.24, + "z": 3.38 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 29.24, + "z": 3.38 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 29.24, + "z": 3.38 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 29.24, + "z": 3.38 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 29.24, + "z": 3.38 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 29.24, + "z": 3.38 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 29.24, + "z": 3.38 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 20.24, + "z": 3.38 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 20.24, + "z": 3.38 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 20.24, + "z": 3.38 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 20.24, + "z": 3.38 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 20.24, + "z": 3.38 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 20.24, + "z": 3.38 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 20.24, + "z": 3.38 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 20.24, + "z": 3.38 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 20.24, + "z": 3.38 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 20.24, + "z": 3.38 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 20.24, + "z": 3.38 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 20.24, + "z": 3.38 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 11.24, + "z": 3.38 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 11.24, + "z": 3.38 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 11.24, + "z": 3.38 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 11.24, + "z": 3.38 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 11.24, + "z": 3.38 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 11.24, + "z": 3.38 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 11.24, + "z": 3.38 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 11.24, + "z": 3.38 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 11.24, + "z": 3.38 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 11.24, + "z": 3.38 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 11.24, + "z": 3.38 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 11.24, + "z": 3.38 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "B2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "C3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons Flex 96 Tip Rack Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_flex_96_tiprack_adapter", + "quirks": [ + "tiprackAdapterFor96Channel" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": {} + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "D2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons Flex 96 Tip Rack Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_flex_96_tiprack_adapter", + "quirks": [ + "tiprackAdapterFor96Channel" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": {} + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": { + "addressableAreaName": "C4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": { + "addressableAreaName": "D4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p1000_96" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableArea", + "params": { + "addressableAreaName": "96ChannelWasteChute", + "forceDirect": false, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "stayAtHighestPossibleZ": false + }, + "result": { + "position": { + "x": 391.945, + "y": 10.585, + "z": 114.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashC1", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 54.25, + "y": 150.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableArea", + "params": { + "addressableAreaName": "96ChannelWasteChute", + "forceDirect": false, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "stayAtHighestPossibleZ": false + }, + "result": { + "position": { + "x": 391.945, + "y": 10.585, + "z": 114.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableAreaForDropTip", + "params": { + "addressableAreaName": "movableTrashD1", + "alternateDropLocation": true, + "forceDirect": false, + "ignoreTipConfiguration": true, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "result": { + "position": { + "x": 54.25, + "y": 43.0, + "z": 40.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableArea", + "params": { + "addressableAreaName": "96ChannelWasteChute", + "forceDirect": false, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "stayAtHighestPossibleZ": false + }, + "result": { + "position": { + "x": 391.945, + "y": 10.585, + "z": 114.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "moveToAddressableArea", + "params": { + "addressableAreaName": "96ChannelWasteChute", + "forceDirect": false, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "stayAtHighestPossibleZ": false + }, + "result": { + "position": { + "x": 391.945, + "y": 10.585, + "z": 114.5 + } + }, + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_96_well_aluminum_block/1", + "loadName": "opentrons_96_well_aluminum_block", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_adapter/1", + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "C3" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_adapter/1", + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "D2" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + } + ], + "liquids": [ + { + "description": "High Quality H₂O", + "displayColor": "#42AB2D", + "displayName": "water" + }, + { + "description": "C₃H₆O", + "displayColor": "#38588a", + "displayName": "acetone" + } + ], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Deck Configuration 1" + }, + "modules": [ + { + "location": { + "slotName": "B1" + }, + "model": "thermocyclerModuleV2" + }, + { + "location": { + "slotName": "A2" + }, + "model": "magneticBlockV1" + }, + { + "location": { + "slotName": "B3" + }, + "model": "temperatureModuleV2" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p1000_96" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[cda954ef1e][Flex_None_None_MM_2_16_AnalysisError_MagneticModuleInFlexProtocol].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[cda954ef1e][Flex_None_None_MM_2_16_AnalysisError_MagneticModuleInFlexProtocol].json new file mode 100644 index 00000000000..079ef1e5891 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[cda954ef1e][Flex_None_None_MM_2_16_AnalysisError_MagneticModuleInFlexProtocol].json @@ -0,0 +1,73 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "ValueError [line 15]: A magneticModuleType cannot be loaded into slot C1", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "ValueError: A magneticModuleType cannot be loaded into slot C1", + "errorCode": "4000", + "errorInfo": { + "args": "('A magneticModuleType cannot be loaded into slot C1',)", + "class": "ValueError", + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 69, in run_python\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_None_None_MM_2_16_AnalysisError_MagneticModuleInFlexProtocol.py\", line 15, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 818, in load_module\n module_core = self._core.load_module(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/protocol.py\", line 423, in load_module\n self._ensure_module_location(normalized_deck_slot, module_type)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/protocol.py\", line 597, in _ensure_module_location\n raise ValueError(f\"A {module_type.value} cannot be loaded into slot {slot}\")\n" + }, + "errorType": "PythonException", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "Flex_None_None_MM_2_16_AnalysisError_MagneticModuleInFlexProtocol.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [], + "liquids": [], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Analysis Error - Magnetic Module in Flex Protocol" + }, + "modules": [], + "pipettes": [], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ce0f35b3c6][Flex_None_None_TM_2_16_AnalysisError_ModuleInCol2].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ce0f35b3c6][Flex_None_None_TM_2_16_AnalysisError_ModuleInCol2].json new file mode 100644 index 00000000000..753bfe82c0a --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ce0f35b3c6][Flex_None_None_TM_2_16_AnalysisError_ModuleInCol2].json @@ -0,0 +1,73 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "ValueError [line 15]: A temperatureModuleType cannot be loaded into slot C2", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "ValueError: A temperatureModuleType cannot be loaded into slot C2", + "errorCode": "4000", + "errorInfo": { + "args": "('A temperatureModuleType cannot be loaded into slot C2',)", + "class": "ValueError", + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 69, in run_python\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_None_None_TM_2_16_AnalysisError_ModuleInCol2.py\", line 15, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 818, in load_module\n module_core = self._core.load_module(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/protocol.py\", line 423, in load_module\n self._ensure_module_location(normalized_deck_slot, module_type)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/protocol.py\", line 597, in _ensure_module_location\n raise ValueError(f\"A {module_type.value} cannot be loaded into slot {slot}\")\n" + }, + "errorType": "PythonException", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "Flex_None_None_TM_2_16_AnalysisError_ModuleInCol2.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [], + "liquids": [], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Analysis Error - Module in Column 2" + }, + "modules": [], + "pipettes": [], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d0c057a918][Flex_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d0c057a918][Flex_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch].json new file mode 100644 index 00000000000..49a64a88098 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d0c057a918][Flex_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch].json @@ -0,0 +1,13255 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "D1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": {}, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "D2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "D3" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 45.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Magnetic Block GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 0.0, + "z": 38.0 + }, + "model": "magneticBlockV1", + "moduleType": "magneticBlockType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": {}, + "ot2_standard": {}, + "ot3_standard": {} + } + }, + "model": "magneticBlockV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/hardware-modules/products/aluminum-block-set" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.45, + "zDimension": 21.2 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "quirks": [ + "gripperIncompatible" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.2, + "z": 6.42 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.2, + "z": 6.42 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.2, + "z": 6.42 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.2, + "z": 6.42 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.2, + "z": 6.42 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.2, + "z": 6.42 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.2, + "z": 6.42 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.2, + "z": 6.42 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.2, + "z": 6.42 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.2, + "z": 6.42 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.2, + "z": 6.42 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.2, + "z": 6.42 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.2, + "z": 6.42 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.2, + "z": 6.42 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.2, + "z": 6.42 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.2, + "z": 6.42 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.2, + "z": 6.42 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.2, + "z": 6.42 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.2, + "z": 6.42 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.2, + "z": 6.42 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.2, + "z": 6.42 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.2, + "z": 6.42 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.2, + "z": 6.42 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.2, + "z": 6.42 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.2, + "z": 6.42 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.2, + "z": 6.42 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.2, + "z": 6.42 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.2, + "z": 6.42 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.2, + "z": 6.42 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.2, + "z": 6.42 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.2, + "z": 6.42 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.2, + "z": 6.42 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.2, + "z": 6.42 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.2, + "z": 6.42 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.2, + "z": 6.42 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.2, + "z": 6.42 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.2, + "z": 6.42 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.2, + "z": 6.42 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.2, + "z": 6.42 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.2, + "z": 6.42 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.2, + "z": 6.42 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.2, + "z": 6.42 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.2, + "z": 6.42 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.2, + "z": 6.42 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.2, + "z": 6.42 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.2, + "z": 6.42 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.2, + "z": 6.42 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.2, + "z": 6.42 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.2, + "z": 6.42 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.2, + "z": 6.42 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.2, + "z": 6.42 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.2, + "z": 6.42 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.2, + "z": 6.42 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.2, + "z": 6.42 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.2, + "z": 6.42 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.2, + "z": 6.42 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.2, + "z": 6.42 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.2, + "z": 6.42 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.2, + "z": 6.42 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.2, + "z": 6.42 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.2, + "z": 6.42 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.2, + "z": 6.42 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.2, + "z": 6.42 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.2, + "z": 6.42 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.2, + "z": 6.42 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.2, + "z": 6.42 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.2, + "z": 6.42 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.2, + "z": 6.42 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.2, + "z": 6.42 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.2, + "z": 6.42 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.2, + "z": 6.42 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.2, + "z": 6.42 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.2, + "z": 6.42 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.2, + "z": 6.42 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.2, + "z": 6.42 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.2, + "z": 6.42 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.2, + "z": 6.42 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.2, + "z": 6.42 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.2, + "z": 6.42 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.2, + "z": 6.42 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.2, + "z": 6.42 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.2, + "z": 6.42 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.2, + "z": 6.42 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.2, + "z": 6.42 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.2, + "z": 6.42 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.2, + "z": 6.42 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.2, + "z": 6.42 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.2, + "z": 6.42 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.2, + "z": 6.42 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.2, + "z": 6.42 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.2, + "z": 6.42 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.2, + "z": 6.42 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.2, + "z": 6.42 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.2, + "z": 6.42 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.2, + "z": 6.42 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.2, + "z": 6.42 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C3" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "B3" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "503001", + "503501" + ], + "links": [ + "https://www.nest-biotech.com/deep-well-plates/59253726.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.3, + "zDimension": 41 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 21.9, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Deep Well Plate 2mL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_2ml_deep", + "magneticModuleEngageHeight": 6.8, + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_deep_well_adapter": { + "x": 0, + "y": 0, + "z": 16.3 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 2.66 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "A9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 74.15, + "yDimension": 8.2, + "z": 3 + }, + "B1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "B9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 65.15, + "yDimension": 8.2, + "z": 3 + }, + "C1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "C9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 56.15, + "yDimension": 8.2, + "z": 3 + }, + "D1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "D9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 47.15, + "yDimension": 8.2, + "z": 3 + }, + "E1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "E9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 38.15, + "yDimension": 8.2, + "z": 3 + }, + "F1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "F9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 29.15, + "yDimension": 8.2, + "z": 3 + }, + "G1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "G9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 20.15, + "yDimension": 8.2, + "z": 3 + }, + "H1": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 14.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H10": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 95.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H11": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 104.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H12": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 113.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H2": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 23.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H3": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 32.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H4": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 41.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H5": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 50.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H6": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 59.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H7": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 68.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H8": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 77.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + }, + "H9": { + "depth": 38, + "shape": "rectangular", + "totalLiquidVolume": 2000, + "x": 86.3, + "xDimension": 8.2, + "y": 11.15, + "yDimension": 8.2, + "z": 3 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "location": { + "slotName": "B1" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Thermo Scientific", + "brandId": [ + "AB2396" + ], + "links": [ + "https://www.fishersci.com/shop/products/armadillo-96-well-pcr-plate-1/AB2396" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 16.0 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.0, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Armadillo 96 Well Plate 200 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.95 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 11.91 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 3.54 + }, + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.7 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.24, + "z": 1.05 + }, + "A10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.24, + "z": 1.05 + }, + "A11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.24, + "z": 1.05 + }, + "A12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.24, + "z": 1.05 + }, + "A2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.24, + "z": 1.05 + }, + "A3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.24, + "z": 1.05 + }, + "A4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.24, + "z": 1.05 + }, + "A5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.24, + "z": 1.05 + }, + "A6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.24, + "z": 1.05 + }, + "A7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.24, + "z": 1.05 + }, + "A8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.24, + "z": 1.05 + }, + "A9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.24, + "z": 1.05 + }, + "B1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.24, + "z": 1.05 + }, + "B10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.24, + "z": 1.05 + }, + "B11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.24, + "z": 1.05 + }, + "B12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.24, + "z": 1.05 + }, + "B2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.24, + "z": 1.05 + }, + "B3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.24, + "z": 1.05 + }, + "B4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.24, + "z": 1.05 + }, + "B5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.24, + "z": 1.05 + }, + "B6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.24, + "z": 1.05 + }, + "B7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.24, + "z": 1.05 + }, + "B8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.24, + "z": 1.05 + }, + "B9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.24, + "z": 1.05 + }, + "C1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.24, + "z": 1.05 + }, + "C10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.24, + "z": 1.05 + }, + "C11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.24, + "z": 1.05 + }, + "C12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.24, + "z": 1.05 + }, + "C2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.24, + "z": 1.05 + }, + "C3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.24, + "z": 1.05 + }, + "C4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.24, + "z": 1.05 + }, + "C5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.24, + "z": 1.05 + }, + "C6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.24, + "z": 1.05 + }, + "C7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.24, + "z": 1.05 + }, + "C8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.24, + "z": 1.05 + }, + "C9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.24, + "z": 1.05 + }, + "D1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.24, + "z": 1.05 + }, + "D10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.24, + "z": 1.05 + }, + "D11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.24, + "z": 1.05 + }, + "D12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.24, + "z": 1.05 + }, + "D2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.24, + "z": 1.05 + }, + "D3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.24, + "z": 1.05 + }, + "D4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.24, + "z": 1.05 + }, + "D5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.24, + "z": 1.05 + }, + "D6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.24, + "z": 1.05 + }, + "D7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.24, + "z": 1.05 + }, + "D8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.24, + "z": 1.05 + }, + "D9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.24, + "z": 1.05 + }, + "E1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.24, + "z": 1.05 + }, + "E10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.24, + "z": 1.05 + }, + "E11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.24, + "z": 1.05 + }, + "E12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.24, + "z": 1.05 + }, + "E2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.24, + "z": 1.05 + }, + "E3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.24, + "z": 1.05 + }, + "E4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.24, + "z": 1.05 + }, + "E5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.24, + "z": 1.05 + }, + "E6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.24, + "z": 1.05 + }, + "E7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.24, + "z": 1.05 + }, + "E8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.24, + "z": 1.05 + }, + "E9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.24, + "z": 1.05 + }, + "F1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.24, + "z": 1.05 + }, + "F10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.24, + "z": 1.05 + }, + "F11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.24, + "z": 1.05 + }, + "F12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.24, + "z": 1.05 + }, + "F2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.24, + "z": 1.05 + }, + "F3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.24, + "z": 1.05 + }, + "F4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.24, + "z": 1.05 + }, + "F5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.24, + "z": 1.05 + }, + "F6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.24, + "z": 1.05 + }, + "F7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.24, + "z": 1.05 + }, + "F8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.24, + "z": 1.05 + }, + "F9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.24, + "z": 1.05 + }, + "G1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.24, + "z": 1.05 + }, + "G10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.24, + "z": 1.05 + }, + "G11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.24, + "z": 1.05 + }, + "G12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.24, + "z": 1.05 + }, + "G2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.24, + "z": 1.05 + }, + "G3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.24, + "z": 1.05 + }, + "G4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.24, + "z": 1.05 + }, + "G5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.24, + "z": 1.05 + }, + "G6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.24, + "z": 1.05 + }, + "G7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.24, + "z": 1.05 + }, + "G8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.24, + "z": 1.05 + }, + "G9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.24, + "z": 1.05 + }, + "H1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.24, + "z": 1.05 + }, + "H10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.24, + "z": 1.05 + }, + "H11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.24, + "z": 1.05 + }, + "H12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.24, + "z": 1.05 + }, + "H2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.24, + "z": 1.05 + }, + "H3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.24, + "z": 1.05 + }, + "H4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.24, + "z": 1.05 + }, + "H5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.24, + "z": 1.05 + }, + "H6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.24, + "z": 1.05 + }, + "H7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.24, + "z": 1.05 + }, + "H8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.24, + "z": 1.05 + }, + "H9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.24, + "z": 1.05 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "location": { + "slotName": "B2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Thermo Scientific", + "brandId": [ + "AB2396" + ], + "links": [ + "https://www.fishersci.com/shop/products/armadillo-96-well-pcr-plate-1/AB2396" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 16.0 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.0, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Armadillo 96 Well Plate 200 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.95 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 11.91 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 3.54 + }, + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.7 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.24, + "z": 1.05 + }, + "A10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.24, + "z": 1.05 + }, + "A11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.24, + "z": 1.05 + }, + "A12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.24, + "z": 1.05 + }, + "A2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.24, + "z": 1.05 + }, + "A3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.24, + "z": 1.05 + }, + "A4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.24, + "z": 1.05 + }, + "A5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.24, + "z": 1.05 + }, + "A6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.24, + "z": 1.05 + }, + "A7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.24, + "z": 1.05 + }, + "A8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.24, + "z": 1.05 + }, + "A9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.24, + "z": 1.05 + }, + "B1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.24, + "z": 1.05 + }, + "B10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.24, + "z": 1.05 + }, + "B11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.24, + "z": 1.05 + }, + "B12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.24, + "z": 1.05 + }, + "B2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.24, + "z": 1.05 + }, + "B3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.24, + "z": 1.05 + }, + "B4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.24, + "z": 1.05 + }, + "B5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.24, + "z": 1.05 + }, + "B6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.24, + "z": 1.05 + }, + "B7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.24, + "z": 1.05 + }, + "B8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.24, + "z": 1.05 + }, + "B9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.24, + "z": 1.05 + }, + "C1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.24, + "z": 1.05 + }, + "C10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.24, + "z": 1.05 + }, + "C11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.24, + "z": 1.05 + }, + "C12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.24, + "z": 1.05 + }, + "C2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.24, + "z": 1.05 + }, + "C3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.24, + "z": 1.05 + }, + "C4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.24, + "z": 1.05 + }, + "C5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.24, + "z": 1.05 + }, + "C6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.24, + "z": 1.05 + }, + "C7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.24, + "z": 1.05 + }, + "C8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.24, + "z": 1.05 + }, + "C9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.24, + "z": 1.05 + }, + "D1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.24, + "z": 1.05 + }, + "D10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.24, + "z": 1.05 + }, + "D11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.24, + "z": 1.05 + }, + "D12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.24, + "z": 1.05 + }, + "D2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.24, + "z": 1.05 + }, + "D3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.24, + "z": 1.05 + }, + "D4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.24, + "z": 1.05 + }, + "D5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.24, + "z": 1.05 + }, + "D6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.24, + "z": 1.05 + }, + "D7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.24, + "z": 1.05 + }, + "D8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.24, + "z": 1.05 + }, + "D9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.24, + "z": 1.05 + }, + "E1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.24, + "z": 1.05 + }, + "E10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.24, + "z": 1.05 + }, + "E11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.24, + "z": 1.05 + }, + "E12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.24, + "z": 1.05 + }, + "E2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.24, + "z": 1.05 + }, + "E3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.24, + "z": 1.05 + }, + "E4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.24, + "z": 1.05 + }, + "E5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.24, + "z": 1.05 + }, + "E6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.24, + "z": 1.05 + }, + "E7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.24, + "z": 1.05 + }, + "E8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.24, + "z": 1.05 + }, + "E9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.24, + "z": 1.05 + }, + "F1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.24, + "z": 1.05 + }, + "F10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.24, + "z": 1.05 + }, + "F11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.24, + "z": 1.05 + }, + "F12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.24, + "z": 1.05 + }, + "F2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.24, + "z": 1.05 + }, + "F3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.24, + "z": 1.05 + }, + "F4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.24, + "z": 1.05 + }, + "F5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.24, + "z": 1.05 + }, + "F6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.24, + "z": 1.05 + }, + "F7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.24, + "z": 1.05 + }, + "F8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.24, + "z": 1.05 + }, + "F9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.24, + "z": 1.05 + }, + "G1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.24, + "z": 1.05 + }, + "G10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.24, + "z": 1.05 + }, + "G11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.24, + "z": 1.05 + }, + "G12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.24, + "z": 1.05 + }, + "G2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.24, + "z": 1.05 + }, + "G3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.24, + "z": 1.05 + }, + "G4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.24, + "z": 1.05 + }, + "G5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.24, + "z": 1.05 + }, + "G6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.24, + "z": 1.05 + }, + "G7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.24, + "z": 1.05 + }, + "G8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.24, + "z": 1.05 + }, + "G9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.24, + "z": 1.05 + }, + "H1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.24, + "z": 1.05 + }, + "H10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.24, + "z": 1.05 + }, + "H11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.24, + "z": 1.05 + }, + "H12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.24, + "z": 1.05 + }, + "H2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.24, + "z": 1.05 + }, + "H3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.24, + "z": 1.05 + }, + "H4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.24, + "z": 1.05 + }, + "H5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.24, + "z": 1.05 + }, + "H6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.24, + "z": 1.05 + }, + "H7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.24, + "z": 1.05 + }, + "H8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.24, + "z": 1.05 + }, + "H9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.24, + "z": 1.05 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_ot3_96_tiprack_200ul_rss", + "location": { + "slotName": "A1" + }, + "namespace": "custom_beta", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [ + "RSS_made" + ] + }, + "cornerOffsetFromSlot": { + "x": -14.375, + "y": -3.625, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL with adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "custom_beta", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_ot3_96_tiprack_200ul_rss", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 78, + "z": 12.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 78, + "z": 12.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 78, + "z": 12.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 78, + "z": 12.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 78, + "z": 12.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 78, + "z": 12.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 78, + "z": 12.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 78, + "z": 12.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 78, + "z": 12.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 78, + "z": 12.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 78, + "z": 12.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 78, + "z": 12.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 69, + "z": 12.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 69, + "z": 12.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 69, + "z": 12.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 69, + "z": 12.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 69, + "z": 12.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 69, + "z": 12.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 69, + "z": 12.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 69, + "z": 12.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 69, + "z": 12.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 69, + "z": 12.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 69, + "z": 12.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 69, + "z": 12.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 60, + "z": 12.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 60, + "z": 12.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 60, + "z": 12.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 60, + "z": 12.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 60, + "z": 12.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 60, + "z": 12.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 60, + "z": 12.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 60, + "z": 12.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 60, + "z": 12.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 60, + "z": 12.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 60, + "z": 12.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 60, + "z": 12.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 51, + "z": 12.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 51, + "z": 12.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 51, + "z": 12.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 51, + "z": 12.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 51, + "z": 12.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 51, + "z": 12.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 51, + "z": 12.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 51, + "z": 12.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 51, + "z": 12.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 51, + "z": 12.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 51, + "z": 12.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 51, + "z": 12.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 42, + "z": 12.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 42, + "z": 12.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 42, + "z": 12.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 42, + "z": 12.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 42, + "z": 12.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 42, + "z": 12.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 42, + "z": 12.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 42, + "z": 12.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 42, + "z": 12.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 42, + "z": 12.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 42, + "z": 12.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 42, + "z": 12.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 33, + "z": 12.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 33, + "z": 12.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 33, + "z": 12.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 33, + "z": 12.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 33, + "z": 12.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 33, + "z": 12.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 33, + "z": 12.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 33, + "z": 12.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 33, + "z": 12.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 33, + "z": 12.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 33, + "z": 12.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 33, + "z": 12.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 24, + "z": 12.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 24, + "z": 12.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 24, + "z": 12.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 24, + "z": 12.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 24, + "z": 12.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 24, + "z": 12.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 24, + "z": 12.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 24, + "z": 12.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 24, + "z": 12.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 24, + "z": 12.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 24, + "z": 12.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 24, + "z": 12.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 15, + "z": 12.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 15, + "z": 12.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 15, + "z": 12.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 15, + "z": 12.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 15, + "z": 12.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 15, + "z": 12.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 15, + "z": 12.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 15, + "z": 12.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 15, + "z": 12.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 15, + "z": 12.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 15, + "z": 12.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 15, + "z": 12.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_ot3_96_tiprack_200ul_rss", + "location": { + "slotName": "A2" + }, + "namespace": "custom_beta", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [ + "RSS_made" + ] + }, + "cornerOffsetFromSlot": { + "x": -14.375, + "y": -3.625, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 200 µL with adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "custom_beta", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_ot3_96_tiprack_200ul_rss", + "quirks": [], + "tipLength": 58.35, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 78, + "z": 12.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 78, + "z": 12.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 78, + "z": 12.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 78, + "z": 12.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 78, + "z": 12.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 78, + "z": 12.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 78, + "z": 12.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 78, + "z": 12.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 78, + "z": 12.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 78, + "z": 12.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 78, + "z": 12.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 78, + "z": 12.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 69, + "z": 12.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 69, + "z": 12.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 69, + "z": 12.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 69, + "z": 12.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 69, + "z": 12.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 69, + "z": 12.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 69, + "z": 12.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 69, + "z": 12.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 69, + "z": 12.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 69, + "z": 12.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 69, + "z": 12.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 69, + "z": 12.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 60, + "z": 12.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 60, + "z": 12.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 60, + "z": 12.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 60, + "z": 12.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 60, + "z": 12.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 60, + "z": 12.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 60, + "z": 12.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 60, + "z": 12.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 60, + "z": 12.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 60, + "z": 12.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 60, + "z": 12.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 60, + "z": 12.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 51, + "z": 12.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 51, + "z": 12.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 51, + "z": 12.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 51, + "z": 12.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 51, + "z": 12.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 51, + "z": 12.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 51, + "z": 12.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 51, + "z": 12.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 51, + "z": 12.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 51, + "z": 12.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 51, + "z": 12.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 51, + "z": 12.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 42, + "z": 12.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 42, + "z": 12.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 42, + "z": 12.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 42, + "z": 12.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 42, + "z": 12.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 42, + "z": 12.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 42, + "z": 12.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 42, + "z": 12.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 42, + "z": 12.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 42, + "z": 12.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 42, + "z": 12.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 42, + "z": 12.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 33, + "z": 12.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 33, + "z": 12.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 33, + "z": 12.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 33, + "z": 12.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 33, + "z": 12.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 33, + "z": 12.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 33, + "z": 12.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 33, + "z": 12.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 33, + "z": 12.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 33, + "z": 12.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 33, + "z": 12.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 33, + "z": 12.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 24, + "z": 12.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 24, + "z": 12.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 24, + "z": 12.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 24, + "z": 12.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 24, + "z": 12.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 24, + "z": 12.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 24, + "z": 12.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 24, + "z": 12.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 24, + "z": 12.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 24, + "z": 12.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 24, + "z": 12.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 24, + "z": 12.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 28.75, + "y": 15, + "z": 12.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 109.75, + "y": 15, + "z": 12.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 118.75, + "y": 15, + "z": 12.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 127.75, + "y": 15, + "z": 12.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 37.75, + "y": 15, + "z": 12.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 46.75, + "y": 15, + "z": 12.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 55.75, + "y": 15, + "z": 12.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 64.75, + "y": 15, + "z": 12.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 73.75, + "y": 15, + "z": 12.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 82.75, + "y": 15, + "z": 12.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 91.75, + "y": 15, + "z": 12.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.59, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 100.75, + "y": 15, + "z": 12.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p1000_96" + }, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 15 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "UnsuitableTiprackForPipetteMotion [line 288]: Error 2004 MOTION_PLANNING_FAILURE (UnsuitableTiprackForPipetteMotion): Opentrons Flex 96 Tip Rack 200 µL with adapter must be on an Opentrons Flex 96 Tip Rack Adapter in order to pick up or return all 96 tips simultaneously.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "Opentrons Flex 96 Tip Rack 200 µL with adapter must be on an Opentrons Flex 96 Tip Rack Adapter in order to pick up or return all 96 tips simultaneously.", + "errorCode": "2004", + "errorInfo": {}, + "errorType": "UnsuitableTiprackForPipetteMotion", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "Flex_P1000_96_HS_TM_MM_2_15_MagMaxRNACells96Ch.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_3200ml_fixed/1", + "loadName": "opentrons_1_trash_3200ml_fixed", + "location": { + "slotName": "A3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "D2" + } + }, + { + "definitionUri": "opentrons/opentrons_96_aluminumblock_nest_wellplate_100ul/1", + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "location": {} + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C2" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "C3" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_2ml_deep/2", + "loadName": "nest_96_wellplate_2ml_deep", + "location": { + "slotName": "B3" + } + }, + { + "definitionUri": "opentrons/armadillo_96_wellplate_200ul_pcr_full_skirt/2", + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "location": { + "slotName": "B1" + } + }, + { + "definitionUri": "opentrons/armadillo_96_wellplate_200ul_pcr_full_skirt/2", + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "location": { + "slotName": "B2" + } + }, + { + "definitionUri": "custom_beta/opentrons_ot3_96_tiprack_200ul_rss/1", + "loadName": "opentrons_ot3_96_tiprack_200ul_rss", + "location": { + "slotName": "A1" + } + }, + { + "definitionUri": "custom_beta/opentrons_ot3_96_tiprack_200ul_rss/1", + "loadName": "opentrons_ot3_96_tiprack_200ul_rss", + "location": { + "slotName": "A2" + } + } + ], + "liquids": [], + "metadata": { + "author": "Opentrons Engineering ", + "description": "MagMax RNA Extraction: Cells 96 ABR TESTING", + "protocolName": "MagMax RNA Extraction: Cells 96 ABR TESTING", + "source": "Software Testing Team" + }, + "modules": [ + { + "location": { + "slotName": "D1" + }, + "model": "heaterShakerModuleV1" + }, + { + "location": { + "slotName": "D3" + }, + "model": "temperatureModuleV2" + }, + { + "location": { + "slotName": "C1" + }, + "model": "magneticBlockV1" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p1000_96" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d577930518][Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModulesNoFixtures].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d577930518][Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModulesNoFixtures].json new file mode 100644 index 00000000000..fdb32f11a8b --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d577930518][Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModulesNoFixtures].json @@ -0,0 +1,8583 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "B2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.65, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "C3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons Flex 96 Tip Rack Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_flex_96_tiprack_adapter", + "quirks": [ + "tiprackAdapterFor96Channel" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": {} + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "D2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons Flex 96 Tip Rack Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_flex_96_tiprack_adapter", + "quirks": [ + "tiprackAdapterFor96Channel" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": {} + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p1000_96" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H1": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H2": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H3": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H4": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H5": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H6": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H7": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H8": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H9": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H10": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H11": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "A12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "B12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "C12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "D12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "E12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "F12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "G12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "params": { + "volumeByWell": { + "H12": 100.0 + } + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 90.88 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 90.88 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": "offDeck", + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": "offDeck", + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": {}, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 90.88 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.1, + "tipVolume": 1000.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 288.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 160.0, + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.78 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 1.92 + }, + "volume": 10.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.38, + "z": 90.88 + } + }, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": "offDeck", + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "params": { + "newLocation": "offDeck", + "strategy": "manualMoveWithPause" + }, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "Flex_P1000_96_GRIPPER_HS_TM_TC_MB_2_16_DeckConfiguration1_NoModulesNoFixtures.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_adapter/1", + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "C3" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_adapter/1", + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "D2" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {} + } + ], + "liquids": [ + { + "description": "High Quality H₂O", + "displayColor": "#42AB2D", + "displayName": "water" + }, + { + "description": "C₃H₆O", + "displayColor": "#38588a", + "displayName": "acetone" + } + ], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Deck Configuration 1 - No Modules or Fixtures" + }, + "modules": [], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p1000_96" + } + ], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d8ec3534d4][Flex_P1000_96_TM_2_16_AnalysisError_ModuleAndWasteChuteConflict].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d8ec3534d4][Flex_P1000_96_TM_2_16_AnalysisError_ModuleAndWasteChuteConflict].json new file mode 100644 index 00000000000..0932bcf0274 --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d8ec3534d4][Flex_P1000_96_TM_2_16_AnalysisError_ModuleAndWasteChuteConflict].json @@ -0,0 +1,1293 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "A1" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons Flex 96 Tip Rack Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_flex_96_tiprack_adapter", + "quirks": [ + "tiprackAdapterFor96Channel" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": {} + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + } + }, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "IncompatibleAddressableAreaError [line 19]: Error 4000 GENERAL_ERROR (IncompatibleAddressableAreaError): Cannot use Slot D3, not compatible with one or more of the following fixtures: Waste Chute", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "Cannot use Slot D3, not compatible with one or more of the following fixtures: Waste Chute", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "IncompatibleAddressableAreaError", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "Flex_P1000_96_TM_2_16_AnalysisError_ModuleAndWasteChuteConflict.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_adapter/1", + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "A1" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": {} + } + ], + "liquids": [], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Analysis Error - Module and Waste Chute Conflict" + }, + "modules": [], + "pipettes": [], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[dc8ac87114][Flex_None_None_2_16_AnalysisError_AccessToFixedTrashProp].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[dc8ac87114][Flex_None_None_2_16_AnalysisError_AccessToFixedTrashProp].json new file mode 100644 index 00000000000..909a30763ac --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[dc8ac87114][Flex_None_None_2_16_AnalysisError_AccessToFixedTrashProp].json @@ -0,0 +1,73 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 16 + ], + "protocolType": "python" + }, + "errors": [ + { + "detail": "APIVersionError [line 15]: Fixed Trash is not supported on Flex protocols in API Version 2.16 and above.", + "errorCode": "4000", + "errorInfo": {}, + "errorType": "ExceptionInProtocolError", + "wrappedErrors": [ + { + "detail": "opentrons.protocols.api_support.util.APIVersionError: Fixed Trash is not supported on Flex protocols in API Version 2.16 and above.", + "errorCode": "4000", + "errorInfo": { + "args": "('Fixed Trash is not supported on Flex protocols in API Version 2.16 and above.',)", + "class": "APIVersionError", + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 69, in run_python\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_None_None_2_16_AnalysisError_AccessToFixedTrashProp.py\", line 15, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 1111, in fixed_trash\n raise APIVersionError(\n" + }, + "errorType": "PythonException", + "wrappedErrors": [] + } + ] + } + ], + "files": [ + { + "name": "Flex_None_None_2_16_AnalysisError_AccessToFixedTrashProp.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [], + "liquids": [], + "metadata": { + "author": "Derek Maggio ", + "protocolName": "QA Protocol - Analysis Error - Access to Fixed Trash Property" + }, + "modules": [], + "pipettes": [], + "robotType": "OT-3 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f3ec1e065e][OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f3ec1e065e][OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40].json new file mode 100644 index 00000000000..3d1a5e973ae --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f3ec1e065e][OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40].json @@ -0,0 +1,9621 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "params": { + "mount": "right", + "pipetteName": "p20_single_gen2" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "1" + }, + "model": "magneticModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 124.875, + "y": 2.75, + "z": 82.25 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 110.152, + "overLabwareHeight": 4.052 + }, + "displayName": "Magnetic Module GEN2", + "gripperOffsets": {}, + "labwareOffset": { + "x": -1.175, + "y": -0.125, + "z": 82.25 + }, + "model": "magneticModuleV2", + "moduleType": "magneticModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.3 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0.25 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "magneticModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "3" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2" + }, + "status": "succeeded" + }, + { + "commandType": "loadModule", + "params": { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [ + "thermocyclerModuleV1" + ], + "dimensions": { + "bareOverallHeight": 98.0, + "lidHeight": 37.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN1", + "gripperOffsets": {}, + "labwareOffset": { + "x": 0.0, + "y": 82.56, + "z": 97.8 + }, + "model": "thermocyclerModuleV1", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": {} + }, + "model": "thermocyclerModuleV1" + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Trash", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons" + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 172.86, + "yDimension": 165.86, + "zDimension": 82 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "trash", + "displayName": "Opentrons Fixed Trash", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trash", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_1_trash_1100ml_fixed", + "quirks": [ + "centerMultichannelOnWells", + "fixedTrash", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 0, + "shape": "rectangular", + "totalLiquidVolume": 1100000, + "x": 82.84, + "xDimension": 107.11, + "y": 80, + "yDimension": 165.67, + "z": 82 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 10 µL", + "loadName": "opentrons_96_tiprack_10ul", + "location": { + "slotName": "2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 10 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_10ul", + "tipLength": 39.2, + "tipOverlap": 3.29 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_300ul", + "tipLength": 59.3, + "tipOverlap": 7.47 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.39 + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.39 + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.39 + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.39 + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.39 + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.39 + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.39 + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.39 + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.39 + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.39 + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.39 + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.39 + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.39 + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.39 + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.39 + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.39 + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.39 + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.39 + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.39 + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.39 + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.39 + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.39 + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.39 + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.39 + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.39 + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.39 + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.39 + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.39 + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.39 + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.39 + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.39 + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.39 + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.39 + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.39 + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.39 + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.39 + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.39 + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.39 + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.39 + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.39 + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.39 + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.39 + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.39 + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.39 + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.39 + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.39 + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.39 + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.39 + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.39 + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.39 + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.39 + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.39 + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.39 + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.39 + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.39 + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.39 + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.39 + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.39 + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.39 + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.39 + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.39 + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.39 + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.39 + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.39 + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.39 + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.39 + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.39 + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.39 + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.39 + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.39 + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.39 + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.39 + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.39 + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.39 + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.39 + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.39 + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.39 + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.39 + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.39 + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.39 + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.39 + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.39 + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.39 + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.39 + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.39 + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.39 + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.39 + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.39 + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.39 + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.39 + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.39 + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.39 + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.39 + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.39 + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.39 + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.39 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "A1", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "5" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Agilent", + "brandId": [ + "201252-100" + ], + "links": [ + "https://www.agilent.com/store/en_US/Prod-201252-100/201252-100" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.57, + "zDimension": 44.04 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "Agilent 1 Well Reservoir 290 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "agilent_1_reservoir_290ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.22, + "shape": "rectangular", + "totalLiquidVolume": 290000, + "x": 63.88, + "xDimension": 108, + "y": 42.785, + "yDimension": 72, + "z": 4.82 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "A2", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "6" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360102" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 31.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ], + [ + "A10" + ], + [ + "A11" + ], + [ + "A12" + ], + [ + "A2" + ], + [ + "A3" + ], + [ + "A4" + ], + [ + "A5" + ], + [ + "A6" + ], + [ + "A7" + ], + [ + "A8" + ], + [ + "A9" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 14.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A10": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 95.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A11": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 104.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A12": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 113.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A2": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 23.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A3": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 32.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A4": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 41.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A5": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 50.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A6": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 59.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A7": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 68.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A8": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 77.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + }, + "A9": { + "depth": 26.85, + "shape": "rectangular", + "totalLiquidVolume": 15000, + "x": 86.38, + "xDimension": 8.2, + "y": 42.78, + "yDimension": 71.2, + "z": 4.55 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Mag Labware", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 15.7 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "magneticModuleEngageHeight": 20 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.24, + "z": 0.92 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.24, + "z": 0.92 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.24, + "z": 0.92 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.24, + "z": 0.92 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.24, + "z": 0.92 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.24, + "z": 0.92 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.24, + "z": 0.92 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.24, + "z": 0.92 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.24, + "z": 0.92 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.24, + "z": 0.92 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.24, + "z": 0.92 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.24, + "z": 0.92 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.24, + "z": 0.92 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.24, + "z": 0.92 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.24, + "z": 0.92 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.24, + "z": 0.92 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.24, + "z": 0.92 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.24, + "z": 0.92 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.24, + "z": 0.92 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.24, + "z": 0.92 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.24, + "z": 0.92 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.24, + "z": 0.92 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.24, + "z": 0.92 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.24, + "z": 0.92 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.24, + "z": 0.92 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.24, + "z": 0.92 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.24, + "z": 0.92 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.24, + "z": 0.92 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.24, + "z": 0.92 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.24, + "z": 0.92 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.24, + "z": 0.92 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.24, + "z": 0.92 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.24, + "z": 0.92 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.24, + "z": 0.92 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.24, + "z": 0.92 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.24, + "z": 0.92 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.24, + "z": 0.92 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.24, + "z": 0.92 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.24, + "z": 0.92 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.24, + "z": 0.92 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.24, + "z": 0.92 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.24, + "z": 0.92 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.24, + "z": 0.92 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.24, + "z": 0.92 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.24, + "z": 0.92 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.24, + "z": 0.92 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.24, + "z": 0.92 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.24, + "z": 0.92 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.24, + "z": 0.92 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.24, + "z": 0.92 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.24, + "z": 0.92 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.24, + "z": 0.92 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.24, + "z": 0.92 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.24, + "z": 0.92 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.24, + "z": 0.92 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.24, + "z": 0.92 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.24, + "z": 0.92 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.24, + "z": 0.92 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.24, + "z": 0.92 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.24, + "z": 0.92 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.24, + "z": 0.92 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.24, + "z": 0.92 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.24, + "z": 0.92 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.24, + "z": 0.92 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.24, + "z": 0.92 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.24, + "z": 0.92 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.24, + "z": 0.92 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.24, + "z": 0.92 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.24, + "z": 0.92 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.24, + "z": 0.92 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.24, + "z": 0.92 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.24, + "z": 0.92 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.24, + "z": 0.92 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.24, + "z": 0.92 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.24, + "z": 0.92 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.24, + "z": 0.92 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.24, + "z": 0.92 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.24, + "z": 0.92 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.24, + "z": 0.92 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.24, + "z": 0.92 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.24, + "z": 0.92 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.24, + "z": 0.92 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.24, + "z": 0.92 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.24, + "z": 0.92 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.24, + "z": 0.92 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.24, + "z": 0.92 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.24, + "z": 0.92 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.24, + "z": 0.92 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.24, + "z": 0.92 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.24, + "z": 0.92 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.24, + "z": 0.92 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.24, + "z": 0.92 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.24, + "z": 0.92 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.24, + "z": 0.92 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.24, + "z": 0.92 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.24, + "z": 0.92 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "TempDeck LW", + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "location": {}, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/hardware-modules/products/aluminum-block-set" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.45, + "zDimension": 21.2 + }, + "gripperOffsets": {}, + "groups": [ + { + "brand": { + "brand": "NEST", + "brandId": [ + "402501" + ], + "links": [ + "https://www.nest-biotech.com/pcr-plates/58773587.html" + ] + }, + "metadata": { + "displayCategory": "wellPlate", + "displayName": "NEST 96 Well Plate 100 µL", + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 74.2, + "z": 6.42 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 74.2, + "z": 6.42 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 74.2, + "z": 6.42 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 74.2, + "z": 6.42 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 74.2, + "z": 6.42 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 74.2, + "z": 6.42 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 74.2, + "z": 6.42 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 74.2, + "z": 6.42 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 74.2, + "z": 6.42 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 74.2, + "z": 6.42 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 74.2, + "z": 6.42 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 74.2, + "z": 6.42 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 65.2, + "z": 6.42 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 65.2, + "z": 6.42 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 65.2, + "z": 6.42 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 65.2, + "z": 6.42 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 65.2, + "z": 6.42 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 65.2, + "z": 6.42 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 65.2, + "z": 6.42 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 65.2, + "z": 6.42 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 65.2, + "z": 6.42 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 65.2, + "z": 6.42 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 65.2, + "z": 6.42 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 65.2, + "z": 6.42 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 56.2, + "z": 6.42 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 56.2, + "z": 6.42 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 56.2, + "z": 6.42 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 56.2, + "z": 6.42 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 56.2, + "z": 6.42 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 56.2, + "z": 6.42 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 56.2, + "z": 6.42 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 56.2, + "z": 6.42 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 56.2, + "z": 6.42 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 56.2, + "z": 6.42 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 56.2, + "z": 6.42 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 56.2, + "z": 6.42 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 47.2, + "z": 6.42 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 47.2, + "z": 6.42 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 47.2, + "z": 6.42 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 47.2, + "z": 6.42 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 47.2, + "z": 6.42 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 47.2, + "z": 6.42 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 47.2, + "z": 6.42 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 47.2, + "z": 6.42 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 47.2, + "z": 6.42 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 47.2, + "z": 6.42 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 47.2, + "z": 6.42 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 47.2, + "z": 6.42 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 38.2, + "z": 6.42 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 38.2, + "z": 6.42 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 38.2, + "z": 6.42 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 38.2, + "z": 6.42 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 38.2, + "z": 6.42 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 38.2, + "z": 6.42 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 38.2, + "z": 6.42 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 38.2, + "z": 6.42 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 38.2, + "z": 6.42 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 38.2, + "z": 6.42 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 38.2, + "z": 6.42 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 38.2, + "z": 6.42 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 29.2, + "z": 6.42 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 29.2, + "z": 6.42 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 29.2, + "z": 6.42 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 29.2, + "z": 6.42 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 29.2, + "z": 6.42 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 29.2, + "z": 6.42 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 29.2, + "z": 6.42 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 29.2, + "z": 6.42 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 29.2, + "z": 6.42 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 29.2, + "z": 6.42 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 29.2, + "z": 6.42 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 29.2, + "z": 6.42 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 20.2, + "z": 6.42 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 20.2, + "z": 6.42 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 20.2, + "z": 6.42 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 20.2, + "z": 6.42 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 20.2, + "z": 6.42 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 20.2, + "z": 6.42 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 20.2, + "z": 6.42 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 20.2, + "z": 6.42 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 20.2, + "z": 6.42 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 20.2, + "z": 6.42 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 20.2, + "z": 6.42 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 20.2, + "z": 6.42 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 14.38, + "y": 11.2, + "z": 6.42 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 95.38, + "y": 11.2, + "z": 6.42 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 104.38, + "y": 11.2, + "z": 6.42 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 113.38, + "y": 11.2, + "z": 6.42 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 23.38, + "y": 11.2, + "z": 6.42 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 32.38, + "y": 11.2, + "z": 6.42 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 41.38, + "y": 11.2, + "z": 6.42 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 50.38, + "y": 11.2, + "z": 6.42 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 59.38, + "y": 11.2, + "z": 6.42 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 68.38, + "y": 11.2, + "z": 6.42 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 77.38, + "y": 11.2, + "z": 6.42 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 100, + "x": 86.38, + "y": 11.2, + "z": 6.42 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "params": { + "displayName": "Opentrons 96 Tip Rack 20 µL", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "9" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [], + "links": [ + "https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.69 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons 96 Tip Rack 20 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_96_tiprack_20ul", + "tipLength": 39.2, + "tipOverlap": 8.25 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 74.24, + "z": 25.49 + }, + "A10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 74.24, + "z": 25.49 + }, + "A11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 74.24, + "z": 25.49 + }, + "A12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 74.24, + "z": 25.49 + }, + "A2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 74.24, + "z": 25.49 + }, + "A3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 74.24, + "z": 25.49 + }, + "A4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 74.24, + "z": 25.49 + }, + "A5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 74.24, + "z": 25.49 + }, + "A6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 74.24, + "z": 25.49 + }, + "A7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 74.24, + "z": 25.49 + }, + "A8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 74.24, + "z": 25.49 + }, + "A9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 74.24, + "z": 25.49 + }, + "B1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 65.24, + "z": 25.49 + }, + "B10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 65.24, + "z": 25.49 + }, + "B11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 65.24, + "z": 25.49 + }, + "B12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 65.24, + "z": 25.49 + }, + "B2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 65.24, + "z": 25.49 + }, + "B3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 65.24, + "z": 25.49 + }, + "B4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 65.24, + "z": 25.49 + }, + "B5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 65.24, + "z": 25.49 + }, + "B6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 65.24, + "z": 25.49 + }, + "B7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 65.24, + "z": 25.49 + }, + "B8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 65.24, + "z": 25.49 + }, + "B9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 65.24, + "z": 25.49 + }, + "C1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 56.24, + "z": 25.49 + }, + "C10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 56.24, + "z": 25.49 + }, + "C11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 56.24, + "z": 25.49 + }, + "C12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 56.24, + "z": 25.49 + }, + "C2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 56.24, + "z": 25.49 + }, + "C3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 56.24, + "z": 25.49 + }, + "C4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 56.24, + "z": 25.49 + }, + "C5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 56.24, + "z": 25.49 + }, + "C6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 56.24, + "z": 25.49 + }, + "C7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 56.24, + "z": 25.49 + }, + "C8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 56.24, + "z": 25.49 + }, + "C9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 56.24, + "z": 25.49 + }, + "D1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 47.24, + "z": 25.49 + }, + "D10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 47.24, + "z": 25.49 + }, + "D11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 47.24, + "z": 25.49 + }, + "D12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 47.24, + "z": 25.49 + }, + "D2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 47.24, + "z": 25.49 + }, + "D3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 47.24, + "z": 25.49 + }, + "D4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 47.24, + "z": 25.49 + }, + "D5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 47.24, + "z": 25.49 + }, + "D6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 47.24, + "z": 25.49 + }, + "D7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 47.24, + "z": 25.49 + }, + "D8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 47.24, + "z": 25.49 + }, + "D9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 47.24, + "z": 25.49 + }, + "E1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 38.24, + "z": 25.49 + }, + "E10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 38.24, + "z": 25.49 + }, + "E11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 38.24, + "z": 25.49 + }, + "E12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 38.24, + "z": 25.49 + }, + "E2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 38.24, + "z": 25.49 + }, + "E3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 38.24, + "z": 25.49 + }, + "E4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 38.24, + "z": 25.49 + }, + "E5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 38.24, + "z": 25.49 + }, + "E6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 38.24, + "z": 25.49 + }, + "E7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 38.24, + "z": 25.49 + }, + "E8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 38.24, + "z": 25.49 + }, + "E9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 38.24, + "z": 25.49 + }, + "F1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 29.24, + "z": 25.49 + }, + "F10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 29.24, + "z": 25.49 + }, + "F11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 29.24, + "z": 25.49 + }, + "F12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 29.24, + "z": 25.49 + }, + "F2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 29.24, + "z": 25.49 + }, + "F3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 29.24, + "z": 25.49 + }, + "F4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 29.24, + "z": 25.49 + }, + "F5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 29.24, + "z": 25.49 + }, + "F6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 29.24, + "z": 25.49 + }, + "F7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 29.24, + "z": 25.49 + }, + "F8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 29.24, + "z": 25.49 + }, + "F9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 29.24, + "z": 25.49 + }, + "G1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 20.24, + "z": 25.49 + }, + "G10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 20.24, + "z": 25.49 + }, + "G11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 20.24, + "z": 25.49 + }, + "G12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 20.24, + "z": 25.49 + }, + "G2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 20.24, + "z": 25.49 + }, + "G3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 20.24, + "z": 25.49 + }, + "G4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 20.24, + "z": 25.49 + }, + "G5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 20.24, + "z": 25.49 + }, + "G6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 20.24, + "z": 25.49 + }, + "G7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 20.24, + "z": 25.49 + }, + "G8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 20.24, + "z": 25.49 + }, + "G9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 20.24, + "z": 25.49 + }, + "H1": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 14.38, + "y": 11.24, + "z": 25.49 + }, + "H10": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 95.38, + "y": 11.24, + "z": 25.49 + }, + "H11": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 104.38, + "y": 11.24, + "z": 25.49 + }, + "H12": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 113.38, + "y": 11.24, + "z": 25.49 + }, + "H2": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 23.38, + "y": 11.24, + "z": 25.49 + }, + "H3": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 32.38, + "y": 11.24, + "z": 25.49 + }, + "H4": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 41.38, + "y": 11.24, + "z": 25.49 + }, + "H5": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 50.38, + "y": 11.24, + "z": 25.49 + }, + "H6": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 59.38, + "y": 11.24, + "z": 25.49 + }, + "H7": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 68.38, + "y": 11.24, + "z": 25.49 + }, + "H8": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 77.38, + "y": 11.24, + "z": 25.49 + }, + "H9": { + "depth": 39.2, + "diameter": 3.27, + "shape": "circular", + "totalLiquidVolume": 20, + "x": 86.38, + "y": 11.24, + "z": 25.49 + } + } + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Engaging Magnetic Module", + "legacyCommandType": "command.MAGDECK_ENGAGE" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Setting Temperature Module temperature to 25.0 °C (rounded off to nearest integer)", + "legacyCommandType": "command.TEMPDECK_SET_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Waiting for Temperature Module to reach temperature 25.0 °C (rounded off to nearest integer)", + "legacyCommandType": "command.TEMPDECK_AWAIT_TEMP" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "B12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "C12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "D12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "E12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "F12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "G12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 30.950000000000003, + "tipVolume": 20 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 3.78, + "volume": 20.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "H12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 20.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "params": { + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "tipDiameter": 0, + "tipLength": 51.099999999999994, + "tipVolume": 300 + }, + "status": "succeeded" + }, + { + "commandType": "aspirate", + "params": { + "flowRate": 94.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A12" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dispense", + "params": { + "flowRate": 94.0, + "volume": 100.0, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "top" + }, + "wellName": "A6" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "volume": 100.0 + }, + "status": "succeeded" + }, + { + "commandType": "dropTip", + "params": { + "alternateDropLocation": false, + "wellLocation": { + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "status": "succeeded" + } + ], + "config": { + "protocolType": "json", + "schemaVersion": 4 + }, + "errors": [], + "files": [ + { + "name": "OT2_P300M_P20S_MM_TM_TC1_5_2_6_PD40.json", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "displayName": "Trash", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_10ul/1", + "displayName": "Opentrons 96 Tip Rack 10 µL", + "loadName": "opentrons_96_tiprack_10ul", + "location": { + "slotName": "2" + } + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_300ul/1", + "displayName": "Opentrons 96 Tip Rack 300 µL", + "loadName": "opentrons_96_tiprack_300ul", + "location": { + "slotName": "4" + } + }, + { + "definitionUri": "opentrons/agilent_1_reservoir_290ml/1", + "displayName": "A1", + "loadName": "agilent_1_reservoir_290ml", + "location": { + "slotName": "5" + } + }, + { + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "displayName": "A2", + "loadName": "nest_12_reservoir_15ml", + "location": { + "slotName": "6" + } + }, + { + "definitionUri": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", + "displayName": "Mag Labware", + "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_96_aluminumblock_nest_wellplate_100ul/1", + "displayName": "TempDeck LW", + "loadName": "opentrons_96_aluminumblock_nest_wellplate_100ul", + "location": {} + }, + { + "definitionUri": "opentrons/opentrons_96_tiprack_20ul/1", + "displayName": "Opentrons 96 Tip Rack 20 µL", + "loadName": "opentrons_96_tiprack_20ul", + "location": { + "slotName": "9" + } + } + ], + "liquids": [], + "metadata": { + "author": "NN MM", + "category": null, + "description": "Protocol for e2e tests", + "protocolName": "script_pur_sample_1", + "subcategory": null, + "tags": [] + }, + "modules": [ + { + "location": { + "slotName": "1" + }, + "model": "magneticModuleV2" + }, + { + "location": { + "slotName": "3" + }, + "model": "temperatureModuleV2" + }, + { + "location": { + "slotName": "7" + }, + "model": "thermocyclerModuleV1" + } + ], + "pipettes": [ + { + "mount": "left", + "pipetteName": "p300_multi_gen2" + }, + { + "mount": "right", + "pipetteName": "p20_single_gen2" + } + ], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f60da4eefb][OT2_None_None_2_12_Python310SyntaxRobotAnalysisOnlyError].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f60da4eefb][OT2_None_None_2_12_Python310SyntaxRobotAnalysisOnlyError].json new file mode 100644 index 00000000000..dfb4ce4eeea --- /dev/null +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f60da4eefb][OT2_None_None_2_12_Python310SyntaxRobotAnalysisOnlyError].json @@ -0,0 +1,100 @@ +{ + "commands": [ + { + "commandType": "home", + "params": {}, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Where is the point? (0,0) Origin is the point's location.", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Where is the point? (0,1) Y=1 and the point is on the y-axis.", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Where is the point? (1,0) X=1 and the point is on the x-axis.", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + }, + { + "commandType": "custom", + "params": { + "legacyCommandText": "Where is the point? (1,1) The point is located somewhere else on the plane.", + "legacyCommandType": "command.COMMENT" + }, + "result": {}, + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 12 + ], + "protocolType": "python" + }, + "errors": [], + "files": [ + { + "name": "OT2_None_None_2_12_Python310SyntaxRobotAnalysisOnlyError.py", + "role": "main" + }, + { + "name": "cpx_4_tuberack_100ul.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_1000ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_200ul_rss.json", + "role": "labware" + }, + { + "name": "opentrons_ot3_96_tiprack_50ul_rss.json", + "role": "labware" + }, + { + "name": "sample_labware.json", + "role": "labware" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_1_trash_1100ml_fixed/1", + "loadName": "opentrons_1_trash_1100ml_fixed", + "location": { + "slotName": "12" + } + } + ], + "liquids": [], + "metadata": { + "apiLevel": "2.12", + "author": "Opentrons Engineering ", + "description": "Python 3.10 Only", + "protocolName": "🛠 3.10 only Python 🛠", + "source": "Software Testing Team" + }, + "modules": [], + "pipettes": [], + "robotType": "OT-2 Standard" +} diff --git a/app-testing/tests/analyses_snapshot_test.py b/app-testing/tests/analyses_snapshot_test.py new file mode 100644 index 00000000000..cc4c2498ae3 --- /dev/null +++ b/app-testing/tests/analyses_snapshot_test.py @@ -0,0 +1,116 @@ +import json +import os +from pathlib import Path +from typing import Any, List + +import pytest +from automation.data.protocol import Protocol +from automation.data.protocols import Protocols +from citools.generate_analyses import ANALYSIS_SUFFIX, generate_analyses_from_test +from syrupy.extensions.json import JSONSnapshotExtension +from syrupy.filters import props +from syrupy.types import SerializableData + +# not included in the snapshot +exclude = props( + "id", + "createdAt", + "startedAt", + "completedAt", + "lastModified", + "created", + "key", + "pipetteId", + "labwareId", + "serialNumber", + "moduleId", + "liquidId", +) + + +@pytest.fixture +def snapshot_exclude(snapshot: SerializableData) -> SerializableData: + return snapshot.with_defaults(exclude=exclude) + + +@pytest.fixture +def snapshot_json(snapshot_exclude: SerializableData) -> SerializableData: + return snapshot_exclude.with_defaults(extension_class=JSONSnapshotExtension) + + +def what_protocols() -> List[Protocol]: + protocols: Protocols = Protocols() + protocols_to_test: str = os.getenv("APP_ANALYSIS_TEST_PROTOCOLS", "upload_protocol") + tests: list[(Protocol)] = [] + for protocol_name in [x.strip() for x in protocols_to_test.split(",")]: + tests.append((getattr(protocols, protocol_name))) + return tests + + +@pytest.fixture(scope="session") +def analyze_protocols() -> None: + """Use the environment variable to select which protocols are used in the test.""" + tests = what_protocols() + # Generate target analyses + if not tests: + exit("No protocols to test.") + # !!!!! Docker Image with tag of TARGET must already be created + target = os.getenv("TARGET") + if not target: + raise AssertionError("Environment variable TARGET not set.") + else: + generate_analyses_from_test(tag=target, protocols=tests) + + +def sort_all_lists(d: Any, sort_key: str | None = None) -> Any: + """Recursively sorts lists in a nested dictionary. + + :param d: The dictionary or list to sort. + :param sort_key: The key to sort dictionaries on if they are in a list. + """ + if isinstance(d, dict): + return {k: sort_all_lists(v, sort_key) for k, v in d.items()} + elif isinstance(d, list): + # Sort each item in the list + sorted_list = [sort_all_lists(x, sort_key) for x in d] + # Try to sort the list if it contains comparable items + try: + if sort_key and all(isinstance(x, dict) and sort_key in x for x in sorted_list): + return sorted(sorted_list, key=lambda x: x[sort_key]) + else: + return sorted(sorted_list) + except TypeError: + # If items are not comparable, return the list as is + return sorted_list + else: + return d + + +# Read in what protocols to test from the environment variable +# APP_ANALYSIS_TEST_PROTOCOLS +# Generate all the analyses for the target version of the Opentrons repository +# Compare the analyses to the snapshots + + +@pytest.mark.parametrize( + "protocol", + what_protocols(), + ids=[x.short_sha for x in what_protocols()], +) +def test_analysis_snapshot(analyze_protocols: None, snapshot_json: SerializableData, protocol: Protocol) -> None: + target = os.getenv("TARGET") + if not target: + raise AssertionError("Environment variable TARGET not set.") + analysis = Path( + Path(__file__).parent.parent, + "analysis_results", + f"{protocol.file_name}_{target}_{ANALYSIS_SUFFIX}", + ) + if analysis.exists(): + with open(analysis, "r") as f: + data = json.load(f) + print(f"Test name: {protocol.file_name}") + data = sort_all_lists(data, sort_key="name") + assert snapshot_json(name=protocol.file_name) == data + else: + raise AssertionError(f"Analysis file not found: {analysis}") diff --git a/app-testing/tests/app_settings_test.py b/app-testing/tests/app_settings_test.py index 343c0ba5feb..0b0d49f4c38 100644 --- a/app-testing/tests/app_settings_test.py +++ b/app-testing/tests/app_settings_test.py @@ -56,10 +56,7 @@ def test_app_settings( == "https://support.opentrons.com/s/article/Uninstall-the-Opentrons-App" ) assert app_settings.get_link_to_previous_releases().is_displayed() - assert ( - app_settings.get_link_to_previous_releases().get_attribute("href") - == "https://github.com/Opentrons/opentrons/releases" - ) + assert app_settings.get_link_to_previous_releases().get_attribute("href") == "https://github.com/Opentrons/opentrons/releases" app_settings.click_close_previous_software_modal() assert app_settings.get_link_app_robot_sync().is_displayed() diff --git a/app-testing/tests/protocol_analyze_test.py b/app-testing/tests/protocol_analyze_test.py index f513820e07c..09e1f5b9cd0 100644 --- a/app-testing/tests/protocol_analyze_test.py +++ b/app-testing/tests/protocol_analyze_test.py @@ -10,22 +10,44 @@ from automation.pages.protocol_landing import ProtocolLanding from rich.console import Console from selenium.webdriver.chrome.webdriver import WebDriver +from selenium.webdriver.remote.webelement import WebElement -def _what_protocols() -> list[(Protocol)]: +def _what_protocols() -> list[Protocol]: """Use the environment variable to select which protocols are used in the test.""" protocols: Protocols = Protocols() protocols_to_test: str = os.getenv("APP_ANALYSIS_TEST_PROTOCOLS", "upload_protocol") - tests: list[(Protocol)] = [] - for protocol_name in [x.strip() for x in protocols_to_test.split(",")]: - tests.append((getattr(protocols, protocol_name))) + tests: list[Protocol] = [] + for protocol_name in [x.strip() for x in protocols_to_test.split(",") if len(x.strip()) > 0]: + protocol = getattr(protocols, protocol_name) + tests.append( + # https://docs.pytest.org/en/7.1.x/reference/reference.html#pytest-param + # pytest.param returns a special ParamterSet type. But when pytest runs + # the test, it will be a Protocol type. Don't feel like fighting mypy. + pytest.param( # type: ignore[arg-type] + protocol, + id=protocol.protocol_name, + # https://docs.pytest.org/en/7.1.x/reference/reference.html#pytest-mark-xfail + marks=pytest.mark.xfail( + condition=protocol.expected_test_failure, + reason=protocol.expected_test_reason, + raises=AssertionError, + run=True, + strict=True, + ), + ) + ) return tests -@pytest.mark.parametrize( - "protocol", - _what_protocols(), -) +def get_error_text(protocol_landing: ProtocolLanding, error_link: WebElement) -> str: + protocol_landing.base.click_webelement(error_link) + error_details = protocol_landing.get_popout_error().text + protocol_landing.click_popout_close() + return error_details + + +@pytest.mark.parametrize("protocol", _what_protocols()) def test_analyses( driver: WebDriver, console: Console, @@ -49,9 +71,9 @@ def test_analyses( style="white on blue", ) drag_and_drop_file(labware_landing.get_drag_drop_file_button(), labware) - if labware_landing.get_success_toast_message( + if labware_landing.get_success_toast_message(filename=labware.name) or labware_landing.get_duplicate_error_toast_message( filename=labware.name - ) or labware_landing.get_duplicate_error_toast_message(filename=labware.name): + ): console.print( f"{labware.name} uploaded to app.", style="white on blue", @@ -74,29 +96,17 @@ def test_analyses( ), f"Analysis took more than {analysis_timeout} seconds." # look for analysis error if the protocol should have one + error_link = protocol_landing.get_error_details_safe() if protocol.app_error: - error_link = protocol_landing.get_error_details_safe() - assert error_link is not None, "No analysis error but was expecting one." - protocol_landing.base.click_webelement(error_link) - error_details = protocol_landing.get_popout_error().text - assert error_details == protocol.app_analysis_error - protocol_landing.click_popout_close() - else: - error_link = protocol_landing.get_error_details_safe() - - if error_link is not None: - protocol_landing.base.click_webelement(error_link) - error_details = protocol_landing.get_popout_error().text - raise AssertionError(f"Unexpected analysis error: {error_details}") + assert get_error_text(protocol_landing, error_link) == protocol.app_analysis_error + elif error_link is not None: + raise AssertionError(f"Unexpected analysis error: {get_error_text(protocol_landing, error_link)}") # Verifying elements on Protocol Landing Page # todo fix next line needs to be safe and print name not found assert protocol_landing.get_deckMap_protocol_landing(protocol_name=protocol.protocol_name).is_displayed() - assert ( - protocol_landing.get_protocol_name_text_protocol_landing(protocol_name=protocol.protocol_name) - == protocol.protocol_name - ) + assert protocol_landing.get_protocol_name_text_protocol_landing(protocol_name=protocol.protocol_name) == protocol.protocol_name # TODO validate robot diff --git a/app-testing/tests/protocol_landing_test.py b/app-testing/tests/protocol_landing_test.py index a3d8fcfddfa..b003b3495fe 100644 --- a/app-testing/tests/protocol_landing_test.py +++ b/app-testing/tests/protocol_landing_test.py @@ -43,10 +43,7 @@ def test_protocol_landing( # Verifying elements on Protocol Landing Page assert protocol_landing.get_import_button_protocol_landing().is_displayed() assert protocol_landing.get_deckMap_protocol_landing(protocol_name="script_pur_sample_1").is_displayed() - assert ( - protocol_landing.get_protocol_name_text_protocol_landing(protocol_name="script_pur_sample_1") - == "script_pur_sample_1" - ) + assert protocol_landing.get_protocol_name_text_protocol_landing(protocol_name="script_pur_sample_1") == "script_pur_sample_1" protocol_landing.click_overflow_menu() assert protocol_landing.get_show_in_folder().is_displayed() assert protocol_landing.get_run_protocol().is_displayed() diff --git a/app/Makefile b/app/Makefile index aff21131cae..9a47b026172 100644 --- a/app/Makefile +++ b/app/Makefile @@ -9,6 +9,9 @@ PATH := $(shell cd .. && yarn bin):$(PATH) # dev server port PORT ?= 8090 +# Path of source package +SRC_PATH = app + OPENTRONS_PROJECT ?= robot-stack # dependency directories for dev @@ -16,6 +19,14 @@ shell_dir := ../app-shell shell_odd_dir := ../app-shell-odd discovery_client_dir := ../discovery-client +# These variables can be overriden when make is invoked to customize the +# behavior of jest. For instance, +# make test tests=src/pages/Labware/__tests__/hooks.test.tsx would run only the +# specified test +tests ?= +cov_opts ?= --coverage=true --ci=true --collectCoverageFrom='app/src/**/*.(js|ts|tsx)' +test_opts ?= + # standard targets ##################################################################### @@ -32,11 +43,11 @@ clean: # artifacts ##################################################################### - +# override webpack's default hashing algorithm for node 18: https://github.com/webpack/webpack/issues/14532 .PHONY: dist dist: export NODE_ENV := production dist: - webpack --profile + NODE_OPTIONS=--openssl-legacy-provider webpack --profile # development ##################################################################### @@ -60,8 +71,9 @@ dev-odd: .PHONY: dev-server dev-server: export OPENTRONS_PROJECT := $(OPENTRONS_PROJECT) +dev-server: export NODE_OPTIONS := --openssl-legacy-provider dev-server: - webpack-dev-server --hot + webpack-dev-server --hot --host=:: .PHONY: dev-shell dev-shell: @@ -71,9 +83,17 @@ dev-shell: .PHONY: dev-shell-odd dev-shell-odd: export OT_APP_IS_ON_DEVICE := 1 -dev-shell-odd: export OT_APP_ON_DEVICE_DISPLAY_SETTINGS__UNFINISHED_UNBOXING_FLOW_ROUTE := /dashboard +dev-shell-odd: export OT_APP_ON_DEVICE_DISPLAY_SETTINGS__UNFINISHED_UNBOXING_FLOW_ROUTE := 0 dev-shell-odd: export OT_APP_UI__WIDTH := 1024 dev-shell-odd: export OT_APP_UI__HEIGHT := 600 dev-shell-odd: wait-on http-get://localhost:$(PORT) $(MAKE) -C $(shell_odd_dir) dev OPENTRONS_PROJECT=$(OPENTRONS_PROJECT) + +.PHONY: test +test: + make -C .. test-js-app tests="$(tests)" test_opts="$(test_opts)" + +.PHONY: test-cov +test-cov: + make -C .. test-js-app tests=$(tests) test_opts="$(test_opts)" cov_opts="$(cov_opts)" diff --git a/app/package.json b/app/package.json index d2f8dd09ff1..cfe86d536e2 100644 --- a/app/package.json +++ b/app/package.json @@ -18,9 +18,9 @@ }, "homepage": "https://github.com/Opentrons/opentrons", "dependencies": { + "@ebay/nice-modal-react": "1.2.13", "@fontsource/dejavu-sans": "5.0.3", "@fontsource/public-sans": "5.0.3", - "@hot-loader/react-dom": "17.0.1", "@opentrons/api-client": "link:../api-client", "@opentrons/components": "link:../components", "@opentrons/react-api-client": "link:../react-api-client", @@ -28,7 +28,7 @@ "@thi.ng/paths": "1.6.5", "@types/uuid": "^3.4.7", "classnames": "2.2.5", - "connected-react-router": "6.8.0", + "connected-react-router": "6.9.3", "core-js": "3.2.1", "date-fns": "2.25.0", "events": "3.0.0", @@ -42,14 +42,13 @@ "mixpanel-browser": "2.22.1", "netmask": "2.0.2", "path-to-regexp": "3.0.0", - "react": "17.0.1", - "react-dom": "17.0.1", + "react": "18.2.0", + "react-dom": "18.2.0", "react-error-boundary": "^4.0.10", - "react-hot-loader": "4.13.0", - "react-i18next": "^11.7.3", + "react-i18next": "13.5.0", "react-intersection-observer": "^8.33.1", - "react-redux": "7.2.1", - "react-router-dom": "5.1.1", + "react-redux": "8.1.2", + "react-router-dom": "5.3.4", "react-select": "5.4.0", "react-simple-keyboard": "^3.4.187", "react-viewport-list": "6.3.0", diff --git a/app/src/App/DesktopApp.tsx b/app/src/App/DesktopApp.tsx index 5064cdf0672..f42ef7e0e80 100644 --- a/app/src/App/DesktopApp.tsx +++ b/app/src/App/DesktopApp.tsx @@ -1,5 +1,6 @@ import * as React from 'react' import { Redirect, Route, Switch, useRouteMatch } from 'react-router-dom' +import { ErrorBoundary } from 'react-error-boundary' import { Box, @@ -8,6 +9,7 @@ import { POSITION_RELATIVE, } from '@opentrons/components' import { ApiHostProvider } from '@opentrons/react-api-client' +import NiceModal from '@ebay/nice-modal-react' import { Alerts } from '../organisms/Alerts' import { Breadcrumbs } from '../organisms/Breadcrumbs' @@ -26,8 +28,9 @@ import { Navbar } from './Navbar' import { EstopTakeover, EmergencyStopContext } from '../organisms/EmergencyStop' import { OPENTRONS_USB } from '../redux/discovery' import { appShellRequestor } from '../redux/shell/remote' -import { useRobot, useIsOT3 } from '../organisms/Devices/hooks' +import { useRobot, useIsFlex } from '../organisms/Devices/hooks' import { PortalRoot as ModalPortalRoot } from './portal' +import { DesktopAppFallback } from './DesktopAppFallback' import type { RouteProps, DesktopRouteParams } from './types' @@ -97,43 +100,47 @@ export const DesktopApp = (): JSX.Element => { ] return ( - <> - - - - - - - {desktopRoutes.map(({ Component, exact, path }: RouteProps) => { - return ( - - - - - - - - ) - })} - - - - - - - - + + + + + + + + + {desktopRoutes.map( + ({ Component, exact, path }: RouteProps) => { + return ( + + + + + + + + ) + } + )} + + + + + + + + + ) } @@ -142,10 +149,10 @@ function RobotControlTakeover(): JSX.Element | null { const params = deviceRouteMatch?.params as DesktopRouteParams const robotName = params?.robotName const robot = useRobot(robotName) - const isOT3 = useIsOT3(robotName) + const isFlex = useIsFlex(robotName) // E-stop is not supported on OT2 - if (!isOT3) return null + if (!isFlex) return null if (deviceRouteMatch == null || robot == null || robotName == null) return null diff --git a/app/src/App/DesktopAppFallback.tsx b/app/src/App/DesktopAppFallback.tsx new file mode 100644 index 00000000000..f1e1ce1e990 --- /dev/null +++ b/app/src/App/DesktopAppFallback.tsx @@ -0,0 +1,64 @@ +import * as React from 'react' +import { useDispatch } from 'react-redux' +import { useHistory } from 'react-router-dom' +import { useTranslation } from 'react-i18next' + +import { useTrackEvent, ANALYTICS_DESKTOP_APP_ERROR } from '../redux/analytics' + +import type { FallbackProps } from 'react-error-boundary' + +import { + AlertPrimaryButton, + ALIGN_FLEX_END, + DIRECTION_COLUMN, + Flex, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' + +import { StyledText } from '../atoms/text' +import { LegacyModal } from '../molecules/LegacyModal' +import { reloadUi } from '../redux/shell' + +import type { Dispatch } from '../redux/types' + +export function DesktopAppFallback({ error }: FallbackProps): JSX.Element { + const { t } = useTranslation('app_settings') + const trackEvent = useTrackEvent() + const dispatch = useDispatch() + const history = useHistory() + const handleReloadClick = (): void => { + trackEvent({ + name: ANALYTICS_DESKTOP_APP_ERROR, + properties: { errorMessage: error.message }, + }) + // route to the root page and initiate an electron browser window reload via app-shell + history.push('/') + dispatch(reloadUi(error.message)) + } + + return ( + + + + + {t('error_boundary_desktop_app_description')} + + + {error.message} + + + + {t('reload_app')} + + + + ) +} diff --git a/app/src/App/Navbar.tsx b/app/src/App/Navbar.tsx index 3af5d5461cd..14ed93c1412 100644 --- a/app/src/App/Navbar.tsx +++ b/app/src/App/Navbar.tsx @@ -32,16 +32,16 @@ const SALESFORCE_HELP_LINK = 'https://support.opentrons.com/s/' const NavbarLink = styled(NavLink)` color: ${COLORS.white}; align-self: ${ALIGN_STRETCH}; - background-color: ${COLORS.darkBlackEnabled}; + background-color: ${COLORS.black90}; &:hover { - background-color: ${COLORS.darkBlackHover}; + background-color: ${COLORS.black80}; } &:focus-visible { - box-shadow: inset 0 0 0 3px ${COLORS.fundamentalsFocus}; + box-shadow: inset 0 0 0 3px ${COLORS.blue50}; outline: none; - background-color: ${COLORS.darkGreyHover}; + background-color: ${COLORS.grey60}; } &:focus-visible.active { @@ -50,26 +50,26 @@ const NavbarLink = styled(NavLink)` } &:active { - background-color: ${COLORS.darkBlackEnabled}; + background-color: ${COLORS.black90}; } &.active { - background-color: ${COLORS.darkBlackSelected}; + background-color: ${COLORS.black70}; } &.active:has(svg) { - background-color: ${COLORS.darkBlackEnabled}; + background-color: ${COLORS.black90}; } ` const NavIconLink = styled(NavLink)` &.active > svg { - color: ${COLORS.medGreyEnabled}; - background-color: ${COLORS.darkBlackSelected}; + color: ${COLORS.grey30}; + background-color: ${COLORS.black70}; } ` const IconLink = styled(Link)` &.active > svg { - color: ${COLORS.medGreyEnabled}; - background-color: ${COLORS.darkBlackSelected}; + color: ${COLORS.grey30}; + background-color: ${COLORS.black70}; } ` @@ -78,27 +78,27 @@ const NavbarIcon = styled(Icon)` height: ${SIZE_2}; padding: ${SPACING.spacing6}; border-radius: 50%; - color: ${COLORS.medGreyEnabled}; + color: ${COLORS.grey30}; background-color: ${COLORS.transparent}; &:hover { - background-color: ${COLORS.darkBlackHover}; + background-color: ${COLORS.black80}; } &:focus-visible { - box-shadow: inset 0 0 0 3px ${COLORS.fundamentalsFocus}; + box-shadow: inset 0 0 0 3px ${COLORS.blue50}; outline: none; - background-color: ${COLORS.darkGreyHover}; + background-color: ${COLORS.grey60}; } &:active { - color: ${COLORS.medGreyEnabled}; - background-color: ${COLORS.darkBlackEnabled}; + color: ${COLORS.grey30}; + background-color: ${COLORS.black90}; } &.active { - color: ${COLORS.medGreyEnabled}; - background-color: ${COLORS.darkBlackSelected}; + color: ${COLORS.grey30}; + background-color: ${COLORS.black70}; } ` @@ -113,7 +113,7 @@ export function Navbar({ routes }: { routes: RouteProps[] }): JSX.Element { ) return ( ( <> @@ -205,6 +230,7 @@ const onDeviceDisplayEvents: Array = [ const TURN_OFF_BACKLIGHT = '7' export const OnDeviceDisplayApp = (): JSX.Element => { + useSoftwareUpdatePoll() const { brightness: userSetBrightness, sleepMs } = useSelector( getOnDeviceDisplaySettings ) @@ -216,8 +242,12 @@ export const OnDeviceDisplayApp = (): JSX.Element => { } const dispatch = useDispatch() const isIdle = useIdle(sleepTime, options) - const scrollRef = React.useRef(null) - const isScrolling = useScrolling(scrollRef) + const [currentNode, setCurrentNode] = React.useState(null) + const scrollRef = React.useCallback( + (node: HTMLElement | null) => setCurrentNode(node), + [] + ) + const isScrolling = useScrolling(currentNode) const TOUCH_SCREEN_STYLE = css` position: ${POSITION_RELATIVE}; @@ -227,17 +257,12 @@ export const OnDeviceDisplayApp = (): JSX.Element => { overflow-y: ${OVERFLOW_AUTO}; &::-webkit-scrollbar { - display: ${isScrolling ? undefined : 'none'}; + display: ${isScrolling ? 'block' : 'none'}; width: 0.75rem; } - &::-webkit-scrollbar-track { - margin-top: 170px; - margin-bottom: 170px; - } - &::-webkit-scrollbar-thumb { - background: ${COLORS.darkBlack40}; + background: ${COLORS.grey50}; border-radius: 11px; } ` @@ -257,7 +282,7 @@ export const OnDeviceDisplayApp = (): JSX.Element => { // TODO (sb:6/12/23) Create a notification manager to set up preference and order of takeover modals return ( - + {isIdle ? ( @@ -267,24 +292,26 @@ export const OnDeviceDisplayApp = (): JSX.Element => { - - - - {onDeviceDisplayRoutes.map( - ({ Component, exact, path }: RouteProps) => { - return ( - - - - - - - ) - } - )} - - - + + + + + {onDeviceDisplayRoutes.map( + ({ Component, exact, path }: RouteProps) => { + return ( + + + + + + + ) + } + )} + + + + )} diff --git a/app/src/App/OnDeviceDisplayAppFallback.tsx b/app/src/App/OnDeviceDisplayAppFallback.tsx index c822b189193..9c3b082f1c3 100644 --- a/app/src/App/OnDeviceDisplayAppFallback.tsx +++ b/app/src/App/OnDeviceDisplayAppFallback.tsx @@ -39,7 +39,7 @@ export function OnDeviceDisplayAppFallback({ const modalHeader: ModalHeaderBaseProps = { title: t('error_boundary_title'), iconName: 'ot-alert', - iconColor: COLORS.red2, + iconColor: COLORS.red50, } // immediately report to robot logs that something fatal happened diff --git a/app/src/App/__mocks__/hacks.ts b/app/src/App/__mocks__/hacks.ts new file mode 100644 index 00000000000..842209dfcba --- /dev/null +++ b/app/src/App/__mocks__/hacks.ts @@ -0,0 +1 @@ +export const hackWindowNavigatorOnLine = (): void => {} diff --git a/app/src/App/__tests__/App.test.tsx b/app/src/App/__tests__/App.test.tsx index e27bac86398..4e300874b02 100644 --- a/app/src/App/__tests__/App.test.tsx +++ b/app/src/App/__tests__/App.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react' -import '@testing-library/jest-dom' import { when, resetAllWhenMocks } from 'jest-when' +import { screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' @@ -61,13 +61,13 @@ describe('App', () => { it('renders a DesktopApp component when not on device', () => { when(mockGetIsOnDevice).calledWith(MOCK_STATE).mockReturnValue(false) - const [{ getByText }] = render() - getByText('mock DesktopApp') + render() + screen.getByText('mock DesktopApp') }) it('renders an OnDeviceDisplayApp component when on device', () => { when(mockGetIsOnDevice).calledWith(MOCK_STATE).mockReturnValue(true) - const [{ getByText }] = render() - getByText('mock OnDeviceDisplayApp') + render() + screen.getByText('mock OnDeviceDisplayApp') }) }) diff --git a/app/src/App/__tests__/DesktopApp.test.tsx b/app/src/App/__tests__/DesktopApp.test.tsx index 2ce2028d695..8cae33ec06b 100644 --- a/app/src/App/__tests__/DesktopApp.test.tsx +++ b/app/src/App/__tests__/DesktopApp.test.tsx @@ -1,6 +1,5 @@ import * as React from 'react' import { MemoryRouter } from 'react-router-dom' -import '@testing-library/jest-dom' import { renderWithProviders } from '@opentrons/components' @@ -14,7 +13,7 @@ import { ProtocolRunDetails } from '../../pages/Devices/ProtocolRunDetails' import { RobotSettings } from '../../pages/Devices/RobotSettings' import { GeneralSettings } from '../../pages/AppSettings/GeneralSettings' import { AlertsModal } from '../../organisms/Alerts/AlertsModal' -import { useIsOT3 } from '../../organisms/Devices/hooks' +import { useIsFlex } from '../../organisms/Devices/hooks' import { useSoftwareUpdatePoll } from '../hooks' import { DesktopApp } from '../DesktopApp' @@ -56,7 +55,7 @@ const mockBreadcrumbs = Breadcrumbs as jest.MockedFunction const mockUseSoftwareUpdatePoll = useSoftwareUpdatePoll as jest.MockedFunction< typeof useSoftwareUpdatePoll > -const mockUseIsOT3 = useIsOT3 as jest.MockedFunction +const mockUseIsFlex = useIsFlex as jest.MockedFunction const render = (path = '/') => { return renderWithProviders( @@ -80,7 +79,7 @@ describe('DesktopApp', () => { mockAppSettings.mockReturnValue(
Mock AppSettings
) mockBreadcrumbs.mockReturnValue(
Mock Breadcrumbs
) mockAlertsModal.mockReturnValue(<>) - mockUseIsOT3.mockReturnValue(true) + mockUseIsFlex.mockReturnValue(true) }) afterEach(() => { jest.resetAllMocks() diff --git a/app/src/App/__tests__/OnDeviceDisplayApp.test.tsx b/app/src/App/__tests__/OnDeviceDisplayApp.test.tsx index 77ae23132aa..02907e346a0 100644 --- a/app/src/App/__tests__/OnDeviceDisplayApp.test.tsx +++ b/app/src/App/__tests__/OnDeviceDisplayApp.test.tsx @@ -1,55 +1,59 @@ import * as React from 'react' +import { screen } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' -import '@testing-library/jest-dom' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../i18n' -import { ConnectViaEthernet } from '../../pages/OnDeviceDisplay/ConnectViaEthernet' -import { ConnectViaUSB } from '../../pages/OnDeviceDisplay/ConnectViaUSB' -import { ConnectViaWifi } from '../../pages/OnDeviceDisplay/ConnectViaWifi' -import { NetworkSetupMenu } from '../../pages/OnDeviceDisplay/NetworkSetupMenu' -import { InstrumentsDashboard } from '../../pages/OnDeviceDisplay/InstrumentsDashboard' -import { RobotDashboard } from '../../pages/OnDeviceDisplay/RobotDashboard' -import { RobotSettingsDashboard } from '../../pages/OnDeviceDisplay/RobotSettingsDashboard' +import { ConnectViaEthernet } from '../../pages/ConnectViaEthernet' +import { ConnectViaUSB } from '../../pages/ConnectViaUSB' +import { ConnectViaWifi } from '../../pages/ConnectViaWifi' +import { NetworkSetupMenu } from '../../pages/NetworkSetupMenu' +import { InstrumentsDashboard } from '../../pages/InstrumentsDashboard' +import { RobotDashboard } from '../../pages/RobotDashboard' +import { RobotSettingsDashboard } from '../../pages/RobotSettingsDashboard' import { ProtocolDashboard } from '../../pages/ProtocolDashboard' -import { ProtocolSetup } from '../../pages/OnDeviceDisplay/ProtocolSetup' -import { ProtocolDetails } from '../../pages/OnDeviceDisplay/ProtocolDetails' +import { ProtocolSetup } from '../../pages/ProtocolSetup' +import { ProtocolDetails } from '../../pages/ProtocolDetails' import { OnDeviceDisplayApp } from '../OnDeviceDisplayApp' -import { RunningProtocol } from '../../pages/OnDeviceDisplay/RunningProtocol' -import { RunSummary } from '../../pages/OnDeviceDisplay/RunSummary' -import { Welcome } from '../../pages/OnDeviceDisplay/Welcome' -import { NameRobot } from '../../pages/OnDeviceDisplay/NameRobot' -import { InitialLoadingScreen } from '../../pages/OnDeviceDisplay/InitialLoadingScreen' +import { RunningProtocol } from '../../pages/RunningProtocol' +import { RunSummary } from '../../pages/RunSummary' +import { Welcome } from '../../pages/Welcome' +import { NameRobot } from '../../pages/NameRobot' +import { InitialLoadingScreen } from '../../pages/InitialLoadingScreen' import { EmergencyStop } from '../../pages/EmergencyStop' +import { DeckConfigurationEditor } from '../../pages/DeckConfiguration' import { getOnDeviceDisplaySettings } from '../../redux/config' import { getIsShellReady } from '../../redux/shell' import { getLocalRobot } from '../../redux/discovery' import { mockConnectedRobot } from '../../redux/discovery/__fixtures__' import { useCurrentRunRoute, useProtocolReceiptToast } from '../hooks' +import { useNotifyCurrentMaintenanceRun } from '../../resources/maintenance_runs/useNotifyCurrentMaintenanceRun' import type { OnDeviceDisplaySettings } from '../../redux/config/types' -jest.mock('../../pages/OnDeviceDisplay/Welcome') -jest.mock('../../pages/OnDeviceDisplay/NetworkSetupMenu') -jest.mock('../../pages/OnDeviceDisplay/ConnectViaEthernet') -jest.mock('../../pages/OnDeviceDisplay/ConnectViaUSB') -jest.mock('../../pages/OnDeviceDisplay/ConnectViaWifi') -jest.mock('../../pages/OnDeviceDisplay/RobotDashboard') -jest.mock('../../pages/OnDeviceDisplay/RobotSettingsDashboard') +jest.mock('../../pages/Welcome') +jest.mock('../../pages/NetworkSetupMenu') +jest.mock('../../pages/ConnectViaEthernet') +jest.mock('../../pages/ConnectViaUSB') +jest.mock('../../pages/ConnectViaWifi') +jest.mock('../../pages/RobotDashboard') +jest.mock('../../pages/RobotSettingsDashboard') jest.mock('../../pages/ProtocolDashboard') -jest.mock('../../pages/OnDeviceDisplay/ProtocolSetup') -jest.mock('../../pages/OnDeviceDisplay/ProtocolDetails') -jest.mock('../../pages/OnDeviceDisplay/InstrumentsDashboard') -jest.mock('../../pages/OnDeviceDisplay/RunningProtocol') -jest.mock('../../pages/OnDeviceDisplay/RunSummary') -jest.mock('../../pages/OnDeviceDisplay/NameRobot') -jest.mock('../../pages/OnDeviceDisplay/InitialLoadingScreen') +jest.mock('../../pages/ProtocolSetup') +jest.mock('../../pages/ProtocolDetails') +jest.mock('../../pages/InstrumentsDashboard') +jest.mock('../../pages/RunningProtocol') +jest.mock('../../pages/RunSummary') +jest.mock('../../pages/NameRobot') +jest.mock('../../pages/InitialLoadingScreen') jest.mock('../../pages/EmergencyStop') +jest.mock('../../pages/DeckConfiguration') jest.mock('../../redux/config') jest.mock('../../redux/shell') jest.mock('../../redux/discovery') jest.mock('../hooks') +jest.mock('../../resources/maintenance_runs/useNotifyCurrentMaintenanceRun') const mockSettings = { sleepMs: 60 * 1000 * 60 * 24 * 7, @@ -100,6 +104,9 @@ const mockNameRobot = NameRobot as jest.MockedFunction const mockEmergencyStop = EmergencyStop as jest.MockedFunction< typeof EmergencyStop > +const mockDeckConfigurationEditor = DeckConfigurationEditor as jest.MockedFunction< + typeof DeckConfigurationEditor +> const mockGetOnDeviceDisplaySettings = getOnDeviceDisplaySettings as jest.MockedFunction< typeof getOnDeviceDisplaySettings > @@ -115,6 +122,9 @@ const mockUseProtocolReceiptToasts = useProtocolReceiptToast as jest.MockedFunct const mockGetLocalRobot = getLocalRobot as jest.MockedFunction< typeof getLocalRobot > +const mockUseNotifyMaintenanceRun = useNotifyCurrentMaintenanceRun as jest.MockedFunction< + typeof useNotifyCurrentMaintenanceRun +> const render = (path = '/') => { return renderWithProviders( @@ -149,83 +159,98 @@ describe('OnDeviceDisplayApp', () => { mockNameRobot.mockReturnValue(
Mock NameRobot
) mockInitialLoadingScreen.mockReturnValue(
Mock Loading
) mockEmergencyStop.mockReturnValue(
Mock EmergencyStop
) + mockDeckConfigurationEditor.mockReturnValue( +
Mock DeckConfiguration
+ ) mockUseCurrentRunRoute.mockReturnValue(null) mockGetLocalRobot.mockReturnValue(mockConnectedRobot) + mockUseNotifyMaintenanceRun.mockReturnValue({ + data: { + data: { + id: 'test', + }, + }, + } as any) }) afterEach(() => { jest.resetAllMocks() }) it('renders Welcome component from /welcome', () => { - const [{ getByText }] = render('/welcome') - getByText('Mock Welcome') + render('/welcome') + screen.getByText('Mock Welcome') }) it('renders NetworkSetupMenu component from /network-setup', () => { - const [{ getByText }] = render('/network-setup') - getByText('Mock NetworkSetupMenu') + render('/network-setup') + screen.getByText('Mock NetworkSetupMenu') }) it('renders ConnectViaEthernet component from /network-setup/ethernet', () => { - const [{ getByText }] = render('/network-setup/ethernet') - getByText('Mock ConnectViaEthernet') + render('/network-setup/ethernet') + screen.getByText('Mock ConnectViaEthernet') }) it('renders ConnectViaUSB component from /network-setup/usb', () => { - const [{ getByText }] = render('/network-setup/usb') - getByText('Mock ConnectViaUSB') + render('/network-setup/usb') + screen.getByText('Mock ConnectViaUSB') }) it('renders ConnectViaWifi component from /network-setup/wifi', () => { - const [{ getByText }] = render('/network-setup/wifi') - getByText('Mock ConnectViaWifi') + render('/network-setup/wifi') + screen.getByText('Mock ConnectViaWifi') }) it('renders RobotDashboard component from /dashboard', () => { - const [{ getByText }] = render('/dashboard') - getByText('Mock RobotDashboard') + render('/dashboard') + screen.getByText('Mock RobotDashboard') }) it('renders ProtocolDashboard component from /protocols', () => { - const [{ getByText }] = render('/protocols') - getByText('Mock ProtocolDashboard') + render('/protocols') + screen.getByText('Mock ProtocolDashboard') }) it('renders ProtocolDetails component from /protocols/:protocolId/setup', () => { - const [{ getByText }] = render('/protocols/my-protocol-id') - getByText('Mock ProtocolDetails') + render('/protocols/my-protocol-id') + screen.getByText('Mock ProtocolDetails') }) it('renders RobotSettingsDashboard component from /robot-settings', () => { - const [{ getByText }] = render('/robot-settings') - getByText('Mock RobotSettingsDashboard') + render('/robot-settings') + screen.getByText('Mock RobotSettingsDashboard') }) it('renders InstrumentsDashboard component from /instruments', () => { - const [{ getByText }] = render('/instruments') - getByText('Mock InstrumentsDashboard') + render('/instruments') + screen.getByText('Mock InstrumentsDashboard') }) it('when current run route present renders ProtocolSetup component from /runs/:runId/setup', () => { mockUseCurrentRunRoute.mockReturnValue('/runs/my-run-id/setup') - const [{ getByText }] = render('/runs/my-run-id/setup') - getByText('Mock ProtocolSetup') + render('/runs/my-run-id/setup') + screen.getByText('Mock ProtocolSetup') }) it('when current run route present renders RunningProtocol component from /runs/:runId/run', () => { mockUseCurrentRunRoute.mockReturnValue('/runs/my-run-id/run') - const [{ getByText }] = render('/runs/my-run-id/run') - getByText('Mock RunningProtocol') + render('/runs/my-run-id/run') + screen.getByText('Mock RunningProtocol') }) it('when current run route present renders a RunSummary component from /runs/:runId/summary', () => { mockUseCurrentRunRoute.mockReturnValue('/runs/my-run-id/summary') - const [{ getByText }] = render('/runs/my-run-id/summary') - getByText('Mock RunSummary') + render('/runs/my-run-id/summary') + screen.getByText('Mock RunSummary') }) it('renders the loading screen on mount', () => { - const [{ getByText }] = render('/') + render('/') mockgetIsShellReady.mockReturnValue(true) - getByText('Mock Loading') + screen.getByText('Mock Loading') }) it('renders EmergencyStop component from /emergency-stop', () => { mockUseCurrentRunRoute.mockReturnValue('/emergency-stop') - const [{ getByText }] = render('/emergency-stop') - getByText('Mock EmergencyStop') + render('/emergency-stop') + screen.getByText('Mock EmergencyStop') + }) + it('renders DeckConfiguration component from /deck-configuration', () => { + mockUseCurrentRunRoute.mockReturnValue('/deck-configuration') + render('/deck-configuration') + screen.getByText('Mock DeckConfiguration') }) it('renders protocol receipt toasts', () => { render('/') diff --git a/app/src/App/__tests__/OnDeviceDisplayAppFallback.test.tsx b/app/src/App/__tests__/OnDeviceDisplayAppFallback.test.tsx index aaa8f1f1d8d..fe5a7c6c16f 100644 --- a/app/src/App/__tests__/OnDeviceDisplayAppFallback.test.tsx +++ b/app/src/App/__tests__/OnDeviceDisplayAppFallback.test.tsx @@ -1,5 +1,6 @@ import * as React from 'react' import { when } from 'jest-when' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../i18n' @@ -41,17 +42,17 @@ describe('OnDeviceDisplayAppFallback', () => { }) it('should render text and button', () => { - const [{ getByText }] = render(props) - getByText('An unknown error has occurred') - getByText( + render(props) + screen.getByText('An unknown error has occurred') + screen.getByText( 'You need to restart the touchscreen. Then download the robot logs from the Opentrons App and send them to support@opentrons.com for assistance.' ) - getByText('Restart touchscreen') + screen.getByText('Restart touchscreen') }) it('should call a mock function when tapping reload button', () => { - const [{ getByText }] = render(props) - getByText('Restart touchscreen').click() + render(props) + fireEvent.click(screen.getByText('Restart touchscreen')) expect(mockTrackEvent).toHaveBeenCalledWith({ name: ANALYTICS_ODD_APP_ERROR, properties: { errorMessage: 'mock error' }, diff --git a/app/src/App/__tests__/hooks.test.tsx b/app/src/App/__tests__/hooks.test.tsx index 52091f553d8..afe3cab6af7 100644 --- a/app/src/App/__tests__/hooks.test.tsx +++ b/app/src/App/__tests__/hooks.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { createStore } from 'redux' import { I18nextProvider } from 'react-i18next' import { Provider } from 'react-redux' @@ -12,7 +12,7 @@ import type { Store } from 'redux' import type { State } from '../../redux/types' describe('useSoftwareUpdatePoll', () => { - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> let store: Store beforeEach(() => { jest.useFakeTimers() diff --git a/app/src/App/hacks.ts b/app/src/App/hacks.ts new file mode 100644 index 00000000000..696e7baec9a --- /dev/null +++ b/app/src/App/hacks.ts @@ -0,0 +1,16 @@ +// If the system boots while no network connection is available, then some requests to localhost +// hang eternally while connecting (so no request timeouts work either) and things get +// generally weird. Overriding the browser API to pretend to always be "online" fixes this. +// It makes sense; if "onLine" is false, that means that any network call is _guaranteed_ to fail +// so middlewares probably elide them; but we really want it to be true basically always because +// most of what we do is via localhost. +// +// This function is exposed in its own module so it can be mocked in testing +// since jest really doesn't like you doing this. + +export const hackWindowNavigatorOnLine = (): void => { + Object.defineProperty(window.navigator, 'onLine', { + get: () => true, + }) + window.dispatchEvent(new Event('online')) +} diff --git a/app/src/App/hooks.ts b/app/src/App/hooks.ts index 429f5a14283..4c0faf2c7e8 100644 --- a/app/src/App/hooks.ts +++ b/app/src/App/hooks.ts @@ -5,12 +5,10 @@ import { useQueryClient } from 'react-query' import { useRouteMatch } from 'react-router-dom' import { useDispatch } from 'react-redux' -import { useInterval } from '@opentrons/components' +import { useInterval, truncateString } from '@opentrons/components' import { useAllProtocolIdsQuery, - useAllRunsQuery, useHost, - useRunQuery, useCreateLiveCommandMutation, } from '@opentrons/react-api-client' import { @@ -25,8 +23,10 @@ import { import { checkShellUpdate } from '../redux/shell' import { useToaster } from '../organisms/ToasterOven' +import { useNotifyAllRunsQuery } from '../resources/runs/useNotifyAllRunsQuery' +import { useNotifyRunQuery } from '../resources/runs/useNotifyRunQuery' -import type { SetStatusBarCreateCommand } from '@opentrons/shared-data/protocol/types/schemaV7/command/incidental' +import type { SetStatusBarCreateCommand } from '@opentrons/shared-data' import type { Dispatch } from '../redux/types' const CURRENT_RUN_POLL = 5000 @@ -91,12 +91,13 @@ export function useProtocolReceiptToast(): void { protocolNames.forEach(name => { makeToast( t('protocol_added', { - protocol_name: name, + protocol_name: truncateString(name, 30), }), 'success', { closeButton: true, disableTimeout: true, + displayType: 'odd', } ) }) @@ -126,7 +127,7 @@ export function useProtocolReceiptToast(): void { } export function useCurrentRunRoute(): string | null { - const { data: allRuns } = useAllRunsQuery( + const { data: allRuns } = useNotifyAllRunsQuery( { pageLength: 1 }, { refetchInterval: CURRENT_RUN_POLL } ) @@ -140,7 +141,7 @@ export function useCurrentRunRoute(): string | null { ) // trim link path down to only runId : null const currentRunId = currentRun?.id ?? null - const { data: runRecord } = useRunQuery(currentRunId, { + const { data: runRecord } = useNotifyRunQuery(currentRunId, { staleTime: Infinity, enabled: currentRunId != null, }) diff --git a/app/src/App/index.tsx b/app/src/App/index.tsx index 752308ca0ff..38aa5df8e98 100644 --- a/app/src/App/index.tsx +++ b/app/src/App/index.tsx @@ -1,6 +1,5 @@ import * as React from 'react' import { useSelector } from 'react-redux' -import { hot } from 'react-hot-loader/root' import { Flex, POSITION_FIXED, DIRECTION_ROW } from '@opentrons/components' @@ -12,7 +11,7 @@ import { TopPortalRoot } from './portal' const stopEvent = (event: React.MouseEvent): void => event.preventDefault() -export const AppComponent = (): JSX.Element | null => { +export const App = (): JSX.Element | null => { const hasConfigLoaded = useSelector(getConfig) != null const isOnDevice = useSelector(getIsOnDevice) @@ -34,5 +33,3 @@ export const AppComponent = (): JSX.Element | null => { ) : null } - -export const App = hot(AppComponent) diff --git a/app/src/App/types.ts b/app/src/App/types.ts index ad81d57e452..935f7d43d97 100644 --- a/app/src/App/types.ts +++ b/app/src/App/types.ts @@ -23,13 +23,8 @@ export type RobotSettingsTab = | 'networking' | 'advanced' | 'feature-flags' - | 'privacy' -export type AppSettingsTab = - | 'general' - | 'privacy' - | 'advanced' - | 'feature-flags' +export type AppSettingsTab = 'general' | 'advanced' | 'feature-flags' export type ProtocolRunDetailsTab = 'setup' | 'module-controls' | 'run-preview' diff --git a/app/src/DesignTokens/BorderRadius/BorderRadius.stories.tsx b/app/src/DesignTokens/BorderRadius/BorderRadius.stories.tsx index 7afa0d6e178..f985048cd13 100644 --- a/app/src/DesignTokens/BorderRadius/BorderRadius.stories.tsx +++ b/app/src/DesignTokens/BorderRadius/BorderRadius.stories.tsx @@ -26,7 +26,6 @@ const Template: Story = args => { const targetBorderRadiuses = args.borderRadius.filter(s => s[0].includes('borderRadiusSize') ) - console.log(targetBorderRadiuses) return ( = args => { diff --git a/app/src/DesignTokens/Colors/Colors.stories.tsx b/app/src/DesignTokens/Colors/Colors.stories.tsx index 431375bc82c..b1a1bef3c15 100644 --- a/app/src/DesignTokens/Colors/Colors.stories.tsx +++ b/app/src/DesignTokens/Colors/Colors.stories.tsx @@ -1,20 +1,20 @@ import * as React from 'react' import { - Flex, + ALIGN_CENTER, + BORDERS, COLORS, DIRECTION_COLUMN, DIRECTION_ROW, - SPACING, - ALIGN_CENTER, + Flex, JUSTIFY_CENTER, + SPACING, TYPOGRAPHY, - BORDERS, } from '@opentrons/components' -import type { Story, Meta } from '@storybook/react' - import { StyledText } from '../../atoms/text' +import type { Story, Meta } from '@storybook/react' + export default { title: 'Design Tokens/Colors', } as Meta @@ -24,9 +24,7 @@ interface ColorsStorybookProps { } const Template: Story = args => { - const targetColors = args.colors.filter( - c => (!c[0].includes('opacity') || c.length > 2) && typeof c[1] === 'string' - ) + const targetColors = args.colors const [copiedColor, setCopiedColor] = React.useState(null) @@ -79,7 +77,7 @@ const Template: Story = args => { borderRadius={BORDERS.borderRadiusSize2} onClick={() => handleClick(color[0])} style={{ cursor: 'pointer' }} - border={`2px solid ${COLORS.darkBlackEnabled}`} + border={`2px solid ${COLORS.black90}`} > = args => {
))} diff --git a/app/src/assets/images/flex_trash_bin.png b/app/src/assets/images/flex_trash_bin.png new file mode 100644 index 00000000000..ceb02263066 Binary files /dev/null and b/app/src/assets/images/flex_trash_bin.png differ diff --git a/app/src/assets/images/icon_success.png b/app/src/assets/images/icon_success.png index ba9e9a8dcd4..12281639baf 100644 Binary files a/app/src/assets/images/icon_success.png and b/app/src/assets/images/icon_success.png differ diff --git a/app/src/assets/images/lpc_level_probe_with_labware.svg b/app/src/assets/images/lpc_level_probe_with_labware.svg new file mode 100644 index 00000000000..5e75128d9fc --- /dev/null +++ b/app/src/assets/images/lpc_level_probe_with_labware.svg @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/assets/images/lpc_level_probe_with_tip.svg b/app/src/assets/images/lpc_level_probe_with_tip.svg new file mode 100644 index 00000000000..799e78dd3d1 --- /dev/null +++ b/app/src/assets/images/lpc_level_probe_with_tip.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/assets/images/on-device-display/deck_fixture_setup_qrcode.png b/app/src/assets/images/on-device-display/deck_fixture_setup_qrcode.png new file mode 100644 index 00000000000..79a1812ebed Binary files /dev/null and b/app/src/assets/images/on-device-display/deck_fixture_setup_qrcode.png differ diff --git a/app/src/assets/images/on-device-display/privacy_policy_qrcode.png b/app/src/assets/images/on-device-display/privacy_policy_qrcode.png new file mode 100644 index 00000000000..3de0cbe2158 Binary files /dev/null and b/app/src/assets/images/on-device-display/privacy_policy_qrcode.png differ diff --git a/app/src/assets/images/on-device-display/setup_instructions_qr_code.png b/app/src/assets/images/on-device-display/setup_instructions_qr_code.png index f69d70cde25..052cac4a7cf 100644 Binary files a/app/src/assets/images/on-device-display/setup_instructions_qr_code.png and b/app/src/assets/images/on-device-display/setup_instructions_qr_code.png differ diff --git a/app/src/assets/images/staging_area_slot.png b/app/src/assets/images/staging_area_slot.png new file mode 100644 index 00000000000..61f394b56a4 Binary files /dev/null and b/app/src/assets/images/staging_area_slot.png differ diff --git a/app/src/assets/images/t10_torx_screwdriver.png b/app/src/assets/images/t10_torx_screwdriver.png index 3650e421b04..5f709f8d665 100644 Binary files a/app/src/assets/images/t10_torx_screwdriver.png and b/app/src/assets/images/t10_torx_screwdriver.png differ diff --git a/app/src/assets/images/waste_chute.png b/app/src/assets/images/waste_chute.png new file mode 100644 index 00000000000..d57a50be706 Binary files /dev/null and b/app/src/assets/images/waste_chute.png differ diff --git a/app/src/assets/images/waste_chute_with_staging_area.png b/app/src/assets/images/waste_chute_with_staging_area.png new file mode 100644 index 00000000000..987cac5872a Binary files /dev/null and b/app/src/assets/images/waste_chute_with_staging_area.png differ diff --git a/app/src/assets/localization/en/app_settings.json b/app/src/assets/localization/en/app_settings.json index 4b223c7f69f..1304de23f6b 100644 --- a/app/src/assets/localization/en/app_settings.json +++ b/app/src/assets/localization/en/app_settings.json @@ -1,7 +1,5 @@ { - "__dev_internal__enableDeckConfiguration": "Enable Deck Configuration", - "__dev_internal__enableExtendedHardware": "Enable Extended Hardware", - "__dev_internal__lpcWithProbe": "Golden Tip LPC", + "__dev_internal__protocolStats": "Protocol Stats", "add_folder_button": "Add labware source folder", "add_ip_button": "Add", "add_ip_error": "Enter an IP Address or Hostname", @@ -36,6 +34,7 @@ "enable_dev_tools": "Developer Tools", "enable_dev_tools_description": "Enabling this setting opens Developer Tools on app launch, enables additional logging and gives access to feature flags.", "error_boundary_description": "You need to restart the touchscreen. Then download the robot logs from the Opentrons App and send them to support@opentrons.com for assistance.", + "error_boundary_desktop_app_description": "You need to reload the app. Contact support with the following error message:", "error_boundary_title": "An unknown error has occurred", "feature_flags": "Feature Flags", "general": "General", @@ -54,13 +53,12 @@ "no_unavail_robots_to_clear": "No unavailable robots to clear", "not_found": "Not Found", "opentrons_app_successfully_updated": "The Opentrons App was successfully updated.", - "opentrons_app_update": "Opentrons app update", + "opentrons_app_update": "Opentrons App update", "opentrons_app_update_available": "Opentrons App Update Available", "opentrons_app_update_available_variation": "An Opentrons App update is available.", "opentrons_app_will_use_interpreter": "If specified, the Opentrons App will use the Python interpreter at this path instead of the default bundled Python interpreter.", - "opentrons_cares_about_privacy": "Opentrons cares about your privacy. We anonymize all data and only use it to improve our products.", - "opt_in_description": "Automatically send us anonymous diagnostics and usage data. We only use this information to improve our products.", "opt_in": "Opt in", + "opt_in_description": "Automatically send us anonymous diagnostics and usage data. We only use this information to improve our products.", "opt_out": "Opt out", "ot2_advanced_settings": "OT-2 Advanced Settings", "override_path": "override path", @@ -68,9 +66,11 @@ "prevent_robot_caching": "Prevent Robot Caching", "prevent_robot_caching_description": "The app will immediately clear unavailable robots and will not remember unavailable robots while this is enabled. On networks with many robots, preventing caching may improve network performance at the expense of slower and less reliable robot discovery on app launch.", "previous_releases": "View previous Opentrons releases", - "privacy": "Privacy", + "problem_during_update": "This update is taking longer than usual.", "prompt": "Always show the prompt to choose calibration block or trash bin", "receive_alert": "Receive an alert when an Opentrons software update is available.", + "release_notes": "Release notes", + "reload_app": "Reload app", "remind_later": "Remind me later", "reset_to_default": "Reset to default", "restart_touchscreen": "Restart touchscreen", @@ -81,10 +81,10 @@ "setup_connection": "Set up connection", "share_app_analytics": "Share App Analytics with Opentrons", "share_app_analytics_description": "Help Opentrons improve its products and services by automatically sending anonymous diagnostics and usage data.", - "share_display_usage_description": "Data on how you interact with the touchscreen on Flex.", "share_display_usage": "Share display usage", - "share_robot_logs_description": "Data on actions the robot does, like running protocols.", + "share_display_usage_description": "Data on how you interact with the touchscreen on Flex.", "share_robot_logs": "Share robot logs", + "share_robot_logs_description": "Data on actions the robot does, like running protocols.", "show_labware_offset_snippets": "Show Labware Offset data code snippets", "show_labware_offset_snippets_description": "Only for users who need to apply Labware Offset data outside of the Opentrons App. When enabled, code snippets for Jupyter Notebook and SSH are available during protocol setup.", "software_update_available": "Software Update Available", @@ -92,6 +92,7 @@ "successfully_deleted_unavail_robots": "Successfully deleted unavailable robots", "tip_length_cal_method": "Tip Length Calibration Method", "trash_bin": "Always use trash bin to calibrate", + "try_restarting_the_update": "Try restarting the update.", "turn_off_updates": "Turn off software update notifications in App Settings.", "up_to_date": "Up to date", "update_alerts": "Software Update Alerts", @@ -109,7 +110,7 @@ "usb_to_ethernet_adapter_no_driver_version": "Unknown", "usb_to_ethernet_adapter_toast_message": "An update is available for Realtek USB-to-Ethernet adapter driver", "usb_to_ethernet_not_connected": "No USB-to-Ethernet adapter connected", - "versions_sync": "Learn more about keeping the Opentrons app and robot software in sync", + "versions_sync": "Learn more about keeping the Opentrons App and robot software in sync", "view_change_log": "View Opentrons technical change log", "view_issue_tracker": "View Opentrons issue tracker", "view_release_notes": "View full Opentrons release notes", diff --git a/app/src/assets/localization/en/device_details.json b/app/src/assets/localization/en/device_details.json index 2c3d3edcca5..8aa5a3af4f1 100644 --- a/app/src/assets/localization/en/device_details.json +++ b/app/src/assets/localization/en/device_details.json @@ -2,49 +2,68 @@ "about_flex_gripper": "About Flex Gripper", "about_gripper": "About gripper", "about_module": "About {{name}}", - "about_pipette": "About pipette", "about_pipette_name": "About {{name}} Pipette", - "an_error_occurred_while_updating": "An error occurred while updating your pipette's settings.", + "about_pipette": "About pipette", + "add_fixture_description": "Add this fixture to your deck configuration. It will be referenced during protocol analysis.", + "add_to_slot_description": "Choose a fixture below to add to your deck configuration. It will be referenced during protocol analysis.", + "add_to_slot": "Add to slot {{slotName}}", + "add": "Add", "an_error_occurred_while_updating_module": "An error occurred while updating your {{moduleName}}. Please try again.", "an_error_occurred_while_updating_please_try_again": "An error occurred while updating your pipette's settings. Please try again.", + "an_error_occurred_while_updating": "An error occurred while updating your pipette's settings.", "attach_gripper": "Attach gripper", "attach_pipette": "Attach pipette", "both_mounts": "Both Mounts", "bundle_firmware_file_not_found": "Bundled fw file not found for module of type: {{module}}", "calibrate_gripper": "Calibrate gripper", "calibrate_now": "Calibrate now", - "calibrate_pipette": "Calibrate pipette", "calibrate_pipette_offset": "Calibrate pipette offset", + "calibrate_pipette": "Calibrate pipette", + "calibration_needed_without_link": "Calibration needed.", "calibration_needed": "Calibration needed. Calibrate now", "canceled": "canceled", + "changes_will_be_lost_description": "Are you sure you want to exit without saving your deck configuration?", + "changes_will_be_lost": "Changes will be lost", "choose_protocol_to_run": "Choose protocol to Run on {{name}}", "close_lid": "Close lid", "completed": "completed", "confirm": "Confirm", + "continue_editing": "Continue editing", "controls": "Controls", "current_speed": "Current: {{speed}} rpm", "current_temp": "Current: {{temp}} °C", "current_version": "Current Version", "deck_cal_missing": "Pipette Offset calibration missing. Calibrate deck first.", + "deck_configuration_is_not_available_when_robot_is_busy": "Deck configuration is not available when the robot is busy", + "deck_configuration_is_not_available_when_run_is_in_progress": "Deck configuration is not available when run is in progress", + "deck_configuration": "deck configuration", + "deck_fixture_setup_instructions": "Deck fixture setup instructions", + "deck_fixture_setup_modal_bottom_description_desktop": "For detailed instructions for different types of fixtures, scan the QR code or go to the link below.", + "deck_fixture_setup_modal_bottom_description": "For details on installing different fixture types, scan the QR code or search for “deck configuration” on support.opentrons.com", + "deck_fixture_setup_modal_top_description": "First, unscrew and remove the deck slot where you'll install a fixture. Then put the fixture in place and attach it as needed.", "deck_slot": "deck slot {{slot}}", "delete_run": "Delete protocol run record", "detach_gripper": "Detach gripper", "detach_pipette": "Detach pipette", + "discard_changes": "Discard changes", "disengaged": "Disengaged", "download_run_log": "Download protocol run log", + "drop_tips": "drop tips", "empty": "Empty", "error_details": "error details", "estop_disconnected": "E-stop disconnected. Robot movement is halted.", "estop_disengaged": "E-stop disengaged, but robot operation still halted.", "estop_pressed": "E-stop pressed. Robot movement is halted.", "failed": "failed", - "firmware_update_available": "Firmware update available.", + "firmware_update_available_now_without_link": "Firmware update available.", "firmware_update_available_now": "Firmware update available. Update now", + "firmware_update_available": "Firmware update available.", "firmware_update_failed": "Failed to update module firmware", "firmware_update_installation_successful": "Installation successful", "firmware_update_occurring": "Firmware update in progress...", - "have_not_run": "No recent runs", + "fixture": "Fixture", "have_not_run_description": "After you run some protocols, they will appear here.", + "have_not_run": "No recent runs", "heater": "Heater", "height_ranges": "{{gen}} Height Ranges", "hot_to_the_touch": "Module is hot to the touch", @@ -53,35 +72,42 @@ "instruments_and_modules": "Instruments and Modules", "labware_bottom": "Labware Bottom", "last_run_time": "last run {{number}}", - "left": "left", "left_right": "Left+Right Mounts", + "left": "left", "lights": "Lights", "link_firmware_update": "View Firmware Update", + "location_conflicts": "Location conflicts", + "location": "Location", "magdeck_gen1_height": "Height: {{height}}", "magdeck_gen2_height": "Height: {{height}} mm", "max_engage_height": "Max Engage Height", - "missing_both": "missing hardware", - "missing_module": "missing {{num}} module", + "missing_fixture": "missing {{num}} fixture", + "missing_fixtures_plural": "missing {{count}} fixtures", + "missing_hardware": "missing hardware", + "missing_instrument": "missing {{num}} instrument", + "missing_instruments_plural": "missing {{count}} instruments", "missing_module_plural": "missing {{count}} modules", - "missing_pipette": "missing {{num}} pipette", - "missing_pipettes_plural": "missing {{count}} pipettes", + "missing_module": "missing {{num}} module", "module_actions_unavailable": "Module actions unavailable while protocol is running", - "module_calibration_required": "Module calibration required.", "module_calibration_required_no_pipette_attached": "Module calibration required. Attach a pipette before running module calibration.", + "module_calibration_required_no_pipette_calibrated": "Module calibration required. Calibrate pipette before running module calibration. ", "module_calibration_required_update_pipette_FW": "Update pipette firmware before proceeding with required module calibration.", + "module_calibration_required": "Module calibration required.", "module_controls": "Module Controls", - "module_error": "Module error", "module_error_contact_support": "Try powering the module off and on again. If the error persists, contact Opentrons Support.", + "module_error": "Module error", "module_name_error": "{{moduleName}} error", "module_status_range": "Between {{min}} - {{max}} {{unit}}", "mount": "{{side}} Mount", "na_speed": "Target: N/A", "na_temp": "Target: N/A", + "no_deck_fixtures": "No deck fixtures", "no_protocol_runs": "No protocol runs yet!", "no_protocols_found": "No protocols found", - "no_recent_runs": "No recent runs", "no_recent_runs_description": "After you run some protocols, they will appear here.", + "no_recent_runs": "No recent runs", "num_units": "{{num}} mm", + "offline_deck_configuration": "Robot must be on the network to see deck configuration", "offline_instruments_and_modules": "Robot must be on the network to see connected instruments and modules", "offline_recent_protocol_runs": "Robot must be on the network to see protocol runs", "open_lid": "Open lid", @@ -95,17 +121,22 @@ "overflow_menu_mod_temp": "Set module temperature", "overflow_menu_set_block_temp": "Set block temperature", "pipette_cal_recommended": "Pipette Offset calibration recommended.", + "pipette_calibrations_differ": "The attached pipettes have very different calibration values. When properly calibrated, the values should be similar.", "pipette_offset_calibration_needed": "Pipette Offset calibration needed.", + "pipette_recalibration_recommended": "Pipette recalibration recommended", "pipette_settings": "{{pipetteName}} Settings", "plunger_positions": "Plunger Positions", "power_force": "Power / Force", "protocol": "Protocol", - "ready": "Ready", + "protocol_analysis_failed": "Protocol failed in-app analysis. ", + "protocol_analysis_stale": "Protocol analysis out of date. ", + "protocol_details_page_reanalyze": "Go to the protocol details screen to reanalyze.", "ready_to_run": "ready to run", + "ready": "Ready", "recalibrate_gripper": "Recalibrate gripper", "recalibrate_now": "Recalibrate now", - "recalibrate_pipette": "Recalibrate pipette", "recalibrate_pipette_offset": "Recalibrate pipette offset", + "recalibrate_pipette": "Recalibrate pipette", "recent_protocol_runs": "Recent Protocol Runs", "rerun_now": "Rerun protocol now", "reset_all": "Reset all", @@ -113,17 +144,18 @@ "resume_operation": "Resume operation", "right": "right", "robot_control_not_available": "Some robot controls are not available when run is in progress", - "run": "Run", + "robot_initializing": "Initializing...", "run_a_protocol": "Run a protocol", "run_again": "Run again", "run_duration": "Run duration", + "run": "Run", + "select_options": "Select options", "serial_number": "Serial Number", - "robot_initializing": "Initializing...", "set_block_temp": "Set temperature", "set_block_temperature": "Set block temperature", - "set_engage_height": "Set Engage Height", "set_engage_height_and_enter_integer": "Set the engage height for this Magnetic Module. Enter an integer between {{lower}} and {{higher}}.", "set_engage_height_for_module": "Set Engage Height for {{name}}", + "set_engage_height": "Set Engage Height", "set_lid_temperature": "Set lid temperature", "set_shake_of_hs": "Set rpm for this module.", "set_shake_speed": "Set shake speed", @@ -131,15 +163,17 @@ "set_target_temp_of_hs": "Set target temperature. This module actively heats but cools passively to room temperature.", "set_temp_or_shake": "Set {{part}}", "set_temperature": "Set temperature", + "setup_instructions": "Setup Instructions", "shake_speed": "shake speed", "shaker": "Shaker", + "staging_area_slot": "Staging area slot", "status": "Status", "target_speed": "Target: {{speed}} rpm", "target_temp": "Target: {{temp}} °C", "tc_block": "Block", "tc_lid": "Lid", - "tc_set_temperature": "Set {{part}} Temperature for {{name}}", "tc_set_temperature_body": "Pre heat or cool your Thermocycler {{part}}. Enter a whole number between {{min}} °C and {{max}} °C.", + "tc_set_temperature": "Set {{part}} Temperature for {{name}}", "tempdeck_slideout_body": "Pre heat or cool your {{model}}. Enter a whole number between 4 °C and 96 °C.", "tempdeck_slideout_title": "Set Temperature for {{name}}", "temperature": "Temperature", @@ -147,14 +181,16 @@ "this_robot_will_restart_with_update": "This robot has to restart to update its software. Restarting will immediately stop the current run or calibration.Do you want to update now anyway?", "tip_pickup_drop": "Tip Pickup / Drop", "to_run_protocol_go_to_protocols_page": "To run a protocol on this robot, import a protocol on the Protocols page", + "trash": "Trash", "update_now": "Update now", "updating_firmware": "Updating firmware...", - "usb_port": "usb-{{port}}", "usb_port_not_connected": "usb not connected", + "usb_port": "usb-{{port}}", "version": "Version {{version}}", - "view": "View", "view_pipette_setting": "Pipette Settings", "view_run_record": "View protocol run record", + "view": "View", + "waste_chute": "Waste chute", "welcome_modal_description": "A place to run protocols, manage your instruments, and view robot status.", "welcome_to_your_dashboard": "Welcome to your dashboard!", "yes_update_now": "Yes, update now" diff --git a/app/src/assets/localization/en/device_settings.json b/app/src/assets/localization/en/device_settings.json index ce632a90c4f..7223c34972e 100644 --- a/app/src/assets/localization/en/device_settings.json +++ b/app/src/assets/localization/en/device_settings.json @@ -3,7 +3,9 @@ "about_calibration_description": "For the robot to move accurately and precisely, you need to calibrate it. Positional calibration happens in three parts: deck calibration, pipette offset calibration and tip length calibration.", "about_calibration_description_ot3": "For the robot to move accurately and precisely, you need to calibrate it. Pipette and gripper calibration is an automated process that uses a calibration probe or pin.After calibration is complete, you can save the calibration data to your computer as a JSON file.", "about_calibration_title": "About Calibration", + "acknowledge_privacy_policy": "Acknowledge Privacy Policy", "advanced": "Advanced", + "agree": "I agree", "alpha_description": "Warning: alpha releases are feature-complete but may contain significant bugs.", "alternative_security_types": "Alternative security types", "alternative_security_types_description": "The Opentrons App supports connecting Flex to various enterprise access points. Connect via USB and finish setup in the app.", @@ -12,6 +14,7 @@ "are_you_sure_you_want_to_disconnect": "Are you sure you want to disconnect from {{ssid}}?", "attach_a_pipette_before_calibrating": "Attach a pipette in order to perform calibration", "boot_scripts": "Boot scripts", + "both": "Both", "browse_file_system": "Browse file system", "bug_fixes": "Bug Fixes", "calibrate_deck": "Calibrate deck", @@ -33,10 +36,11 @@ "choose_reset_settings": "Choose reset settings", "clear_all_data": "Clear all data", "clear_all_stored_data": "Clear all stored data", - "clear_all_stored_data_description": "Resets all settings. You’ll have to redo initial setup before using the robot again.", + "clear_all_stored_data_description": "Clears calibrations, protocols, and all settings except robot name and network settings.", "clear_calibration_data": "Clear calibration data", "clear_data_and_restart_robot": "Clear data and restart robot", "clear_individual_data": "Clear individual data", + "clear_option_authorized_keys": "Clear SSH public keys", "clear_option_boot_scripts": "Clear custom boot scripts", "clear_option_boot_scripts_description": "Clears scripts that modify the robot's behavior when powered on.", "clear_option_deck_calibration": "Clear deck calibration", @@ -48,6 +52,7 @@ "clear_option_runs_history": "Clear protocol run history", "clear_option_runs_history_subtext": "Clears information about past runs of all protocols.", "clear_option_tip_length_calibrations": "Clear tip length calibrations", + "cancel_software_update": "Cancel software update", "confirm_device_reset_description": "This will permanently delete all protocol, calibration, and other data. You’ll have to redo initial setup before using the robot again.", "confirm_device_reset_heading": "Are you sure you want to reset your device?", "connect": "Connect", @@ -80,6 +85,7 @@ "device_reset_description": "Reset labware calibration, boot scripts, and/or robot calibration to factory settings.", "device_reset_slideout_description": "Select individual settings to only clear specific data types.", "device_resets_cannot_be_undone": "Resets cannot be undone", + "release_notes": "Release notes", "directly_connected_to_this_computer": "Directly connected to this computer.", "disconnect": "Disconnect", "disconnect_from_ssid": "Disconnect from {{ssid}}", @@ -93,7 +99,7 @@ "display_led_lights": "Status LEDs", "display_led_lights_description": "Control the strip of color lights on the front of the robot.", "display_sleep_settings": "Display Sleep Settings", - "do_not_turn_off": "Do not turn off the robot while updating", + "do_not_turn_off": "This could take up to 15 minutes. Don't turn off the robot.", "done": "Done", "download": "Download", "download_calibration_data": "Download calibration logs", @@ -104,6 +110,8 @@ "downloading_update": "Downloading update...", "e_stop_connected": "E-stop successfully connected", "e_stop_not_connected": "Connect the E-stop to an auxiliary port on the back of the robot.", + "enable_status_light": "Enable status light", + "enable_status_light_description": "Turn on or off the strip of color LEDs on the front of the robot.", "engaged": "Engaged", "enter_network_name": "Enter network name", "enter_password": "Enter password", @@ -161,7 +169,7 @@ "name_love_it": "{{name}}, love it!", "name_rule_description": "Enter up to 17 characters (letters and numbers only)", "name_rule_error_exist": "Oops! Name is already in use. Choose a different name.", - "name_rule_error_name_length": "Oops! Robot name must follow the character count and limitations", + "name_rule_error_name_length": "Oops! Robot name must follow the character count and limitations.", "name_rule_error_too_short": "Oops! Too short. Robot name must be at least 1 character.", "name_your_robot": "Name your robot", "name_your_robot_description": "Don’t worry, you can always change this in your settings.", @@ -200,7 +208,8 @@ "pipette_offset_calibration_recommended": "Pipette Offset calibration recommended", "pipette_offset_calibrations_history": "See all Pipette Offset Calibration history", "pipette_offset_calibrations_title": "Pipette Offset Calibrations", - "privacy": "Privacy", + "privacy_policy_description": "By proceeding you are agreeing to share robot usage data. Opentrons uses this data to improve our products and services.To read more about our data collection policies, visit our Privacy Policy.", + "problem_during_update": "This update is taking longer than usual.", "proceed_without_updating": "Proceed without update", "protocol_run_history": "Protocol run History", "recalibrate_deck": "Recalibrate deck", @@ -222,6 +231,7 @@ "resets_cannot_be_undone": "Resets cannot be undone", "restart_now": "Restart now?", "restart_robot_confirmation_description": "It will take a few minutes for {{robotName}} to restart.", + "restart_taking_too_long": "{{robotName}} is taking longer than expected to restart. Check the Advanced tab of its settings page to see whether it updated successfully. If the robot is unresponsive, restart it manually.", "restarting_robot": "Install complete, robot restarting...", "resume_robot_operations": "Resume robot operations", "returns_your_device_to_new_state": "This returns your device to a new state.", @@ -264,6 +274,7 @@ "software_is_up_to_date": "Your software is already up to date!", "software_update_error": "Software update error", "some_robot_controls_are_not_available": "Some robot controls are not available when run is in progress", + "ssh_public_keys": "SSH public keys", "subnet_mask": "Subnet Mask", "successfully_connected": "Successfully connected!", "successfully_connected_to_network": "Successfully connected to {{ssid}}!", @@ -278,6 +289,7 @@ "touchscreen_sleep": "Touchscreen Sleep", "troubleshooting": "Troubleshooting", "try_again": "Try again", + "try_restarting_the_update": "Try restarting the update.", "up_to_date": "up to date", "update_available": "Update Available", "update_channel_description": "Stable receives the latest stable releases. Beta allows you to try out new in-progress features before they launch in Stable channel, but they have not completed testing yet.", diff --git a/app/src/assets/localization/en/devices_landing.json b/app/src/assets/localization/en/devices_landing.json index 965fa2d8d37..60a25974fec 100644 --- a/app/src/assets/localization/en/devices_landing.json +++ b/app/src/assets/localization/en/devices_landing.json @@ -5,6 +5,7 @@ "connect_to_network": "Connect to network", "connection_troubleshooting_intro": "If you’re having trouble with the robot’s connection, try these troubleshooting tasks. First, double check that the robot is powered on.", "contact_support_for_connection_help": "If none of these work, contact Opentrons Support for help (via the question mark link in this app, or by emailing {{support_email}}.)", + "deck_configuration": "Deck configuration", "devices": "Devices", "disconnect_from_network": "Disconnect from network", "empty": "Empty", @@ -23,6 +24,7 @@ "lights_on": "lights on", "loading": "loading", "looking_for_robots": "Looking for robots", + "ninety_six_mount": "Left + Right Mount", "make_sure_robot_is_connected": "Make sure the robot is connected to this computer", "modules": "Modules", "no_robots_found": "No robots found", diff --git a/app/src/assets/localization/en/drop_tip_wizard.json b/app/src/assets/localization/en/drop_tip_wizard.json new file mode 100644 index 00000000000..66924d00210 --- /dev/null +++ b/app/src/assets/localization/en/drop_tip_wizard.json @@ -0,0 +1,36 @@ +{ + "before_you_begin_do_you_want_to_blowout": "Before you begin, do you need to preserve aspirated liquid?", + "begin_removal": "Begin removal", + "blowout_complete": "blowout complete", + "blowout_liquid": "Blow out liquid", + "choose_blowout_location": "choose blowout location", + "choose_drop_tip_location": "choose tip-drop location", + "confirm_blowout_location": "Is the pipette positioned where the liquids should be blown out?", + "confirm_drop_tip_location": "Is the pipette positioned where the tips should be dropped?", + "drop_tip_complete": "tip drop complete", + "drop_tip_failed": "The drop tip could not be completed. Contact customer support for assistance.", + "drop_tips": "drop tips", + "error_dropping_tips": "Error dropping tips", + "exit_screen_title": "Exit before completing drop tip?", + "getting_ready": "Getting ready…", + "go_back": "go back", + "move_to_slot": "move to slot", + "no_proceed_to_drop_tip": "No, proceed to tip removal", + "position_and_blowout": "Ensure that the pipette tip is centered above and level with where you want the liquid to be blown out. If it isn't, use the controls below or your keyboard to jog the pipette until it is properly aligned.", + "position_and_drop_tip": "Ensure that the pipette tip is centered above and level with where you want to drop the tips. If it isn't, use the controls below or your keyboard to jog the pipette until it is properly aligned.", + "position_the_pipette": "position the pipette", + "remove_the_tips": "You may want to remove the tips from the {{mount}} Pipette before using it again in a protocol.", + "remove_the_tips_from_pipette": "You may want to remove the tips from the pipette before using it again in a protocol.", + "remove_tips": "Remove tips", + "select_blowout_slot": "You can blow out liquid into a labware or dispose of it.Select the slot where you want to blow out the liquid on the deck map to the right. Once confirmed, the gantry will move to the chosen slot.", + "select_blowout_slot_odd": "You can blow out liquid into a labware or dispose of it.
After the gantry moves to the chosen slot, use the jog controls to move the pipette to the exact position for blowing out.", + "select_drop_tip_slot": "You can return tips to a tip rack or dispose of them.Select the slot where you want to drop the tips on the deck map to the right. Once confirmed, the gantry will move to the chosen slot.", + "select_drop_tip_slot_odd": "You can blow out liquid into a labware or dispose of it.
After the gantry moves to the chosen slot, use the jog controls to move the pipette to the exact position for dropping tips.", + "skip": "Skip", + "stand_back_blowing_out": "Stand back, robot is blowing out liquid", + "stand_back_dropping_tips": "Stand back, robot is dropping tips", + "stand_back_exiting": "Stand back, robot is in motion", + "tips_are_attached": "Tips are attached", + "tips_may_be_attached": "Tips may be attached.", + "yes_blow_out_liquid": "Yes, blow out liquid in labware" +} diff --git a/app/src/assets/localization/en/gripper_wizard_flows.json b/app/src/assets/localization/en/gripper_wizard_flows.json index bcb33b748a9..a868cdb474e 100644 --- a/app/src/assets/localization/en/gripper_wizard_flows.json +++ b/app/src/assets/localization/en/gripper_wizard_flows.json @@ -6,12 +6,14 @@ "begin_calibration": "Begin calibration", "calibrate_gripper": "Calibrate Gripper", "calibration_pin": "Calibration Pin", + "calibration_pin_touching": "The calibration pin will touch the calibration square in slot {{slot}} to determine its exact position.", "complete_calibration": "Complete calibration", "connect_and_screw_in_gripper": "Connect and secure Flex Gripper", "continue": "Continue", "continue_calibration": "Continue calibration", "detach_gripper": "Detach Gripper", "firmware_updating": "A firmware update is required, instrument is updating...", + "firmware_up_to_date": "Firmware is up to date.", "get_started": "Get started", "gripper_calibration": "Gripper Calibration", "gripper_recalibration": "Gripper Recalibration", @@ -20,9 +22,9 @@ "gripper_successfully_attached": "Gripper successfully attached", "gripper_successfully_calibrated": "Flex Gripper successfully calibrated", "gripper_successfully_detached": "Flex Gripper successfully detached", - "gripper": "Gripper", + "gripper": "Flex Gripper", "hex_screwdriver": "2.5 mm Hex Screwdriver", - "hold_gripper_and_loosen_screws": "Hold the gripper in place and loosen the bottom gripper screw first. After that move onto the bottom screw. (The screws are captive and will not come apart from the gripper.) Then carefully remove the gripper.", + "hold_gripper_and_loosen_screws": "Hold the gripper in place and loosen the top gripper screw first. After that move onto the bottom screw. (The screws are captive and will not come apart from the gripper.) Then carefully remove the gripper.", "insert_pin_into_front_jaw": "Insert calibration pin in front jaw", "insert_pin_into_rear_jaw": "Insert calibration pin in rear jaw", "loosen_screws_and_detach": "Loosen screws and detach Flex Gripper", diff --git a/app/src/assets/localization/en/heater_shaker.json b/app/src/assets/localization/en/heater_shaker.json index 039bf88a71c..12ac83a4123 100644 --- a/app/src/assets/localization/en/heater_shaker.json +++ b/app/src/assets/localization/en/heater_shaker.json @@ -35,6 +35,7 @@ "stop_shaking_start_run": "Stop shaking and start run", "stop_shaking": "Stop Shaking", "t10_torx_screwdriver": "{{name}} Screwdriver", + "t10_torx_screwdriver_subtitle": "Provided with the Heater-Shaker. Using another size can strip the module's screws.", "test_shake_banner_information": "If you want to add labware to the module before doing a test shake, you can use the labware latch controls to hold the latches open.", "test_shake_banner_labware_information": "If you want to add the {{labware}} to the module before doing a test shake, you can use the labware latch controls.", "test_shake_slideout_banner_info": "If you want to add labware to the module before doing a test shake, you can use the labware latch controls to hold the latches open.", diff --git a/app/src/assets/localization/en/index.ts b/app/src/assets/localization/en/index.ts index 9b7b10d79ee..c7256b1d415 100644 --- a/app/src/assets/localization/en/index.ts +++ b/app/src/assets/localization/en/index.ts @@ -5,6 +5,7 @@ import protocol_command_text from './protocol_command_text.json' import device_details from './device_details.json' import device_settings from './device_settings.json' import devices_landing from './devices_landing.json' +import drop_tip_wizard from './drop_tip_wizard.json' import firmware_update from './firmware_update.json' import gripper_wizard_flows from './gripper_wizard_flows.json' import heater_shaker from './heater_shaker.json' @@ -37,6 +38,7 @@ export const en = { device_details, device_settings, devices_landing, + drop_tip_wizard, firmware_update, gripper_wizard_flows, heater_shaker, diff --git a/app/src/assets/localization/en/instruments_dashboard.json b/app/src/assets/localization/en/instruments_dashboard.json index c0dc087f89a..6c58e39adbf 100644 --- a/app/src/assets/localization/en/instruments_dashboard.json +++ b/app/src/assets/localization/en/instruments_dashboard.json @@ -4,6 +4,7 @@ "firmware_version": "firmware version", "last_calibrated": "last calibrated", "no_cal_data": "no calibration data", + "pipette_calibrations_differ": "Pipette recalibration recommended The attached pipettes have very different calibration values. When properly calibrated, the values should be similar.", "recalibrate": "recalibrate", "serial_number": "serial number" } diff --git a/app/src/assets/localization/en/labware_position_check.json b/app/src/assets/localization/en/labware_position_check.json index e0fa1ea9fe9..f08c465f7fa 100644 --- a/app/src/assets/localization/en/labware_position_check.json +++ b/app/src/assets/localization/en/labware_position_check.json @@ -2,24 +2,31 @@ "adapter_in_mod_in_slot": "{{adapter}} in {{module}} in {{slot}}", "adapter_in_slot": "{{adapter}} in {{slot}}", "adapter_in_tc": "{{adapter}} in {{module}}", - "all_modules_and_labware_from_protocol": "All modules and labware used in the protocol", + "all_modules_and_labware_from_protocol": "All modules and labware used in the protocol {{protocol_name}}", "applied_offset_data": "Applied Labware Offset data", "apply_offset_data": "Apply labware offset data", "apply_offsets": "apply offsets", + "attach_probe": "Attach calibration probe", + "backmost": "backmost", + "calibration_probe": "calibration probe", "check_item_in_location": "Check {{item}} in {{location}}", "check_labware_in_slot_title": "Check Labware {{labware_display_name}} in slot {{slot}}", "check_remaining_labware_with_primary_pipette_section": "Check remaining labware with {{primary_mount}} Pipette and tip", + "check_tip_location": "the top of the tip in the A1 position", + "check_well_location": "well A1 on the labware", "clear_all_slots": "Clear all deck slots of labware, leaving modules in place", + "clear_all_slots_odd": "Clear all deck slots of labware", "cli_ssh": "Command Line Interface (SSH)", "close_and_apply_offset_data": "Close and apply labware offset data", + "confirm_detached": "Confirm removal", "confirm_pick_up_tip_modal_title": "Did the pipette pick up a tip successfully?", "confirm_pick_up_tip_modal_try_again_text": "No, try again", "confirm_position_and_move": "Confirm position, move to slot {{next_slot}}", "confirm_position_and_pick_up_tip": "Confirm position, pick up tip", "confirm_position_and_return_tip": "Confirm position, return tip to Slot {{next_slot}} and home", - "ensure_nozzle_is_above_tip_odd": "Ensure that the pipette nozzle furthest from you is centered above and level with the top of the tip in the A1 position. If it isn't, tap Move pipette and then jog the pipette until it is properly aligned.", - "ensure_nozzle_is_above_tip_desktop": "Ensure that the pipette nozzle furthest from you is centered above and level with the top of the tip in the A1 position. If it isn't, use the controls below or your keyboard to jog the pipette until it is properly aligned.", - "ensure_tip_is_above_well": "Ensure that the pipette tip furthest from you is centered above and level with well A1 on the labware.", + "detach_probe": "Remove calibration probe", + "ensure_nozzle_position_odd": "Ensure that the {{tip_type}} is centered above and level with {{item_location}}. If it isn't, tap Move pipette and then jog the pipette until it is properly aligned.", + "ensure_nozzle_position_desktop": "Ensure that the {{tip_type}} is centered above and level with {{item_location}}. If it isn't, use the controls below or your keyboard to jog the pipette until it is properly aligned.", "error_modal_header": "Something went wrong", "error_modal_problem_in_app": "There was an error performing Labware Position Check. Please restart the app. If the problem persists, please contact Opentrons Support", "error_modal_problem_on_robot": "There was an error processing your request on the robot", @@ -28,6 +35,7 @@ "exit_screen_subtitle": "If you exit now, all labware offsets will be discarded. This cannot be undone.", "exit_screen_title": "Exit before completing Labware Position Check?", "get_labware_offset_data": "Get Labware Offset Data", + "install_probe": "Take the calibration probe from its storage location. Ensure its collar is fully unlocked. Push the pipette ejector up and press the probe firmly onto the {{location}} pipette nozzle as far as it can go. Twist the collar to lock the probe. Test that the probe is secure by gently pulling it back and forth.", "jog_controls_adjustment": "Need to make an adjustment?", "jupyter_notebook": "Jupyter Notebook", "labware_display_location_text": "Deck Slot {{slot}}", @@ -66,6 +74,7 @@ "move_to_a1_position": "Move the pipette to line up in the A1 position", "moving_to_slot_title": "Moving to slot {{slot}}", "new_labware_offset_data": "New labware offset data", + "ninety_six_probe_location": "A1 (back left corner)", "no_labware_offsets": "No Labware Offset", "no_offset_data_available": "No labware offset data available", "no_offset_data_on_robot": "This robot has no useable labware offset data for this run.", @@ -73,6 +82,7 @@ "offsets": "offsets", "pick_up_tip_from_rack_in_location": "Pick up tip from tip rack in {{location}}", "picking_up_tip_title": "Picking up tip in slot {{slot}}", + "pipette_nozzle": "pipette nozzle furthest from you", "place_a_full_tip_rack_in_location": "Place a full {{tip_rack}} into {{location}}", "place_labware_in_adapter_in_location": "Place a {{adapter}} followed by a {{labware}} into {{location}}", "place_labware_in_location": "Place a {{labware}} into {{location}}", @@ -81,6 +91,9 @@ "position_check_description": "Labware Position Check is a guided workflow that checks every labware on the deck for an added degree of precision in your protocol.When you check a labware, the OT-2’s pipette nozzle or attached tip will stop at the center of the A1 well. If the pipette nozzle or tip is not centered, you can reveal the OT-2’s jog controls to make an adjustment. This Labware Offset will be applied to the entire labware. Offset data is measured to the nearest 1/10th mm and can be made in the X, Y and/or Z directions.", "prepare_item_in_location": "Prepare {{item}} in {{location}}", "primary_pipette_tipracks_section": "Check tip racks with {{primary_mount}} Pipette and pick up a tip", + "remove_calibration_probe": "Remove calibration probe", + "remove_probe": "Unlock the calibraiton probe, remove it from the nozzle, and return it to its storage location.", + "remove_probe_before_exit": "Remove the calibration probe before exiting", "return_tip_rack_to_location": "Return tip rack to {{location}}", "return_tip_section": "Return tip", "returning_tip_title": "Returning tip in slot {{slot}}", diff --git a/app/src/assets/localization/en/module_wizard_flows.json b/app/src/assets/localization/en/module_wizard_flows.json index 39a9ae02e7f..636bb368662 100644 --- a/app/src/assets/localization/en/module_wizard_flows.json +++ b/app/src/assets/localization/en/module_wizard_flows.json @@ -1,6 +1,6 @@ { "attach_probe": "Attach probe to pipette", - "begin_calibration": "Begin automated calibration", + "begin_calibration": "Begin calibration", "calibrate_pipette": "Calibrate pipettes before proceeding to module calibration", "calibrate": "Calibrate", "calibration_adapter_heatershaker": "Calibration Adapter", @@ -19,25 +19,29 @@ "error_during_calibration": "Error during calibration", "error_prepping_module": "Error prepping module for calibration", "exit": "Exit", + "firmware_up_to_date": "{{module}} firmware up to date.", "firmware_updated": "{{module}} firmware updated!", "get_started": "To get started, remove labware from the deck and clean up the working area to make the calibration easier. Also gather the needed equipment shown to the right.The calibration adapter came with your module. The pipette probe came with your Flex pipette.", - "install_probe_8_channel": "Take the calibration probe from its storage location. Ensure its collar is unlocked. Push the pipette ejector up and press the probe firmly onto the backmost pipette nozzle. Twist the collar to lock the probe. Test that the probe is secure by gently pulling it back and forth.", - "install_probe_96_channel": "Take the calibration probe from its storage location. Ensure its collar is unlocked. Push the pipette ejector up and press the probe firmly onto the A1 (back left corner) pipette nozzle. Twist the collar to lock the probe. Test that the probe is secure by gently pulling it back and forth.", - "install_probe": "Take the calibration probe from its storage location. Ensure its collar is unlocked. Push the pipette ejector up and press the probe firmly onto the pipette nozzle. Twist the collar to lock the probe. Test that the probe is secure by gently pulling it back and forth.", + "install_adapter": "Place calibration adapter in {{module}}", + "install_calibration_adapter": "Install calibration adapter", + "location_occupied": "A {{fixture}} is currently specified here on the deck configuration", "module_calibrating": "Stand back, {{moduleName}} is calibrating", - "module_calibration_failed": "The module calibration could not be completed. Contact customer support for assistance.", + "module_calibration_failed": "Module calibration was unsuccessful. Make sure the calibration adapter is fully seated on the module and try again. If you still have trouble, contact Opentrons Support.{{error}}", "module_calibration": "Module calibration", "module_secured": "The module must be fully secured in its caddy and secured in the deck slot.", "module_too_hot": "Module is too hot to proceed to module calibration", "move_gantry_to_front": "Move gantry to front", "next": "Next", - "pipette_probe": "Pipette Probe", - "place_adapter": "Place calibration adapter in {{module}}", + "pipette_probe": "Pipette probe", + "place_flush_heater_shaker": "Place the adapter flush on the top of the module. Secure the adapter to the module with a thermal adapter screw and T10 Torx screwdriver.", + "place_flush_thermocycler": "Ensure the Thermocycler lid is open and place the adapter flush on top of the module where the labware would normally go. ", "place_flush": "Place the adapter flush on top of the module.", "prepping_module": "Prepping {{module}} for module calibration", "recalibrate": "Recalibrate", "select_location": "Select module location", "select_the_slot": "Select the slot where you installed the {{module}} on the deck map to the right. The location must be correct for successful calibration.", + "slot_unavailable": "Slot unavailable", + "stand_back_exiting": "Stand back, robot is in motion", "stand_back": "Stand back, calibration in progress", "start_setup": "Start setup", "successfully_calibrated": "{{module}} successfully calibrated" diff --git a/app/src/assets/localization/en/pipette_wizard_flows.json b/app/src/assets/localization/en/pipette_wizard_flows.json index f7f3abae2d8..5d13142349c 100644 --- a/app/src/assets/localization/en/pipette_wizard_flows.json +++ b/app/src/assets/localization/en/pipette_wizard_flows.json @@ -10,6 +10,7 @@ "attach_pipette": "attach {{mount}} pipette", "attach_probe": "attach calibration probe", "attach": "Attaching Pipette", + "backmost": "backmost", "before_you_begin": "Before you begin", "begin_calibration": "Begin calibration", "cal_pipette": "Calibrate pipette", @@ -23,13 +24,14 @@ "connect_96_channel": "connect and attach 96-channel pipette", "connect_and_secure_pipette": "connect and secure pipette", "continue": "Continue", - "critical_unskippable_step": "this is a critical step that cannot be skipped", + "critical_unskippable_step": "this is a critical step that should not be skipped", "detach_96_attach_mount": "Detach 96-Channel Pipette and Attach {{mount}} Pipette", "detach_96_channel": "Detach 96-Channel Pipette", "detach_and_reattach": "Detach and reattach pipette", "detach_and_retry": "detach and retry", "detach_mount_attach_96": "Detach {{mount}} Pipette and Attach 96-Channel Pipette", "detach_mounting_plate_instructions": "Hold onto the plate so it does not fall. Then remove the pins on the plate from the slots on the gantry carriage.", + "detach_next_pipette": "Detach next pipette", "detach_pipette_to_attach_96": "Detach {{pipetteName}} and attach 96-Channel pipette", "detach_pipette": "detach {{mount}} pipette", "detach_pipettes_attach_96": "Detach Pipettes and Attach 96-Channel Pipette", @@ -37,24 +39,24 @@ "detach": "Detaching Pipette", "exit_cal": "Exit calibration", "firmware_updating": "A firmware update is required, instrument is updating...", + "firmware_up_to_date": "No firmware update found.", "gantry_empty_for_96_channel_success": "Now that both mounts are empty, you can begin the 96-Channel Pipette attachment process.", "get_started_detach": "To get started, remove labware from the deck and clean up the working area to make detachment easier. Also gather the needed equipment shown to the right.", "grab_screwdriver": "While continuing to hold in place, grab your 2.5mm driver and tighten screws as shown in the animation. Test the pipette attachment by giving it a wiggle before pressing continue", "hold_and_loosen": "Hold the pipette in place and loosen the pipette screws. (The screws are captive and will not come apart from the pipette.) Then carefully remove the pipette.", "hold_pipette_carefully": "Hold onto the pipette so it does not fall. Connect the pipette by aligning the two protruding rods on the mounting plate. Ensure a secure attachment by screwing in the four front screws with the provided screwdriver.", "how_to_reattach": "Push the right pipette mount up to the top of the z-axis. Then tighten the captive screw at the top right of the gantry carriage.When reattached, the right mount should no longer freely move up and down.", - "install_probe_8_channel": "Take the calibration probe from its storage location. Ensure its collar is unlocked. Push the pipette ejector up and press the probe firmly onto the backmost pipette nozzle. Twist the collar to lock the probe. Test that the probe is secure by gently pulling it back and forth.", - "install_probe_96_channel": "Take the calibration probe from its storage location. Ensure its collar is unlocked. Push the pipette ejector up and press the probe firmly onto the A1 (back left corner) pipette nozzle. Twist the collar to lock the probe. Test that the probe is secure by gently pulling it back and forth.", - "install_probe": "Take the calibration probe from its storage location. Ensure its collar is unlocked. Push the pipette ejector up and press the probe firmly onto the pipette nozzle. Twist the collar to lock the probe. Test that the probe is secure by gently pulling it back and forth.", + "install_probe": "Take the calibration probe from its storage location. Ensure its collar is unlocked. Push the pipette ejector up and press the probe firmly onto the {{location}} pipette nozzle. Twist the collar to lock the probe. Test that the probe is secure by gently pulling it back and forth.", "loose_detach": "Loosen screws and detach ", "move_gantry_to_front": "Move gantry to front", - "must_detach_mounting_plate": "You must detach the mounting plate before using other pipettes.", + "must_detach_mounting_plate": "You must detach the mounting plate and reattach the z-axis carraige before using other pipettes. We do not recommend exiting this process before completion.", "name_and_volume_detected": "{{name}} Pipette Detected", "next": "next", "ninety_six_channel": "{{ninetySix}} pipette", "ninety_six_detached_success": "{{pipetteName}} pipette successfully detached", + "ninety_six_probe_location": "A1 (back left corner)", "pip_cal_failed": "pipette calibration failed", - "pip_cal_success": "{{pipetteName}} successfully attached and calibrated", + "pip_cal_success": "{{pipetteName}} successfully calibrated", "pip_recal_success": "{{pipetteName}} successfully recalibrated", "pipette_attached": "{{pipetteName}} successfully attached", "pipette_calibrating": "Stand back, {{pipetteName}} is calibrating", @@ -78,9 +80,12 @@ "something_seems_wrong": "There may be a problem with your pipette. Exit setup and contact Opentrons Support for assistance.", "stand_back": "Stand back, robot is in motion", "try_again": "try again", + "unable_to_detect_probe": "Unable to detect calibration probe", "unscrew_and_detach": "Loosen Screws and Detach Mounting Plate", "unscrew_at_top": "Loosen the captive screw on the top right of the carriage. This releases the right pipette mount, which should then freely move up and down.", "unscrew_carriage": "unscrew z-axis carriage", + "waste_chute_error": "Remove the waste chute from the deck plate adapter before proceeding.", + "waste_chute_warning": "If the waste chute is installed, remove it from the deck plate adapter before proceeding.", "wrong_pip": "wrong instrument installed", "z_axis_still_attached": "z-axis screw still secure" } diff --git a/app/src/assets/localization/en/protocol_command_text.json b/app/src/assets/localization/en/protocol_command_text.json index 6feb4ff5066..4d3a2a40933 100644 --- a/app/src/assets/localization/en/protocol_command_text.json +++ b/app/src/assets/localization/en/protocol_command_text.json @@ -2,10 +2,13 @@ "adapter_in_mod_in_slot": "{{adapter}} on {{module}} in {{slot}}", "adapter_in_slot": "{{adapter}} in {{slot}}", "aspirate": "Aspirating {{volume}} µL from well {{well_name}} of {{labware}} in {{labware_location}} at {{flow_rate}} µL/sec", + "aspirate_in_place": "Aspirating {{volume}} µL in place at {{flow_rate}} µL/sec ", "blowout": "Blowing out at well {{well_name}} of {{labware}} in {{labware_location}} at {{flow_rate}} µL/sec", - "configure_for_volume": "Configure {{pipette}} to aspirate {{volume}} µL", + "blowout_in_place": "Blowing out in place at {{flow_rate}} µL/sec", "closing_tc_lid": "Closing Thermocycler lid", "comment": "Comment", + "configure_for_volume": "Configure {{pipette}} to aspirate {{volume}} µL", + "configure_nozzle_layout": "Configure {{pipette}} to use {{amount}} nozzles", "confirm_and_resume": "Confirm and resume", "deactivate_hs_shake": "Deactivating shaker", "deactivate_temperature_module": "Deactivating Temperature Module", @@ -14,9 +17,11 @@ "deactivating_tc_lid": "Deactivating Thermocycler lid", "degrees_c": "{{temp}}°C", "disengaging_magnetic_module": "Disengaging Magnetic Module", - "dispense": "Dispensing {{volume}} µL into well {{well_name}} of {{labware}} in {{labware_location}} at {{flow_rate}} µL/sec", "dispense_push_out": "Dispensing {{volume}} µL into well {{well_name}} of {{labware}} in {{labware_location}} at {{flow_rate}} µL/sec and pushing out {{push_out_volume}} µL", + "dispense": "Dispensing {{volume}} µL into well {{well_name}} of {{labware}} in {{labware_location}} at {{flow_rate}} µL/sec", + "dispense_in_place": "Dispensing {{volume}} µL in place at {{flow_rate}} µL/sec", "drop_tip": "Dropping tip in {{well_name}} of {{labware}}", + "drop_tip_in_place": "Dropping tip in place", "engaging_magnetic_module": "Engaging Magnetic Module", "fixed_trash": "Fixed Trash", "home_gantry": "Homing all gantry, pipette, and plunger axes", @@ -31,13 +36,16 @@ "move_to_coordinates": "Moving to (X: {{x}}, Y: {{y}}, Z: {{z}})", "move_to_slot": "Moving to Slot {{slot_name}}", "move_to_well": "Moving to well {{well_name}} of {{labware}} in {{labware_location}}", + "move_to_addressable_area": "Moving to {{addressable_area}}", + "move_to_addressable_area_drop_tip": "Dropping tip into {{addressable_area}}", "notes": "notes", "off_deck": "off deck", "offdeck": "offdeck", "opening_tc_lid": "Opening Thermocycler lid", "pause_on": "Pause on {{robot_name}}", "pause": "Pause", - "pickup_tip": "Picking up tip from {{well_name}} of {{labware}} in {{labware_location}}", + "pickup_tip": "Picking up tip(s) from {{well_range}} of {{labware}} in {{labware_location}}", + "prepare_to_aspirate": "Preparing {{pipette}} to aspirate", "return_tip": "Returning tip to {{well_name}} of {{labware}} in {{labware_location}}", "save_position": "Saving position", "set_and_await_hs_shake": "Setting Heater-Shaker to shake at {{rpm}} rpm and waiting until reached", @@ -50,6 +58,7 @@ "tc_awaiting_for_duration": "Waiting for Thermocycler profile to complete", "tc_run_profile_steps": "temperature: {{celsius}}°C, seconds: {{seconds}}", "tc_starting_profile": "Thermocycler starting {{repetitions}} repetitions of cycle composed of the following steps:", + "trash_bin_in_slot": "Trash Bin in {{slot_name}}", "touch_tip": "Touching tip", "unlatching_hs_latch": "Unlatching labware on Heater-Shaker", "wait_for_duration": "Pausing for {{seconds}} seconds. {{message}}", @@ -57,5 +66,6 @@ "waiting_for_hs_to_reach": "Waiting for Heater-Shaker to reach target temperature", "waiting_for_tc_block_to_reach": "Waiting for Thermocycler block to reach target temperature and holding for specified time", "waiting_for_tc_lid_to_reach": "Waiting for Thermocycler lid to reach target temperature", - "waiting_to_reach_temp_module": "Waiting for Temperature Module to reach {{temp}}" + "waiting_to_reach_temp_module": "Waiting for Temperature Module to reach {{temp}}", + "waste_chute": "Waste Chute" } diff --git a/app/src/assets/localization/en/protocol_details.json b/app/src/assets/localization/en/protocol_details.json index 8119f449dad..229aa43cc90 100644 --- a/app/src/assets/localization/en/protocol_details.json +++ b/app/src/assets/localization/en/protocol_details.json @@ -7,21 +7,24 @@ "connection_status": "connection status", "creation_method": "creation method", "deck_view": "Deck View", - "delete_protocol": "Delete Protocol", "delete_protocol_perm": "{{name}} and its run history will be permanently deleted.", + "delete_protocol": "Delete Protocol", + "delete_this_protocol": "Delete this protocol?", "description": "description", "extension_mount": "extension mount", "go_to_labware_definition": "Go to labware definition", + "gripper_pick_up_count_description": "individual move labware commands that use the gripper.", + "gripper_pick_up_count": "Grip Count", "hardware": "hardware", - "labware": "labware", "labware_name": "Labware name", + "labware": "labware", "last_analyzed": "last analyzed", "last_updated": "last updated", - "left_and_right_mounts": "Left+Right Mounts", + "both_mounts": "Both Mounts", "left_mount": "left mount", "liquid_name": "liquid name", - "liquids": "liquids", "liquids_not_in_protocol": "no liquids are specified for this protocol", + "liquids": "liquids", "location": "location", "modules": "modules", "no_available_robots_found": "No available robots found", @@ -29,18 +32,25 @@ "not_connected": "not connected", "not_in_protocol": "no {{section}} is specified for this protocol", "org_or_author": "org/author", + "pipette_aspirate_count_description": "individual aspirate commands per pipette.", + "pipette_aspirate_count": "{{pipette}} aspirate count", + "pipette_dispense_count_description": "individual dispense commands per pipette.", + "pipette_dispense_count": "{{pipette}} dispense count", + "pipette_pick_up_count_description": "individual pick up tip commands per pipette.", + "pipette_pick_up_count": "{{pipette}} pick up tip count", "proceed_to_setup": "Proceed to setup", "protocol_designer_version": "Protocol Designer {{version}}", "protocol_failed_app_analysis": "This protocol failed in-app analysis. It may be unusable on robots without custom software configurations.", + "protocol_outdated_app_analysis": "This protocol's analysis is out of date. It may produce different results if you run it now.", "python_api_version": "Python API {{version}}", "quantity": "Quantity", "read_less": "read less", "read_more": "read more", "right_mount": "right mount", - "robot": "robot", "robot_configuration": "robot configuration", - "robot_is_busy": "{{robotName}} is busy", "robot_is_busy_with_protocol": "{{robotName}} is busy with {{protocolName}} in {{runStatus}} state. Do you want to clear it and proceed?", + "robot_is_busy": "{{robotName}} is busy", + "robot": "robot", "run_protocol": "Run protocol", "send": "Send", "sending": "Sending", @@ -49,10 +59,10 @@ "start_setup": "Start setup", "successfully_sent": "Successfully sent", "total_volume": "total volume", - "unavailable_or_busy_robot_not_listed": "{{count}} unavailable or busy robot is not listed.", "unavailable_or_busy_robot_not_listed_plural": "{{count}} unavailable or busy robots are not listed.", - "unavailable_robot_not_listed": "{{count}} unavailable robot is not listed.", + "unavailable_or_busy_robot_not_listed": "{{count}} unavailable or busy robot is not listed.", "unavailable_robot_not_listed_plural": "{{count}} unavailable robots are not listed.", + "unavailable_robot_not_listed": "{{count}} unavailable robot is not listed.", "unsuccessfully_sent": "Unsuccessfully sent", "view_run_details": "View run details", "view_unavailable_robots": "View unavailable robots on the Devices page" diff --git a/app/src/assets/localization/en/protocol_info.json b/app/src/assets/localization/en/protocol_info.json index 0fc225e6f65..bbaac1ce9c2 100644 --- a/app/src/assets/localization/en/protocol_info.json +++ b/app/src/assets/localization/en/protocol_info.json @@ -3,7 +3,6 @@ "browse_protocol_library": "Open Protocol Library", "cancel_run": "Cancel Run", "choose_file": "Choose File...", - "choose_protocol_file": "Choose File", "choose_snippet_type": "Choose the Labware Offset Data Python Snippet based on target execution environment.", "continue_proceed_to_calibrate": "Proceed to Calibrate", "continue_verify_calibrations": "Verify pipette and labware calibrations", @@ -86,6 +85,7 @@ "unpin_protocol": "Unpin protocol", "unpinned_protocol": "Unpinned protocol", "update_robot_for_custom_labware": "You have custom labware definitions saved to your app, but this robot needs to be updated before you can use these definitions with Python protocols", + "upload": "Upload", "upload_and_simulate": "Open a protocol to run on {{robot_name}}", "valid_file_types": "Valid file types: Python files (.py) or Protocol Designer files (.json)" } diff --git a/app/src/assets/localization/en/protocol_list.json b/app/src/assets/localization/en/protocol_list.json index 1b54fc7885c..d014c27abae 100644 --- a/app/src/assets/localization/en/protocol_list.json +++ b/app/src/assets/localization/en/protocol_list.json @@ -7,12 +7,15 @@ "modules": "modules", "no_data": "No data", "protocol_analysis_failure": "Protocol analysis failure.", + "protocol_analysis_outdated": "Protocol analysis is out of date.", + "protocol_deleted": "Protocol deleted", "reanalyze_or_view_error": "Reanalyze protocol or view error details", + "reanalyze_to_view": "Reanalyze protocol", "right_mount": "right mount", "robot": "robot", - "send_to_ot3_overflow": "Send to {{robot_display_name}}", - "send_to_ot3": "Send protocol to {{robot_display_name}}", - "should_delete_this_protocol": "Delete this protocol?", + "send_to_robot_overflow": "Send to {{robot_display_name}}", + "send_to_robot": "Send protocol to {{robot_display_name}}", + "delete_this_protocol": "Delete this protocol?", "show_in_folder": "Show in folder", "start_setup": "Start setup", "this_protocol_will_be_trashed": "This protocol will be moved to this computer’s trash and may be unrecoverable.", diff --git a/app/src/assets/localization/en/protocol_setup.json b/app/src/assets/localization/en/protocol_setup.json index fc99548e57c..6b66209ab40 100644 --- a/app/src/assets/localization/en/protocol_setup.json +++ b/app/src/assets/localization/en/protocol_setup.json @@ -1,7 +1,10 @@ { "96_mount": "left + right mount", + "action_needed": "Action needed", "adapter_slot_location_module": "Slot {{slotName}}, {{adapterName}} on {{moduleName}}", "adapter_slot_location": "Slot {{slotName}}, {{adapterName}}", + "add_fixture_to_deck": "Add this fixture to your deck configuration. It will be referenced during protocol analysis.", + "add_fixture": "Add {{fixtureName}} to deck configuration", "additional_labware": "{{count}} additional labware", "additional_off_deck_labware": "Additional Off-Deck Labware", "attach_gripper_failure_reason": "Attach the required gripper to continue", @@ -19,6 +22,7 @@ "calibrate_deck_to_proceed_to_pipette_calibration": "Calibrate your deck in order to proceed to pipette calibration", "calibrate_deck_to_proceed_to_tip_length_calibration": "Calibrate your deck in order to proceed to tip length calibration", "calibrate_gripper_failure_reason": "Calibrate the required gripper to continue", + "calibrate_module_failure_reason": "Calibrate the required modules(s) to continue", "calibrate_now": "Calibrate now", "calibrate_pipette_before_module_calibration": "Calibrate pipette before running module calibration", "calibrate_pipette_failure_reason": "Calibrate the required pipette(s) to continue", @@ -35,30 +39,44 @@ "calibration": "Calibration", "closing": "Closing...", "complete_setup_before_proceeding": "complete setup before continuing run", + "configure": "Configure", + "configured": "configured", "confirm_heater_shaker_module_modal_description": "Before the run begins, module should have both anchors fully extended for a firm attachment. The thermal adapter should be attached to the module. ", "confirm_heater_shaker_module_modal_title": "Confirm Heater-Shaker Module is attached", "connect_all_hardware": "Connect and calibrate all hardware first", "connect_all_mod": "Connect all modules first", "connection_info_not_available": "Connection info not available once run has started", "connection_status": "Connection Status", + "currently_configured": "Currently configured", "currently_unavailable": "Currently unavailable", "deck_cal_description_bullet_1": "Perform Deck Calibration during new robot setup.", "deck_cal_description_bullet_2": "Redo Deck Calibration if you relocate your robot.", "deck_cal_description": "This measures the deck X and Y values relative to the gantry. Deck Calibration is the foundation for Tip Length Calibration and Pipette Offset Calibration.", "deck_calibration_title": "Deck Calibration", + "deck_conflict_info_thermocycler": "Update the deck configuration by removing the fixtures in locations A1 and B1. Either remove the fixtures from the deck configuration or update the protocol.", + "deck_conflict_info": "Update the deck configuration by removing the {{currentFixture}} in location {{cutout}}. Either remove the fixture from the deck configuration or update the protocol.", + "deck_conflict": "Deck location conflict", "deck_map": "Deck Map", "example": "Example", "extension_mount": "extension mount", "extra_attention_warning_title": "Secure labware and modules before proceeding to run", "extra_module_attached": "Extra module attached", "feedback_form_link": "Let us know!", + "fixture_name": "fixture", + "fixture": "Fixture", + "fixtures_connected_plural": "{{count}} fixtures attached", + "fixtures_connected": "{{count}} fixture attached", "get_labware_offset_data": "Get Labware Offset Data", + "hardware_missing": "Missing hardware", "heater_shaker_extra_attention": "Use latch controls for easy placement of labware.", "heater_shaker_labware_list_view": "To add labware, use the toggle to control the latch", "how_offset_data_works": "How labware offsets work", "initial_liquids_num_plural": "{{count}} initial liquids", "initial_liquids_num": "{{count}} initial liquid", "initial_location": "Initial Location", + "install_modules_and_fixtures": "Install the required modules and power them on. Install the required fixtures and review the deck configuration.", + "instrument_calibrations_missing_plural": "Missing {{count}} calibrations", + "instrument_calibrations_missing": "Missing {{count}} calibration", "instruments_connected_plural": "{{count}} instruments attached", "instruments_connected": "{{count}} instrument attached", "instruments": "Instruments", @@ -91,6 +109,7 @@ "loading_data": "Loading data...", "loading_labware_offsets": "Loading labware offsets", "loading_protocol_details": "Loading details...", + "location_conflict": "Location conflict", "location": "Location", "lpc_and_offset_data_title": "Labware Position Check and Labware Offset Data", "lpc_disabled_calibration_not_complete": "Make sure robot calibration is complete before running Labware Position Check", @@ -101,30 +120,38 @@ "magnetic_module_attention_warning": "Opentrons recommends securing labware with the module’s bracket.
See how to secure labware to the Magnetic Module", "magnetic_module_extra_attention": "Opentrons recommends securing labware with the module’s bracket", "map_view": "Map View", + "missing_gripper": "Missing gripper", + "missing_instruments": "Missing {{count}}", + "missing_pipettes_plural": "Missing {{count}} pipettes", + "missing_pipettes": "Missing {{count}} pipette", "missing": "Missing", "modal_instructions_title": "{{moduleName}} Setup Instructions", "modal_instructions": "For step-by-step instructions on setting up your module, consult the Quickstart Guide that came in its box. You can also click the link below or scan the QR code to visit the modules section of the Opentrons Help Center.", + "module_and_deck_setup": "Modules & deck", "module_connected": "Connected", "module_disconnected": "Disconnected", "module_instructions_link": "{{moduleName}} setup instructions", "module_mismatch_body": "Check that the modules connected to this robot are of the right type and generation", - "module_name": "Module Name", + "module_name": "Module", "module_not_connected": "Not connected", "module_setup_step_description_plural": "Install the required modules and power them on.", "module_setup_step_description": "Install the required modules and power them on.", "module_setup_step_title": "Modules", "module_slot_location": "Slot {{slotName}}, {{moduleName}}", + "module": "Module", + "modules_and_deck": "Modules & deck", "modules_connected_plural": "{{count}} modules attached", "modules_connected": "{{count}} module attached", "modules_setup_step_title": "Module Setup", "modules": "Modules", "mount_title": "{{mount}} MOUNT:", "mount": "{{mount}} mount", + "multiple_fixtures_missing": "{{count}} fixtures missing", "multiple_modules_example": "Your protocol has two Temperature Modules. The Temperature Module attached to the first port starting from the left will be related to the first Temperature Module in your protocol while the second Temperature Module loaded would be related to the Temperature Module connected to the next port to the right. If using a hub, follow the same logic with the port ordering.", "multiple_modules_explanation": "To use more than one of the same module in a protocol, you first need to plug in the module that’s called first in your protocol to the lowest numbered USB port on the robot. Continue in the same manner with additional modules.", "multiple_modules_help_link_title": "See How To Set Up Modules of the Same Type", "multiple_modules_learn_more": "Learn more about using multiple modules of the same type", - "multiple_modules_missing": "Multiple modules missing", + "multiple_modules_missing_plural": "Missing {{count}} modules", "multiple_modules_modal": "Setting up multiple modules of the same type", "multiple_modules": "Multiple modules of the same type", "multiple_of_most_modules": "You can use multiples of most module types within a single Python protocol by connecting and loading the modules in a specific order. The robot will initialize the matching module attached to the lowest numbered port first, regardless of what deck slot it occupies.", @@ -132,14 +159,16 @@ "n_a": "N/A", "no_data": "no data", "no_labware_offset_data": "no labware offset data yet", + "no_modules_or_fixtures": "No modules or fixtures are specified for this protocol.", "no_modules_specified": "no modules are specified for this protocol.", - "no_modules_used_in_this_protocol": "No modules used in this protocol", + "no_modules_used_in_this_protocol": "No hardware used in this protocol", "no_tiprack_loaded": "Protocol must load a tip rack", "no_tiprack_used": "Protocol must pick up a tip", "no_usb_connection_required": "No USB connection required", "no_usb_port_yet": "No USB Port Yet", "no_usb_required": "No USB required", "not_calibrated": "Not calibrated yet", + "not_configured": "not configured", "off_deck": "Off deck", "offset_data": "Offset Data", "offsets_applied_plural": "{{count}} offsets applied", @@ -171,6 +200,7 @@ "protocol_run_complete": "Protocol run complete.", "protocol_run_failed": "Protocol run failed.", "protocol_run_started": "Protocol run started.", + "protocol_specifies": "Protocol specifies", "protocol_upload_revamp_feedback": "Have feedback about this experience?", "quantity": "Quantity", "recalibrate": "Recalibrate", @@ -179,6 +209,7 @@ "recommended": "Recommended", "required_instrument_calibrations": "required instrument calibrations", "required_tip_racks_title": "Required Tip Length Calibrations", + "resolve": "Resolve", "robot_cal_description": "Robot calibration establishes how the robot knows where it is in relation to the deck. Accurate Robot calibration is essential to run protocols successfully. Robot calibration has 3 parts: Deck calibration, Tip Length calibration and Pipette Offset calibration.", "robot_cal_help_title": "How Robot Calibration Works", "robot_calibration_step_description_pipettes_only": "Review required instruments and calibrations for this protocol.", @@ -210,11 +241,12 @@ "tip_length_cal_title": "Tip Length Calibration", "tip_length_calibration": "tip length calibration", "total_vol": "total volume", + "update_deck": "Update deck", "usb_connected_no_port_info": "USB Port Connected", "usb_port_connected": "USB Port {{port}}", "view_current_offsets": "View current offsets", "view_moam": "View setup instructions for placing modules of the same type to the robot.", - "view_module_setup_instructions": "View module setup instructions", + "view_setup_instructions": "View setup instructions", "volume": "Volume", "what_labware_offset_is": "A Labware Offset is a type of positional adjustment that accounts for small, real-world variances in the overall position of the labware on a robot’s deck. Labware Offset data is unique to a specific combination of labware definition, deck slot, and robot.", "why_use_lpc": "Labware Position Check is intended to correct for minor variances. Opentrons does not recommend using Labware Position Check to compensate for large positional adjustments. Needing to set large labware offsets could indicate a problem with robot calibration." diff --git a/app/src/assets/localization/en/robot_calibration.json b/app/src/assets/localization/en/robot_calibration.json index 66f43d65289..9828ed706c4 100644 --- a/app/src/assets/localization/en/robot_calibration.json +++ b/app/src/assets/localization/en/robot_calibration.json @@ -1,6 +1,7 @@ { "attached_pipettes": "attached pipette calibrations", "before_you_begin": "Before you begin", + "calibrate": "Calibrate", "calibrate_deck": "calibrate deck", "calibrate_pipette": "Calibrate pipette", "calibrate_tip_length": "Calibrate the length of a tip on this pipette.", @@ -10,17 +11,16 @@ "calibrate_z_axis_on_block": "Calibrate z-axis on block", "calibrate_z_axis_on_slot": "Calibrate z-axis in slot 5", "calibrate_z_axis_on_trash": "Calibrate z-axis on trash bin", - "calibrate": "Calibrate", "calibration_block_description": "This block is a specially made tool that fits perfectly on your deck and helps with calibration.If you do not have a Calibration Block, please email support@opentrons.com so we can send you one. In your message, be sure to include your name, company or institution name, and shipping address. While you wait for the block to arrive, you can use the flat surface on the trash bin of your robot instead.", "calibration_complete": "Calibration complete", "calibration_dashboard": "Calibration Dashboard", + "calibration_health_check": "Calibration Health Check", "calibration_health_check_intro_body": "Calibration Health Check diagnoses problems with Deck, Tip Length, and Pipette Offset Calibration.You will move the pipettes to various positions, which will be compared against your existing calibration data.If there is a large difference, you will be prompted to redo some or all of your calibrations.", "calibration_health_check_results": "Calibration Health Check Results", - "calibration_health_check": "Calibration Health Check", "calibration_on_opentrons_tips_is_important": "It’s extremely important to perform this calibration using the Opentrons tips and tip racks specified above, as the robot determines accuracy based on the known measurements of these tips.", "calibration_recommended": "Calibration recommended", - "calibration_status_description": "For accurate and precise movement, calibrate the robot's deck, pipette offsets, and tip lengths.", "calibration_status": "Calibration Status", + "calibration_status_description": "For accurate and precise movement, calibrate the robot's deck, pipette offsets, and tip lengths.", "calibrations_complete": "Calibrations complete!", "change_tip_rack": "Change tip rack", "check_tip_on_block": "Check tip on block", @@ -36,6 +36,7 @@ "confirm_placement": "Confirm placement", "confirm_tip_rack": "Confirm tip rack", "custom": "custom", + "deck_calibration": "Deck Calibration", "deck_calibration_description": "Calibrate the position of the robot's deck. Recommended for all new robots and after moving robots.", "deck_calibration_error_occurred": "An error occurred while trying to start deck calibration", "deck_calibration_failure": "Failed to start deck calibration", @@ -43,17 +44,16 @@ "deck_calibration_missing": "You haven't calibrated the deck yet", "deck_calibration_redo": "recalibrate deck", "deck_calibration_spinner": "Deck calibration is {{ongoing_action}}", - "deck_calibration": "Deck Calibration", "deck_invalidates_pipette_offset": "Recalibrating the deck clears pipette offset data", "definition": "Your OT-2 moves pipettes around in 3D space based on its calibration. Learn more about how calibration works on the OT-2.", "delete_calibration_data": "Delete calibration data", "did_pipette_pick_up_tip": "Did pipette pick up tip successfully?", "direction_controls": "direction controls", "do_you_have_a_cal_block": "Do you have a Calibration Block?", + "download_calibration": "Download your calibration data", "download_calibration_data_available": "Save all three types of calibration data as a JSON file.", "download_calibration_data_unavailable": "No calibration data available.", "download_calibration_title": "Download Calibration Data", - "download_calibration": "Download your calibration data", "download_details": "Download details JSON Calibration Check summary", "finish": "Finish", "get_started": "Get started", @@ -76,21 +76,21 @@ "last_calibrated": "Last calibrated", "last_completed_on": "Last completed {{timestamp}}", "last_migrated": "Last known calibration migrated", - "launch_calibration_link_text": "Go to calibration", "launch_calibration": "Launch calibration", + "launch_calibration_link_text": "Go to calibration", "manage_pipettes": "manage pipettes", - "missing_calibration_data_long": "Robot is missing calibration data", "missing_calibration_data": "Missing calibration data", + "missing_calibration_data_long": "Robot is missing calibration data", "need_help": "Need help?", "no_pipette": "No pipette attached", "no_tip_length": "Calibrate your pipette to see saved tip length", - "opentrons_tip_racks_recommended": "Opentrons tip racks are highly recommended. Accuracy cannot be guaranteed with other tip racks.", "opentrons": "opentrons", + "opentrons_tip_racks_recommended": "Opentrons tip racks are highly recommended. Accuracy cannot be guaranteed with other tip racks.", "pick_up_tip": "Pick up tip", "pipette_name_and_serial": "{{name}}, {{serial}}", + "pipette_offset_calibration": "Pipette Offset Calibration", "pipette_offset_calibration_intro_body": "Calibrating pipette offset measures a pipette’s position relative to the pipette mount and the deck.", "pipette_offset_calibration_on_mount": "Calibrate this pipette's offset while attached to the robot's {{mount}} mount.", - "pipette_offset_calibration": "Pipette Offset Calibration", "pipette_offset_description": "Calibrate the position for the the default tip and pipette combination.", "pipette_offset_recalibrate_both_mounts": "Pipette offsets for both mounts will have to be recalibrated.", "pipette_offset_requires_tip_length": "You don’t have a tip length saved with this pipette yet. You will need to calibrate tip length before calibrating your pipette offset.", @@ -100,35 +100,36 @@ "position_pipette_over_tip": "Position pipette over A1", "prepare_the_space": "Prepare the space", "progress_will_be_lost": "{{sessionType}} progress will be lost", + "recalibrate": "Recalibrate", "recalibrate_pipette": "Recalibrate pipette", "recalibrate_warning_body": "Performing a deck calibration will clear all of your pipette offset and tip length calibrations. You will need to recalibrate your pipette offset and tip length after completing a deck calibration.", "recalibrate_warning_heading": "Are you sure you want to recalibrate your deck?", - "recalibrate": "Recalibrate", "recalibration_recommended": "Recalibration recommended", + "return_tip": "Return tip", "return_tip_and_continue": "Return tip and continue to next pipette", "return_tip_and_exit": "Return tip and see calibration health check results", - "return_tip": "Return tip", "see_how_robot_calibration_works": "See how robot calibration works", "select_tip_rack": "select tip rack", "serial_number": "Serial number", "small": "Small", - "start_over_question": "Start over?", "start_over": "Start over", + "start_over_question": "Start over?", "start_with_deck_calibration": "Start with Deck Calibration, which is the basis for the rest of calibration.", "starting_over_loses_progress": "Starting over will cancel your calibration progress.", "this_is_the_tip_used_in_pipette_offset_cal": "Please note: You must use the same tips you used in Pipette Offset Calibration, which are listed above.", "tiny": "Tiny", + "tip_length": "tip length calibration", "tip_length_and_pipette_offset_calibration": "Tip Length and Pipette Offset Calibration", - "tip_length_calibration_intro_body": "Tip length calibration measures the distance between the bottom of the tip and the pipette’s nozzle.", "tip_length_calibration": "Tip Length Calibration", + "tip_length_calibration_intro_body": "Tip length calibration measures the distance between the bottom of the tip and the pipette’s nozzle.", "tip_length_invalidates_pipette_offset": "Recalibrating tip length will clear pipette offset data.", - "tip_length": "tip length calibration", "tip_pick_up_instructions": "Using the controls below or your keyboard, jog the pipette until the nozzle closest to you is centered above the A1 position and level with the top of the tip.
When the pipette is properly aligned, pick up the tip.", "title": "robot calibration", "to_check": "To check the {{mount}} pipette:", "unknown_custom_tiprack": "unknown custom tip rack", "use_calibration_block": "Use Calibration Block", "use_trash_bin": "Use trash bin", + "using_current_calibrations": "Using current calibrations.", "you_can_remove_cal_block": "You can remove the Calibration Block from the deck now.", "you_will_need": "You will need:" } diff --git a/app/src/assets/localization/en/robot_controls.json b/app/src/assets/localization/en/robot_controls.json index 0526077ab5f..cba7f31410e 100644 --- a/app/src/assets/localization/en/robot_controls.json +++ b/app/src/assets/localization/en/robot_controls.json @@ -1,10 +1,12 @@ { "confirm_location": "confirm location", + "drop_tips": "Drop tips", "home_button": "home", "home_description": "Return robot to starting position.", "home_label": "home all axes", "lights_description": "Control lights on deck.", "lights_label": "lights", + "recalibrate": "Recalibrate", "restart_button": "restart", "restart_description": "Restart robot.", "restart_label": "Restart robot", diff --git a/app/src/assets/localization/en/run_details.json b/app/src/assets/localization/en/run_details.json index b6f74676a97..bb2d54c19fe 100644 --- a/app/src/assets/localization/en/run_details.json +++ b/app/src/assets/localization/en/run_details.json @@ -1,56 +1,59 @@ { "analysis_failure_on_robot": "An error occurred while attempting to analyze {{protocolName}} on {{robotName}}. Fix the following error and try running this protocol again.", "analyzing_on_robot": "Analyzing on robot", - "anticipated_step": "Anticipated steps", "anticipated": "Anticipated steps", + "anticipated_step": "Anticipated steps", "apply_stored_data": "Apply stored data", "apply_stored_labware_offset_data": "Apply stored Labware Offset data?", + "cancel_run": "Cancel run", "cancel_run_alert_info": "Doing so will terminate this run, drop any attached tips in the trash container and home your robot.", "cancel_run_modal_back": "No, go back", "cancel_run_modal_confirm": "Yes, cancel run", "cancel_run_modal_heading": "Are you sure you want to cancel this run?", "cancel_run_module_info": "Additionally, any hardware modules used within the protocol will remain active and maintain their current states until deactivated.", - "cancel_run": "Cancel run", - "canceling_run_dot": "canceling run...", "canceling_run": "Canceling Run", - "clear_protocol_to_make_available": "Clear protocol from robot to make it available.", + "canceling_run_dot": "canceling run...", "clear_protocol": "Clear protocol", + "clear_protocol_to_make_available": "Clear protocol from robot to make it available.", "close_door_to_resume": "Close robot door to resume run", + "close_door": "Close robot door", "closing_protocol": "Closing Protocol", - "comment_step": "Comment", "comment": "Comment", + "comment_step": "Comment", "complete_protocol_to_download": "Complete the protocol to download the run log", - "contact_information": "Download the run logs from the Opentrons App and send it to support@opentrons.com for assistance.", - "current_step_pause_timer": "Timer", - "current_step_pause": "Current Step - Paused by User", + "contact_information": "Download the robot logs from the Opentrons App and send it to support@opentrons.com for assistance.", "current_step": "Current Step", + "current_step_pause": "Current Step - Paused by User", + "current_step_pause_timer": "Timer", "current_temperature": "Current: {{temperature}} °C", "data_out_of_date": "This data is likely out of date", + "door_is_open": "Robot door is open", "door_open_pause": "Current Step - Paused - Door Open", "download_run_log": "Download run log", "downloading_run_log": "Downloading run log", "drop_tip": "Dropping tip in {{well_name}} of {{labware}} in {{labware_location}}", "duration": "Duration", + "end": "End", "end_of_protocol": "End of protocol", "end_step_time": "End", - "end": "End", "error_info": "Error {{errorCode}}: {{errorType}}", "error_type": "Error: {{errorType}}", "failed_step": "Failed step", + "final_step": "Final Step", "ignore_stored_data": "Ignore stored data", - "labware_offset_data": "labware offset data", "labware": "labware", + "labware_offset_data": "labware offset data", "left": "Left", + "load_labware_info_protocol_setup": "Load {{labware}} in {{module_name}} in Slot {{slot_name}}", + "load_labware_info_protocol_setup_adapter": "Load {{labware}} in {{adapter_name}} in Slot {{slot_name}}", "load_labware_info_protocol_setup_adapter_module": "Load {{labware}} in {{adapter_name}} in {{module_name}} in Slot {{slot_name}}", "load_labware_info_protocol_setup_adapter_off_deck": "Load {{labware}} in {{adapter_name}} off deck", - "load_labware_info_protocol_setup_adapter": "Load {{labware}} in {{adapter_name}} in Slot {{slot_name}}", "load_labware_info_protocol_setup_no_module": "Load {{labware}} in Slot {{slot_name}}", "load_labware_info_protocol_setup_off_deck": "Load {{labware}} off deck", "load_labware_info_protocol_setup_plural": "Load {{labware}} in {{module_name}}", - "load_labware_info_protocol_setup": "Load {{labware}} in {{module_name}} in Slot {{slot_name}}", "load_liquids_info_protocol_setup": "Load {{liquid}} into {{labware}}", - "load_module_protocol_setup_plural": "Load {{module}}", "load_module_protocol_setup": "Load {{module}} in Slot {{slot_name}}", + "load_module_protocol_setup_plural": "Load {{module}}", "load_pipette_protocol_setup": "Load {{pipette_name}} in {{mount_name}} Mount", "loading_protocol": "Loading Protocol", "location": "location", @@ -62,9 +65,9 @@ "not_available_for_a_run_in_progress": "not available for a run in progress", "not_started_yet": "Not started yet", "off_deck": "Off deck", + "pause": "Pause", "pause_protocol": "Pause protocol", "pause_run": "Pause run", - "pause": "Pause", "paused_for": "Paused For", "pickup_tip": "Picking up tip from {{well_name}} of {{labware}} in {{labware_location}}", "plus_more": "+{{count}} more", @@ -86,33 +89,34 @@ "right": "Right", "robot_has_previous_offsets": "This robot has stored Labware Offset data from previous protocol runs. Do you want to apply that data to this protocol run? You can still adjust any offsets with Labware Position Check.", "robot_was_recalibrated": "This robot was recalibrated after this Labware Offset data was stored.", + "run": "Run", "run_again": "Run again", - "run_canceled_splash": "Run canceled", "run_canceled": "Run canceled.", - "run_complete_splash": "Run completed", + "run_canceled_splash": "Run canceled", "run_complete": "Run completed", + "run_complete_splash": "Run completed", "run_completed": "Run completed.", "run_cta_disabled": "Complete required steps on Protocol tab before starting the run", + "run_failed": "Run failed.", "run_failed_modal_body": "Error occurred when protocol was {{command}}", - "run_failed_modal_description_desktop": "Download the run log and send it to support@opentrons.com for assistance.", "run_failed_modal_description": "Please contact support@opentrons.com with relevant information for assistance with troubleshooting.", + "run_failed_modal_description_desktop": "Download the run log and send it to support@opentrons.com for assistance.", "run_failed_modal_header": "{{errorName}}: {{errorCode}} at protocol step {{count}}", "run_failed_modal_title": "Run failed", "run_failed_splash": "Run failed", - "run_failed": "Run failed.", "run_has_diverged_from_predicted": "Run has diverged from predicted state. Cannot anticipate new steps.", "run_preview": "Run Preview", "run_protocol": "Run Protocol", "run_status": "Status: {{status}}", "run_time": "Run Time", - "run": "Run", - "setup_incomplete": "Complete required steps in Setup tab", "setup": "Setup", + "setup_incomplete": "Complete required steps in Setup tab", "slot": "Slot {{slotName}}", + "start": "Start", "start_run": "Start run", "start_step_time": "Start", "start_time": "Start Time", - "start": "Start", + "status": "Status", "status_blocked-by-open-door": "Paused - door open", "status_failed": "Failed", "status_finishing": "Finishing", @@ -123,7 +127,6 @@ "status_stop-requested": "Stop requested", "status_stopped": "Canceled", "status_succeeded": "Completed", - "status": "Status", "step_failed": "Step failed", "step_number": "Step {{step_number}}:", "steps_total": "{{count}} steps total", @@ -132,11 +135,11 @@ "temperature_not_available": "{{temperature_type}}: n/a", "thermocycler_error_tooltip": "Module encountered an anomaly, please contact support", "total_elapsed_time": "Total elapsed time", - "total_step_count_plural": "{{count}} steps total", "total_step_count": "{{count}} step total", + "total_step_count_plural": "{{count}} steps total", "unable_to_determine_steps": "Unable to determine steps", "view_analysis_error_details": "View error details", "view_current_step": "View current step", - "view_error_details": "View error details", - "view_error": "View error" + "view_error": "View error", + "view_error_details": "View error details" } diff --git a/app/src/assets/localization/en/shared.json b/app/src/assets/localization/en/shared.json index 057d4aca41c..6d662f7057c 100644 --- a/app/src/assets/localization/en/shared.json +++ b/app/src/assets/localization/en/shared.json @@ -1,6 +1,9 @@ { "a_software_update_is_available": "A software update is available for this robot. Update to run protocols.", + "acknowledge_privacy": "Acknowledge Privacy Policy", + "add": "add", "alphabetical": "Alphabetical", + "agree": "I agree", "back": "Back", "before_you_begin": "Before you begin", "browse": "browse", @@ -46,6 +49,8 @@ "ok": "ok", "on": "On", "open": "open", + "opentrons_privacy_policy": "Opentrons privacy policy", + "privacy_body": "By proceeding you are agreeing to share desktop app usage data. Opentrons uses this data to improve our products and services. To read more about our data collection policies, visit our Privacy Policy:", "proceed_to_setup": "Proceed to setup", "protocol_run_general_error_msg": "Protocol run could not be created on the robot.", "reanalyze": "Reanalyze", diff --git a/app/src/assets/videos/droptip-wizard/Blowout-Liquid.webm b/app/src/assets/videos/droptip-wizard/Blowout-Liquid.webm new file mode 100644 index 00000000000..0da6aa63c8f Binary files /dev/null and b/app/src/assets/videos/droptip-wizard/Blowout-Liquid.webm differ diff --git a/app/src/assets/videos/droptip-wizard/Drop-tip.webm b/app/src/assets/videos/droptip-wizard/Drop-tip.webm new file mode 100644 index 00000000000..aa11df0e7da Binary files /dev/null and b/app/src/assets/videos/droptip-wizard/Drop-tip.webm differ diff --git a/app/src/assets/videos/gripper-wizards/PIN_FROM_FRONT_TO_REAR_JAW.webm b/app/src/assets/videos/gripper-wizards/PIN_FROM_FRONT_TO_REAR_JAW.webm index 22c8868a683..e10adb42873 100644 Binary files a/app/src/assets/videos/gripper-wizards/PIN_FROM_FRONT_TO_REAR_JAW.webm and b/app/src/assets/videos/gripper-wizards/PIN_FROM_FRONT_TO_REAR_JAW.webm differ diff --git a/app/src/assets/videos/gripper-wizards/PIN_FROM_REAR_TO_STORAGE.webm b/app/src/assets/videos/gripper-wizards/PIN_FROM_REAR_TO_STORAGE.webm index 26109dcaae1..2ed744d187a 100644 Binary files a/app/src/assets/videos/gripper-wizards/PIN_FROM_REAR_TO_STORAGE.webm and b/app/src/assets/videos/gripper-wizards/PIN_FROM_REAR_TO_STORAGE.webm differ diff --git a/app/src/assets/videos/gripper-wizards/PIN_FROM_STORAGE_TO_FRONT_JAW.webm b/app/src/assets/videos/gripper-wizards/PIN_FROM_STORAGE_TO_FRONT_JAW.webm index ec9f22ad617..4812569342c 100644 Binary files a/app/src/assets/videos/gripper-wizards/PIN_FROM_STORAGE_TO_FRONT_JAW.webm and b/app/src/assets/videos/gripper-wizards/PIN_FROM_STORAGE_TO_FRONT_JAW.webm differ diff --git a/app/src/assets/videos/gripper-wizards/UNMOUNT_GRIPPER.webm b/app/src/assets/videos/gripper-wizards/UNMOUNT_GRIPPER.webm index 9e2d894f6e3..d6b5d39bb3b 100644 Binary files a/app/src/assets/videos/gripper-wizards/UNMOUNT_GRIPPER.webm and b/app/src/assets/videos/gripper-wizards/UNMOUNT_GRIPPER.webm differ diff --git a/app/src/assets/videos/module_wizard_flows/HeaterShaker_PlaceAdapter_R.webm b/app/src/assets/videos/module_wizard_flows/HeaterShaker_PlaceAdapter_R.webm index e29ce967e70..1a8fcfe1f27 100644 Binary files a/app/src/assets/videos/module_wizard_flows/HeaterShaker_PlaceAdapter_R.webm and b/app/src/assets/videos/module_wizard_flows/HeaterShaker_PlaceAdapter_R.webm differ diff --git a/app/src/assets/videos/module_wizard_flows/TempModule_PlaceAdapter_R.webm b/app/src/assets/videos/module_wizard_flows/TempModule_PlaceAdapter_R.webm index fbf663c610c..d820f2de76c 100644 Binary files a/app/src/assets/videos/module_wizard_flows/TempModule_PlaceAdapter_R.webm and b/app/src/assets/videos/module_wizard_flows/TempModule_PlaceAdapter_R.webm differ diff --git a/app/src/assets/videos/pipette-wizard-flows/Pipette_Attach_96.webm b/app/src/assets/videos/pipette-wizard-flows/Pipette_Attach_96.webm index 3f219813708..d3486a97089 100644 Binary files a/app/src/assets/videos/pipette-wizard-flows/Pipette_Attach_96.webm and b/app/src/assets/videos/pipette-wizard-flows/Pipette_Attach_96.webm differ diff --git a/app/src/assets/videos/pipette-wizard-flows/Pipette_Detach_96.webm b/app/src/assets/videos/pipette-wizard-flows/Pipette_Detach_96.webm index a8625b78d95..386af577693 100644 Binary files a/app/src/assets/videos/pipette-wizard-flows/Pipette_Detach_96.webm and b/app/src/assets/videos/pipette-wizard-flows/Pipette_Detach_96.webm differ diff --git a/app/src/assets/videos/pipette-wizard-flows/Pipette_Detach_Probe_96.webm b/app/src/assets/videos/pipette-wizard-flows/Pipette_Detach_Probe_96.webm new file mode 100644 index 00000000000..867c290019e Binary files /dev/null and b/app/src/assets/videos/pipette-wizard-flows/Pipette_Detach_Probe_96.webm differ diff --git a/app/src/assets/videos/pipette-wizard-flows/Pipette_Probing_96.webm b/app/src/assets/videos/pipette-wizard-flows/Pipette_Probing_96.webm index d47971d3a8a..7b659291f8b 100644 Binary files a/app/src/assets/videos/pipette-wizard-flows/Pipette_Probing_96.webm and b/app/src/assets/videos/pipette-wizard-flows/Pipette_Probing_96.webm differ diff --git a/app/src/atoms/Banner/index.tsx b/app/src/atoms/Banner/index.tsx index b042f2dcb3d..aa7322d0372 100644 --- a/app/src/atoms/Banner/index.tsx +++ b/app/src/atoms/Banner/index.tsx @@ -49,28 +49,28 @@ const BANNER_PROPS_BY_TYPE: Record< > = { success: { icon: { name: 'check-circle' }, - backgroundColor: COLORS.successBackgroundLight, - color: COLORS.successEnabled, + backgroundColor: COLORS.green30, + color: COLORS.green60, }, error: { icon: { name: 'alert-circle' }, - backgroundColor: COLORS.errorBackgroundLight, - color: COLORS.errorEnabled, + backgroundColor: COLORS.red30, + color: COLORS.red60, }, warning: { icon: { name: 'alert-circle' }, - backgroundColor: COLORS.warningBackgroundLight, - color: COLORS.warningEnabled, + backgroundColor: COLORS.yellow30, + color: COLORS.yellow60, }, updating: { icon: { name: 'ot-spinner' }, - backgroundColor: COLORS.darkGreyDisabled, - color: COLORS.darkGreyEnabled, + backgroundColor: COLORS.grey30, + color: COLORS.grey60, }, informing: { icon: { name: 'information' }, - backgroundColor: COLORS.fundamentalsBackground, - color: COLORS.darkGreyEnabled, + backgroundColor: COLORS.blue30, + color: COLORS.blue60, }, } @@ -97,7 +97,6 @@ export function Banner(props: BannerProps): JSX.Element { color: BANNER_PROPS_BY_TYPE[type].color, } const BANNER_STYLE = css` - border: 1px ${BORDERS.styleSolid} ${BANNER_PROPS_BY_TYPE[type].color}; font-size: ${TYPOGRAPHY.fontSizeP}; font-weight: ${TYPOGRAPHY.fontWeightRegular}; border-radius: ${SPACING.spacing4}; @@ -105,8 +104,7 @@ export function Banner(props: BannerProps): JSX.Element { @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { font-size: 1.25rem; font-weight: ${TYPOGRAPHY.fontWeightSemiBold}; - border: none; - background-color: ${COLORS.yellow3}; + background-color: ${COLORS.yellow35}; border-radius: ${BORDERS.borderRadiusSize3}; line-height: 1.5rem; } diff --git a/app/src/atoms/Chip/Chip.stories.tsx b/app/src/atoms/Chip/Chip.stories.tsx index 1ac28f769a4..5b2c5704585 100644 --- a/app/src/atoms/Chip/Chip.stories.tsx +++ b/app/src/atoms/Chip/Chip.stories.tsx @@ -18,7 +18,7 @@ interface ChipStorybookProps extends React.ComponentProps { const Template: Story = ({ ...args }) => ( diff --git a/app/src/atoms/Chip/__tests__/Chip.test.tsx b/app/src/atoms/Chip/__tests__/Chip.test.tsx index e2d635ce238..4a9c7e4b5a7 100644 --- a/app/src/atoms/Chip/__tests__/Chip.test.tsx +++ b/app/src/atoms/Chip/__tests__/Chip.test.tsx @@ -19,8 +19,10 @@ describe('Chip', () => { const [{ getByTestId, getByText, queryByLabelText }] = render(props) const chip = getByTestId('Chip_basic') const chipText = getByText('mockBasic') - expect(chip).toHaveStyle(`background-color: ${COLORS.darkBlack20}`) - expect(chipText).toHaveStyle(`color: ${COLORS.darkBlack90}`) + expect(chip).toHaveStyle( + `background-color: ${COLORS.black90}${COLORS.opacity20HexCode}` + ) + expect(chipText).toHaveStyle(`color: ${COLORS.grey60}`) expect(queryByLabelText('icon_mockBasic')).not.toBeInTheDocument() }) @@ -32,11 +34,11 @@ describe('Chip', () => { const [{ getByTestId, getByText, getByLabelText }] = render(props) const chip = getByTestId('Chip_success') const chipText = getByText('mockSuccess') - expect(chip).toHaveStyle(`background-color: ${COLORS.green3}`) + expect(chip).toHaveStyle(`background-color: ${COLORS.green35}`) expect(chip).toHaveStyle(`border-radius: ${BORDERS.borderRadiusSize5}`) - expect(chipText).toHaveStyle(`color: ${COLORS.green1}`) + expect(chipText).toHaveStyle(`color: ${COLORS.green60}`) const icon = getByLabelText('icon_mockSuccess') - expect(icon).toHaveStyle(`color: ${COLORS.green1}`) + expect(icon).toHaveStyle(`color: ${COLORS.green60}`) }) it('should render text, icon, no bgcolor with success colors and bg false', () => { @@ -50,9 +52,9 @@ describe('Chip', () => { const chipText = getByText('mockSuccess') expect(chip).toHaveStyle(`background-color: ${COLORS.transparent}`) expect(chip).toHaveStyle(`border-radius: ${BORDERS.borderRadiusSize5}`) - expect(chipText).toHaveStyle(`color: ${COLORS.green1}`) + expect(chipText).toHaveStyle(`color: ${COLORS.green60}`) const icon = getByLabelText('icon_mockSuccess') - expect(icon).toHaveStyle(`color: ${COLORS.green1}`) + expect(icon).toHaveStyle(`color: ${COLORS.green60}`) }) it('should render text, icon, bgcolor with warning colors', () => { @@ -63,11 +65,11 @@ describe('Chip', () => { const [{ getByTestId, getByText, getByLabelText }] = render(props) const chip = getByTestId('Chip_warning') const chipText = getByText('mockWarning') - expect(chip).toHaveStyle(`background-color: ${COLORS.yellow3}`) + expect(chip).toHaveStyle(`background-color: ${COLORS.yellow35}`) expect(chip).toHaveStyle(`border-radius: ${BORDERS.borderRadiusSize5}`) - expect(chipText).toHaveStyle(`color: ${COLORS.yellow1}`) + expect(chipText).toHaveStyle(`color: ${COLORS.yellow60}`) const icon = getByLabelText('icon_mockWarning') - expect(icon).toHaveStyle(`color: ${COLORS.yellow1}`) + expect(icon).toHaveStyle(`color: ${COLORS.yellow60}`) }) it('should render text, icon, no bgcolor with warning colors and bg false', () => { @@ -81,9 +83,9 @@ describe('Chip', () => { const chipText = getByText('mockWarning') expect(chip).toHaveStyle(`background-color: ${String(COLORS.transparent)}`) expect(chip).toHaveStyle(`border-radius: ${BORDERS.borderRadiusSize5}`) - expect(chipText).toHaveStyle(`color: ${String(COLORS.yellow1)}`) + expect(chipText).toHaveStyle(`color: ${String(COLORS.yellow60)}`) const icon = getByLabelText('icon_mockWarning') - expect(icon).toHaveStyle(`color: ${String(COLORS.yellow1)}`) + expect(icon).toHaveStyle(`color: ${String(COLORS.yellow60)}`) }) it('should render text, icon, bgcolor with neutral colors', () => { @@ -94,11 +96,13 @@ describe('Chip', () => { const [{ getByTestId, getByText, getByLabelText }] = render(props) const chip = getByTestId('Chip_neutral') const chipText = getByText('mockNeutral') - expect(chip).toHaveStyle(`background-color: ${COLORS.darkBlack20}`) + expect(chip).toHaveStyle( + `background-color: ${COLORS.black90}${COLORS.opacity20HexCode}` + ) expect(chip).toHaveStyle(`border-radius: ${BORDERS.borderRadiusSize5}`) - expect(chipText).toHaveStyle(`color: ${COLORS.darkBlack70}`) + expect(chipText).toHaveStyle(`color: ${COLORS.grey60}`) const icon = getByLabelText('icon_mockNeutral') - expect(icon).toHaveStyle(`color: ${COLORS.darkBlack90}`) + expect(icon).toHaveStyle(`color: ${COLORS.grey60}`) }) it('should render text, icon, no bgcolor with neutral colors and bg false', () => { @@ -112,9 +116,9 @@ describe('Chip', () => { const chipText = getByText('mockNeutral') expect(chip).toHaveStyle(`background-color: ${COLORS.transparent}`) expect(chip).toHaveStyle(`border-radius: ${BORDERS.borderRadiusSize5}`) - expect(chipText).toHaveStyle(`color: ${COLORS.darkBlack70}`) + expect(chipText).toHaveStyle(`color: ${COLORS.grey60}`) const icon = getByLabelText('icon_mockNeutral') - expect(icon).toHaveStyle(`color: ${COLORS.darkBlack90}`) + expect(icon).toHaveStyle(`color: ${COLORS.grey60}`) }) it('should render text, icon, bgcolor with error colors', () => { @@ -125,11 +129,11 @@ describe('Chip', () => { const [{ getByTestId, getByText, getByLabelText }] = render(props) const chip = getByTestId('Chip_error') const chipText = getByText('mockError') - expect(chip).toHaveStyle(`background-color: ${COLORS.red3}`) + expect(chip).toHaveStyle(`background-color: ${COLORS.red35}`) expect(chip).toHaveStyle(`border-radius: ${BORDERS.borderRadiusSize5}`) - expect(chipText).toHaveStyle(`color: ${COLORS.red1}`) + expect(chipText).toHaveStyle(`color: ${COLORS.red60}`) const icon = getByLabelText('icon_mockError') - expect(icon).toHaveStyle(`color: ${COLORS.red1}`) + expect(icon).toHaveStyle(`color: ${COLORS.red60}`) }) it('should render text, icon, no bgcolor with error colors and bg false', () => { @@ -143,8 +147,8 @@ describe('Chip', () => { const chipText = getByText('mockError') expect(chip).toHaveStyle(`background-color: ${COLORS.transparent}`) expect(chip).toHaveStyle(`border-radius: ${BORDERS.borderRadiusSize5}`) - expect(chipText).toHaveStyle(`color: ${COLORS.red1}`) + expect(chipText).toHaveStyle(`color: ${COLORS.red60}`) const icon = getByLabelText('icon_mockError') - expect(icon).toHaveStyle(`color: ${COLORS.red1}`) + expect(icon).toHaveStyle(`color: ${COLORS.red60}`) }) }) diff --git a/app/src/atoms/Chip/index.tsx b/app/src/atoms/Chip/index.tsx index 2b5523649b9..5a6f16a0418 100644 --- a/app/src/atoms/Chip/index.tsx +++ b/app/src/atoms/Chip/index.tsx @@ -39,34 +39,34 @@ const CHIP_PROPS_BY_TYPE: Record< } > = { basic: { - backgroundColor: COLORS.darkBlack20, + backgroundColor: `${COLORS.black90}${COLORS.opacity20HexCode}`, borderRadius: BORDERS.borderRadiusSize1, - textColor: COLORS.darkBlack90, + textColor: COLORS.grey60, }, error: { - backgroundColor: COLORS.red3, + backgroundColor: COLORS.red35, borderRadius: BORDERS.borderRadiusSize5, - iconColor: COLORS.red1, - textColor: COLORS.red1, + iconColor: COLORS.red60, + textColor: COLORS.red60, }, neutral: { - backgroundColor: COLORS.darkBlack20, + backgroundColor: `${COLORS.black90}${COLORS.opacity20HexCode}`, borderRadius: BORDERS.borderRadiusSize5, - iconColor: COLORS.darkBlack90, - textColor: COLORS.darkBlack70, + iconColor: COLORS.grey60, + textColor: COLORS.grey60, }, success: { - backgroundColor: COLORS.green3, + backgroundColor: COLORS.green35, borderRadius: BORDERS.borderRadiusSize5, - iconColor: COLORS.green1, + iconColor: COLORS.green60, iconName: 'ot-check', - textColor: COLORS.green1, + textColor: COLORS.green60, }, warning: { - backgroundColor: COLORS.yellow3, + backgroundColor: COLORS.yellow35, borderRadius: BORDERS.borderRadiusSize5, - iconColor: COLORS.yellow1, - textColor: COLORS.yellow1, + iconColor: COLORS.yellow60, + textColor: COLORS.yellow60, }, } diff --git a/app/src/atoms/GlobalStyle/index.ts b/app/src/atoms/GlobalStyle/index.ts index e39c351fbe6..9d9abf9882b 100644 --- a/app/src/atoms/GlobalStyle/index.ts +++ b/app/src/atoms/GlobalStyle/index.ts @@ -25,7 +25,7 @@ export const GlobalStyle = createGlobalStyle<{ isOnDevice?: boolean }>` body { width: 100%; height: 100%; - color: ${COLORS.darkBlackEnabled}; + color: ${COLORS.black90}; } a { diff --git a/app/src/atoms/InlineNotification/index.tsx b/app/src/atoms/InlineNotification/index.tsx index 3367104392b..a92492d7c46 100644 --- a/app/src/atoms/InlineNotification/index.tsx +++ b/app/src/atoms/InlineNotification/index.tsx @@ -36,23 +36,23 @@ const INLINE_NOTIFICATION_PROPS_BY_TYPE: Record< > = { alert: { icon: { name: 'ot-alert' }, - backgroundColor: COLORS.yellow3, - color: COLORS.yellow2, + backgroundColor: COLORS.yellow30, + color: COLORS.yellow60, }, error: { icon: { name: 'ot-alert' }, - backgroundColor: COLORS.red3, - color: COLORS.red2, + backgroundColor: COLORS.red30, + color: COLORS.red60, }, neutral: { icon: { name: 'information' }, - backgroundColor: COLORS.darkBlack20, - color: COLORS.darkBlackEnabled, + backgroundColor: COLORS.grey30, + color: COLORS.grey60, }, success: { icon: { name: 'ot-check' }, - backgroundColor: COLORS.green3, - color: COLORS.green2, + backgroundColor: COLORS.green30, + color: COLORS.green60, }, } diff --git a/app/src/atoms/InputField/index.tsx b/app/src/atoms/InputField/index.tsx index 58eb8945db3..7ffb71119d2 100644 --- a/app/src/atoms/InputField/index.tsx +++ b/app/src/atoms/InputField/index.tsx @@ -71,7 +71,7 @@ export function InputField(props: InputFieldProps): JSX.Element { lineHeight={1} fontSize={TYPOGRAPHY.fontSizeP} fontWeight={TYPOGRAPHY.fontWeightRegular} - color={props.error != null ? COLOR_WARNING_DARK : COLORS.darkBlackEnabled} + color={props.error != null ? COLOR_WARNING_DARK : COLORS.black90} opacity={props.disabled ?? false ? 0.5 : ''} > @@ -89,17 +89,16 @@ function Input(props: InputFieldProps): JSX.Element { background-color: ${COLORS.white}; border-radius: ${SPACING.spacing4}; padding: ${SPACING.spacing8}; - border: 1px ${BORDERS.styleSolid} - ${error ? COLORS.errorEnabled : COLORS.medGreyEnabled}; + border: 1px ${BORDERS.styleSolid} ${error ? COLORS.red50 : COLORS.grey50}; font-size: ${TYPOGRAPHY.fontSizeP}; &:active { - border: 1px ${BORDERS.styleSolid} ${COLORS.darkGreyEnabled}; + border: 1px ${BORDERS.styleSolid} ${COLORS.grey50}; } & input { border-radius: inherit; - color: ${COLORS.darkBlackEnabled}; + color: ${COLORS.black90}; border: none; flex: 1 1 auto; width: 100%; @@ -110,14 +109,15 @@ function Input(props: InputFieldProps): JSX.Element { } &:hover { - border: 1px ${BORDERS.styleSolid} - ${error ? COLORS.errorEnabled : COLORS.medGreyHover}; + border: 1px ${BORDERS.styleSolid} ${error ? COLORS.red50 : COLORS.grey60}; + outline: 2px ${BORDERS.styleSolid} ${COLORS.blue50}; + outline-offset: 3px; } &:focus { - border: 1px ${BORDERS.styleSolid} ${COLORS.blueEnabled}; + border: 1px ${BORDERS.styleSolid} ${error ? COLORS.red50 : COLORS.grey60}; } &:disabled { - border: 1px ${BORDERS.styleSolid} ${COLORS.darkGreyDisabled}; + border: 1px ${BORDERS.styleSolid} ${COLORS.grey30}; } input[type='number']::-webkit-inner-spin-button, input[type='number']::-webkit-outer-spin-button { @@ -134,10 +134,10 @@ function Input(props: InputFieldProps): JSX.Element { ` const ERROR_TEXT_STYLE = css` - color: ${COLORS.errorEnabled}; + color: ${COLORS.red50}; @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { font-size: ${TYPOGRAPHY.fontSize22}; - color: ${COLORS.red2}; + color: ${COLORS.red50}; } ` @@ -155,7 +155,7 @@ function Input(props: InputFieldProps): JSX.Element { display={DISPLAY_INLINE_BLOCK} textAlign={TEXT_ALIGN_RIGHT} alignSelf={ALIGN_CENTER} - color={COLORS.darkGreyEnabled} + color={props.disabled ? COLORS.grey40 : COLORS.grey50} fontSize={TYPOGRAPHY.fontSizeLabel} > {props.units} @@ -163,7 +163,7 @@ function Input(props: InputFieldProps): JSX.Element { )} > = args => ( - + ) diff --git a/app/src/atoms/Link/__tests__/ExternalLink.test.tsx b/app/src/atoms/Link/__tests__/ExternalLink.test.tsx index a4bbd1ab0e8..6158ecf69b3 100644 --- a/app/src/atoms/Link/__tests__/ExternalLink.test.tsx +++ b/app/src/atoms/Link/__tests__/ExternalLink.test.tsx @@ -25,7 +25,7 @@ describe('ExternalLink', () => { const link = getByText('Test Link') expect(link).toHaveAttribute('href', 'https://opentrons.com') expect(link).toHaveAttribute('target', '_blank') - expect(link).toHaveStyle(`color: ${String(COLORS.blueEnabled)}`) + expect(link).toHaveStyle(`color: ${COLORS.blue55}`) }) it('renders open-in-new icon', () => { diff --git a/app/src/atoms/ListItem/__tests__/ListItem.test.tsx b/app/src/atoms/ListItem/__tests__/ListItem.test.tsx index 0f17babdf1b..8f1d1a0ea69 100644 --- a/app/src/atoms/ListItem/__tests__/ListItem.test.tsx +++ b/app/src/atoms/ListItem/__tests__/ListItem.test.tsx @@ -26,7 +26,7 @@ describe('ListItem', () => { const [{ getByText, getByTestId }] = render(props) getByText('mock listitem content') const listItem = getByTestId('ListItem_error') - expect(listItem).toHaveStyle(`backgroundColor: ${COLORS.red3}`) + expect(listItem).toHaveStyle(`backgroundColor: ${COLORS.red35}`) expect(listItem).toHaveStyle( `padding: ${SPACING.spacing16} ${SPACING.spacing24}` ) @@ -37,7 +37,7 @@ describe('ListItem', () => { const [{ getByText, getByTestId }] = render(props) getByText('mock listitem content') const listItem = getByTestId('ListItem_noActive') - expect(listItem).toHaveStyle(`backgroundColor: ${COLORS.light1}`) + expect(listItem).toHaveStyle(`backgroundColor: ${COLORS.grey35}`) expect(listItem).toHaveStyle( `padding: ${SPACING.spacing16} ${SPACING.spacing24}` ) @@ -48,7 +48,7 @@ describe('ListItem', () => { const [{ getByText, getByTestId }] = render(props) getByText('mock listitem content') const listItem = getByTestId('ListItem_success') - expect(listItem).toHaveStyle(`backgroundColor: ${COLORS.green3}`) + expect(listItem).toHaveStyle(`backgroundColor: ${COLORS.green35}`) expect(listItem).toHaveStyle( `padding: ${SPACING.spacing16} ${SPACING.spacing24}` ) @@ -59,7 +59,7 @@ describe('ListItem', () => { const [{ getByText, getByTestId }] = render(props) getByText('mock listitem content') const listItem = getByTestId('ListItem_warning') - expect(listItem).toHaveStyle(`backgroundColor: ${COLORS.yellow3}`) + expect(listItem).toHaveStyle(`backgroundColor: ${COLORS.yellow35}`) expect(listItem).toHaveStyle( `padding: ${SPACING.spacing16} ${SPACING.spacing24}` ) diff --git a/app/src/atoms/ListItem/index.tsx b/app/src/atoms/ListItem/index.tsx index 1ce33bb9cb2..741ce9233c1 100644 --- a/app/src/atoms/ListItem/index.tsx +++ b/app/src/atoms/ListItem/index.tsx @@ -18,16 +18,16 @@ const LISTITEM_PROPS_BY_TYPE: Record< { backgroundColor: string } > = { error: { - backgroundColor: COLORS.red3, + backgroundColor: COLORS.red35, }, noActive: { - backgroundColor: COLORS.light1, + backgroundColor: COLORS.grey35, }, success: { - backgroundColor: COLORS.green3, + backgroundColor: COLORS.green35, }, warning: { - backgroundColor: COLORS.yellow3, + backgroundColor: COLORS.yellow35, }, } diff --git a/app/src/atoms/MenuList/MenuItem.tsx b/app/src/atoms/MenuList/MenuItem.tsx index 603be766a31..a91e64321e7 100644 --- a/app/src/atoms/MenuList/MenuItem.tsx +++ b/app/src/atoms/MenuList/MenuItem.tsx @@ -16,18 +16,21 @@ export const MenuItem = styled.button` text-align: ${TYPOGRAPHY.textAlignLeft}; font-size: ${TYPOGRAPHY.fontSizeP}; background-color: ${COLORS.transparent}; - color: ${COLORS.darkBlackEnabled}; + color: ${COLORS.black90}; padding: ${SPACING.spacing8} ${SPACING.spacing12} ${SPACING.spacing8} ${SPACING.spacing12}; - &:hover, + &:hover { + background-color: ${COLORS.grey10}; + } + &:active { - background-color: ${COLORS.lightBlue}; + background-color: ${COLORS.grey30}; } &:disabled { background-color: ${COLORS.transparent}; - color: ${COLORS.black}${COLORS.opacity50HexCode}; + color: ${COLORS.grey40}; } @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { @@ -35,22 +38,21 @@ export const MenuItem = styled.button` text-align: ${TYPOGRAPHY.textAlignCenter}; font-size: ${TYPOGRAPHY.fontSize28}; background-color: ${({ isAlert }) => - isAlert ? COLORS.errorEnabled : COLORS.transparent}; - color: ${({ isAlert }) => - isAlert ? COLORS.white : COLORS.darkBlackEnabled}; + isAlert ? COLORS.red50 : COLORS.transparent}; + color: ${({ isAlert }) => (isAlert ? COLORS.white : COLORS.black90)}; padding: ${SPACING.spacing24}; height: 5.5rem; line-height: ${TYPOGRAPHY.lineHeight36}; &:hover, &:active { background-color: ${({ isAlert }) => - isAlert ? COLORS.errorEnabled : COLORS.darkBlack20}; + isAlert ? COLORS.red50 : COLORS.grey35}; } &:disabled { background-color: ${({ isAlert }) => - isAlert ? COLORS.errorEnabled : COLORS.transparent}; - color: ${({ isAlert }) => (isAlert ? COLORS.white : COLORS.darkBlack60)}; + isAlert ? COLORS.red50 : COLORS.transparent}; + color: ${({ isAlert }) => (isAlert ? COLORS.white : COLORS.grey50)}; } } ` diff --git a/app/src/atoms/MenuList/OverflowBtn.tsx b/app/src/atoms/MenuList/OverflowBtn.tsx index c1acb16d2be..a6be9e28ca8 100644 --- a/app/src/atoms/MenuList/OverflowBtn.tsx +++ b/app/src/atoms/MenuList/OverflowBtn.tsx @@ -14,33 +14,33 @@ export const OverflowBtn = React.forwardRef( max-height: ${SPACING.spacing32}; &:hover { - background-color: ${COLORS.lightGreyHover}; + background-color: ${COLORS.grey30}; } &:hover circle { - fill: ${COLORS.darkBlackEnabled}; + fill: ${COLORS.black90}; } &:active, &:focus { - background-color: ${COLORS.lightGreyPressed}; + background-color: ${COLORS.grey35}; } &:active circle, &:focus circle { - fill: ${COLORS.darkGreyPressed}; + fill: ${COLORS.grey60}; } &:focus-visible { - box-shadow: ${`0 0 0 3px ${COLORS.warningEnabled}`}; + box-shadow: ${`0 0 0 3px ${COLORS.blue50}`}; background-color: ${'transparent'}; } &:focus-visible circle { - fill: ${COLORS.darkGreyHover}; + fill: ${COLORS.grey60}; } &:disabled circle { - fill: ${COLORS.successDisabled}; + fill: ${COLORS.grey40}; } &:disabled { background-color: transparent; @@ -53,7 +53,7 @@ export const OverflowBtn = React.forwardRef( width="19" height="31" viewBox="0 0 19 31" - fill={COLORS.darkGreyEnabled} + fill={COLORS.grey50} xmlns="http://www.w3.org/2000/svg" > diff --git a/app/src/atoms/MenuList/__tests__/MenuList.test.tsx b/app/src/atoms/MenuList/__tests__/MenuList.test.tsx index 6540c619540..dde6e9a3f3d 100644 --- a/app/src/atoms/MenuList/__tests__/MenuList.test.tsx +++ b/app/src/atoms/MenuList/__tests__/MenuList.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { MenuList } from '..' @@ -17,8 +18,8 @@ describe('MenuList', () => { }) it('renders a child not on device', () => { - const { getByText } = render(props) - getByText('mockBtn') + render(props) + screen.getByText('mockBtn') }) it('renders isOnDevice child, clicking background overlay calls onClick', () => { props = { @@ -26,8 +27,8 @@ describe('MenuList', () => { isOnDevice: true, onClick: jest.fn(), } - const { getByLabelText } = render(props) - getByLabelText('BackgroundOverlay_ModalShell').click() + render(props) + fireEvent.click(screen.getByLabelText('BackgroundOverlay_ModalShell')) expect(props.onClick).toHaveBeenCalled() }) }) diff --git a/app/src/atoms/MenuList/__tests__/OverflowBtn.test.tsx b/app/src/atoms/MenuList/__tests__/OverflowBtn.test.tsx index 9e8f0945d7b..a4066b29700 100644 --- a/app/src/atoms/MenuList/__tests__/OverflowBtn.test.tsx +++ b/app/src/atoms/MenuList/__tests__/OverflowBtn.test.tsx @@ -1,6 +1,6 @@ +import 'jest-styled-components' import * as React from 'react' import { fireEvent } from '@testing-library/react' -import 'jest-styled-components' import { COLORS, renderWithProviders } from '@opentrons/components' import { OverflowBtn } from '../OverflowBtn' @@ -27,7 +27,7 @@ describe('OverflowBtn', () => { expect(getByRole('button')).toHaveStyleRule( 'background-color', - `${String(COLORS.lightGreyHover)}`, + `${String(COLORS.grey30)}`, { modifier: ':hover', } @@ -41,7 +41,7 @@ describe('OverflowBtn', () => { expect(getByRole('button')).toHaveStyleRule( 'background-color', - `${String(COLORS.lightGreyPressed)}`, + `${String(COLORS.grey35)}`, { modifier: ':active', } @@ -55,7 +55,7 @@ describe('OverflowBtn', () => { expect(getByRole('button')).toHaveStyleRule( 'box-shadow', - `0 0 0 3px ${String(COLORS.fundamentalsFocus)}`, + `0 0 0 3px ${String(COLORS.blue50)}`, { modifier: ':focus-visible', } @@ -69,7 +69,7 @@ describe('OverflowBtn', () => { expect(getByRole('button')).toHaveStyleRule( 'fill', - `${String(COLORS.successDisabled)}`, + `${String(COLORS.grey40)}`, { modifier: ':disabled circle', } diff --git a/app/src/atoms/MenuList/index.tsx b/app/src/atoms/MenuList/index.tsx index 6e39e3b0b1c..4d06e8f5de5 100644 --- a/app/src/atoms/MenuList/index.tsx +++ b/app/src/atoms/MenuList/index.tsx @@ -21,7 +21,7 @@ export const MenuList = (props: MenuListProps): JSX.Element | null => { return isOnDevice && onClick != null ? ( > = args => { {'Add 5% to the current progress every 0.2 sec'} diff --git a/app/src/atoms/ProgressBar/__tests__/ProgressBar.test.tsx b/app/src/atoms/ProgressBar/__tests__/ProgressBar.test.tsx index a02a016d04c..9554d3d27a4 100644 --- a/app/src/atoms/ProgressBar/__tests__/ProgressBar.test.tsx +++ b/app/src/atoms/ProgressBar/__tests__/ProgressBar.test.tsx @@ -32,7 +32,7 @@ describe('ProgressBar', () => { props.percentComplete = 50 const [{ getByTestId }] = render(props) const bar = getByTestId('ProgressBar_Bar') - expect(bar).toHaveStyle(`background: ${COLORS.blueEnabled}`) + expect(bar).toHaveStyle(`background: ${COLORS.blue50}`) expect(bar).toHaveStyle('width: 50%') }) @@ -40,19 +40,19 @@ describe('ProgressBar', () => { props.percentComplete = 100 const [{ getByTestId }] = render(props) const bar = getByTestId('ProgressBar_Bar') - expect(bar).toHaveStyle(`background: ${COLORS.blueEnabled}`) + expect(bar).toHaveStyle(`background: ${COLORS.blue50}`) expect(bar).toHaveStyle('width: 100%') }) it('renders LinerProgress Bar at 50% + red width', () => { props.percentComplete = 50 props.innerStyles = css` - background: ${COLORS.errorEnabled}; + background: ${COLORS.red50}; ` const [{ getByTestId }] = render(props) const bar = getByTestId('ProgressBar_Bar') - expect(bar).not.toHaveStyle(`background: ${COLORS.blueEnabled}`) - expect(bar).toHaveStyle(`background: ${COLORS.errorEnabled}`) + expect(bar).not.toHaveStyle(`background: ${COLORS.blue50}`) + expect(bar).toHaveStyle(`background: ${COLORS.red50}`) expect(bar).toHaveStyle('width: 50%') }) }) diff --git a/app/src/atoms/ProgressBar/index.tsx b/app/src/atoms/ProgressBar/index.tsx index 6450d602612..01054384094 100644 --- a/app/src/atoms/ProgressBar/index.tsx +++ b/app/src/atoms/ProgressBar/index.tsx @@ -38,7 +38,7 @@ export function ProgressBar({ const LINER_PROGRESS_FILLER_STYLE = css` height: 0.5rem; width: ${progress}; - background: ${COLORS.blueEnabled}; + background: ${COLORS.blue50}; transition: width 0.5s ease-in-out; webkit-transition: width 0.5s ease-in-out; moz-transition: width 0.5s ease-in-out; diff --git a/app/src/atoms/SelectField/Select.tsx b/app/src/atoms/SelectField/Select.tsx index c24729f3d25..670fcc5be34 100644 --- a/app/src/atoms/SelectField/Select.tsx +++ b/app/src/atoms/SelectField/Select.tsx @@ -43,15 +43,15 @@ export function Select(props: SelectComponentProps): JSX.Element { border: BORDERS.lineBorder, width: props.width != null ? props.width : 'auto', height: SPACING.spacing16, - borderColor: COLORS.medGreyEnabled, + borderColor: COLORS.grey30, boxShadow: 'none', padding: SPACING.spacing6, flexDirection: DIRECTION_ROW, '&:hover': { - borderColor: COLORS.medGreyHover, + borderColor: COLORS.grey60, }, '&:active': { - borderColor: COLORS.medGreyHover, + borderColor: COLORS.grey60, }, }), container: (styles: CSSObjectWithLabel) => ({ @@ -62,7 +62,7 @@ export function Select(props: SelectComponentProps): JSX.Element { group: NO_STYLE_FN, groupHeading: (styles: CSSObjectWithLabel) => ({ ...styles, - color: COLORS.darkBlackEnabled, + color: COLORS.black90, fontWeight: TYPOGRAPHY.fontWeightSemiBold, fontSize: TYPOGRAPHY.fontSizeP, }), @@ -102,27 +102,23 @@ export function Select(props: SelectComponentProps): JSX.Element { noOptionsMessage: (styles: CSSObjectWithLabel) => ({ ...styles, padding: SPACING.spacing6, - color: COLORS.darkBlackEnabled, + color: COLORS.black90, }), option: (styles: CSSObjectWithLabel, state: OptionProps) => ({ ...styles, - color: Boolean(state.isDisabled) - ? COLORS.darkGreyDisabled - : COLORS.darkBlackEnabled, - backgroundColor: Boolean(state.isSelected) - ? COLORS.lightBlue - : COLORS.white, + color: Boolean(state.isDisabled) ? COLORS.grey30 : COLORS.black90, + backgroundColor: Boolean(state.isSelected) ? COLORS.blue10 : COLORS.white, '&:hover': { - backgroundColor: COLORS.lightBlue, + backgroundColor: COLORS.blue10, }, '&:active': { - backgroundColor: COLORS.lightBlue, + backgroundColor: COLORS.blue10, }, }), placeholder: (styles: CSSObjectWithLabel) => ({ ...styles, marginLeft: SPACING.spacing8, - color: COLORS.darkBlackEnabled, + color: COLORS.black90, fontSize: TYPOGRAPHY.fontSizeP, marginTop: '0.2rem', }), diff --git a/app/src/atoms/SelectField/index.tsx b/app/src/atoms/SelectField/index.tsx index 1ec659acbe5..646ecd60378 100644 --- a/app/src/atoms/SelectField/index.tsx +++ b/app/src/atoms/SelectField/index.tsx @@ -45,7 +45,7 @@ export interface SelectFieldProps { const CAPTION_STYLE = css` font-size: ${TYPOGRAPHY.fontSizeCaption}; &.error { - color: ${COLORS.errorEnabled}; + color: ${COLORS.red50}; font-weight: ${TYPOGRAPHY.fontWeightSemiBold}; } ` diff --git a/app/src/atoms/Skeleton/index.tsx b/app/src/atoms/Skeleton/index.tsx index 2513d21e1a0..69890ee621f 100644 --- a/app/src/atoms/Skeleton/index.tsx +++ b/app/src/atoms/Skeleton/index.tsx @@ -16,9 +16,9 @@ export const Skeleton = (props: SkeletonProps): JSX.Element => { animation: shimmer 2s infinite linear; background: linear-gradient( to right, - ${COLORS.medGreyEnabled} 1%, + ${COLORS.grey30} 1%, #e3e3e366 25%, - ${COLORS.medGreyEnabled} 40% + ${COLORS.grey30} 40% ); background-size: ${backgroundSize}; width: ${width}; diff --git a/app/src/atoms/SleepScreen/__tests__/SleepScreen.test.tsx b/app/src/atoms/SleepScreen/__tests__/SleepScreen.test.tsx index 08ceb7a2c1c..ed29909fc9c 100644 --- a/app/src/atoms/SleepScreen/__tests__/SleepScreen.test.tsx +++ b/app/src/atoms/SleepScreen/__tests__/SleepScreen.test.tsx @@ -14,6 +14,6 @@ describe('SleepScreen', () => { const touchScreen = getByTestId('Touchscreen_SleepScreen') expect(touchScreen).toHaveStyle('width: 100vw') expect(touchScreen).toHaveStyle('height: 100vh') - expect(touchScreen).toHaveStyle(`background-color: ${COLORS.black}`) + expect(touchScreen).toHaveStyle(`background-color: ${COLORS.black90}`) }) }) diff --git a/app/src/atoms/SleepScreen/index.tsx b/app/src/atoms/SleepScreen/index.tsx index c1e4ba0a96c..2600f9d2de9 100644 --- a/app/src/atoms/SleepScreen/index.tsx +++ b/app/src/atoms/SleepScreen/index.tsx @@ -7,7 +7,7 @@ export function SleepScreen(): JSX.Element { ) diff --git a/app/src/atoms/Slideout/Slideout.stories.tsx b/app/src/atoms/Slideout/Slideout.stories.tsx index 5d0823c2577..63cdf2adae4 100644 --- a/app/src/atoms/Slideout/Slideout.stories.tsx +++ b/app/src/atoms/Slideout/Slideout.stories.tsx @@ -26,7 +26,7 @@ const Children = ( diff --git a/app/src/atoms/Slideout/index.tsx b/app/src/atoms/Slideout/index.tsx index fc8e137ae66..57d20e1de50 100644 --- a/app/src/atoms/Slideout/index.tsx +++ b/app/src/atoms/Slideout/index.tsx @@ -1,18 +1,19 @@ import * as React from 'react' import { css } from 'styled-components' import { + ALIGN_CENTER, Box, - Flex, - DIRECTION_ROW, - DIRECTION_COLUMN, Btn, + COLORS, + DIRECTION_COLUMN, + DIRECTION_ROW, + Flex, Icon, - SPACING, JUSTIFY_SPACE_BETWEEN, - ALIGN_CENTER, - COLORS, + OVERFLOW_WRAP_ANYWHERE, Overlay, POSITION_FIXED, + SPACING, TYPOGRAPHY, } from '@opentrons/components' @@ -30,7 +31,6 @@ export interface SlideoutProps { const SHARED_STYLE = css` z-index: 2; - overflow: hidden; @keyframes slidein { from { transform: translateX(100%); @@ -73,32 +73,37 @@ const EXPANDED_STYLE = css` const COLLAPSED_STYLE = css` ${SHARED_STYLE} animation: slideout 300ms forwards; + overflow: hidden; ` const INITIALLY_COLLAPSED_STYLE = css` ${SHARED_STYLE} animation: slideout 0ms forwards; + overflow: hidden; ` const OVERLAY_IN_STYLE = css` ${SHARED_STYLE} animation: overlayin 300ms forwards; + overflow: hidden; ` const OVERLAY_OUT_STYLE = css` ${SHARED_STYLE} animation: overlayout 300ms forwards; + overflow: hidden; ` const INITIALLY_OVERLAY_OUT_STYLE = css` ${SHARED_STYLE} animation: overlayout 0ms forwards; + overflow: hidden; ` const CLOSE_ICON_STYLE = css` border-radius: 50%; &:hover { - background: ${COLORS.lightGreyHover}; + background: ${COLORS.grey30}; } &:active { - background: ${COLORS.lightGreyPressed}; + background: ${COLORS.grey35}; } ` @@ -133,6 +138,7 @@ export const Slideout = (props: SlideoutProps): JSX.Element => { const overlayOutStyle = hasBeenExpanded.current ? OVERLAY_OUT_STYLE : INITIALLY_OVERLAY_OUT_STYLE + return ( <> { css={` ${isExpanded ?? false ? OVERLAY_IN_STYLE : overlayOutStyle} `} - backgroundColor={COLORS.darkBlackEnabled} + backgroundColor={COLORS.black90} /> { > @@ -181,9 +187,7 @@ export const Slideout = (props: SlideoutProps): JSX.Element => { size="1.5rem" onClick={handleClose} aria-label="exit" - data-testid={`Slideout_icon_close_${ - typeof title === 'string' ? title : '' - }`} + data-testid={`Slideout_icon_close_${title}`} > @@ -192,7 +196,7 @@ export const Slideout = (props: SlideoutProps): JSX.Element => { ) : ( <>{title} )} - + ) => { } describe('CustomKeyboard', () => { - let props: React.ComponentProps - - beforeEach(() => { + it('should render the custom keyboards lower case', () => { const { result } = renderHook(() => React.useRef(null)) - props = { + const props = { onChange: jest.fn(), keyboardRef: result.current, } - }) - - it('should render the custom keyboards lower case', () => { const { getAllByRole } = render(props) const buttons = getAllByRole('button') const expectedButtonNames = [ @@ -59,6 +53,11 @@ describe('CustomKeyboard', () => { }) }) it('should render the custom keyboards upper case, when clicking shift key', () => { + const { result } = renderHook(() => React.useRef(null)) + const props = { + onChange: jest.fn(), + keyboardRef: result.current, + } const { getByRole, getAllByRole } = render(props) const shiftKey = getByRole('button', { name: 'SHIFT' }) fireEvent.click(shiftKey) @@ -102,6 +101,11 @@ describe('CustomKeyboard', () => { }) it('should render the custom keyboards numbers, when clicking number key', () => { + const { result } = renderHook(() => React.useRef(null)) + const props = { + onChange: jest.fn(), + keyboardRef: result.current, + } const { getByRole, getAllByRole } = render(props) const numberKey = getByRole('button', { name: '123' }) fireEvent.click(numberKey) @@ -127,6 +131,11 @@ describe('CustomKeyboard', () => { }) it('should render the custom keyboards lower case, when clicking number key then abc key', () => { + const { result } = renderHook(() => React.useRef(null)) + const props = { + onChange: jest.fn(), + keyboardRef: result.current, + } const { getByRole } = render(props) const numberKey = getByRole('button', { name: '123' }) getByRole('button', { name: 'a' }) diff --git a/app/src/atoms/SoftwareKeyboard/CustomKeyboard/index.css b/app/src/atoms/SoftwareKeyboard/CustomKeyboard/index.css index 1a8090ed878..f3e0b6cdd54 100644 --- a/app/src/atoms/SoftwareKeyboard/CustomKeyboard/index.css +++ b/app/src/atoms/SoftwareKeyboard/CustomKeyboard/index.css @@ -3,7 +3,7 @@ .simple-keyboard.oddTheme1.hg-theme-default { width: 100%; height: 100%; - background-color: #d0d0d0; + background-color: #cbcccc; /* grey35 */ font-family: 'Public Sans', sans-serif; padding: 8px; font-size: 28px; diff --git a/app/src/atoms/SoftwareKeyboard/NormalKeyboard/NormalKeyboard.stories.tsx b/app/src/atoms/SoftwareKeyboard/NormalKeyboard/NormalKeyboard.stories.tsx index 65a236ea1c9..87a01d919d5 100644 --- a/app/src/atoms/SoftwareKeyboard/NormalKeyboard/NormalKeyboard.stories.tsx +++ b/app/src/atoms/SoftwareKeyboard/NormalKeyboard/NormalKeyboard.stories.tsx @@ -8,6 +8,8 @@ import { import { touchScreenViewport } from '../../../DesignTokens/constants' import { InputField } from '../../InputField' import { NormalKeyboard } from '.' +import '../../../styles.global.css' + import type { Story, Meta } from '@storybook/react' export default { diff --git a/app/src/atoms/SoftwareKeyboard/NormalKeyboard/__tests__/NormalKeyboard.test.tsx b/app/src/atoms/SoftwareKeyboard/NormalKeyboard/__tests__/NormalKeyboard.test.tsx index 41cac3e2056..e578584ad11 100644 --- a/app/src/atoms/SoftwareKeyboard/NormalKeyboard/__tests__/NormalKeyboard.test.tsx +++ b/app/src/atoms/SoftwareKeyboard/NormalKeyboard/__tests__/NormalKeyboard.test.tsx @@ -1,6 +1,5 @@ import * as React from 'react' -import { fireEvent } from '@testing-library/react' -import { renderHook } from '@testing-library/react-hooks' +import { fireEvent, renderHook } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { NormalKeyboard } from '..' @@ -9,16 +8,12 @@ const render = (props: React.ComponentProps) => { } describe('SoftwareKeyboard', () => { - let props: React.ComponentProps - - beforeEach(() => { + it('should render the software keyboards', () => { const { result } = renderHook(() => React.useRef(null)) - props = { + const props = { onChange: jest.fn(), keyboardRef: result.current, } - }) - it('should render the software keyboards', () => { const { getAllByRole } = render(props) const buttons = getAllByRole('button') @@ -62,6 +57,11 @@ describe('SoftwareKeyboard', () => { }) it('should render the software keyboards when hitting shift key', () => { + const { result } = renderHook(() => React.useRef(null)) + const props = { + onChange: jest.fn(), + keyboardRef: result.current, + } const { getAllByRole, getByRole } = render(props) const shiftKey = getByRole('button', { name: 'SHIFT' }) fireEvent.click(shiftKey) @@ -106,6 +106,11 @@ describe('SoftwareKeyboard', () => { }) it('should render the software keyboards when hitting 123 key', () => { + const { result } = renderHook(() => React.useRef(null)) + const props = { + onChange: jest.fn(), + keyboardRef: result.current, + } const { getAllByRole, getByRole } = render(props) const numberKey = getByRole('button', { name: '123' }) fireEvent.click(numberKey) @@ -149,6 +154,11 @@ describe('SoftwareKeyboard', () => { }) it('should render the software keyboards when hitting #+= key', () => { + const { result } = renderHook(() => React.useRef(null)) + const props = { + onChange: jest.fn(), + keyboardRef: result.current, + } const { getAllByRole, getByRole } = render(props) const numberKey = getByRole('button', { name: '123' }) fireEvent.click(numberKey) @@ -194,6 +204,11 @@ describe('SoftwareKeyboard', () => { }) it('should call mock function when clicking a key', () => { + const { result } = renderHook(() => React.useRef(null)) + const props = { + onChange: jest.fn(), + keyboardRef: result.current, + } const { getByRole } = render(props) const aKey = getByRole('button', { name: 'a' }) fireEvent.click(aKey) diff --git a/app/src/atoms/SoftwareKeyboard/NormalKeyboard/index.css b/app/src/atoms/SoftwareKeyboard/NormalKeyboard/index.css index 4b5c8c256e5..5e1b269ca82 100644 --- a/app/src/atoms/SoftwareKeyboard/NormalKeyboard/index.css +++ b/app/src/atoms/SoftwareKeyboard/NormalKeyboard/index.css @@ -3,7 +3,7 @@ .simple-keyboard.oddTheme1.hg-theme-default { width: 100%; height: 100%; - background-color: #d0d0d0; + background-color: #cbcccc; /* grey35 */ font-family: 'Public Sans', sans-serif; padding: 8px; font-size: 28px; diff --git a/app/src/atoms/SoftwareKeyboard/Numpad/Numpad.stories.tsx b/app/src/atoms/SoftwareKeyboard/Numpad/Numpad.stories.tsx index 49d7f8e739c..4aa472ec363 100644 --- a/app/src/atoms/SoftwareKeyboard/Numpad/Numpad.stories.tsx +++ b/app/src/atoms/SoftwareKeyboard/Numpad/Numpad.stories.tsx @@ -8,6 +8,7 @@ import { import { touchScreenViewport } from '../../../DesignTokens/constants' import { InputField } from '../../InputField' import { Numpad } from './' +import '../../../styles.global.css' import type { Story, Meta } from '@storybook/react' diff --git a/app/src/atoms/SoftwareKeyboard/Numpad/__tests__/Numpad.test.tsx b/app/src/atoms/SoftwareKeyboard/Numpad/__tests__/Numpad.test.tsx index c9c19def25c..7ef05d582ca 100644 --- a/app/src/atoms/SoftwareKeyboard/Numpad/__tests__/Numpad.test.tsx +++ b/app/src/atoms/SoftwareKeyboard/Numpad/__tests__/Numpad.test.tsx @@ -1,6 +1,5 @@ import * as React from 'react' -import { fireEvent } from '@testing-library/react' -import { renderHook } from '@testing-library/react-hooks' +import { fireEvent, renderHook } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { Numpad } from '..' @@ -9,16 +8,12 @@ const render = (props: React.ComponentProps) => { } describe('Numpad', () => { - let props: React.ComponentProps - - beforeEach(() => { + it('should render the numpad keys', () => { const { result } = renderHook(() => React.useRef(null)) - props = { + const props = { onChange: jest.fn(), keyboardRef: result.current, } - }) - it('should render the numpad keys', () => { const { getAllByRole } = render(props) const buttons = getAllByRole('button') const expectedButtonNames = [ @@ -43,6 +38,11 @@ describe('Numpad', () => { }) it('should call mock function when clicking num key', () => { + const { result } = renderHook(() => React.useRef(null)) + const props = { + onChange: jest.fn(), + keyboardRef: result.current, + } const { getByRole } = render(props) const numKey = getByRole('button', { name: '1' }) fireEvent.click(numKey) diff --git a/app/src/atoms/SoftwareKeyboard/Numpad/index.tsx b/app/src/atoms/SoftwareKeyboard/Numpad/index.tsx index 445ace45dba..b16b950fada 100644 --- a/app/src/atoms/SoftwareKeyboard/Numpad/index.tsx +++ b/app/src/atoms/SoftwareKeyboard/Numpad/index.tsx @@ -17,7 +17,7 @@ export function Numpad({ onChange, keyboardRef }: NumpadProps): JSX.Element { } return ( /* - * autoUseTouchEvents: for OT-3 on-device app + * autoUseTouchEvents: for Flex on-device app * useButtonTag: this is for testing purpose that each key renders as a button */ > = args => ( export const Active = Template.bind({}) Active.args = { status: 'Heating', - backgroundColor: COLORS.medBlue, - iconColor: COLORS.blueEnabled, + backgroundColor: COLORS.blue30, + iconColor: COLORS.blue50, pulse: true, } export const Holding = Template.bind({}) Holding.args = { status: 'Holding at target', - backgroundColor: COLORS.medBlue, - iconColor: COLORS.blueEnabled, + backgroundColor: COLORS.blue30, + iconColor: COLORS.blue50, pulse: false, } export const Idle = Template.bind({}) Idle.args = { status: 'Idle', - backgroundColor: COLORS.medGreyEnabled, - iconColor: COLORS.darkGreyEnabled, + backgroundColor: COLORS.grey30, + iconColor: COLORS.grey50, pulse: true, } export const Error = Template.bind({}) Error.args = { status: 'Error', - backgroundColor: COLORS.warningBackgroundLight, - iconColor: COLORS.warningEnabled, + backgroundColor: COLORS.yellow20, + iconColor: COLORS.yellow50, pulse: true, } diff --git a/app/src/atoms/StatusLabel/__tests__/StatusLabel.test.tsx b/app/src/atoms/StatusLabel/__tests__/StatusLabel.test.tsx index f9752e876b0..0b34f921a9d 100644 --- a/app/src/atoms/StatusLabel/__tests__/StatusLabel.test.tsx +++ b/app/src/atoms/StatusLabel/__tests__/StatusLabel.test.tsx @@ -13,7 +13,7 @@ describe('StatusLabel', () => { props = { status: 'Engaged', backgroundColor: C_SKY_BLUE, - iconColor: COLORS.blueEnabled, + iconColor: COLORS.blue50, id: 'engaged_status', showIcon: true, } @@ -26,7 +26,7 @@ describe('StatusLabel', () => { props = { status: 'Disengaged', backgroundColor: C_SKY_BLUE, - iconColor: COLORS.blueEnabled, + iconColor: COLORS.blue50, } const { getByText } = render(props) expect(getByText('Disengaged')).toHaveStyle('backgroundColor: C_SKY_BLUE') @@ -35,9 +35,9 @@ describe('StatusLabel', () => { it('renders an idle status label with a gray background and text', () => { props = { status: 'Idle', - backgroundColor: COLORS.medGreyEnabled, - iconColor: COLORS.darkGrey, - textColor: COLORS.darkBlackEnabled, + backgroundColor: COLORS.grey30, + iconColor: COLORS.grey50, + textColor: COLORS.black90, showIcon: false, } const { getByText } = render(props) @@ -49,7 +49,7 @@ describe('StatusLabel', () => { props = { status: 'holding at target', backgroundColor: C_SKY_BLUE, - iconColor: COLORS.blueEnabled, + iconColor: COLORS.blue50, } const { getByText } = render(props) expect(getByText('Holding at target')).toHaveStyle( @@ -61,7 +61,7 @@ describe('StatusLabel', () => { props = { status: 'cooling', backgroundColor: C_SKY_BLUE, - iconColor: COLORS.blueEnabled, + iconColor: COLORS.blue50, } const { getByText } = render(props) expect(getByText('Cooling')).toHaveStyle('backgroundColor: C_SKY_BLUE') @@ -71,7 +71,7 @@ describe('StatusLabel', () => { props = { status: 'heating', backgroundColor: C_SKY_BLUE, - iconColor: COLORS.blueEnabled, + iconColor: COLORS.blue50, } const { getByText } = render(props) expect(getByText('Heating')).toHaveStyle('backgroundColor: C_SKY_BLUE') @@ -81,7 +81,7 @@ describe('StatusLabel', () => { props = { status: 'Engaged', backgroundColor: C_SKY_BLUE, - iconColor: COLORS.blueEnabled, + iconColor: COLORS.blue50, pulse: true, } const { getByTestId } = render(props) diff --git a/app/src/atoms/StatusLabel/index.tsx b/app/src/atoms/StatusLabel/index.tsx index e35cbcaac4c..6c8842097de 100644 --- a/app/src/atoms/StatusLabel/index.tsx +++ b/app/src/atoms/StatusLabel/index.tsx @@ -22,6 +22,7 @@ interface StatusLabelProps { iconSize?: string pulse?: boolean id?: string + capitalizeStatus?: boolean } export const StatusLabel = (props: StatusLabelProps): JSX.Element | null => { @@ -35,6 +36,7 @@ export const StatusLabel = (props: StatusLabelProps): JSX.Element | null => { pulse, showIcon = true, id, + capitalizeStatus = true, } = props return ( @@ -74,9 +76,9 @@ export const StatusLabel = (props: StatusLabelProps): JSX.Element | null => { - {capitalize(status)} + {capitalizeStatus ? capitalize(status) : status} diff --git a/app/src/atoms/StepMeter/__tests__/StepMeter.test.tsx b/app/src/atoms/StepMeter/__tests__/StepMeter.test.tsx index 50aa54e4343..faa688df6f1 100644 --- a/app/src/atoms/StepMeter/__tests__/StepMeter.test.tsx +++ b/app/src/atoms/StepMeter/__tests__/StepMeter.test.tsx @@ -51,4 +51,21 @@ describe('StepMeter', () => { const bar = getByTestId('StepMeter_StepMeterBar') expect(bar).toHaveStyle('width: 100%') }) + + it('should transition with style when progressing forward and no style if progressing backward', () => { + props = { + ...props, + currentStep: 2, + } + const { getByTestId } = render(props) + getByTestId('StepMeter_StepMeterContainer') + const bar = getByTestId('StepMeter_StepMeterBar') + expect(bar).toHaveStyle('transition: width 0.5s ease-in-out;') + + props = { + ...props, + currentStep: 1, + } + expect(bar).not.toHaveStyle('transition: ;') + }) }) diff --git a/app/src/atoms/StepMeter/index.tsx b/app/src/atoms/StepMeter/index.tsx index 999f0661da4..2c2854dc4d6 100644 --- a/app/src/atoms/StepMeter/index.tsx +++ b/app/src/atoms/StepMeter/index.tsx @@ -16,34 +16,44 @@ interface StepMeterProps { export const StepMeter = (props: StepMeterProps): JSX.Element => { const { totalSteps, currentStep } = props + const prevPercentComplete = React.useRef(0) const progress = currentStep != null ? currentStep : 0 - const percentComplete = `${ + const percentComplete = // this logic puts a cap at 100% percentComplete which we should never run into currentStep != null && currentStep > totalSteps ? 100 : (progress / totalSteps) * 100 - }%` const StepMeterContainer = css` position: ${POSITION_RELATIVE}; height: ${SPACING.spacing4}; - background-color: ${COLORS.medGreyEnabled}; + background-color: ${COLORS.grey30}; @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { height: ${SPACING.spacing12}; } ` + + const ODD_ANIMATION_OPTIMIZATIONS = ` + backface-visibility: hidden; + perspective: 1000; + will-change: transform; + ` + const StepMeterBar = css` + ${ODD_ANIMATION_OPTIMIZATIONS} position: ${POSITION_ABSOLUTE}; top: 0; height: 100%; - background-color: ${COLORS.blueEnabled}; - width: ${percentComplete}; - webkit-transition: width 0.5s ease-in-out; - moz-transition: width 0.5s ease-in-out; - o-transition: width 0.5s ease-in-out; - transition: width 0.5s ease-in-out; + background-color: ${COLORS.blue50}; + width: ${percentComplete}%; + transform: translateX(0); + transition: ${prevPercentComplete.current <= percentComplete + ? 'width 0.5s ease-in-out' + : ''}; ` + prevPercentComplete.current = percentComplete + return ( diff --git a/app/src/atoms/Toast/index.tsx b/app/src/atoms/Toast/index.tsx index bd08eb61526..8611c06247d 100644 --- a/app/src/atoms/Toast/index.tsx +++ b/app/src/atoms/Toast/index.tsx @@ -103,7 +103,7 @@ export function Toast(props: ToastProps): JSX.Element { const ODD_ANIMATION_OPTIMIZATIONS = ` backface-visibility: hidden; perspective: 1000; - will-change: opacity, transform3d; + will-change: opacity, transform; ` const DESKTOP_ANIMATION_SLIDE_UP_AND_IN = css` animation-duration: ${TOAST_ANIMATION_DURATION}ms; @@ -163,11 +163,9 @@ export function Toast(props: ToastProps): JSX.Element { @keyframes slidedown { from { - transform: translate3d(0%, 0%, 0); filter: opacity(100%); } to { - transform: translate3d(0%, 50%, 0); filter: opacity(0); } } @@ -180,11 +178,9 @@ export function Toast(props: ToastProps): JSX.Element { @keyframes fadeUpAndOut { from { - transform: translate3d(0%, 0%, 0); filter: opacity(100%); } to { - transform: translate3d(0%, -10%, 0); filter: opacity(0%); } } @@ -193,7 +189,7 @@ export function Toast(props: ToastProps): JSX.Element { const ODD_ANIMATION_NONE = css`` const TEXT_STYLE = css` - color: ${COLORS.darkBlackEnabled}; + color: ${COLORS.black90}; font-size: ${showODDStyle ? TYPOGRAPHY.fontSize22 : TYPOGRAPHY.fontSizeP}; font-weight: ${showODDStyle ? TYPOGRAPHY.fontWeightSemiBold @@ -231,31 +227,23 @@ export function Toast(props: ToastProps): JSX.Element { } = { [ERROR_TOAST]: { iconName: 'ot-alert', - color: `${showODDStyle ? COLORS.red2 : COLORS.errorEnabled}`, - backgroundColor: `${ - showODDStyle ? COLORS.red4 : COLORS.errorBackgroundLight - }`, + color: COLORS.red60, + backgroundColor: `${showODDStyle ? COLORS.red30 : COLORS.red20}`, }, [INFO_TOAST]: { iconName: 'information', - color: `${showODDStyle ? COLORS.grey2 : COLORS.darkGreyEnabled}`, - backgroundColor: `${ - showODDStyle ? COLORS.grey4 : COLORS.darkGreyDisabled - }`, + color: COLORS.blue60, + backgroundColor: `${showODDStyle ? COLORS.blue30 : COLORS.blue20}`, }, [SUCCESS_TOAST]: { iconName: 'ot-check', - color: `${showODDStyle ? COLORS.green2 : COLORS.successEnabled}`, - backgroundColor: `${ - showODDStyle ? COLORS.green4 : COLORS.successBackgroundLight - }`, + color: COLORS.green60, + backgroundColor: `${showODDStyle ? COLORS.green30 : COLORS.green20}`, }, [WARNING_TOAST]: { iconName: 'ot-alert', - color: `${showODDStyle ? COLORS.yellow2 : COLORS.warningEnabled}`, - backgroundColor: `${ - showODDStyle ? COLORS.yellow4 : COLORS.warningBackgroundLight - }`, + color: `${COLORS.yellow60}`, + backgroundColor: `${showODDStyle ? COLORS.yellow30 : COLORS.yellow20}`, }, } @@ -362,7 +350,7 @@ export function Toast(props: ToastProps): JSX.Element { > {headingText.length > 0 ? ( onCloseHandler()}> diff --git a/app/src/atoms/Tooltip/__tests__/Tooltip.test.tsx b/app/src/atoms/Tooltip/__tests__/Tooltip.test.tsx index 889e969ec82..754ca6d9e2d 100644 --- a/app/src/atoms/Tooltip/__tests__/Tooltip.test.tsx +++ b/app/src/atoms/Tooltip/__tests__/Tooltip.test.tsx @@ -56,9 +56,7 @@ describe('Tooltip', () => { expect(tooltip).toBeInTheDocument() expect(tooltip).toHaveStyle('position: absolute') expect(tooltip).toHaveStyle('left: 0.25rem') - expect(tooltip).toHaveStyle( - `background: ${String(COLORS.darkBlackEnabled)}` - ) + expect(tooltip).toHaveStyle(`background: ${String(COLORS.black90)}`) expect(tooltip).toHaveStyle(`color: ${String(COLORS.white)}`) expect(tooltip).toHaveStyle('width: 8.75rem') expect(tooltip).toHaveStyle('font-size: 0.625rem') diff --git a/app/src/atoms/Tooltip/index.tsx b/app/src/atoms/Tooltip/index.tsx index 7de7c1a6da7..5c72542e268 100644 --- a/app/src/atoms/Tooltip/index.tsx +++ b/app/src/atoms/Tooltip/index.tsx @@ -21,7 +21,7 @@ export function Tooltip(props: TooltipProps): JSX.Element { return ( = { secondary: { - defaultColor: COLORS.darkBlackEnabled, - defaultBackgroundColor: COLORS.mediumBlueEnabled, - activeBackgroundColor: COLORS.mediumBluePressed, - iconColor: COLORS.blueEnabled, + defaultColor: COLORS.black90, + defaultBackgroundColor: COLORS.blue35, + activeBackgroundColor: COLORS.blue40, + iconColor: COLORS.blue50, }, alert: { - defaultColor: COLORS.red1, - defaultBackgroundColor: COLORS.red3, - activeBackgroundColor: COLORS.red3Pressed, - iconColor: COLORS.red1, + defaultColor: COLORS.red60, + defaultBackgroundColor: COLORS.red35, + activeBackgroundColor: COLORS.red40, + iconColor: COLORS.red60, }, primary: { defaultColor: COLORS.white, - defaultBackgroundColor: COLORS.blueEnabled, - activeBackgroundColor: COLORS.bluePressed, + defaultBackgroundColor: COLORS.blue50, + activeBackgroundColor: COLORS.blue60, iconColor: COLORS.white, }, } @@ -97,15 +97,14 @@ export function LargeButton(props: LargeButtonProps): JSX.Element { } &:disabled { - background-color: ${COLORS.darkBlack20}; - color: ${COLORS.darkBlack60}; + background-color: ${COLORS.grey35}; + color: ${COLORS.grey50}; } ` return ( = { secondary: { - defaultColor: COLORS.darkBlackEnabled, - defaultBackgroundColor: COLORS.mediumBlueEnabled, - activeBackgroundColor: COLORS.mediumBluePressed, - disabledBackgroundColor: `${COLORS.darkBlack20}`, - disabledColor: `${COLORS.darkBlack60}`, + defaultColor: COLORS.black90, + defaultBackgroundColor: COLORS.blue35, + activeBackgroundColor: COLORS.blue40, + disabledBackgroundColor: `${COLORS.grey35}`, + disabledColor: `${COLORS.grey50}`, }, alert: { defaultColor: COLORS.white, - defaultBackgroundColor: COLORS.red2, - activeBackgroundColor: COLORS.red2Pressed, - disabledBackgroundColor: `${COLORS.darkBlack20}`, - disabledColor: `${COLORS.darkBlack60}`, + defaultBackgroundColor: COLORS.red50, + activeBackgroundColor: COLORS.red55, + disabledBackgroundColor: `${COLORS.grey35}`, + disabledColor: `${COLORS.grey50}`, }, primary: { defaultColor: COLORS.white, - defaultBackgroundColor: COLORS.blueEnabled, - activeBackgroundColor: COLORS.bluePressed, - disabledBackgroundColor: `${COLORS.darkBlack20}`, - disabledColor: `${COLORS.darkBlack60}`, + defaultBackgroundColor: COLORS.blue50, + activeBackgroundColor: COLORS.blue60, + disabledBackgroundColor: `${COLORS.grey35}`, + disabledColor: `${COLORS.grey50}`, }, tertiaryHighLight: { - defaultColor: COLORS.darkBlackEnabled, - defaultBackgroundColor: `${COLORS.blueEnabled}${COLORS.opacity0HexCode}`, - activeBackgroundColor: `${COLORS.darkBlack20}`, - disabledBackgroundColor: `${COLORS.blueEnabled}${COLORS.opacity0HexCode}`, - disabledColor: `${COLORS.darkBlack60}`, + defaultColor: COLORS.black90, + defaultBackgroundColor: `${COLORS.blue50}00`, + activeBackgroundColor: `${COLORS.grey35}`, + disabledBackgroundColor: `${COLORS.blue50}00`, + disabledColor: `${COLORS.grey50}`, }, tertiaryLowLight: { - defaultColor: `${COLORS.darkBlack70}`, - defaultBackgroundColor: ` ${COLORS.blueEnabled}${COLORS.opacity0HexCode}`, - activeBackgroundColor: `${COLORS.darkBlack20}`, - disabledBackgroundColor: `${COLORS.blueEnabled}${COLORS.opacity0HexCode}`, - disabledColor: `${COLORS.darkBlack60}`, + defaultColor: `${COLORS.grey60}`, + defaultBackgroundColor: ` ${COLORS.blue50}00`, + activeBackgroundColor: `${COLORS.grey35}`, + disabledBackgroundColor: `${COLORS.blue50}00`, + disabledColor: `${COLORS.grey50}`, }, } @@ -138,7 +138,6 @@ export function SmallButton(props: SmallButtonProps): JSX.Element { return ( {iconPlacement === 'startIcon' && iconName != null ? ( - + {iconPlacement === 'endIcon' && iconName != null ? ( - + { const SUBMIT_INPUT_STYLE = css` - background-color: ${COLORS.blueEnabled}; + background-color: ${COLORS.blue50}; border-radius: ${BORDERS.radiusSoftCorners}; padding: ${SPACING.spacing8} ${SPACING.spacing16}; color: ${COLORS.white}; @@ -29,21 +29,21 @@ export const SubmitPrimaryButton = ( ${styleProps} &:focus-visible { - box-shadow: 0 0 0 3px ${COLORS.warningEnabled}; + box-shadow: 0 0 0 3px ${COLORS.yellow50}; } &:hover { - background-color: ${COLORS.blueHover}; + background-color: ${COLORS.blue55}; box-shadow: 0 0 0; } &:active { - background-color: ${COLORS.bluePressed}; + background-color: ${COLORS.blue60}; } &:disabled { - background-color: ${COLORS.darkGreyDisabled}; - color: ${COLORS.successDisabled}; + background-color: ${COLORS.grey30}; + color: ${COLORS.grey40}; } ` return diff --git a/app/src/atoms/buttons/TabbedButton.tsx b/app/src/atoms/buttons/TabbedButton.tsx index 6ad4fec5035..224f0f52e2a 100644 --- a/app/src/atoms/buttons/TabbedButton.tsx +++ b/app/src/atoms/buttons/TabbedButton.tsx @@ -9,32 +9,32 @@ import { } from '@opentrons/components' const SELECTED_STYLE = css` - background-color: ${COLORS.highlightPurple1}; + background-color: ${COLORS.purple50}; color: ${COLORS.white}; &:focus, &:hover { - background-color: ${COLORS.highlightPurple1}; + background-color: ${COLORS.purple50}; box-shadow: none; } &:active { - background-color: ${COLORS.highlightPurple1Pressed}; + background-color: ${COLORS.purple55}; } ` const UNSELECTED_STYLE = css` - background-color: ${COLORS.highlightPurple2}; - color: ${COLORS.darkBlack100}; + background-color: ${COLORS.purple35}; + color: ${COLORS.black90}; &:focus, &:hover { - background-color: ${COLORS.highlightPurple2}; + background-color: ${COLORS.purple35}; box-shadow: none; } &:active { - background-color: ${COLORS.highlightPurple2Pressed}; + background-color: ${COLORS.purple40}; } ` @@ -58,11 +58,11 @@ export const TabbedButton = styled(Btn)` ${styleProps} &:focus-visible { - box-shadow: 0 0 0 3px ${COLORS.fundamentalsFocus}; + box-shadow: 0 0 0 3px ${COLORS.blue50}; } &:disabled { - background-color: ${COLORS.darkBlack20}; - color: ${COLORS.darkBlack60}; + background-color: ${COLORS.grey35}; + color: ${COLORS.grey50}; } `} ` diff --git a/app/src/atoms/buttons/TertiaryButton.tsx b/app/src/atoms/buttons/TertiaryButton.tsx index 04704261b77..a6ab30fb0ed 100644 --- a/app/src/atoms/buttons/TertiaryButton.tsx +++ b/app/src/atoms/buttons/TertiaryButton.tsx @@ -9,10 +9,10 @@ import { } from '@opentrons/components' export const TertiaryButton = styled(NewPrimaryBtn)` - background-color: ${COLORS.blueEnabled}; + background-color: ${COLORS.blue50}; border-radius: ${BORDERS.radiusRoundEdge}; box-shadow: none; - color: ${COLORS.fundamentalsBackground}; + color: ${COLORS.white}; overflow: no-wrap; padding-left: ${SPACING.spacing16}; padding-right: ${SPACING.spacing16}; @@ -23,20 +23,21 @@ export const TertiaryButton = styled(NewPrimaryBtn)` ${styleProps} &:hover { - background-color: ${COLORS.blueHover}; + background-color: ${COLORS.blue55}; box-shadow: none; } &:active { - background-color: ${COLORS.bluePressed}; + background-color: ${COLORS.blue60}; } &:focus-visible { - box-shadow: 0 0 0 3px ${COLORS.fundamentalsFocus}; + background-color: ${COLORS.blue55}; + box-shadow: 0 0 0 3px ${COLORS.yellow50}; } &:disabled { - background-color: ${COLORS.darkGreyDisabled}; - color: ${COLORS.errorDisabled}; + background-color: ${COLORS.grey30}; + color: ${COLORS.grey40}; } ` diff --git a/app/src/atoms/buttons/ToggleButton.tsx b/app/src/atoms/buttons/ToggleButton.tsx index c72346bb001..6262de74cb4 100644 --- a/app/src/atoms/buttons/ToggleButton.tsx +++ b/app/src/atoms/buttons/ToggleButton.tsx @@ -6,34 +6,34 @@ import { Btn, Icon, COLORS, SIZE_1, SIZE_2 } from '@opentrons/components' import type { StyleProps } from '@opentrons/components' const TOGGLE_DISABLED_STYLES = css` - color: ${COLORS.darkGreyEnabled}; + color: ${COLORS.grey50}; &:hover { - color: ${COLORS.darkGreyHover}; + color: ${COLORS.grey60}; } &:focus-visible { - box-shadow: 0 0 0 3px ${COLORS.warningEnabled}; + box-shadow: 0 0 0 3px ${COLORS.yellow50}; } &:disabled { - color: ${COLORS.darkGreyDisabled}; + color: ${COLORS.grey40}; } ` const TOGGLE_ENABLED_STYLES = css` - color: ${COLORS.blueEnabled}; + color: ${COLORS.blue50}; &:hover { - color: ${COLORS.blueHover}; + color: ${COLORS.blue55}; } &:focus-visible { - box-shadow: 0 0 0 3px ${COLORS.warningEnabled}; + box-shadow: 0 0 0 3px ${COLORS.yellow50}; } &:disabled { - color: ${COLORS.darkGreyDisabled}; + color: ${COLORS.grey40}; } ` diff --git a/app/src/atoms/buttons/__tests__/BackButton.test.tsx b/app/src/atoms/buttons/__tests__/BackButton.test.tsx index d230971b7ae..64f61ff6205 100644 --- a/app/src/atoms/buttons/__tests__/BackButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/BackButton.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { MemoryRouter, Route, Switch } from 'react-router-dom' import { renderWithProviders } from '@opentrons/components' @@ -38,24 +39,24 @@ describe('BackButton', () => { it('calls provided on click handler and does not go back one page', () => { const mockOnClick = jest.fn() - const { getByText, queryByText } = render({ onClick: mockOnClick }) + render({ onClick: mockOnClick }) expect(mockOnClick).toBeCalledTimes(0) - getByText('this is the current page') - expect(queryByText('this is the previous page')).toBeNull() - getByText('Back').click() + screen.getByText('this is the current page') + expect(screen.queryByText('this is the previous page')).toBeNull() + fireEvent.click(screen.getByText('Back')) expect(mockOnClick).toBeCalledTimes(1) - getByText('this is the current page') - expect(queryByText('this is the previous page')).toBeNull() + screen.getByText('this is the current page') + expect(screen.queryByText('this is the previous page')).toBeNull() }) it('goes back one page in history on click if no on click handler provided', () => { - const { getByText, queryByText } = render() + render() - getByText('this is the current page') - expect(queryByText('this is the previous page')).toBeNull() - getByText('Back').click() - getByText('this is the previous page') - expect(queryByText('this is the current page')).toBeNull() + screen.getByText('this is the current page') + expect(screen.queryByText('this is the previous page')).toBeNull() + fireEvent.click(screen.getByText('Back')) + screen.getByText('this is the previous page') + expect(screen.queryByText('this is the current page')).toBeNull() }) }) diff --git a/app/src/atoms/buttons/__tests__/FloatingActionButton.test.tsx b/app/src/atoms/buttons/__tests__/FloatingActionButton.test.tsx index 0c14cec1f55..ebb241233ed 100644 --- a/app/src/atoms/buttons/__tests__/FloatingActionButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/FloatingActionButton.test.tsx @@ -1,3 +1,4 @@ +import 'jest-styled-components' import * as React from 'react' import { renderWithProviders, @@ -32,7 +33,7 @@ describe('FloatingActionButton', () => { expect(button).toHaveStyle( `padding: ${SPACING.spacing12} ${SPACING.spacing24}` ) - expect(button).toHaveStyle(`background-color: ${COLORS.highlightPurple1}`) + expect(button).toHaveStyle(`background-color: ${COLORS.purple50}`) expect(button).toHaveStyle(`font-size: ${TYPOGRAPHY.fontSize28}`) expect(button).toHaveStyle(`font-weight: ${TYPOGRAPHY.fontWeightSemiBold}`) expect(button).toHaveStyle(`line-height: ${TYPOGRAPHY.lineHeight36}`) @@ -49,31 +50,23 @@ describe('FloatingActionButton', () => { const { getByRole } = render(props) const button = getByRole('button') expect(button).toBeDisabled() - expect(button).toHaveStyle(`background-color: #16212d33`) - expect(button).toHaveStyle(`color: #16212d99`) + expect(button).toHaveStyle(`background-color: ${COLORS.grey35}`) + expect(button).toHaveStyle(`color: ${COLORS.grey50}`) }) it('applies the correct states to the unselected floating action button - active', () => { const { getByRole } = render(props) const button = getByRole('button') - expect(button).toHaveStyleRule( - 'background-color', - `${COLORS.highlightPurple1Pressed}`, - { - modifier: ':active', - } - ) + expect(button).toHaveStyleRule('background-color', `${COLORS.purple55}`, { + modifier: ':active', + }) }) it('applies the correct states to the unselected floating action button - focus-visible', () => { const { getByRole } = render(props) const button = getByRole('button') - expect(button).toHaveStyleRule( - 'border-color', - `${COLORS.fundamentalsFocus}`, - { - modifier: ':focus-visible', - } - ) + expect(button).toHaveStyleRule('border-color', `${COLORS.blue50}`, { + modifier: ':focus-visible', + }) }) }) diff --git a/app/src/atoms/buttons/__tests__/LargeButton.test.tsx b/app/src/atoms/buttons/__tests__/LargeButton.test.tsx index 432101a2c5d..2889f722ab5 100644 --- a/app/src/atoms/buttons/__tests__/LargeButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/LargeButton.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders, COLORS } from '@opentrons/components' import { LargeButton } from '../LargeButton' @@ -17,11 +18,11 @@ describe('LargeButton', () => { } }) it('renders the default button and it works as expected', () => { - const { getByText, getByRole } = render(props) - getByText('large button').click() + render(props) + fireEvent.click(screen.getByText('large button')) expect(props.onClick).toHaveBeenCalled() - expect(getByRole('button')).toHaveStyle( - `background-color: ${COLORS.blueEnabled}` + expect(screen.getByRole('button')).toHaveStyle( + `background-color: ${COLORS.blue50}` ) }) it('renders the alert button', () => { @@ -29,17 +30,19 @@ describe('LargeButton', () => { ...props, buttonType: 'alert', } - const { getByRole } = render(props) - expect(getByRole('button')).toHaveStyle(`background-color: ${COLORS.red3}`) + render(props) + expect(screen.getByRole('button')).toHaveStyle( + `background-color: ${COLORS.red35}` + ) }) it('renders the secondary button', () => { props = { ...props, buttonType: 'secondary', } - const { getByRole } = render(props) - expect(getByRole('button')).toHaveStyle( - `background-color: ${COLORS.mediumBlueEnabled}` + render(props) + expect(screen.getByRole('button')).toHaveStyle( + `background-color: ${COLORS.blue35}` ) }) it('renders the button as disabled', () => { @@ -47,7 +50,7 @@ describe('LargeButton', () => { ...props, disabled: true, } - const { getByRole } = render(props) - expect(getByRole('button')).toBeDisabled() + render(props) + expect(screen.getByRole('button')).toBeDisabled() }) }) diff --git a/app/src/atoms/buttons/__tests__/MediumButton.test.tsx b/app/src/atoms/buttons/__tests__/MediumButton.test.tsx index 9718cd8b821..ae7c685f498 100644 --- a/app/src/atoms/buttons/__tests__/MediumButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/MediumButton.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders, COLORS, BORDERS } from '@opentrons/components' import { MediumButton } from '../MediumButton' @@ -17,11 +18,11 @@ describe('MediumButton', () => { } }) it('renders the default button and it works as expected', () => { - const { getByText, getByRole } = render(props) - getByText('Medium button').click() + render(props) + fireEvent.click(screen.getByText('Medium button')) expect(props.onClick).toHaveBeenCalled() - expect(getByRole('button')).toHaveStyle( - `background-color: ${COLORS.blueEnabled}` + expect(screen.getByRole('button')).toHaveStyle( + `background-color: ${COLORS.blue50}` ) }) it('renders the alert button', () => { @@ -29,17 +30,19 @@ describe('MediumButton', () => { ...props, buttonType: 'alert', } - const { getByRole } = render(props) - expect(getByRole('button')).toHaveStyle(`background-color: ${COLORS.red2}`) + render(props) + expect(screen.getByRole('button')).toHaveStyle( + `background-color: ${COLORS.red50}` + ) }) it('renders the secondary button', () => { props = { ...props, buttonType: 'secondary', } - const { getByRole } = render(props) - expect(getByRole('button')).toHaveStyle( - `background-color: ${COLORS.mediumBlueEnabled}` + render(props) + expect(screen.getByRole('button')).toHaveStyle( + `background-color: ${COLORS.blue35}` ) }) it('renders the secondary alert button', () => { @@ -47,32 +50,38 @@ describe('MediumButton', () => { ...props, buttonType: 'alertSecondary', } - const { getByRole } = render(props) - expect(getByRole('button')).toHaveStyle(`background-color: ${COLORS.red3}`) + render(props) + expect(screen.getByRole('button')).toHaveStyle( + `background-color: ${COLORS.red35}` + ) }) it('renders the tertiary high button', () => { props = { ...props, buttonType: 'tertiaryHigh', } - const { getByRole } = render(props) - expect(getByRole('button')).toHaveStyle(`background-color: ${COLORS.white}`) + render(props) + expect(screen.getByRole('button')).toHaveStyle( + `background-color: ${COLORS.white}` + ) }) it('renders the tertiary low light button', () => { props = { ...props, buttonType: 'tertiaryLowLight', } - const { getByRole } = render(props) - expect(getByRole('button')).toHaveStyle(`background-color: ${COLORS.white}`) + render(props) + expect(screen.getByRole('button')).toHaveStyle( + `background-color: ${COLORS.white}` + ) }) it('renders the button as disabled', () => { props = { ...props, disabled: true, } - const { getByRole } = render(props) - expect(getByRole('button')).toBeDisabled() + render(props) + expect(screen.getByRole('button')).toBeDisabled() }) it('renders custom icon in the button', () => { props = { @@ -80,15 +89,15 @@ describe('MediumButton', () => { iconName: 'restart', } const { getByLabelText } = render(props) - getByLabelText('MediumButton_restart') + getByLabelText('restart icon') }) it('renders the rounded button category', () => { props = { ...props, buttonCategory: 'rounded', } - const { getByRole } = render(props) - expect(getByRole('button')).toHaveStyle( + render(props) + expect(screen.getByRole('button')).toHaveStyle( `border-radius: ${BORDERS.borderRadiusSize5}` ) }) diff --git a/app/src/atoms/buttons/__tests__/QuaternaryButton.test.tsx b/app/src/atoms/buttons/__tests__/QuaternaryButton.test.tsx index 11df7e1a5bc..3d3f951644f 100644 --- a/app/src/atoms/buttons/__tests__/QuaternaryButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/QuaternaryButton.test.tsx @@ -1,3 +1,4 @@ +import 'jest-styled-components' import * as React from 'react' import { renderWithProviders, @@ -30,7 +31,7 @@ describe('QuaternaryButton', () => { `border-radius: ${String(BORDERS.radiusRoundEdge)}` ) expect(button).toHaveStyle('box-shadow: none') - expect(button).toHaveStyle(`color: ${String(COLORS.blueEnabled)}`) + expect(button).toHaveStyle(`color: ${String(COLORS.blue50)}`) expect(button).toHaveStyle( `padding: ${SPACING.spacing8} ${SPACING.spacing16} ${SPACING.spacing8} ${SPACING.spacing16}` ) @@ -71,7 +72,7 @@ describe('QuaternaryButton', () => { const button = getByText('secondary tertiary button') expect(button).toHaveStyleRule( 'box-shadow', - `0 0 0 3px ${String(COLORS.warningEnabled)}`, + `0 0 0 3px ${String(COLORS.yellow50)}`, { modifier: ':focus-visible', } @@ -79,10 +80,10 @@ describe('QuaternaryButton', () => { }) it('renders secondary tertiary button with text and different background color', () => { - props.color = COLORS.errorEnabled + props.color = COLORS.red50 const { getByText } = render(props) const button = getByText('secondary tertiary button') expect(button).toHaveStyle(`background-color: ${String(COLORS.white)}`) - expect(button).toHaveStyle(`color: ${String(COLORS.errorEnabled)}`) + expect(button).toHaveStyle(`color: ${String(COLORS.red50)}`) }) }) diff --git a/app/src/atoms/buttons/__tests__/RadioButton.test.tsx b/app/src/atoms/buttons/__tests__/RadioButton.test.tsx index b03dd301c78..a4b893c35aa 100644 --- a/app/src/atoms/buttons/__tests__/RadioButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/RadioButton.test.tsx @@ -23,7 +23,7 @@ describe('RadioButton', () => { } const { getByRole } = render(props) const label = getByRole('label') - expect(label).toHaveStyle(`background-color: ${COLORS.mediumBlueEnabled}`) + expect(label).toHaveStyle(`background-color: ${COLORS.blue35}`) expect(label).toHaveStyle(`padding: ${SPACING.spacing24}`) }) it('renders the large selected button', () => { @@ -34,7 +34,7 @@ describe('RadioButton', () => { } const { getByRole } = render(props) const label = getByRole('label') - expect(label).toHaveStyle(`background-color: ${COLORS.blueEnabled}`) + expect(label).toHaveStyle(`background-color: ${COLORS.blue50}`) expect(label).toHaveStyle(`padding: ${SPACING.spacing24}`) }) it('renders the small button', () => { @@ -44,7 +44,7 @@ describe('RadioButton', () => { } const { getByRole } = render(props) const label = getByRole('label') - expect(label).toHaveStyle(`background-color: ${COLORS.mediumBlueEnabled}`) + expect(label).toHaveStyle(`background-color: ${COLORS.blue35}`) expect(label).toHaveStyle(`padding: ${SPACING.spacing20}`) }) it('renders the small selected button', () => { @@ -55,7 +55,7 @@ describe('RadioButton', () => { } const { getByRole } = render(props) const label = getByRole('label') - expect(label).toHaveStyle(`background-color: ${COLORS.blueEnabled}`) + expect(label).toHaveStyle(`background-color: ${COLORS.blue50}`) expect(label).toHaveStyle(`padding: ${SPACING.spacing20}`) }) }) diff --git a/app/src/atoms/buttons/__tests__/SmallButton.test.tsx b/app/src/atoms/buttons/__tests__/SmallButton.test.tsx index 6c8b545eb7c..62bd04ec3bc 100644 --- a/app/src/atoms/buttons/__tests__/SmallButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/SmallButton.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders, COLORS, BORDERS } from '@opentrons/components' import { SmallButton } from '../SmallButton' @@ -17,13 +18,13 @@ describe('SmallButton', () => { } }) it('renders the primary button and it works as expected', () => { - const { getByText, getByRole } = render(props) - getByText('small button').click() + render(props) + fireEvent.click(screen.getByText('small button')) expect(props.onClick).toHaveBeenCalled() - expect(getByRole('button')).toHaveStyle( - `background-color: ${COLORS.blueEnabled}` + expect(screen.getByRole('button')).toHaveStyle( + `background-color: ${COLORS.blue50}` ) - expect(getByRole('button')).toHaveStyle( + expect(screen.getByRole('button')).toHaveStyle( `border-radius: ${BORDERS.borderRadiusSize4}` ) }) @@ -32,17 +33,19 @@ describe('SmallButton', () => { ...props, buttonType: 'alert', } - const { getByRole } = render(props) - expect(getByRole('button')).toHaveStyle(`background-color: ${COLORS.red2}`) + render(props) + expect(screen.getByRole('button')).toHaveStyle( + `background-color: ${COLORS.red50}` + ) }) it('renders the secondary button', () => { props = { ...props, buttonType: 'secondary', } - const { getByRole } = render(props) - expect(getByRole('button')).toHaveStyle( - `background-color: ${COLORS.mediumBlueEnabled}` + render(props) + expect(screen.getByRole('button')).toHaveStyle( + `background-color: ${COLORS.blue35}` ) }) it('renders the tertiary high light button', () => { @@ -50,34 +53,32 @@ describe('SmallButton', () => { ...props, buttonType: 'tertiaryHighLight', } - const { getByRole } = render(props) - expect(getByRole('button')).toHaveStyle(`color: ${COLORS.darkBlackEnabled}`) + render(props) + expect(screen.getByRole('button')).toHaveStyle(`color: ${COLORS.black90}`) }) it('renders the tertiary low light', () => { props = { ...props, buttonType: 'tertiaryLowLight', } - const { getByRole } = render(props) - expect(getByRole('button')).toHaveStyle( - `color: ${COLORS.darkBlackEnabled}${COLORS.opacity70HexCode}` - ) + render(props) + expect(screen.getByRole('button')).toHaveStyle(`color: ${COLORS.grey60}`) }) it('renders the button as disabled', () => { props = { ...props, disabled: true, } - const { getByRole } = render(props) - expect(getByRole('button')).toBeDisabled() + render(props) + expect(screen.getByRole('button')).toBeDisabled() }) it('renders the rounded button category', () => { props = { ...props, buttonCategory: 'rounded', } - const { getByRole } = render(props) - expect(getByRole('button')).toHaveStyle( + render(props) + expect(screen.getByRole('button')).toHaveStyle( `border-radius: ${BORDERS.borderRadiusSize5}` ) }) @@ -87,8 +88,8 @@ describe('SmallButton', () => { iconName: 'alert', iconPlacement: 'startIcon', } - const { getByLabelText } = render(props) - getByLabelText('SmallButton_alert_positionStart') + render(props) + screen.getByLabelText('alert') }) it('renders an icon with end placement', () => { props = { @@ -96,7 +97,7 @@ describe('SmallButton', () => { iconName: 'alert', iconPlacement: 'endIcon', } - const { getByLabelText } = render(props) - getByLabelText('SmallButton_alert_positionEnd') + render(props) + screen.getByLabelText('alert') }) }) diff --git a/app/src/atoms/buttons/__tests__/SubmitPrimaryButton.test.tsx b/app/src/atoms/buttons/__tests__/SubmitPrimaryButton.test.tsx index 5cb3c65f933..f6b3ca3b09c 100644 --- a/app/src/atoms/buttons/__tests__/SubmitPrimaryButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/SubmitPrimaryButton.test.tsx @@ -1,3 +1,4 @@ +import 'jest-styled-components' import * as React from 'react' import { fireEvent } from '@testing-library/react' import { @@ -31,9 +32,7 @@ describe('SubmitPrimaryButton', () => { it('renders submit primary button with text', () => { const { getByText } = render(props) const button = getByText('submit primary button') - expect(button).toHaveStyle( - `background-color: ${String(COLORS.blueEnabled)}` - ) + expect(button).toHaveStyle(`background-color: ${String(COLORS.blue50)}`) expect(button).toHaveStyle( `border-radius: ${String(BORDERS.radiusSoftCorners)}` ) @@ -62,10 +61,8 @@ describe('SubmitPrimaryButton', () => { const { getByText } = render(props) const button = getByText('submit primary button') expect(button).toBeDisabled() - expect(button).toHaveStyle( - `background-color: ${String(COLORS.darkGreyDisabled)}` - ) - expect(button).toHaveStyle(`color: ${String(COLORS.successDisabled)}`) + expect(button).toHaveStyle(`background-color: ${String(COLORS.grey30)}`) + expect(button).toHaveStyle(`color: ${String(COLORS.grey40)}`) }) it('calls mock function when clicking the button', () => { @@ -80,7 +77,7 @@ describe('SubmitPrimaryButton', () => { const button = getByText('submit primary button') expect(button).toHaveStyleRule( 'background-color', - `${String(COLORS.blueHover)}`, + `${String(COLORS.blue55)}`, { modifier: ':hover', } @@ -95,7 +92,7 @@ describe('SubmitPrimaryButton', () => { const button = getByText('submit primary button') expect(button).toHaveStyleRule( 'background-color', - `${String(COLORS.bluePressed)}`, + `${String(COLORS.blue60)}`, { modifier: ':active', } @@ -107,7 +104,7 @@ describe('SubmitPrimaryButton', () => { const button = getByText('submit primary button') expect(button).toHaveStyleRule( 'box-shadow', - `0 0 0 3px ${String(COLORS.warningEnabled)}`, + `0 0 0 3px ${String(COLORS.yellow50)}`, { modifier: ':focus-visible', } diff --git a/app/src/atoms/buttons/__tests__/TabbedButton.test.tsx b/app/src/atoms/buttons/__tests__/TabbedButton.test.tsx index 5af751f3982..439c4227518 100644 --- a/app/src/atoms/buttons/__tests__/TabbedButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/TabbedButton.test.tsx @@ -1,3 +1,4 @@ +import 'jest-styled-components' import * as React from 'react' import { renderWithProviders, @@ -25,9 +26,7 @@ describe('Unselected TabbedButton', () => { it('renders unselected tabbed button with text', () => { const { getByText } = render(props) const button = getByText('tabbed button') - expect(button).toHaveStyle( - `background-color: ${String(COLORS.highlightPurple2)}` - ) + expect(button).toHaveStyle(`background-color: ${String(COLORS.purple35)}`) expect(button).toHaveStyle( `padding: ${SPACING.spacing16} ${SPACING.spacing24}` ) @@ -45,7 +44,7 @@ describe('Unselected TabbedButton', () => { `text-transform: ${String(TYPOGRAPHY.textTransformNone)}` ) expect(button).toHaveStyle(`box-shadow: none`) - expect(button).toHaveStyle(`color: ${String(COLORS.darkBlack100)}`) + expect(button).toHaveStyle(`color: ${String(COLORS.black90)}`) }) it('renders unselected tabbed button with text and disabled', () => { @@ -53,8 +52,8 @@ describe('Unselected TabbedButton', () => { const { getByText } = render(props) const button = getByText('tabbed button') expect(button).toBeDisabled() - expect(button).toHaveStyle(`background-color: #16212d33`) - expect(button).toHaveStyle(`color: #16212d99`) + expect(button).toHaveStyle(`background-color: ${COLORS.grey35}`) + expect(button).toHaveStyle(`color: ${COLORS.grey50}`) }) it('applies the correct states to the unselected tabbed button - active', () => { @@ -62,7 +61,7 @@ describe('Unselected TabbedButton', () => { const button = getByText('tabbed button') expect(button).toHaveStyleRule( 'background-color', - `${String(COLORS.highlightPurple2Pressed)}`, + `${String(COLORS.purple40)}`, { modifier: ':active', } @@ -82,7 +81,7 @@ describe('Unselected TabbedButton', () => { const button = getByText('tabbed button') expect(button).toHaveStyleRule( 'box-shadow', - `0 0 0 3px ${String(COLORS.fundamentalsFocus)}`, + `0 0 0 3px ${String(COLORS.blue50)}`, { modifier: ':focus-visible', } @@ -103,9 +102,7 @@ describe('Selected TabbedButton', () => { it('renders selected tabbed button with text', () => { const { getByText } = render(props) const button = getByText('tabbed button') - expect(button).toHaveStyle( - `background-color: ${String(COLORS.highlightPurple1)}` - ) + expect(button).toHaveStyle(`background-color: ${String(COLORS.purple50)}`) expect(button).toHaveStyle( `padding: ${SPACING.spacing16} ${SPACING.spacing24}` ) @@ -131,8 +128,8 @@ describe('Selected TabbedButton', () => { const { getByText } = render(props) const button = getByText('tabbed button') expect(button).toBeDisabled() - expect(button).toHaveStyle(`background-color: #16212d33`) - expect(button).toHaveStyle(`color: #16212d99`) + expect(button).toHaveStyle(`background-color: ${COLORS.grey35}`) + expect(button).toHaveStyle(`color: ${COLORS.grey50}`) }) it('applies the correct states to the selected tabbed button - active', () => { @@ -140,7 +137,7 @@ describe('Selected TabbedButton', () => { const button = getByText('tabbed button') expect(button).toHaveStyleRule( 'background-color', - `${String(COLORS.highlightPurple1Pressed)}`, + `${String(COLORS.purple55)}`, { modifier: ':active', } @@ -160,7 +157,7 @@ describe('Selected TabbedButton', () => { const button = getByText('tabbed button') expect(button).toHaveStyleRule( 'box-shadow', - `0 0 0 3px ${String(COLORS.fundamentalsFocus)}`, + `0 0 0 3px ${String(COLORS.blue50)}`, { modifier: ':focus-visible', } diff --git a/app/src/atoms/buttons/__tests__/TertiaryButton.test.tsx b/app/src/atoms/buttons/__tests__/TertiaryButton.test.tsx index 947a75fef7b..3c2f8c9a2e8 100644 --- a/app/src/atoms/buttons/__tests__/TertiaryButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/TertiaryButton.test.tsx @@ -1,3 +1,4 @@ +import 'jest-styled-components' import * as React from 'react' import { renderWithProviders, @@ -24,31 +25,21 @@ describe('TertiaryButton', () => { it('renders tertiary button with text', () => { const { getByText } = render(props) const button = getByText('tertiary button') - expect(button).toHaveStyle( - `background-color: ${String(COLORS.blueEnabled)}` - ) + expect(button).toHaveStyle(`background-color: ${COLORS.blue50}`) expect(button).toHaveStyle( `padding: ${SPACING.spacing8} ${SPACING.spacing16} ${SPACING.spacing8} ${SPACING.spacing16}` ) - expect(button).toHaveStyle(`font-size: ${String(TYPOGRAPHY.fontSizeLabel)}`) - expect(button).toHaveStyle( - `font-weight: ${String(TYPOGRAPHY.fontWeightSemiBold)}` - ) - expect(button).toHaveStyle( - `line-height: ${String(TYPOGRAPHY.lineHeight12)}` - ) - expect(button).toHaveStyle( - `border-radius: ${String(BORDERS.radiusRoundEdge)}` - ) + expect(button).toHaveStyle(`font-size: ${TYPOGRAPHY.fontSizeLabel}`) + expect(button).toHaveStyle(`font-weight: ${TYPOGRAPHY.fontWeightSemiBold}`) + expect(button).toHaveStyle(`line-height: ${TYPOGRAPHY.lineHeight12}`) + expect(button).toHaveStyle(`border-radius: ${BORDERS.radiusRoundEdge}`) expect(button).toHaveStyle( - `text-transform: ${String(TYPOGRAPHY.textTransformNone)}` + `text-transform: ${TYPOGRAPHY.textTransformNone}` ) expect(button).toHaveStyle('box-shadow: none') expect(button).toHaveStyle('overflow: no-wrap') expect(button).toHaveStyle('white-space: nowrap') - expect(button).toHaveStyle( - `color: ${String(COLORS.fundamentalsBackground)}` - ) + expect(button).toHaveStyle(`color: ${COLORS.white}`) }) it('renders tertiary button with text and disabled', () => { @@ -56,22 +47,16 @@ describe('TertiaryButton', () => { const { getByText } = render(props) const button = getByText('tertiary button') expect(button).toBeDisabled() - expect(button).toHaveStyle( - `background-color: ${String(COLORS.darkGreyDisabled)}` - ) - expect(button).toHaveStyle(`color: ${String(COLORS.errorDisabled)}`) + expect(button).toHaveStyle(`background-color: ${COLORS.grey30}`) + expect(button).toHaveStyle(`color: ${COLORS.grey40}`) }) it('applies the correct states to the button - hover', () => { const { getByText } = render(props) const button = getByText('tertiary button') - expect(button).toHaveStyleRule( - 'background-color', - `${String(COLORS.blueHover)}`, - { - modifier: ':hover', - } - ) + expect(button).toHaveStyleRule('background-color', `${COLORS.blue55}`, { + modifier: ':hover', + }) expect(button).toHaveStyleRule('box-shadow', 'none', { modifier: ':hover', }) @@ -80,13 +65,9 @@ describe('TertiaryButton', () => { it('applies the correct states to the button - active', () => { const { getByText } = render(props) const button = getByText('tertiary button') - expect(button).toHaveStyleRule( - 'background-color', - `${String(COLORS.bluePressed)}`, - { - modifier: ':active', - } - ) + expect(button).toHaveStyleRule('background-color', `${COLORS.blue60}`, { + modifier: ':active', + }) }) it('applies the correct states to the button - focus-visible', () => { @@ -94,7 +75,7 @@ describe('TertiaryButton', () => { const button = getByText('tertiary button') expect(button).toHaveStyleRule( 'box-shadow', - `0 0 0 3px ${String(COLORS.warningEnabled)}`, + `0 0 0 3px ${COLORS.yellow50}`, { modifier: ':focus-visible', } @@ -102,14 +83,10 @@ describe('TertiaryButton', () => { }) it('renders tertiary button with text and different background color', () => { - props.backgroundColor = COLORS.errorEnabled + props.backgroundColor = COLORS.red50 const { getByText } = render(props) const button = getByText('tertiary button') - expect(button).toHaveStyle( - `background-color: ${String(COLORS.errorEnabled)}` - ) - expect(button).toHaveStyle( - `color: ${String(COLORS.fundamentalsBackground)}` - ) + expect(button).toHaveStyle(`background-color: ${COLORS.red50}`) + expect(button).toHaveStyle(`color: ${COLORS.white}`) }) }) diff --git a/app/src/atoms/buttons/__tests__/ToggleButton.test.tsx b/app/src/atoms/buttons/__tests__/ToggleButton.test.tsx index dd841423dc8..1108f5b65e6 100644 --- a/app/src/atoms/buttons/__tests__/ToggleButton.test.tsx +++ b/app/src/atoms/buttons/__tests__/ToggleButton.test.tsx @@ -1,3 +1,4 @@ +import 'jest-styled-components' import * as React from 'react' import { fireEvent } from '@testing-library/react' import { renderWithProviders, COLORS, SIZE_2 } from '@opentrons/components' @@ -26,7 +27,7 @@ describe('ToggleButton', () => { it('renders toggle button - on', () => { const { getByLabelText } = render(props) const button = getByLabelText('toggle button') - expect(button).toHaveStyle(`color: ${String(COLORS.blueEnabled)}`) + expect(button).toHaveStyle(`color: ${String(COLORS.blue50)}`) expect(button).toHaveStyle(`height: ${String(SIZE_2)}`) expect(button).toHaveStyle(`width: ${String(SIZE_2)}`) expect(button).toHaveAttribute('aria-checked', 'true') @@ -35,7 +36,7 @@ describe('ToggleButton', () => { it('applies the correct states to the toggle on- hover', () => { const { getByLabelText } = render(props) const button = getByLabelText('toggle button') - expect(button).toHaveStyleRule('color', `${String(COLORS.blueHover)}`, { + expect(button).toHaveStyleRule('color', `${String(COLORS.blue55)}`, { modifier: ':hover', }) }) @@ -45,7 +46,7 @@ describe('ToggleButton', () => { const button = getByLabelText('toggle button') expect(button).toHaveStyleRule( 'box-shadow', - `0 0 0 3px ${String(COLORS.warningEnabled)}`, + `0 0 0 3px ${String(COLORS.yellow50)}`, { modifier: ':focus-visible', } @@ -56,13 +57,9 @@ describe('ToggleButton', () => { props.disabled = true const { getByLabelText } = render(props) const button = getByLabelText('toggle button') - expect(button).toHaveStyleRule( - 'color', - `${String(COLORS.darkGreyDisabled)}`, - { - modifier: ':disabled', - } - ) + expect(button).toHaveStyleRule('color', `${String(COLORS.grey40)}`, { + modifier: ':disabled', + }) }) it('calls mock function when clicking the toggle button - on', () => { @@ -76,7 +73,7 @@ describe('ToggleButton', () => { props.toggledOn = false const { getByLabelText } = render(props) const button = getByLabelText('toggle button') - expect(button).toHaveStyle(`color: ${String(COLORS.darkGreyEnabled)}`) + expect(button).toHaveStyle(`color: ${String(COLORS.grey50)}`) expect(button).toHaveStyle(`height: ${String(SIZE_2)}`) expect(button).toHaveStyle(`width: ${String(SIZE_2)}`) expect(button).toHaveAttribute('aria-checked', 'false') @@ -86,7 +83,7 @@ describe('ToggleButton', () => { props.toggledOn = false const { getByLabelText } = render(props) const button = getByLabelText('toggle button') - expect(button).toHaveStyleRule('color', `${String(COLORS.darkGreyHover)}`, { + expect(button).toHaveStyleRule('color', `${String(COLORS.grey60)}`, { modifier: ':hover', }) }) @@ -97,7 +94,7 @@ describe('ToggleButton', () => { const button = getByLabelText('toggle button') expect(button).toHaveStyleRule( 'box-shadow', - `0 0 0 3px ${String(COLORS.warningEnabled)}`, + `0 0 0 3px ${String(COLORS.yellow50)}`, { modifier: ':focus-visible', } @@ -109,13 +106,9 @@ describe('ToggleButton', () => { props.disabled = true const { getByLabelText } = render(props) const button = getByLabelText('toggle button') - expect(button).toHaveStyleRule( - 'color', - `${String(COLORS.darkGreyDisabled)}`, - { - modifier: ':disabled', - } - ) + expect(button).toHaveStyleRule('color', `${String(COLORS.grey40)}`, { + modifier: ':disabled', + }) }) it('calls mock function when clicking the toggle button - off', () => { diff --git a/app/src/atoms/buttons/constants.ts b/app/src/atoms/buttons/constants.ts index fb4bf596435..d49080863a7 100644 --- a/app/src/atoms/buttons/constants.ts +++ b/app/src/atoms/buttons/constants.ts @@ -1,3 +1,3 @@ import { SPACING, COLORS } from '@opentrons/components' -export const ODD_FOCUS_VISIBLE = `0 0 0 ${SPACING.spacing4} ${COLORS.fundamentalsFocus}` +export const ODD_FOCUS_VISIBLE = `0 0 0 ${SPACING.spacing4} ${COLORS.blue50}` diff --git a/app/src/atoms/structure/Divider.tsx b/app/src/atoms/structure/Divider.tsx index babca8b86b9..2f8eef69cfc 100644 --- a/app/src/atoms/structure/Divider.tsx +++ b/app/src/atoms/structure/Divider.tsx @@ -6,7 +6,7 @@ type Props = React.ComponentProps export function Divider(props: Props): JSX.Element { return ( { const { getByTestId } = render(props) const divider = getByTestId('divider') expect(divider).toHaveStyle( - `borderBottom: 1px solid ${String(COLORS.medGreyEnabled)}` + `borderBottom: 1px solid ${String(COLORS.grey30)}` ) expect(divider).toHaveStyle('width: 80%') expect(divider).toHaveStyle(`margin-top: ${SPACING.spacing4}`) @@ -30,13 +30,13 @@ describe('Divider', () => { props = { ...props, width: '100%', - color: COLORS.blueEnabled, + color: COLORS.blue50, marginY: 0, paddingX: SPACING.spacing4, } const { getByTestId } = render(props) const divider = getByTestId('divider') - expect(divider).toHaveStyle(`color: ${String(COLORS.blueEnabled)}`) + expect(divider).toHaveStyle(`color: ${String(COLORS.blue50)}`) expect(divider).toHaveStyle('width: 100%') expect(divider).toHaveStyle('margin-top: 0') expect(divider).toHaveStyle('margin-bottom: 0') diff --git a/app/src/atoms/structure/__tests__/Line.test.tsx b/app/src/atoms/structure/__tests__/Line.test.tsx index 4e007d66a81..083cb5645ac 100644 --- a/app/src/atoms/structure/__tests__/Line.test.tsx +++ b/app/src/atoms/structure/__tests__/Line.test.tsx @@ -19,22 +19,20 @@ describe('Line', () => { const { getByTestId } = render(props) const line = getByTestId('line') expect(line).toHaveStyle('width: 100%') - expect(line).toHaveStyle( - `borderBottom: 1px solid ${String(COLORS.medGreyEnabled)}` - ) + expect(line).toHaveStyle(`borderBottom: 1px solid ${String(COLORS.grey30)}`) }) it('renders line with additional props', () => { props = { ...props, width: '80%', - color: COLORS.blueEnabled, + color: COLORS.blue50, marginY: 0, paddingX: SPACING.spacing4, } const { getByTestId } = render(props) const line = getByTestId('line') - expect(line).toHaveStyle(`color: ${String(COLORS.blueEnabled)}`) + expect(line).toHaveStyle(`color: ${String(COLORS.blue50)}`) expect(line).toHaveStyle('width: 80%') expect(line).toHaveStyle('margin-top: 0') expect(line).toHaveStyle('margin-bottom: 0') diff --git a/app/src/i18n.ts b/app/src/i18n.ts index a605a9a2f39..9e03af972c0 100644 --- a/app/src/i18n.ts +++ b/app/src/i18n.ts @@ -25,6 +25,7 @@ i18n.use(initReactI18next).init( escapeValue: false, // not needed for react as it escapes by default format: function (value, format, lng) { if (format === 'upperCase') return value.toUpperCase() + if (format === 'lowerCase') return value.toLowerCase() if (format === 'capitalize') return capitalize(value) if (format === 'sentenceCase') return startCase(value) if (format === 'titleCase') return titleCase(value) diff --git a/app/src/index.tsx b/app/src/index.tsx index ca524cd09bc..aa0db706ce2 100644 --- a/app/src/index.tsx +++ b/app/src/index.tsx @@ -1,6 +1,6 @@ // client entry point and application manifest import React from 'react' -import ReactDom from 'react-dom' +import ReactDom from 'react-dom/client' import { Provider } from 'react-redux' import { ConnectedRouter } from 'connected-react-router' @@ -27,7 +27,11 @@ store.dispatch(uiInitialized()) log.info('Rendering app UI') -ReactDom.render( +const container = document.getElementById('root') +if (container == null) throw new Error('Failed to find the root element') + +const root = ReactDom.createRoot(container) +root.render( @@ -36,6 +40,5 @@ ReactDom.render( - , - document.getElementById('root') + ) diff --git a/app/src/molecules/BackgroundOverlay/__tests__/BackgroundOverlay.test.tsx b/app/src/molecules/BackgroundOverlay/__tests__/BackgroundOverlay.test.tsx index 09a7c148a02..f044b895275 100644 --- a/app/src/molecules/BackgroundOverlay/__tests__/BackgroundOverlay.test.tsx +++ b/app/src/molecules/BackgroundOverlay/__tests__/BackgroundOverlay.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { BackgroundOverlay } from '..' @@ -10,8 +11,8 @@ describe('BackgroundOverlay', () => { let props: React.ComponentProps it('renders background overlay', () => { props = { onClick: jest.fn() } - const { getByLabelText } = render(props) - getByLabelText('BackgroundOverlay').click() + render(props) + fireEvent.click(screen.getByLabelText('BackgroundOverlay')) expect(props.onClick).toHaveBeenCalled() }) }) diff --git a/app/src/molecules/BackgroundOverlay/index.tsx b/app/src/molecules/BackgroundOverlay/index.tsx index b60c20f0738..5c820c9e27f 100644 --- a/app/src/molecules/BackgroundOverlay/index.tsx +++ b/app/src/molecules/BackgroundOverlay/index.tsx @@ -19,7 +19,7 @@ export function BackgroundOverlay(props: BackgroundOverlayProps): JSX.Element { top="0" bottom="0" zIndex="3" - backgroundColor={COLORS.darkBlack60} + backgroundColor={COLORS.grey50} onClick={onClick} {...flexProps} /> diff --git a/app/src/molecules/CardButton/__tests__/CardButton.test.tsx b/app/src/molecules/CardButton/__tests__/CardButton.test.tsx index 53174b54c11..f9df36aa625 100644 --- a/app/src/molecules/CardButton/__tests__/CardButton.test.tsx +++ b/app/src/molecules/CardButton/__tests__/CardButton.test.tsx @@ -49,7 +49,7 @@ describe('CardButton', () => { getByText('Find a network in your lab or enter your own.') expect(getByTestId('cardButton_icon_wifi')).toBeInTheDocument() const button = getByRole('button') - expect(button).toHaveStyle(`background-color: ${COLORS.mediumBlueEnabled}`) + expect(button).toHaveStyle(`background-color: ${COLORS.blue35}`) }) it('renders the button as disabled', () => { diff --git a/app/src/molecules/CardButton/index.tsx b/app/src/molecules/CardButton/index.tsx index 847eceacf6b..ece8c803f8a 100644 --- a/app/src/molecules/CardButton/index.tsx +++ b/app/src/molecules/CardButton/index.tsx @@ -27,29 +27,29 @@ const CARD_BUTTON_STYLE = css` box-shadow: none; &:focus { - background-color: ${COLORS.mediumBluePressed}; + background-color: ${COLORS.blue40}; box-shadow: none; } &:hover { border: none; box-shadow: none; - background-color: ${COLORS.mediumBlueEnabled}; - color: ${COLORS.darkBlackEnabled}; + background-color: ${COLORS.blue35}; + color: ${COLORS.black90}; } &:focus-visible { box-shadow: ${ODD_FOCUS_VISIBLE}; - background-color: ${COLORS.mediumBlueEnabled}; + background-color: ${COLORS.blue35}; } &:active { - background-color: ${COLORS.mediumBluePressed}; + background-color: ${COLORS.blue40}; } &:disabled { - background-color: ${COLORS.darkBlack20}; - color: ${COLORS.darkBlack70}; + background-color: ${COLORS.grey35}; + color: ${COLORS.grey60}; } ` @@ -83,20 +83,20 @@ export function CardButton(props: CardButtonProps): JSX.Element { onClick={() => history.push(destinationPath)} width="100%" css={CARD_BUTTON_STYLE} - backgroundColor={disabled ? COLORS.darkBlack20 : COLORS.mediumBlueEnabled} + backgroundColor={disabled ? COLORS.grey35 : COLORS.blue35} disabled={disabled} > {title} @@ -110,7 +110,7 @@ export function CardButton(props: CardButtonProps): JSX.Element { {description} diff --git a/app/src/molecules/CollapsibleSection/__tests__/CollapsibleSection.test.tsx b/app/src/molecules/CollapsibleSection/__tests__/CollapsibleSection.test.tsx index e02e90e83d7..513f74c8e57 100644 --- a/app/src/molecules/CollapsibleSection/__tests__/CollapsibleSection.test.tsx +++ b/app/src/molecules/CollapsibleSection/__tests__/CollapsibleSection.test.tsx @@ -1,40 +1,40 @@ import * as React from 'react' -import { fireEvent, render } from '@testing-library/react' +import { fireEvent, render, screen } from '@testing-library/react' import { CollapsibleSection } from '../' describe('CollapsibleSection', () => { it('renders children by default', () => { - const { queryByText } = render( + render( section children ) - expect(queryByText('section children')).toBeInTheDocument() + expect(screen.getByText('section children')).toBeInTheDocument() }) it('renders title by default', () => { - const { queryByText } = render( + render( section children ) - expect(queryByText('fakeTitle')).toBeInTheDocument() + expect(screen.getByText('fakeTitle')).toBeInTheDocument() }) it('after clicking collapse icon, children are hidden', () => { - const { queryByRole, queryByText } = render( + render( section children ) - const collapseButton = queryByRole('button') - collapseButton != null && fireEvent.click(collapseButton) - expect(queryByText('section children')).toBeFalsy() + const collapseButton = screen.getByRole('button') + fireEvent.click(collapseButton) + expect(screen.queryByText('section children')).toBeNull() }) it('initially collapsed if prop passed to override', () => { - const { queryByText } = render( + render( section children ) - expect(queryByText('section children')).toBeFalsy() + expect(screen.queryByText('section children')).toBeNull() }) }) diff --git a/app/src/molecules/CollapsibleSection/index.tsx b/app/src/molecules/CollapsibleSection/index.tsx index cec85f2e734..9210e81127d 100644 --- a/app/src/molecules/CollapsibleSection/index.tsx +++ b/app/src/molecules/CollapsibleSection/index.tsx @@ -16,10 +16,10 @@ import { StyledText } from '../../atoms/text' const ACCORDION_STYLE = css` border-radius: 50%; &:hover { - background: ${COLORS.lightGreyHover}; + background: ${COLORS.grey30}; } &:active { - background: ${COLORS.lightGreyPressed}; + background: ${COLORS.grey35}; } ` diff --git a/app/src/molecules/DeckThumbnail/__tests__/DeckThumbnail.test.tsx b/app/src/molecules/DeckThumbnail/__tests__/DeckThumbnail.test.tsx deleted file mode 100644 index a9cbf8e909b..00000000000 --- a/app/src/molecules/DeckThumbnail/__tests__/DeckThumbnail.test.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import * as React from 'react' -import { when, resetAllWhenMocks } from 'jest-when' -import { - getRobotTypeFromLoadedLabware, - getDeckDefFromRobotType, -} from '@opentrons/shared-data' -import ot2StandardDeckDef from '@opentrons/shared-data/deck/definitions/3/ot2_standard.json' -import { renderWithProviders } from '@opentrons/components' -import { simpleAnalysisFileFixture } from '@opentrons/api-client' -import { i18n } from '../../../i18n' -import { DeckThumbnail } from '../' -import type { LoadedLabware, RunTimeCommand } from '@opentrons/shared-data' - -jest.mock('@opentrons/shared-data', () => { - const actualSharedData = jest.requireActual('@opentrons/shared-data') - return { - ...actualSharedData, - getRobotTypeFromLoadedLabware: jest.fn(), - getDeckDefFromRobotType: jest.fn(), - } -}) -jest.mock('@opentrons/components', () => { - const actualComponents = jest.requireActual('@opentrons/components') - return { - ...actualComponents, - Module: jest.fn(({ def, x, y, children }) => ( -
- mock Module ({x},{y}) {def.model} {children} -
- )), - LabwareRender: jest.fn(({ definition }) => ( -
mock LabwareRender {definition.parameters.loadName}
- )), - } -}) -jest.mock('../../../redux/config') - -const mockgetRobotTypeFromLoadedLabware = getRobotTypeFromLoadedLabware as jest.MockedFunction< - typeof getRobotTypeFromLoadedLabware -> - -const mockgetDeckDefFromRobotType = getDeckDefFromRobotType as jest.MockedFunction< - typeof getDeckDefFromRobotType -> - -const commands: RunTimeCommand[] = simpleAnalysisFileFixture.commands as any -const labware: LoadedLabware[] = simpleAnalysisFileFixture.labware as any - -const render = (props: React.ComponentProps) => { - return renderWithProviders(, { - i18nInstance: i18n, - })[0] -} - -describe('DeckThumbnail', () => { - beforeEach(() => { - when(mockgetRobotTypeFromLoadedLabware) - .calledWith(labware) - .mockReturnValue('OT-2 Standard') - when(mockgetDeckDefFromRobotType) - .calledWith('OT-2 Standard') - .mockReturnValue(ot2StandardDeckDef as any) - }) - afterEach(() => { - resetAllWhenMocks() - }) - - it('renders loaded equipment from protocol analysis file', () => { - const { queryByText } = render({ commands, labware }) - expect(queryByText('mock Module (0,0) magneticModuleV2')).not.toBeFalsy() - expect( - queryByText('mock Module (265,0) temperatureModuleV2') - ).not.toBeFalsy() - expect( - queryByText('mock LabwareRender opentrons_96_tiprack_300ul') - ).not.toBeFalsy() - expect( - queryByText( - 'mock LabwareRender opentrons_24_aluminumblock_generic_2ml_screwcap' - ) - ).not.toBeFalsy() - expect( - queryByText('mock LabwareRender nest_96_wellplate_100ul_pcr_full_skirt') - ).not.toBeFalsy() - }) - it('renders an OT-2 deck view when the protocol is an OT-2 protocol', () => { - when(mockgetRobotTypeFromLoadedLabware) - .calledWith(labware) - .mockReturnValue('OT-2 Standard') - render({ commands, labware }) - expect(mockgetDeckDefFromRobotType).toHaveBeenCalledWith('OT-2 Standard') - }) - it('renders an OT-3 deck view when the protocol is an OT-3 protocol', () => { - when(mockgetRobotTypeFromLoadedLabware) - .calledWith(labware) - .mockReturnValue('OT-3 Standard') - render({ commands, labware }) - expect(mockgetDeckDefFromRobotType).toHaveBeenCalledWith('OT-3 Standard') - }) -}) diff --git a/app/src/molecules/DeckThumbnail/index.tsx b/app/src/molecules/DeckThumbnail/index.tsx deleted file mode 100644 index 314896186f2..00000000000 --- a/app/src/molecules/DeckThumbnail/index.tsx +++ /dev/null @@ -1,179 +0,0 @@ -import * as React from 'react' -import { useSelector } from 'react-redux' -import map from 'lodash/map' - -import { - RobotWorkSpace, - Module, - LabwareRender, - SlotLabels, - COLORS, -} from '@opentrons/components' -import { - inferModuleOrientationFromXCoordinate, - getModuleDef2, - getDeckDefFromRobotType, - getRobotTypeFromLoadedLabware, - THERMOCYCLER_MODULE_V1, -} from '@opentrons/shared-data' -import { - parseInitialLoadedLabwareBySlot, - parseInitialLoadedLabwareByModuleId, - parseInitialLoadedModulesBySlot, - parseLiquidsInLoadOrder, - parseLabwareInfoByLiquidId, - parseInitialLoadedLabwareByAdapter, -} from '@opentrons/api-client' -import { getWellFillFromLabwareId } from '../../organisms/Devices/ProtocolRun/SetupLiquids/utils' -import { getIsOnDevice } from '../../redux/config' -import { getStandardDeckViewLayerBlockList } from './utils/getStandardDeckViewLayerBlockList' -import { getStandardDeckViewBox } from './utils/getStandardViewBox' - -import type { StyleProps } from '@opentrons/components' -import type { - DeckSlot, - Liquid, - LoadedLabware, - RunTimeCommand, -} from '@opentrons/shared-data' - -interface DeckThumbnailProps extends StyleProps { - commands: RunTimeCommand[] - labware: LoadedLabware[] - liquids?: Liquid[] - showSlotLabels?: boolean -} - -export function DeckThumbnail(props: DeckThumbnailProps): JSX.Element { - const { - commands, - liquids, - labware = [], - showSlotLabels = false, - ...styleProps - } = props - const robotType = getRobotTypeFromLoadedLabware(labware) - const deckDef = getDeckDefFromRobotType(robotType) - const initialLoadedLabwareBySlot = parseInitialLoadedLabwareBySlot(commands) - const initialLoadedLabwareByAdapter = parseInitialLoadedLabwareByAdapter( - commands - ) - const initialLoadedModulesBySlot = parseInitialLoadedModulesBySlot(commands) - const initialLoadedLabwareByModuleId = parseInitialLoadedLabwareByModuleId( - commands - ) - const liquidsInLoadOrder = parseLiquidsInLoadOrder( - liquids != null ? liquids : [], - commands - ) - const labwareByLiquidId = parseLabwareInfoByLiquidId(commands) - const isOnDevice = useSelector(getIsOnDevice) - // TODO(bh, 2023-7-12): replace with color constant when added to design system - const deckFill = isOnDevice ? COLORS.light1 : '#e6e6e6' - - return ( - // PR #10488 changed size - // revert the height - // Note add offset 18px to right and left - - {({ deckSlotsById }) => ( - <> - {map(deckSlotsById, (slot: DeckSlot, slotId: string) => { - if (slot.matingSurfaceUnitVector == null) return null // if slot has no mating surface, don't render anything in it - - const moduleInSlot = - slotId in initialLoadedModulesBySlot - ? initialLoadedModulesBySlot[slotId] - : null - const labwareInSlot = - slotId in initialLoadedLabwareBySlot - ? initialLoadedLabwareBySlot[slotId] - : null - const labwareInModule = - moduleInSlot?.result?.moduleId != null && - moduleInSlot.result.moduleId in initialLoadedLabwareByModuleId - ? initialLoadedLabwareByModuleId[moduleInSlot.result.moduleId] - : null - - let labwareId = - labwareInSlot != null ? labwareInSlot.result?.labwareId : null - let labwareInAdapter = null - - if (labwareInModule != null) { - if ( - labwareInModule?.result != null && - 'labwareId' in labwareInModule.result && - labwareInModule.result.labwareId in - initialLoadedLabwareByAdapter - ) { - labwareInAdapter = - initialLoadedLabwareByAdapter[ - labwareInModule?.result.labwareId - ] - labwareId = labwareInAdapter.result?.labwareId - } else { - labwareId = labwareInModule.params.labwareId - } - } - const wellFill = - labwareId != null && liquids != null - ? getWellFillFromLabwareId( - labwareId, - liquidsInLoadOrder, - labwareByLiquidId - ) - : null - return ( - - {moduleInSlot != null ? ( - - {labwareInModule?.result?.definition != null ? ( - - ) : null} - - ) : null} - {labwareInSlot?.result?.definition != null ? ( - - - - ) : null} - - ) - })} - {showSlotLabels ? : null} - - )} - - ) -} diff --git a/app/src/molecules/DeckThumbnail/utils/getStandardViewBox.ts b/app/src/molecules/DeckThumbnail/utils/getStandardViewBox.ts deleted file mode 100644 index aeecd0c00ad..00000000000 --- a/app/src/molecules/DeckThumbnail/utils/getStandardViewBox.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { RobotType } from '@opentrons/shared-data' - -const OT2_VIEWBOX = '-75 -20 586 480' -const OT3_VIEWBOX = '-144.31 -76.59 750 580' - -export const getStandardDeckViewBox = (robotType: RobotType): string | null => { - switch (robotType) { - case 'OT-2 Standard': - return OT2_VIEWBOX - case 'OT-3 Standard': - return OT3_VIEWBOX - default: - return null - } -} diff --git a/app/src/molecules/GenericWizardTile/__tests__/GenericWizardTile.test.tsx b/app/src/molecules/GenericWizardTile/__tests__/GenericWizardTile.test.tsx index b1b17345233..0a63337e204 100644 --- a/app/src/molecules/GenericWizardTile/__tests__/GenericWizardTile.test.tsx +++ b/app/src/molecules/GenericWizardTile/__tests__/GenericWizardTile.test.tsx @@ -32,21 +32,21 @@ describe('GenericWizardTile', () => { mockGetIsOnDevice.mockReturnValue(false) }) it('renders correct generic tile information with a help link', () => { - const { getByText } = render(props) - getByText('body') - const btn = getByText('Continue') - getByText('header') + render(props) + screen.getByText('body') + const btn = screen.getByText('Continue') + screen.getByText('header') fireEvent.click(btn) expect(props.proceed).toHaveBeenCalled() - getByText('Need help?') + screen.getByText('Need help?') expect(screen.queryByText('Go back')).not.toBeInTheDocument() }) it('renders correct generic tile information for on device display', () => { mockGetIsOnDevice.mockReturnValue(true) - const { getByText, getByLabelText } = render(props) - getByText('body') - getByText('header') - getByLabelText('SmallButton_primary').click() + render(props) + screen.getByText('body') + screen.getByText('header') + fireEvent.click(screen.getByRole('button')) expect(props.proceed).toHaveBeenCalled() }) it('renders correct generic tile information with a back button', () => { @@ -54,8 +54,8 @@ describe('GenericWizardTile', () => { ...props, back: jest.fn(), } - const { getByText } = render(props) - const btn = getByText('Go back') + render(props) + const btn = screen.getByText('Go back') fireEvent.click(btn) expect(props.back).toHaveBeenCalled() }) @@ -65,8 +65,8 @@ describe('GenericWizardTile', () => { back: jest.fn(), backIsDisabled: true, } - const { getByLabelText } = render(props) - const btn = getByLabelText('back') + render(props) + const btn = screen.getByLabelText('back') fireEvent.click(btn) expect(btn).toBeDisabled() }) diff --git a/app/src/molecules/GenericWizardTile/index.tsx b/app/src/molecules/GenericWizardTile/index.tsx index 9e6d15074bd..de4d904e948 100644 --- a/app/src/molecules/GenericWizardTile/index.tsx +++ b/app/src/molecules/GenericWizardTile/index.tsx @@ -19,9 +19,11 @@ import { DISPLAY_INLINE_BLOCK, ALIGN_CENTER, ALIGN_FLEX_END, + useHoverTooltip, } from '@opentrons/components' import { getIsOnDevice } from '../../redux/config' import { StyledText } from '../../atoms/text' +import { Tooltip } from '../../atoms/Tooltip' import { NeedHelpLink } from '../../organisms/CalibrationPanels' import { SmallButton } from '../../atoms/buttons' @@ -40,7 +42,7 @@ const CAPITALIZE_FIRST_LETTER_STYLE = css` ` const GO_BACK_BUTTON_STYLE = css` ${TYPOGRAPHY.pSemiBold}; - color: ${COLORS.darkGreyEnabled}; + color: ${COLORS.grey50}; &:hover { opacity: 70%; @@ -59,7 +61,7 @@ const GO_BACK_BUTTON_STYLE = css` ` const GO_BACK_BUTTON_DISABLED_STYLE = css` ${TYPOGRAPHY.pSemiBold}; - color: ${COLORS.darkBlack70}; + color: ${COLORS.grey60}; ` const Title = styled.h1` ${TYPOGRAPHY.h1Default}; @@ -90,6 +92,7 @@ export interface GenericWizardTileProps { proceedIsDisabled?: boolean proceedButton?: JSX.Element backIsDisabled?: boolean + disableProceedReason?: string } export function GenericWizardTile(props: GenericWizardTileProps): JSX.Element { @@ -104,9 +107,11 @@ export function GenericWizardTile(props: GenericWizardTileProps): JSX.Element { proceedIsDisabled, proceedButton, backIsDisabled, + disableProceedReason, } = props const { t } = useTranslation('shared') const isOnDevice = useSelector(getIsOnDevice) + const [targetProps, tooltipProps] = useHoverTooltip() let buttonPositioning: string = '' if ( @@ -130,7 +135,7 @@ export function GenericWizardTile(props: GenericWizardTileProps): JSX.Element { {typeof header === 'string' ? {header} : header} @@ -158,19 +163,35 @@ export function GenericWizardTile(props: GenericWizardTileProps): JSX.Element { {getHelp != null ? : null} {proceed != null && proceedButton == null ? ( isOnDevice ? ( - + <> + + {disableProceedReason != null && ( + + {disableProceedReason} + + )} + ) : ( - - {proceedButtonText} - + <> + + {proceedButtonText} + + {disableProceedReason != null && ( + + {disableProceedReason} + + )} + ) ) : null} {proceed == null && proceedButton != null ? proceedButton : null} diff --git a/app/src/molecules/InProgressModal/InProgressModal.tsx b/app/src/molecules/InProgressModal/InProgressModal.tsx index 54e4e5ebb13..0cbc421f0bd 100644 --- a/app/src/molecules/InProgressModal/InProgressModal.tsx +++ b/app/src/molecules/InProgressModal/InProgressModal.tsx @@ -19,6 +19,7 @@ interface Props { // optional override of the spinner alternativeSpinner?: React.ReactNode description?: string + body?: string children?: JSX.Element } @@ -38,6 +39,14 @@ const DESCRIPTION_STYLE = css` line-height: ${TYPOGRAPHY.lineHeight42}; } ` +const BODY_STYLE = css` + ${TYPOGRAPHY.pRegular} + text-align: ${TYPOGRAPHY.textAlignCenter}; + + @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { + ${TYPOGRAPHY.level4HeaderRegular} + color: ${COLORS.grey60} + ` const MODAL_STYLE = css` align-items: ${ALIGN_CENTER}; flex-direction: ${DIRECTION_COLUMN}; @@ -49,16 +58,16 @@ const MODAL_STYLE = css` } ` const SPINNER_STYLE = css` - color: ${COLORS.darkGreyEnabled}; + color: ${COLORS.grey50}; opacity: 100%; @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { - color: ${COLORS.darkBlackEnabled}; + color: ${COLORS.black90}; opacity: 70%; } ` export function InProgressModal(props: Props): JSX.Element { - const { alternativeSpinner, children, description } = props + const { alternativeSpinner, children, description, body } = props const isOnDevice = useSelector(getIsOnDevice) return ( @@ -72,9 +81,17 @@ export function InProgressModal(props: Props): JSX.Element { spin /> )} - {description != null && ( - {description} - )} + + {description != null && ( + {description} + )} + {body != null && {body}} + {children} ) diff --git a/app/src/molecules/InfoMessage/index.tsx b/app/src/molecules/InfoMessage/index.tsx index c85d33c179f..dd576483c29 100644 --- a/app/src/molecules/InfoMessage/index.tsx +++ b/app/src/molecules/InfoMessage/index.tsx @@ -23,7 +23,7 @@ export interface InfoMessageProps { export function InfoMessage({ title, body }: InfoMessageProps): JSX.Element { return ( {title} diff --git a/app/src/molecules/InstrumentCard/InstrumentCard.stories.tsx b/app/src/molecules/InstrumentCard/InstrumentCard.stories.tsx index 179f3fbe6de..dcda23cbf36 100644 --- a/app/src/molecules/InstrumentCard/InstrumentCard.stories.tsx +++ b/app/src/molecules/InstrumentCard/InstrumentCard.stories.tsx @@ -28,6 +28,7 @@ Attached.args = { onClick: () => console.log('item click 2'), }, ], + isEstopNotDisengaged: false, } export const Divider = Template.bind({}) @@ -47,6 +48,7 @@ Divider.args = { onClick: () => console.log('item click 2'), }, ], + isEstopNotDisengaged: false, } export const Empty = Template.bind({}) @@ -67,4 +69,5 @@ Empty.args = { onClick: () => console.log('item click 2'), }, ], + isEstopNotDisengaged: false, } diff --git a/app/src/molecules/InstrumentCard/__tests__/InstrumentCard.test.tsx b/app/src/molecules/InstrumentCard/__tests__/InstrumentCard.test.tsx index c8c014b017a..068439e86b9 100644 --- a/app/src/molecules/InstrumentCard/__tests__/InstrumentCard.test.tsx +++ b/app/src/molecules/InstrumentCard/__tests__/InstrumentCard.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { render } from '@testing-library/react' +import { fireEvent, render, screen } from '@testing-library/react' import { InstrumentCard } from '..' @@ -23,6 +23,7 @@ const renderInstrumentCard = () => onClick: mockDisabledOnClick, }, ]} + isEstopNotDisengaged={false} /> ) @@ -32,23 +33,46 @@ describe('InstrumentCard', () => { }) it('renders instrument card label and description', () => { - const { getByText } = renderInstrumentCard() - - getByText('new instrument GEN4') - getByText('multipurpose grommet') + renderInstrumentCard() + screen.getByText('new instrument GEN4') + screen.getByText('multipurpose grommet') }) it('renders overflow menu items when overflow button clicked', () => { - const { getByRole } = renderInstrumentCard() - - getByRole('button').click() - const activeMenuItem = getByRole('button', { name: 'menu option 1' }) - const disabledMenuItem = getByRole('button', { name: 'menu option 2' }) + renderInstrumentCard() + fireEvent.click(screen.getByRole('button')) + const activeMenuItem = screen.getByRole('button', { name: 'menu option 1' }) + const disabledMenuItem = screen.getByRole('button', { + name: 'menu option 2', + }) expect(activeMenuItem).not.toBeDisabled() expect(disabledMenuItem).toBeDisabled() - activeMenuItem.click() + fireEvent.click(activeMenuItem) expect(mockOnClick).toBeCalled() - disabledMenuItem.click() + fireEvent.click(disabledMenuItem) expect(mockDisabledOnClick).not.toBeCalled() }) + + it('render disabled overflow menu when e-stop is pressed', () => { + render( + + ) + expect(screen.getByRole('button')).toBeDisabled() + }) }) diff --git a/app/src/molecules/InstrumentCard/index.tsx b/app/src/molecules/InstrumentCard/index.tsx index e24870c7610..c8a32724405 100644 --- a/app/src/molecules/InstrumentCard/index.tsx +++ b/app/src/molecules/InstrumentCard/index.tsx @@ -33,6 +33,7 @@ interface InstrumentCardProps extends StyleProps { // special casing the gripper at least for now isGripperAttached?: boolean banner?: React.ReactNode + isEstopNotDisengaged: boolean } /** @@ -48,6 +49,7 @@ export function InstrumentCard(props: InstrumentCardProps): JSX.Element { label, menuOverlayItems, banner, + isEstopNotDisengaged, ...styleProps } = props @@ -61,7 +63,7 @@ export function InstrumentCard(props: InstrumentCardProps): JSX.Element { return ( {isGripperAttached ? ( - - flex gripper + + Flex Gripper ) : null} {instrumentDiagramProps?.pipetteSpecs != null ? ( @@ -92,7 +99,7 @@ export function InstrumentCard(props: InstrumentCardProps): JSX.Element { {banner} @@ -111,6 +118,7 @@ export function InstrumentCard(props: InstrumentCardProps): JSX.Element { {menuOverlay} {showOverflowMenu ? ( diff --git a/app/src/molecules/JogControls/ControlContainer.tsx b/app/src/molecules/JogControls/ControlContainer.tsx index daa0bc0a7af..3e60a319f86 100644 --- a/app/src/molecules/JogControls/ControlContainer.tsx +++ b/app/src/molecules/JogControls/ControlContainer.tsx @@ -17,7 +17,7 @@ interface ControlContainerProps extends StyleProps { } const CONTROL_CHILDREN_STYLES = css` - background-color: ${COLORS.fundamentalsBackground}; + background-color: ${COLORS.grey10}; border-radius: ${BORDERS.radiusSoftCorners}; padding: ${SPACING.spacing16}; width: 100%; diff --git a/app/src/molecules/JogControls/DirectionControl.tsx b/app/src/molecules/JogControls/DirectionControl.tsx index 720cc11323c..86fb7c09d8c 100644 --- a/app/src/molecules/JogControls/DirectionControl.tsx +++ b/app/src/molecules/JogControls/DirectionControl.tsx @@ -174,7 +174,7 @@ const DEFAULT_BUTTON_STYLE = css` justify-content: ${JUSTIFY_FLEX_START}; align-items: ${ALIGN_CENTER}; background-color: ${COLORS.white}; - color: ${COLORS.black}; + color: ${COLORS.black90}; grid-gap: ${SPACING.spacing8}; padding: ${SPACING.spacing8}; @@ -184,31 +184,31 @@ const DEFAULT_BUTTON_STYLE = css` &:hover { background-color: ${COLORS.white}; - color: ${COLORS.black}; + color: ${COLORS.black90}; box-shadow: 0 0 0; - border: 1px ${COLORS.lightGreyHover} solid; + border: 1px ${COLORS.grey30} solid; } &:active { background-color: ${COLORS.white}; - color: ${COLORS.blueEnabled}; - border: 1px ${COLORS.blueEnabled} solid; + color: ${COLORS.blue50}; + border: 1px ${COLORS.blue50} solid; } &:disabled { background-color: ${COLORS.white}; - color: ${COLORS.errorDisabled}; + color: ${COLORS.grey40}; } ` const ACTIVE_BUTTON_STYLE = css` ${DEFAULT_BUTTON_STYLE} - color: ${COLORS.blueEnabled}; - border: 1px ${COLORS.blueEnabled} solid; + color: ${COLORS.blue50}; + border: 1px ${COLORS.blue50} solid; &:hover { - color: ${COLORS.bluePressed}; - border: 1px ${COLORS.bluePressed} solid; + color: ${COLORS.blue60}; + border: 1px ${COLORS.blue60} solid; } ` @@ -266,7 +266,7 @@ export function DirectionControl(props: DirectionControlProps): JSX.Element { {subtitle} @@ -330,7 +330,7 @@ const ARROW_GRID_STYLES = css` } ` const ARROW_BUTTON_STYLES = css` - color: ${COLORS.darkGreyEnabled}; + color: ${COLORS.grey50}; background-color: ${COLORS.white}; border: ${BORDERS.lineBorder}; @@ -342,15 +342,15 @@ const ARROW_BUTTON_STYLES = css` justify-content: ${JUSTIFY_CENTER}; &:hover { background-color: ${COLORS.white}; - color: ${COLORS.darkGreyHover}; + color: ${COLORS.grey60}; box-shadow: 0 0 0; - border: 1px ${COLORS.lightGreyHover} solid; + border: 1px ${COLORS.grey30} solid; } &:active { background-color: ${COLORS.white}; - color: ${COLORS.darkGreyPressed}; - border: 1px ${COLORS.lightGreyHover} solid; + color: ${COLORS.grey60}; + border: 1px ${COLORS.grey30} solid; } &:focus { @@ -359,7 +359,7 @@ const ARROW_BUTTON_STYLES = css` &:disabled { background-color: ${COLORS.white}; - color: ${COLORS.darkGreyDisabled}; + color: ${COLORS.grey30}; } @media (max-width: 750px) { @@ -369,28 +369,28 @@ const ARROW_BUTTON_STYLES = css` @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { width: 125px; height: 125px; - background-color: ${COLORS.light1}; - color: ${COLORS.darkBlackEnabled}; + background-color: ${COLORS.grey35}; + color: ${COLORS.black90}; border-radius: ${BORDERS.borderRadiusSize4}; &:hover { - background-color: ${COLORS.light1Pressed}; - color: ${COLORS.darkBlackHover}; + background-color: ${COLORS.grey40}; + color: ${COLORS.black80}; border: 1px ${COLORS.transparent} solid; } &:active { - background-color: ${COLORS.light1Pressed}; - color: ${COLORS.darkGreyPressed}; + background-color: ${COLORS.grey40}; + color: ${COLORS.grey60}; } &:focus { - background-color: ${COLORS.light1Pressed}; + background-color: ${COLORS.grey40}; } &:disabled { - background-color: ${COLORS.darkBlack20}; - color: ${COLORS.darkBlack40}; + background-color: ${COLORS.grey35}; + color: ${COLORS.grey50}; border: 1px ${COLORS.transparent} solid; } } @@ -457,7 +457,7 @@ export function TouchDirectionControl( {CONTROLS_CONTENTS_BY_PLANE[plane].title} diff --git a/app/src/molecules/JogControls/StepSizeControl.tsx b/app/src/molecules/JogControls/StepSizeControl.tsx index 09db9e8215c..7cd6740a846 100644 --- a/app/src/molecules/JogControls/StepSizeControl.tsx +++ b/app/src/molecules/JogControls/StepSizeControl.tsx @@ -50,7 +50,7 @@ const DEFAULT_BUTTON_STYLE = css` background-color: ${COLORS.white}; border: 1px ${COLORS.white} solid; height: 3.62rem; - color: ${COLORS.black}; + color: ${COLORS.black90}; &:focus { background-color: ${COLORS.white}; @@ -58,30 +58,33 @@ const DEFAULT_BUTTON_STYLE = css` &:hover { background-color: ${COLORS.white}; - color: ${COLORS.black}; + color: ${COLORS.black90}; box-shadow: 0 0 0; - border: 1px ${COLORS.lightGreyHover} solid; + border: 1px ${COLORS.grey30} solid; + outline: 2px ${BORDERS.styleSolid} ${COLORS.blue50}; + outline-offset: 3px; } &:active { background-color: ${COLORS.white}; - color: ${COLORS.blueEnabled}; - border: 1px ${COLORS.blueEnabled} solid; + color: ${COLORS.blue50}; + border: 1px ${COLORS.blue50} solid; } &:disabled { background-color: inherit; - color: ${COLORS.errorDisabled}; + color: ${COLORS.grey40}; } ` const ACTIVE_BUTTON_STYLE = css` ${DEFAULT_BUTTON_STYLE} - color: ${COLORS.blueEnabled}; - border: 1px ${COLORS.blueEnabled} solid; + color: ${COLORS.blue50}; + border: 1px ${COLORS.blue50} solid; &:hover { - color: ${COLORS.blueHover}; - border: 1px ${COLORS.blueHover} solid; + color: ${COLORS.blue55}; + border: 1px ${COLORS.blue55} solid; + outline: 0; } ` interface StepSizeControlProps { @@ -132,10 +135,7 @@ export function StepSizeControl(props: StepSizeControlProps): JSX.Element { {t('jump_size')} - + {JUMP_SIZE_SUBTITLE} @@ -153,7 +153,7 @@ export function StepSizeControl(props: StepSizeControlProps): JSX.Element { > {t(stepSizeTranslationKeyByStep[stepSize])} {`${stepSize} mm`} @@ -173,7 +173,7 @@ export function TouchStepSizeControl(props: StepSizeControlProps): JSX.Element { {t(stepSizeTranslationKeyByStep[stepSize])} {`${stepSize} mm`} diff --git a/app/src/molecules/JogControls/TouchControlButton.tsx b/app/src/molecules/JogControls/TouchControlButton.tsx index c1490726c5a..10422172381 100644 --- a/app/src/molecules/JogControls/TouchControlButton.tsx +++ b/app/src/molecules/JogControls/TouchControlButton.tsx @@ -5,7 +5,7 @@ import { ODD_FOCUS_VISIBLE } from '../../atoms/buttons/constants' export const TouchControlButton = styled.button<{ selected: boolean }>` background-color: ${({ selected }) => - selected ? COLORS.blueEnabled : COLORS.mediumBlueEnabled}; + selected ? COLORS.blue50 : COLORS.blue35}; cursor: default; border-radius: ${BORDERS.borderRadiusSize4}; box-shadow: none; @@ -13,23 +13,23 @@ export const TouchControlButton = styled.button<{ selected: boolean }>` &:focus { background-color: ${({ selected }) => - selected ? COLORS.bluePressed : COLORS.mediumBluePressed}; + selected ? COLORS.blue60 : COLORS.blue40}; box-shadow: none; } &:hover { border: none; box-shadow: none; background-color: ${({ selected }) => - selected ? COLORS.blueEnabled : COLORS.mediumBlueEnabled}; + selected ? COLORS.blue50 : COLORS.blue35}; } &:focus-visible { box-shadow: ${ODD_FOCUS_VISIBLE}; background-color: ${({ selected }) => - selected ? COLORS.blueEnabled : COLORS.mediumBlueEnabled}; + selected ? COLORS.blue50 : COLORS.blue35}; } &:active { background-color: ${({ selected }) => - selected ? COLORS.bluePressed : COLORS.mediumBluePressed}; + selected ? COLORS.blue60 : COLORS.blue40}; } ` diff --git a/app/src/molecules/LegacyModal/LegacyModal.stories.tsx b/app/src/molecules/LegacyModal/LegacyModal.stories.tsx index b10c032e852..8f63710c94b 100644 --- a/app/src/molecules/LegacyModal/LegacyModal.stories.tsx +++ b/app/src/molecules/LegacyModal/LegacyModal.stories.tsx @@ -26,7 +26,7 @@ const Children = ( diff --git a/app/src/molecules/LegacyModal/LegacyModalHeader.tsx b/app/src/molecules/LegacyModal/LegacyModalHeader.tsx index 78fa018d249..7269d33ed6e 100644 --- a/app/src/molecules/LegacyModal/LegacyModalHeader.tsx +++ b/app/src/molecules/LegacyModal/LegacyModalHeader.tsx @@ -22,7 +22,7 @@ export interface LegacyModalHeaderProps { backgroundColor?: string color?: string icon?: IconProps - closeButton?: JSX.Element + closeButton?: React.ReactNode } const closeIconStyles = css` @@ -33,11 +33,11 @@ const closeIconStyles = css` width: 1.625rem; height: 1.625rem; &:hover { - background-color: ${COLORS.lightGreyHover}; + background-color: ${COLORS.grey30}; } &:active { - background-color: ${COLORS.lightGreyPressed}; + background-color: ${COLORS.grey35}; } ` @@ -66,7 +66,7 @@ export const LegacyModalHeader = (
{closeButton != null - ? { closeButton } + ? closeButton : onClose != null && ( ` diff --git a/app/src/molecules/LegacyModal/__tests__/LegacyModal.test.tsx b/app/src/molecules/LegacyModal/__tests__/LegacyModal.test.tsx index aea194c8c5c..c7808ec38fc 100644 --- a/app/src/molecules/LegacyModal/__tests__/LegacyModal.test.tsx +++ b/app/src/molecules/LegacyModal/__tests__/LegacyModal.test.tsx @@ -33,7 +33,7 @@ describe('LegacyModal', () => { const [{ getByTestId }] = render(props) const headerIcon = getByTestId('Modal_header_icon') expect(headerIcon).toBeInTheDocument() - expect(headerIcon).toHaveStyle(`color: ${COLORS.warningEnabled}`) + expect(headerIcon).toHaveStyle(`color: ${COLORS.yellow50}`) expect(getByTestId('Modal_header')).toHaveStyle( `background-color: ${COLORS.white}` ) @@ -44,7 +44,7 @@ describe('LegacyModal', () => { const [{ getByTestId }] = render(props) const headerIcon = getByTestId('Modal_header_icon') expect(headerIcon).toBeInTheDocument() - expect(headerIcon).toHaveStyle(`color: ${COLORS.errorEnabled}`) + expect(headerIcon).toHaveStyle(`color: ${COLORS.red50}`) expect(getByTestId('Modal_header')).toHaveStyle( `background-color: ${COLORS.white}` ) diff --git a/app/src/molecules/LegacyModal/__tests__/LegacyModalHeader.test.tsx b/app/src/molecules/LegacyModal/__tests__/LegacyModalHeader.test.tsx index f4b341caf25..81fdd5b8351 100644 --- a/app/src/molecules/LegacyModal/__tests__/LegacyModalHeader.test.tsx +++ b/app/src/molecules/LegacyModal/__tests__/LegacyModalHeader.test.tsx @@ -1,3 +1,5 @@ +import 'jest-styled-components' +import { screen, fireEvent } from '@testing-library/react' import * as React from 'react' import { @@ -24,38 +26,42 @@ describe('LegacyModalHeader', () => { onClose: mockClose, title: 'mock modal header title', backgroundColor: COLORS.white, - color: COLORS.darkBlackEnabled, + color: COLORS.black90, } }) it('should render text and close icon', () => { - const [{ getByText, getByTestId }] = render(props) - const title = getByText('mock modal header title') - expect(title).toHaveStyle(`color: ${COLORS.darkBlackEnabled}`) - getByTestId('ModalHeader_icon_close_mock modal header title') + render(props) + const title = screen.getByText('mock modal header title') + expect(title).toHaveStyle(`color: ${COLORS.black90}`) + screen.getByTestId('ModalHeader_icon_close_mock modal header title') }) it('should render text, icon, and close icon', () => { props.icon = { name: 'ot-alert', - color: COLORS.darkBlackEnabled, + color: COLORS.black90, size: '1.25rem', marginRight: SPACING.spacing8, } - const [{ getByTestId }] = render(props) - expect(getByTestId('Modal_header_icon')).toHaveStyle( - `color: ${COLORS.darkBlackEnabled}` + render(props) + expect(screen.getByTestId('Modal_header_icon')).toHaveStyle( + `color: ${COLORS.black90}` ) - expect(getByTestId('Modal_header_icon')).toHaveStyle(`width: 1.25rem`) - expect(getByTestId('Modal_header_icon')).toHaveStyle(`height: 1.25rem`) - expect(getByTestId('Modal_header_icon')).toHaveStyle( + expect(screen.getByTestId('Modal_header_icon')).toHaveStyle( + `width: 1.25rem` + ) + expect(screen.getByTestId('Modal_header_icon')).toHaveStyle( + `height: 1.25rem` + ) + expect(screen.getByTestId('Modal_header_icon')).toHaveStyle( `margin-right: ${SPACING.spacing8}` ) }) it('should call a mock function when clicking close icon', () => { - const [{ getByTestId }] = render(props) - const closeIcon = getByTestId( + render(props) + const closeIcon = screen.getByTestId( 'ModalHeader_icon_close_mock modal header title' ) expect(closeIcon).toHaveStyle('width: 1.625rem') @@ -64,21 +70,13 @@ describe('LegacyModalHeader', () => { expect(closeIcon).toHaveStyle(`justify-content: ${JUSTIFY_CENTER}`) expect(closeIcon).toHaveStyle(`align-items: ${ALIGN_CENTER}`) expect(closeIcon).toHaveStyle('border-radius: 0.875rem') - expect(closeIcon).toHaveStyleRule( - 'background-color', - COLORS.lightGreyHover, - { - modifier: ':hover', - } - ) - expect(closeIcon).toHaveStyleRule( - 'background-color', - COLORS.lightGreyPressed, - { - modifier: ':active', - } - ) - closeIcon.click() + expect(closeIcon).toHaveStyleRule('background-color', COLORS.grey30, { + modifier: ':hover', + }) + expect(closeIcon).toHaveStyleRule('background-color', COLORS.grey35, { + modifier: ':active', + }) + fireEvent.click(closeIcon) expect(mockClose).toHaveBeenCalled() }) }) diff --git a/app/src/molecules/LegacyModal/index.tsx b/app/src/molecules/LegacyModal/index.tsx index e73367f84df..189abd4b700 100644 --- a/app/src/molecules/LegacyModal/index.tsx +++ b/app/src/molecules/LegacyModal/index.tsx @@ -35,10 +35,10 @@ export const LegacyModal = (props: LegacyModalProps): JSX.Element => { let iconColor: string = '' switch (type) { case 'warning': - iconColor = COLORS.warningEnabled + iconColor = COLORS.yellow50 break case 'error': - iconColor = COLORS.errorEnabled + iconColor = COLORS.red50 break } return iconColor @@ -56,7 +56,7 @@ export const LegacyModal = (props: LegacyModalProps): JSX.Element => { onClose={onClose} title={title} icon={['error', 'warning'].includes(type) ? modalIcon : undefined} - color={COLORS.darkBlackEnabled} + color={COLORS.black90} backgroundColor={COLORS.white} /> ) @@ -67,7 +67,7 @@ export const LegacyModal = (props: LegacyModalProps): JSX.Element => { header={modalHeader} onOutsideClick={closeOnOutsideClick ?? false ? onClose : undefined} // center within viewport aside from nav - marginLeft="7.125rem" + marginLeft={styleProps.marginLeft ?? '7.125rem'} {...props} footer={footer} > diff --git a/app/src/molecules/MiniCard/__tests__/MiniCard.test.tsx b/app/src/molecules/MiniCard/__tests__/MiniCard.test.tsx index d50ce98d6f0..001cd249ee7 100644 --- a/app/src/molecules/MiniCard/__tests__/MiniCard.test.tsx +++ b/app/src/molecules/MiniCard/__tests__/MiniCard.test.tsx @@ -1,3 +1,4 @@ +import 'jest-styled-components' import * as React from 'react' import { fireEvent } from '@testing-library/react' import { @@ -28,9 +29,7 @@ describe('MiniCard', () => { const { getByText } = render(props) const miniCard = getByText('mock mini card') expect(miniCard).toHaveStyle(`background-color: ${String(COLORS.white)}`) - expect(miniCard).toHaveStyle( - `border: 1px solid ${String(COLORS.medGreyEnabled)}` - ) + expect(miniCard).toHaveStyle(`border: 1px solid ${String(COLORS.grey30)}`) expect(miniCard).toHaveStyle( `border-radius: ${String(BORDERS.radiusSoftCorners)}` ) @@ -43,12 +42,8 @@ describe('MiniCard', () => { props.isSelected = true const { getByText } = render(props) const miniCard = getByText('mock mini card') - expect(miniCard).toHaveStyle( - `background-color: ${String(COLORS.lightBlue)}` - ) - expect(miniCard).toHaveStyle( - `border: 1px solid ${String(COLORS.blueEnabled)}` - ) + expect(miniCard).toHaveStyle(`background-color: ${String(COLORS.blue10)}`) + expect(miniCard).toHaveStyle(`border: 1px solid ${String(COLORS.blue50)}`) expect(miniCard).toHaveStyle( `border-radius: ${String(BORDERS.radiusSoftCorners)}` ) @@ -57,14 +52,14 @@ describe('MiniCard', () => { expect(miniCard).toHaveStyle(`cursor: pointer`) expect(miniCard).toHaveStyleRule( 'border', - `1px solid ${String(COLORS.blueEnabled)}`, + `1px solid ${String(COLORS.blue50)}`, { modifier: ':hover', } ) expect(miniCard).toHaveStyleRule( 'background-color', - `${String(COLORS.lightBlue)}`, + `${String(COLORS.blue10)}`, { modifier: ':hover', } @@ -76,12 +71,8 @@ describe('MiniCard', () => { props.isSelected = true const { getByText } = render(props) const miniCard = getByText('mock mini card') - expect(miniCard).toHaveStyle( - `background-color: ${String(COLORS.errorBackgroundLight)}` - ) - expect(miniCard).toHaveStyle( - `border: 1px solid ${String(COLORS.errorEnabled)}` - ) + expect(miniCard).toHaveStyle(`background-color: ${String(COLORS.red20)}`) + expect(miniCard).toHaveStyle(`border: 1px solid ${String(COLORS.red50)}`) expect(miniCard).toHaveStyle( `border-radius: ${String(BORDERS.radiusSoftCorners)}` ) @@ -90,14 +81,14 @@ describe('MiniCard', () => { expect(miniCard).toHaveStyle(`cursor: pointer`) expect(miniCard).toHaveStyleRule( 'border', - `1px solid ${String(COLORS.errorEnabled)}`, + `1px solid ${String(COLORS.red50)}`, { modifier: ':hover', } ) expect(miniCard).toHaveStyleRule( 'background-color', - `${String(COLORS.errorBackgroundLight)}`, + `${String(COLORS.red20)}`, { modifier: ':hover', } diff --git a/app/src/molecules/MiniCard/index.tsx b/app/src/molecules/MiniCard/index.tsx index e2fb7777dd1..1b7dd584f6a 100644 --- a/app/src/molecules/MiniCard/index.tsx +++ b/app/src/molecules/MiniCard/index.tsx @@ -9,50 +9,71 @@ interface MiniCardProps extends StyleProps { isSelected: boolean children: React.ReactNode isError?: boolean + isWarning?: boolean } const unselectedOptionStyles = css` background-color: ${COLORS.white}; - border: 1px solid ${COLORS.medGreyEnabled}; + border: 1px solid ${COLORS.grey30}; border-radius: ${BORDERS.radiusSoftCorners}; padding: ${SPACING.spacing8}; width: 100%; cursor: pointer; &:hover { - border: 1px solid ${COLORS.medGreyHover}; + background-color: ${COLORS.grey10}; + border: 1px solid ${COLORS.grey35}; } ` const selectedOptionStyles = css` ${unselectedOptionStyles} - border: 1px solid ${COLORS.blueEnabled}; - background-color: ${COLORS.lightBlue}; + border: 1px solid ${COLORS.blue50}; + background-color: ${COLORS.blue10}; &:hover { - border: 1px solid ${COLORS.blueEnabled}; - background-color: ${COLORS.lightBlue}; + border: 1px solid ${COLORS.blue50}; + background-color: ${COLORS.blue10}; } ` const errorOptionStyles = css` ${selectedOptionStyles} - border: 1px solid ${COLORS.errorEnabled}; - background-color: ${COLORS.errorBackgroundLight}; + border: 1px solid ${COLORS.red50}; + background-color: ${COLORS.red20}; &:hover { - border: 1px solid ${COLORS.errorEnabled}; - background-color: ${COLORS.errorBackgroundLight}; + border: 1px solid ${COLORS.red50}; + background-color: ${COLORS.red20}; + } +` + +const warningOptionStyles = css` + ${selectedOptionStyles} + border: 1px solid ${COLORS.yellow50}; + background-color: ${COLORS.yellow20}; + + &:hover { + border: 1px solid ${COLORS.yellow50}; + background-color: ${COLORS.yellow20}; } ` export function MiniCard(props: MiniCardProps): JSX.Element { - const { children, onClick, isSelected, isError = false } = props - - const selectedWrapperStyles = isError - ? errorOptionStyles - : selectedOptionStyles - const wrapperStyles = isSelected - ? selectedWrapperStyles - : unselectedOptionStyles + const { + children, + onClick, + isSelected, + isError = false, + isWarning = false, + } = props + + let wrapperStyles = unselectedOptionStyles + if (isSelected && isError) { + wrapperStyles = errorOptionStyles + } else if (isSelected && isWarning) { + wrapperStyles = warningOptionStyles + } else if (isSelected) { + wrapperStyles = selectedOptionStyles + } return ( diff --git a/app/src/molecules/Modal/Modal.stories.tsx b/app/src/molecules/Modal/Modal.stories.tsx index 5295090666f..7060d710fdb 100644 --- a/app/src/molecules/Modal/Modal.stories.tsx +++ b/app/src/molecules/Modal/Modal.stories.tsx @@ -26,7 +26,7 @@ Default.args = { title: 'Header', hasExitIcon: true, iconName: 'information', - iconColor: COLORS.black, + iconColor: COLORS.black90, }, children: ( { mockModalHeader.mockReturnValue(
mock Modal Header
) }) it('should render the modal with no header', () => { - const { getByText, getByLabelText, queryByText } = render(props) - getByText('children') - getByLabelText('modal_medium') - expect(queryByText('mock Modal Header')).not.toBeInTheDocument() + render(props) + screen.getByText('children') + screen.getByLabelText('modal_medium') + expect(screen.queryByText('mock Modal Header')).not.toBeInTheDocument() }) it('should render the modal with header and large modal size', () => { props = { @@ -31,23 +32,23 @@ describe('Modal', () => { modalSize: 'large', header: { title: 'title' }, } - const { getByText, getByLabelText } = render(props) - getByText('children') - getByLabelText('modal_large') - getByText('mock Modal Header') + render(props) + screen.getByText('children') + screen.getByLabelText('modal_large') + screen.getByText('mock Modal Header') }) it('should render the modal with small modal size', () => { props = { ...props, modalSize: 'small', } - const { getByText, getByLabelText } = render(props) - getByText('children') - getByLabelText('modal_small') + render(props) + screen.getByText('children') + screen.getByLabelText('modal_small') }) it('presses the background overlay and calls onoutsideClick', () => { - const { getByLabelText } = render(props) - getByLabelText('BackgroundOverlay').click() + render(props) + fireEvent.click(screen.getByLabelText('BackgroundOverlay')) expect(props.onOutsideClick).toHaveBeenCalled() }) }) diff --git a/app/src/molecules/Modal/__tests__/ModalHeader.test.tsx b/app/src/molecules/Modal/__tests__/ModalHeader.test.tsx index 634577ec741..6b8c0ffab20 100644 --- a/app/src/molecules/Modal/__tests__/ModalHeader.test.tsx +++ b/app/src/molecules/Modal/__tests__/ModalHeader.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders, COLORS } from '@opentrons/components' import { ModalHeader } from '../ModalHeader' @@ -22,14 +23,14 @@ describe('ModalHeader', () => { ...props, hasExitIcon: true, iconName: 'information', - iconColor: COLORS.black, + iconColor: COLORS.black90, onClick: jest.fn(), } - const { getByLabelText } = render(props) - expect(getByLabelText('icon_information')).toHaveStyle( - `color: ${COLORS.black}` + render(props) + expect(screen.getByLabelText('icon_information')).toHaveStyle( + `color: ${COLORS.black90}` ) - getByLabelText('closeIcon').click() + fireEvent.click(screen.getByLabelText('closeIcon')) expect(props.onClick).toHaveBeenCalled() }) }) diff --git a/app/src/molecules/Modal/__tests__/SmallModalChildren.test.tsx b/app/src/molecules/Modal/__tests__/SmallModalChildren.test.tsx index 5662678fe69..5fb3d4ef914 100644 --- a/app/src/molecules/Modal/__tests__/SmallModalChildren.test.tsx +++ b/app/src/molecules/Modal/__tests__/SmallModalChildren.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { SmallModalChildren } from '../SmallModalChildren' @@ -14,10 +15,10 @@ const render = () => { describe('SmallModalChildren', () => { it('should have a close button and render other text', () => { - const [{ getByText }] = render() - getByText('header') - getByText('subText') - getByText('buttonText').click() + render() + screen.getByText('header') + screen.getByText('subText') + fireEvent.click(screen.getByText('buttonText')) expect(props.handleCloseMaxPinsAlert).toHaveBeenCalled() }) }) diff --git a/app/src/molecules/ModuleIcon/__tests__/ModuleIcon.test.tsx b/app/src/molecules/ModuleIcon/__tests__/ModuleIcon.test.tsx index 090d5dcfc35..00123d8407e 100644 --- a/app/src/molecules/ModuleIcon/__tests__/ModuleIcon.test.tsx +++ b/app/src/molecules/ModuleIcon/__tests__/ModuleIcon.test.tsx @@ -1,3 +1,4 @@ +import 'jest-styled-components' import * as React from 'react' import { renderWithProviders, COLORS, SPACING } from '@opentrons/components' @@ -54,18 +55,14 @@ describe('ModuleIcon', () => { it('renders SharedIcon with correct style', () => { const { getByTestId } = render(props) const module = getByTestId('ModuleIcon_ot-temperature-v2') - expect(module).toHaveStyle(`color: ${String(COLORS.darkGreyEnabled)}`) + expect(module).toHaveStyle(`color: ${String(COLORS.grey60)}`) expect(module).toHaveStyle(`height: ${SPACING.spacing16}`) expect(module).toHaveStyle(`width: ${SPACING.spacing16}`) expect(module).toHaveStyle(`margin-left: ${SPACING.spacing2}`) expect(module).toHaveStyle(`margin-right: ${SPACING.spacing2}`) - expect(module).toHaveStyleRule( - 'color', - `${String(COLORS.darkBlackEnabled)}`, - { - modifier: ':hover', - } - ) + expect(module).toHaveStyleRule('color', `${String(COLORS.black90)}`, { + modifier: ':hover', + }) }) it('renders magnetic module icon', () => { diff --git a/app/src/molecules/ModuleIcon/index.tsx b/app/src/molecules/ModuleIcon/index.tsx index eb6de984104..01b2399b39f 100644 --- a/app/src/molecules/ModuleIcon/index.tsx +++ b/app/src/molecules/ModuleIcon/index.tsx @@ -14,7 +14,7 @@ import type { AttachedModule } from '../../redux/modules/types' const MODULE_ICON_STYLE = css` &:hover { - color: ${COLORS.darkBlackEnabled}; + color: ${COLORS.black90}; } ` interface ModuleIconProps { @@ -33,7 +33,7 @@ export function ModuleIcon(props: ModuleIconProps): JSX.Element { moduleType={module.moduleType} size={SPACING.spacing16} marginX={SPACING.spacing2} - color={COLORS.darkGreyEnabled} + color={COLORS.grey60} css={MODULE_ICON_STYLE} />
diff --git a/app/src/molecules/NavTab/NavTab.stories.tsx b/app/src/molecules/NavTab/NavTab.stories.tsx index 88fcc0dc2e6..5f1a21b92ba 100644 --- a/app/src/molecules/NavTab/NavTab.stories.tsx +++ b/app/src/molecules/NavTab/NavTab.stories.tsx @@ -24,7 +24,6 @@ const Template: Story> = args => ( > - diff --git a/app/src/molecules/NavTab/__tests__/NavTab.test.tsx b/app/src/molecules/NavTab/__tests__/NavTab.test.tsx index 9fad7a4f89e..fb9df3e35c5 100644 --- a/app/src/molecules/NavTab/__tests__/NavTab.test.tsx +++ b/app/src/molecules/NavTab/__tests__/NavTab.test.tsx @@ -44,12 +44,10 @@ describe('NavTab', () => { expect(tab).toHaveStyle( `font-weight: ${String(TYPOGRAPHY.fontWeightSemiBold)}` ) - expect(tab).toHaveStyle(`color: ${String(COLORS.darkGreyEnabled)}`) + expect(tab).toHaveStyle(`color: ${String(COLORS.grey50)}`) fireEvent.click(tab) - expect(tab).toHaveStyle(`color: ${String(COLORS.darkBlackEnabled)}`) - expect(tab).toHaveStyle( - `border-bottom-color: ${String(COLORS.blueEnabled)}` - ) + expect(tab).toHaveStyle(`color: ${String(COLORS.black90)}`) + expect(tab).toHaveStyle(`border-bottom-color: ${String(COLORS.purple50)}`) expect(tab).toHaveStyle(`border-bottom-width: 2px`) expect(tab).toHaveStyle( `border-bottom-style: ${String(BORDERS.styleSolid)}` @@ -68,7 +66,7 @@ describe('NavTab', () => { expect(tab).toHaveStyle( `font-weight: ${String(TYPOGRAPHY.fontWeightSemiBold)}` ) - expect(tab).toHaveStyle(`color: ${String(COLORS.errorDisabled)}`) + expect(tab).toHaveStyle(`color: ${String(COLORS.grey40)}`) }) it('renders navtab when pass to / as to', () => { diff --git a/app/src/molecules/NavTab/index.tsx b/app/src/molecules/NavTab/index.tsx index 4508165ea1c..75dea82b9c1 100644 --- a/app/src/molecules/NavTab/index.tsx +++ b/app/src/molecules/NavTab/index.tsx @@ -13,17 +13,17 @@ interface NavTabProps { const StyledNavLink = styled(NavLink)>` padding: 0 ${SPACING.spacing4} ${SPACING.spacing8}; ${TYPOGRAPHY.labelSemiBold} - color: ${COLORS.darkGreyEnabled}; + color: ${COLORS.grey50}; &.active { - color: ${COLORS.darkBlackEnabled}; + color: ${COLORS.black90}; ${BORDERS.tabBorder} } ` const DisabledNavLink = styled.span` padding: 0 ${SPACING.spacing4} ${SPACING.spacing8}; ${TYPOGRAPHY.labelSemiBold} - color: ${COLORS.errorDisabled}; + color: ${COLORS.grey40}; ` export function NavTab({ diff --git a/app/src/molecules/ODDBackButton/__tests__/ODDBackButton.test.tsx b/app/src/molecules/ODDBackButton/__tests__/ODDBackButton.test.tsx index be004400d91..b57ff06f10e 100644 --- a/app/src/molecules/ODDBackButton/__tests__/ODDBackButton.test.tsx +++ b/app/src/molecules/ODDBackButton/__tests__/ODDBackButton.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders, COLORS } from '@opentrons/components' import { ODDBackButton } from '..' @@ -21,12 +22,12 @@ describe('ODDBackButton', () => { }) it('should render text and icon', () => { - const { getByText, getByTestId, getByRole } = render(props) - getByText('button label') - expect(getByTestId('back_icon')).toBeInTheDocument() - const button = getByRole('button') + render(props) + screen.getByText('button label') + expect(screen.getByTestId('back_icon')).toBeInTheDocument() + const button = screen.getByRole('button') expect(button).toHaveStyle(`background-color: ${COLORS.transparent}`) - button.click() + fireEvent.click(button) expect(props.onClick).toHaveBeenCalled() }) }) diff --git a/app/src/molecules/ODDBackButton/index.tsx b/app/src/molecules/ODDBackButton/index.tsx index 2ae66c94768..f3c81ea9232 100644 --- a/app/src/molecules/ODDBackButton/index.tsx +++ b/app/src/molecules/ODDBackButton/index.tsx @@ -21,7 +21,7 @@ export function ODDBackButton( { styles={{ menuPortal: base => ({ ...base, zIndex: 10 }) }} value={value} defaultValue={defaultValue} - width="14rem" + width="15rem" tabIndex={tabIndex} onChange={( option: SingleValue | MultiValue, diff --git a/app/src/molecules/PythonLabwareOffsetSnippet/index.tsx b/app/src/molecules/PythonLabwareOffsetSnippet/index.tsx index 7da7faf36fa..9844e1cc416 100644 --- a/app/src/molecules/PythonLabwareOffsetSnippet/index.tsx +++ b/app/src/molecules/PythonLabwareOffsetSnippet/index.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import styled from 'styled-components' -import { TYPOGRAPHY, SPACING, BORDERS } from '@opentrons/components' +import { TYPOGRAPHY, SPACING, BORDERS, COLORS } from '@opentrons/components' import { createSnippet } from './createSnippet' import type { LabwareOffsetCreateData } from '@opentrons/api-client' import type { @@ -12,8 +12,7 @@ import type { const JsonTextArea = styled.textarea` min-height: 28vh; width: 100%; - background-color: #f8f8f8; - border: ${BORDERS.lineBorder}; + background-color: ${COLORS.grey30}; border-radius: ${BORDERS.radiusSoftCorners}; padding: ${SPACING.spacing8}; margin: ${SPACING.spacing16} 0; diff --git a/app/src/molecules/ReleaseNotes/index.tsx b/app/src/molecules/ReleaseNotes/index.tsx index b633dcb7a68..537763bdc94 100644 --- a/app/src/molecules/ReleaseNotes/index.tsx +++ b/app/src/molecules/ReleaseNotes/index.tsx @@ -2,14 +2,21 @@ import * as React from 'react' import remark from 'remark' import reactRenderer from 'remark-react' import styles from './styles.css' - +import { StyledText } from '../../atoms/text' export interface ReleaseNotesProps { source?: string | null } +// ToDo (kk:09/22/2023) This component should be updated in the future +// since the package we use hasn't been updated more than 2 years. +// Also the creator recommends users to replace remark-react with rehype-react. const renderer = remark().use(reactRenderer, { remarkReactComponents: { div: React.Fragment, + h2: HeaderText, + ul: React.Fragment, + li: ParagraphText, + p: ParagraphText, a: ExternalLink, }, }) @@ -33,3 +40,11 @@ export function ReleaseNotes(props: ReleaseNotesProps): JSX.Element { function ExternalLink(props: JSX.IntrinsicAttributes): JSX.Element { return } + +function ParagraphText(props: JSX.IntrinsicAttributes): JSX.Element { + return +} + +function HeaderText(props: JSX.IntrinsicAttributes): JSX.Element { + return +} diff --git a/app/src/molecules/SimpleWizardBody/SimpleWizardBody.stories.tsx b/app/src/molecules/SimpleWizardBody/SimpleWizardBody.stories.tsx index 0a060d89ead..8e1faf9ecc7 100644 --- a/app/src/molecules/SimpleWizardBody/SimpleWizardBody.stories.tsx +++ b/app/src/molecules/SimpleWizardBody/SimpleWizardBody.stories.tsx @@ -34,7 +34,7 @@ const Template: Story> = args => ( export const AlertIcon = Template.bind({}) AlertIcon.args = { - iconColor: COLORS.errorEnabled, + iconColor: COLORS.red50, header: 'Pipette still detected', subHeader: 'Are you sure you want to exit before detaching your pipette?', isSuccess: false, @@ -43,7 +43,7 @@ AlertIcon.args = { export const SuccessIcon = Template.bind({}) SuccessIcon.args = { - iconColor: COLORS.successEnabled, + iconColor: COLORS.green50, header: 'Pipette still detected', subHeader: 'Are you sure you want to exit before detaching your pipette?', isSuccess: true, diff --git a/app/src/molecules/SimpleWizardBody/__tests__/SimpleWizardBody.test.tsx b/app/src/molecules/SimpleWizardBody/__tests__/SimpleWizardBody.test.tsx index 27f0bef3357..8c59bdb69e6 100644 --- a/app/src/molecules/SimpleWizardBody/__tests__/SimpleWizardBody.test.tsx +++ b/app/src/molecules/SimpleWizardBody/__tests__/SimpleWizardBody.test.tsx @@ -19,7 +19,7 @@ describe('SimpleWizardBody', () => { let props: React.ComponentProps beforeEach(() => { props = { - iconColor: COLORS.errorText, + iconColor: COLORS.red60, children:
children
, header: 'header', subHeader: 'subheader', diff --git a/app/src/molecules/SimpleWizardBody/index.tsx b/app/src/molecules/SimpleWizardBody/index.tsx index 52bde1e1c8c..38cfc5cce1b 100644 --- a/app/src/molecules/SimpleWizardBody/index.tsx +++ b/app/src/molecules/SimpleWizardBody/index.tsx @@ -16,10 +16,12 @@ import { POSITION_ABSOLUTE, JUSTIFY_FLEX_START, } from '@opentrons/components' +import { FLEX_ROBOT_TYPE } from '@opentrons/shared-data' import SuccessIcon from '../../assets/images/icon_success.png' import { getIsOnDevice } from '../../redux/config' import { StyledText } from '../../atoms/text' import { Skeleton } from '../../atoms/Skeleton' +import type { RobotType } from '@opentrons/shared-data' interface Props extends StyleProps { iconColor: string @@ -28,6 +30,7 @@ interface Props extends StyleProps { children?: React.ReactNode subHeader?: string | JSX.Element isPending?: boolean + robotType?: RobotType /** * this prop is to change justifyContent of OnDeviceDisplay buttons * TODO(jr, 8/9/23): this SHOULD be refactored so the @@ -53,6 +56,7 @@ const SUBHEADER_STYLE = css` ${TYPOGRAPHY.pRegular}; margin-left: 6.25rem; margin-right: 6.25rem; + margin-bottom: ${SPACING.spacing32}; text-align: ${TYPOGRAPHY.textAlignCenter}; height: 1.75rem; @@ -74,6 +78,7 @@ const WIZARD_CONTAINER_STYLE = css` ` const FLEX_SPACING_STYLE = css` height: 1.75rem; + margin-bottom: ${SPACING.spacing32}; @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { height: 0rem; } @@ -87,6 +92,7 @@ export function SimpleWizardBody(props: Props): JSX.Element { subHeader, isSuccess, isPending, + robotType = FLEX_ROBOT_TYPE, ...styleProps } = props const isOnDevice = useSelector(getIsOnDevice) @@ -144,8 +150,8 @@ export function SimpleWizardBody(props: Props): JSX.Element { <> {isSuccess ? ( Success Icon diff --git a/app/src/molecules/ToggleGroup/__tests__/useToggleGroup.test.tsx b/app/src/molecules/ToggleGroup/__tests__/useToggleGroup.test.tsx index a0015ae38f5..ab91cf3fd7f 100644 --- a/app/src/molecules/ToggleGroup/__tests__/useToggleGroup.test.tsx +++ b/app/src/molecules/ToggleGroup/__tests__/useToggleGroup.test.tsx @@ -1,9 +1,7 @@ import * as React from 'react' import { Provider } from 'react-redux' import { createStore } from 'redux' -import { renderHook } from '@testing-library/react-hooks' -import { render, fireEvent } from '@testing-library/react' -import { act } from 'react-test-renderer' +import { renderHook, render, fireEvent } from '@testing-library/react' import { useTrackEvent } from '../../../redux/analytics' import { useToggleGroup } from '../useToggleGroup' @@ -29,9 +27,9 @@ describe('useToggleGroup', () => { }) it('should return default selectedValue and toggle buttons', () => { - const wrapper: React.FunctionComponent<{}> = ({ children }) => ( - {children} - ) + const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + children, + }) => {children} const { result } = renderHook( () => useToggleGroup('List View', 'Map View'), @@ -41,9 +39,9 @@ describe('useToggleGroup', () => { expect(result.current[0]).toBe('List View') }) it('should record an analytics event for list view', async () => { - const wrapper: React.FunctionComponent<{}> = ({ children }) => ( - {children} - ) + const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + children, + }) => {children} const { result } = renderHook( () => useToggleGroup('List View', 'Map View', 'fake event'), @@ -52,18 +50,16 @@ describe('useToggleGroup', () => { const { getByText } = render(result.current[1] as any) const listViewButton = getByText('List View') - act(() => { - fireEvent.click(listViewButton) - }) + fireEvent.click(listViewButton) expect(mockTrackEvent).toHaveBeenCalledWith({ name: 'fake event', properties: { view: 'list' }, }) }) it('should record an analytics event for map view', () => { - const wrapper: React.FunctionComponent<{}> = ({ children }) => ( - {children} - ) + const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + children, + }) => {children} const { result } = renderHook( () => useToggleGroup('List View', 'Map View', 'fake event'), @@ -72,9 +68,7 @@ describe('useToggleGroup', () => { const { getByText } = render(result.current[1] as any) const mapViewButton = getByText('Map View') - act(() => { - fireEvent.click(mapViewButton) - }) + fireEvent.click(mapViewButton) expect(mockTrackEvent).toHaveBeenCalledWith({ name: 'fake event', properties: { view: 'map' }, diff --git a/app/src/molecules/ToggleGroup/useToggleGroup.tsx b/app/src/molecules/ToggleGroup/useToggleGroup.tsx index 6e2f349df11..ce94a6cdad3 100644 --- a/app/src/molecules/ToggleGroup/useToggleGroup.tsx +++ b/app/src/molecules/ToggleGroup/useToggleGroup.tsx @@ -29,19 +29,19 @@ const BUTTON_GROUP_STYLES = css` } &:hover { - background-color: ${COLORS.fundamentalsBackground}; - color: ${COLORS.black}; + background-color: ${COLORS.grey10}; + color: ${COLORS.black90}; box-shadow: 0 0 0; } &.active { - background-color: ${COLORS.blueEnabled}; + background-color: ${COLORS.blue50}; color: ${COLORS.white}; } &:disabled { background-color: inherit; - color: ${COLORS.errorDisabled}; + color: ${COLORS.grey40}; } } @@ -59,7 +59,7 @@ const BUTTON_GROUP_STYLES = css` const ACTIVE_STYLE = css` padding-left: ${SPACING.spacing8}; padding-right: ${SPACING.spacing8}; - background-color: ${COLORS.blueEnabled}; + background-color: ${COLORS.blue50}; color: ${COLORS.white}; pointer-events: none; ` @@ -68,8 +68,8 @@ const DEFAULT_STYLE = css` padding-left: ${SPACING.spacing8}; padding-right: ${SPACING.spacing8}; background-color: ${COLORS.white}; - color: ${COLORS.black}; - border: 1px ${COLORS.medGreyEnabled} solid; + color: ${COLORS.black90}; + border: 1px ${COLORS.grey30} solid; ` export const useToggleGroup = ( diff --git a/app/src/molecules/UpdateBanner/__tests__/UpdateBanner.test.tsx b/app/src/molecules/UpdateBanner/__tests__/UpdateBanner.test.tsx index 620f156f5c8..d5ca628749b 100644 --- a/app/src/molecules/UpdateBanner/__tests__/UpdateBanner.test.tsx +++ b/app/src/molecules/UpdateBanner/__tests__/UpdateBanner.test.tsx @@ -1,13 +1,18 @@ import * as React from 'react' import { when } from 'jest-when' -import { fireEvent } from '@testing-library/react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../i18n' import { UpdateBanner } from '..' -import { useIsOT3 } from '../../../organisms/Devices/hooks' +import { useIsFlex } from '../../../organisms/Devices/hooks' +import { useIsEstopNotDisengaged } from '../../../resources/devices/hooks/useIsEstopNotDisengaged' jest.mock('../../../organisms/Devices/hooks') -const mockUseIsOT3 = useIsOT3 as jest.MockedFunction +jest.mock('../../../resources/devices/hooks/useIsEstopNotDisengaged') +const mockUseIsFlex = useIsFlex as jest.MockedFunction +const mockUseIsEstopNotDisengaged = useIsEstopNotDisengaged as jest.MockedFunction< + typeof useIsEstopNotDisengaged +> const render = (props: React.ComponentProps) => { return renderWithProviders(, { @@ -28,43 +33,49 @@ describe('Module Update Banner', () => { serialNumber: 'test_number', isTooHot: false, } - when(mockUseIsOT3).calledWith(props.robotName).mockReturnValue(true) + when(mockUseIsFlex).calledWith(props.robotName).mockReturnValue(true) + when(mockUseIsEstopNotDisengaged) + .calledWith(props.robotName) + .mockReturnValue(false) }) + it('enables the updateType and serialNumber to be used as the test ID', () => { - const { getByTestId } = render(props) - getByTestId('ModuleCard_calibration_update_banner_test_number') + render(props) + screen.getByTestId('ModuleCard_calibration_update_banner_test_number') }) - it('renders an error banner if calibration is required with no exit button', () => { - const { getByLabelText, queryByLabelText } = render(props) - getByLabelText('icon_error') - expect(queryByLabelText('close_icon')).not.toBeInTheDocument() + it('renders an error banner if calibration is required with no exit button', () => { + render(props) + screen.getByLabelText('icon_error') + expect(screen.queryByLabelText('close_icon')).not.toBeInTheDocument() }) + it('renders an error banner if a mandatory firmware update is required with no exit button', () => { props = { ...props, updateType: 'firmware_important', } - const { getByLabelText, queryByLabelText } = render(props) - - getByLabelText('icon_error') - expect(queryByLabelText('close_icon')).not.toBeInTheDocument() + render(props) + screen.getByLabelText('icon_error') + expect(screen.queryByLabelText('close_icon')).not.toBeInTheDocument() }) + it('renders a warning banner if an optional firmware update is needed with an exit button that dismisses the banner', () => { props = { ...props, updateType: 'firmware', } - const { getByLabelText, queryByLabelText } = render(props) - getByLabelText('icon_warning') - expect(queryByLabelText('close_icon')).toBeInTheDocument() - const btn = getByLabelText('close_icon') + render(props) + screen.getByLabelText('icon_warning') + expect(screen.getByLabelText('close_icon')).toBeInTheDocument() + const btn = screen.getByLabelText('close_icon') fireEvent.click(btn) expect(props.setShowBanner).toHaveBeenCalled() }) + it('enables clicking of text to open the appropriate update modal', () => { - const { getByText } = render(props) - const calibrateBtn = getByText('Calibrate now') + render(props) + const calibrateBtn = screen.getByText('Calibrate now') fireEvent.click(calibrateBtn) expect(props.handleUpdateClick).toHaveBeenCalled() @@ -73,39 +84,61 @@ describe('Module Update Banner', () => { updateType: 'firmware', } render(props) - const firmwareBtn = getByText('Update now') + const firmwareBtn = screen.getByText('Update now') fireEvent.click(firmwareBtn) expect(props.handleUpdateClick).toHaveBeenCalledTimes(2) }) + it('should not render a calibrate link if pipette attachment is required', () => { props = { ...props, attachPipetteRequired: true, } + render(props) + expect(screen.queryByText('Calibrate now')).not.toBeInTheDocument() + }) + + it('should not render a calibrate link if pipette calibration is required', () => { + props = { + ...props, + calibratePipetteRequired: true, + } const { queryByText } = render(props) expect(queryByText('Calibrate now')).not.toBeInTheDocument() }) + it('should not render a calibrate link if pipette firmware update is required', () => { props = { ...props, updatePipetteFWRequired: true, } - const { queryByText } = render(props) - expect(queryByText('Calibrate now')).not.toBeInTheDocument() + render(props) + expect(screen.queryByText('Calibrate now')).not.toBeInTheDocument() + }) + + it('should not render a calibrate link when e-stop is pressed', () => { + when(mockUseIsEstopNotDisengaged) + .calledWith(props.robotName) + .mockReturnValue(true) + render(props) + expect(screen.queryByText('Calibrate now')).not.toBeInTheDocument() }) + it('should render a firmware update link if pipette calibration or firmware update is required', () => { props = { ...props, updateType: 'firmware', attachPipetteRequired: true, + calibratePipetteRequired: true, updatePipetteFWRequired: true, } - const { queryByText } = render(props) - expect(queryByText('Update now')).toBeInTheDocument() + render(props) + expect(screen.getByText('Update now')).toBeInTheDocument() }) + it('should not render a calibrate update link if the robot is an OT-2', () => { - when(mockUseIsOT3).calledWith(props.robotName).mockReturnValue(false) - const { queryByText } = render(props) - expect(queryByText('Calibrate now')).not.toBeInTheDocument() + when(mockUseIsFlex).calledWith(props.robotName).mockReturnValue(false) + render(props) + expect(screen.queryByText('Calibrate now')).not.toBeInTheDocument() }) }) diff --git a/app/src/molecules/UpdateBanner/index.tsx b/app/src/molecules/UpdateBanner/index.tsx index 83c60e7a272..1a2b9190d3b 100644 --- a/app/src/molecules/UpdateBanner/index.tsx +++ b/app/src/molecules/UpdateBanner/index.tsx @@ -13,7 +13,8 @@ import { import { Banner } from '../../atoms/Banner' import { Tooltip } from '../../atoms/Tooltip' -import { useIsOT3 } from '../../organisms/Devices/hooks' +import { useIsFlex } from '../../organisms/Devices/hooks' +import { useIsEstopNotDisengaged } from '../../resources/devices/hooks/useIsEstopNotDisengaged' interface UpdateBannerProps { robotName: string @@ -23,6 +24,7 @@ interface UpdateBannerProps { serialNumber: string isTooHot?: boolean attachPipetteRequired?: boolean + calibratePipetteRequired?: boolean updatePipetteFWRequired?: boolean } @@ -33,6 +35,7 @@ export const UpdateBanner = ({ setShowBanner, handleUpdateClick, attachPipetteRequired, + calibratePipetteRequired, updatePipetteFWRequired, isTooHot, }: UpdateBannerProps): JSX.Element | null => { @@ -42,17 +45,24 @@ export const UpdateBanner = ({ let bannerMessage: string let hyperlinkText: string let closeButtonRendered: false | undefined + const isEstopNotDisengaged = useIsEstopNotDisengaged(robotName) if (updateType === 'calibration') { bannerType = isTooHot ? 'informing' : 'error' closeButtonRendered = false if (attachPipetteRequired) bannerMessage = t('module_calibration_required_no_pipette_attached') + else if (calibratePipetteRequired) + bannerMessage = t('module_calibration_required_no_pipette_calibrated') else if (updatePipetteFWRequired) bannerMessage = t('module_calibration_required_update_pipette_FW') else bannerMessage = t('module_calibration_required') hyperlinkText = - !attachPipetteRequired && !updatePipetteFWRequired && !isTooHot + !attachPipetteRequired && + !updatePipetteFWRequired && + !isTooHot && + !calibratePipetteRequired && + !isEstopNotDisengaged ? t('calibrate_now') : '' } else { @@ -62,8 +72,8 @@ export const UpdateBanner = ({ hyperlinkText = t('update_now') } - const isOT3 = useIsOT3(robotName) - if (!isOT3 && updateType === 'calibration') return null + const isFlex = useIsFlex(robotName) + if (!isFlex && updateType === 'calibration') return null return ( <> diff --git a/app/src/molecules/UploadInput/__tests__/UploadInput.test.tsx b/app/src/molecules/UploadInput/__tests__/UploadInput.test.tsx index 945dfe756be..70efa750bb6 100644 --- a/app/src/molecules/UploadInput/__tests__/UploadInput.test.tsx +++ b/app/src/molecules/UploadInput/__tests__/UploadInput.test.tsx @@ -1,6 +1,5 @@ import * as React from 'react' -import '@testing-library/jest-dom' -import { fireEvent } from '@testing-library/react' +import { fireEvent, screen } from '@testing-library/react' import { BrowserRouter } from 'react-router-dom' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../i18n' @@ -8,42 +7,52 @@ import { UploadInput } from '..' describe('UploadInput', () => { let onUpload: jest.MockedFunction<() => {}> - let render: () => ReturnType[0] beforeEach(() => { onUpload = jest.fn() - render = () => { - return renderWithProviders( - - - , - { - i18nInstance: i18n, - } - )[0] - } }) afterEach(() => { jest.resetAllMocks() }) it('renders correct contents for empty state', () => { - const { getByRole } = render() + renderWithProviders( + + + , + { + i18nInstance: i18n, + } + ) - expect(getByRole('button', { name: 'Choose File' })).toBeTruthy() + expect(screen.getByRole('button', { name: 'Upload' })).toBeTruthy() }) it('opens file select on button click', () => { - const { getByRole, getByTestId } = render() - const button = getByRole('button', { name: 'Choose File' }) - const input = getByTestId('file_input') + renderWithProviders( + + + , + { + i18nInstance: i18n, + } + ) + const button = screen.getByRole('button', { name: 'Upload' }) + const input = screen.getByTestId('file_input') input.click = jest.fn() fireEvent.click(button) expect(input.click).toHaveBeenCalled() }) it('calls create session on choose file', () => { - const { getByTestId } = render() - const input = getByTestId('file_input') + renderWithProviders( + + + , + { + i18nInstance: i18n, + } + ) + const input = screen.getByTestId('file_input') fireEvent.change(input, { target: { files: ['dummyFile'] } }) expect(onUpload).toHaveBeenCalledWith('dummyFile') }) diff --git a/app/src/molecules/UploadInput/index.tsx b/app/src/molecules/UploadInput/index.tsx index 81c52e244ec..d794cc4df76 100644 --- a/app/src/molecules/UploadInput/index.tsx +++ b/app/src/molecules/UploadInput/index.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { css } from 'styled-components' +import styled, { css } from 'styled-components' import { useTranslation } from 'react-i18next' import { Icon, @@ -16,30 +16,28 @@ import { } from '@opentrons/components' import { StyledText } from '../../atoms/text' -const DROP_ZONE_STYLES = css` +const StyledLabel = styled.label` display: flex; cursor: pointer; flex-direction: ${DIRECTION_COLUMN}; align-items: ${ALIGN_CENTER}; width: 100%; padding: ${SPACING.spacing32}; - border: 2px dashed ${COLORS.medGreyEnabled}; + border: 2px dashed ${COLORS.grey30}; border-radius: ${BORDERS.radiusSoftCorners}; text-align: center; background-color: ${COLORS.white}; &:hover, &:focus-within { - background-color: ${COLORS.lightBlue}; - border: 2px dashed ${COLORS.blueEnabled}; + border: 2px dashed ${COLORS.blue50}; } ` const DRAG_OVER_STYLES = css` - background-color: ${COLORS.lightBlue}; - border: 2px dashed ${COLORS.blueEnabled}; + border: 2px dashed ${COLORS.blue50}; ` -const INPUT_STYLES = css` +const StyledInput = styled.input` position: fixed; clip: rect(1px 1px 1px 1px); ` @@ -58,11 +56,11 @@ export function UploadInput(props: UploadInputProps): JSX.Element | null { const [isFileOverDropZone, setIsFileOverDropZone] = React.useState( false ) + const [isHover, setIsHover] = React.useState(false) const handleDrop: React.DragEventHandler = e => { e.preventDefault() e.stopPropagation() - const { files = [] } = 'dataTransfer' in e ? e.dataTransfer : {} - props.onUpload(files[0]) + Array.from(e.dataTransfer.files).forEach(f => props.onUpload(f)) setIsFileOverDropZone(false) } const handleDragEnter: React.DragEventHandler = e => { @@ -73,11 +71,13 @@ export function UploadInput(props: UploadInputProps): JSX.Element | null { e.preventDefault() e.stopPropagation() setIsFileOverDropZone(false) + setIsHover(false) } const handleDragOver: React.DragEventHandler = e => { e.preventDefault() e.stopPropagation() setIsFileOverDropZone(true) + setIsHover(true) } const handleClick: React.MouseEventHandler = _event => { @@ -85,17 +85,10 @@ export function UploadInput(props: UploadInputProps): JSX.Element | null { } const onChange: React.ChangeEventHandler = event => { - const { files = [] } = event.target ?? {} - files?.[0] != null && props.onUpload(files?.[0]) + ;[...(event.target.files ?? [])].forEach(f => props.onUpload(f)) if ('value' in event.currentTarget) event.currentTarget.value = '' } - const dropZoneStyles = isFileOverDropZone - ? css` - ${DROP_ZONE_STYLES} ${DRAG_OVER_STYLES} - ` - : DROP_ZONE_STYLES - return ( - {t('choose_protocol_file')} + {t('upload')} - + ) } diff --git a/app/src/molecules/WizardHeader/index.tsx b/app/src/molecules/WizardHeader/index.tsx index 146b3c85932..a4d48e2db5c 100644 --- a/app/src/molecules/WizardHeader/index.tsx +++ b/app/src/molecules/WizardHeader/index.tsx @@ -28,7 +28,7 @@ interface WizardHeaderProps { const EXIT_BUTTON_STYLE = css` ${TYPOGRAPHY.pSemiBold}; text-transform: ${TYPOGRAPHY.textTransformCapitalize}; - color: ${COLORS.darkGreyEnabled}; + color: ${COLORS.grey50}; &:hover { opacity: 70%; @@ -89,7 +89,7 @@ export const WizardHeader = (props: WizardHeaderProps): JSX.Element => {
{currentStep != null && totalSteps != null && currentStep > 0 ? ( - + {t('step', { current: currentStep, max: totalSteps })} ) : null} diff --git a/app/src/molecules/WizardRequiredEquipmentList/index.tsx b/app/src/molecules/WizardRequiredEquipmentList/index.tsx index 35b87750b4b..d069b64a536 100644 --- a/app/src/molecules/WizardRequiredEquipmentList/index.tsx +++ b/app/src/molecules/WizardRequiredEquipmentList/index.tsx @@ -3,17 +3,18 @@ import { useSelector } from 'react-redux' import { useTranslation } from 'react-i18next' import { css } from 'styled-components' import { - Flex, ALIGN_CENTER, + BORDERS, + Box, + COLORS, DIRECTION_COLUMN, + Flex, JUSTIFY_CENTER, + JUSTIFY_SPACE_AROUND, JUSTIFY_SPACE_BETWEEN, + OVERFLOW_WRAP_ANYWHERE, SPACING, - COLORS, - JUSTIFY_SPACE_AROUND, TYPOGRAPHY, - Box, - BORDERS, } from '@opentrons/components' import { getIsOnDevice } from '../../redux/config' @@ -61,13 +62,17 @@ export function WizardRequiredEquipmentList( paddingY={SPACING.spacing4} key={`${index}_${requiredEquipmentProps.loadName}`} > - + {requiredEquipmentProps.displayName} {/* do not show divider after the last equipment in the list */} {index + 1 === Object.keys(equipmentList).length ? null : ( )} @@ -83,19 +88,18 @@ export function WizardRequiredEquipmentList( > {t('you_will_need')} - {equipmentList.length > 1 ? : null} - {equipmentList.map((requiredEquipmentProps, index) => ( + + {equipmentList.map(requiredEquipmentProps => ( ))} {footer != null ? ( {footer} @@ -157,7 +161,7 @@ function RequiredEquipmentCard(props: RequiredEquipmentCardProps): JSX.Element { > {displayName} {subtitle != null ? ( - + {subtitle} ) : null} diff --git a/app/src/molecules/modals/ErrorModal.tsx b/app/src/molecules/modals/ErrorModal.tsx index b31952b9f2a..3951eb132a9 100644 --- a/app/src/molecules/modals/ErrorModal.tsx +++ b/app/src/molecules/modals/ErrorModal.tsx @@ -11,7 +11,7 @@ interface Props { description: string close?: () => unknown closeUrl?: string - error: { message?: string; [key: string]: unknown } + error: { message?: string; [key: string]: unknown } | null } const DEFAULT_HEADING = 'Unexpected Error' @@ -37,7 +37,7 @@ export function ErrorModal(props: Props): JSX.Element {

- {error.message ?? AN_UNKNOWN_ERROR_OCCURRED} + {error?.message ?? AN_UNKNOWN_ERROR_OCCURRED}

{description}

diff --git a/app/src/organisms/AddCustomLabwareSlideout/__tests__/AddCustomLabwareSlideout.test.tsx b/app/src/organisms/AddCustomLabwareSlideout/__tests__/AddCustomLabwareSlideout.test.tsx index a5efa4a80e7..7bf3f23675f 100644 --- a/app/src/organisms/AddCustomLabwareSlideout/__tests__/AddCustomLabwareSlideout.test.tsx +++ b/app/src/organisms/AddCustomLabwareSlideout/__tests__/AddCustomLabwareSlideout.test.tsx @@ -46,7 +46,7 @@ describe('AddCustomLabwareSlideout', () => { const [{ getByText, getByRole }] = render(props) getByText('Import a Custom Labware Definition') getByText('Or choose a file from your computer to upload.') - const btn = getByRole('button', { name: 'Choose File' }) + const btn = getByRole('button', { name: 'Upload' }) fireEvent.click(btn) expect(mockTrackEvent).toHaveBeenCalledWith({ name: ANALYTICS_ADD_CUSTOM_LABWARE, diff --git a/app/src/organisms/AddCustomLabwareSlideout/index.tsx b/app/src/organisms/AddCustomLabwareSlideout/index.tsx index da7f363c175..43778af840b 100644 --- a/app/src/organisms/AddCustomLabwareSlideout/index.tsx +++ b/app/src/organisms/AddCustomLabwareSlideout/index.tsx @@ -65,7 +65,7 @@ export function AddCustomLabwareSlideout( components={{ a: ( dispatch(addCustomLabware())} role="button" /> diff --git a/app/src/organisms/AdvancedSettings/AdditionalCustomLabwareSourceFolder.tsx b/app/src/organisms/AdvancedSettings/AdditionalCustomLabwareSourceFolder.tsx new file mode 100644 index 00000000000..332ded51a99 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/AdditionalCustomLabwareSourceFolder.tsx @@ -0,0 +1,101 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { useDispatch, useSelector } from 'react-redux' + +import { + ALIGN_CENTER, + COLORS, + DIRECTION_COLUMN, + Flex, + Icon, + JUSTIFY_SPACE_BETWEEN, + Link, + SPACING_AUTO, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' + +import { StyledText } from '../../atoms/text' +import { TertiaryButton } from '../../atoms/buttons' +import { + changeCustomLabwareDirectory, + getCustomLabwareDirectory, + openCustomLabwareDirectory, +} from '../../redux/custom-labware' +import { + useTrackEvent, + ANALYTICS_CHANGE_CUSTOM_LABWARE_SOURCE_FOLDER, +} from '../../redux/analytics' + +import type { Dispatch } from '../../redux/types' + +export function AdditionalCustomLabwareSourceFolder(): JSX.Element { + const { t } = useTranslation('app_settings') + const dispatch = useDispatch() + const labwarePath = useSelector(getCustomLabwareDirectory) + const trackEvent = useTrackEvent() + + return ( + + + + {t('additional_labware_folder_title')} + + + {t('additional_folder_description')} + + + {t('additional_folder_location')} + + {labwarePath !== '' ? ( + dispatch(openCustomLabwareDirectory())} + id="AdvancedSettings_sourceFolderLink" + > + {labwarePath} + + + ) : ( + {t('no_folder')} + )} + + { + { + dispatch(changeCustomLabwareDirectory()) + trackEvent({ + name: ANALYTICS_CHANGE_CUSTOM_LABWARE_SOURCE_FOLDER, + properties: {}, + }) + }} + id="AdvancedSettings_changeLabwareSource" + > + {labwarePath !== '' + ? t('change_folder_button') + : t('add_folder_button')} + + } + + ) +} diff --git a/app/src/organisms/AdvancedSettings/ClearUnavailableRobots.tsx b/app/src/organisms/AdvancedSettings/ClearUnavailableRobots.tsx new file mode 100644 index 00000000000..14f50b7acb9 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/ClearUnavailableRobots.tsx @@ -0,0 +1,126 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { useDispatch, useSelector } from 'react-redux' + +import { + AlertPrimaryButton, + ALIGN_CENTER, + Box, + Btn, + COLORS, + DIRECTION_ROW, + Flex, + JUSTIFY_FLEX_END, + JUSTIFY_SPACE_BETWEEN, + SPACING_AUTO, + SPACING, + TYPOGRAPHY, + useConditionalConfirm, +} from '@opentrons/components' + +import { StyledText } from '../../atoms/text' +import { TertiaryButton } from '../../atoms/buttons' +import { ERROR_TOAST, SUCCESS_TOAST } from '../../atoms/Toast' +import { useToaster } from '../../organisms/ToasterOven' +import { LegacyModal } from '../../molecules/LegacyModal' +import { Portal } from '../../App/portal' +import { + clearDiscoveryCache, + getReachableRobots, + getUnreachableRobots, +} from '../../redux/discovery' + +import type { Dispatch, State } from '../../redux/types' + +export function ClearUnavailableRobots(): JSX.Element { + const { t } = useTranslation('app_settings') + const dispatch = useDispatch() + const { makeToast } = useToaster() + const reachableRobots = useSelector((state: State) => + getReachableRobots(state) + ) + const unreachableRobots = useSelector((state: State) => + getUnreachableRobots(state) + ) + const recentlySeenRobots = reachableRobots.filter( + robot => robot.healthStatus !== 'ok' + ) + const isUnavailableRobots = + unreachableRobots.length > 0 || recentlySeenRobots.length > 0 + const handleDeleteUnavailRobots = (): void => { + if (isUnavailableRobots) { + dispatch(clearDiscoveryCache()) + makeToast(t('successfully_deleted_unavail_robots'), SUCCESS_TOAST) + } else { + makeToast(t('no_unavail_robots_to_clear'), ERROR_TOAST) + } + } + const { + confirm: confirmDeleteUnavailRobots, + showConfirmation: showConfirmDeleteUnavailRobots, + cancel: cancelExit, + } = useConditionalConfirm(handleDeleteUnavailRobots, true) + return ( + <> + {showConfirmDeleteUnavailRobots ? ( + + + {t('clearing_cannot_be_undone')} + + + + {t('shared:cancel')} + + + + + {t('clear_confirm')} + + + + + + ) : null} + + + + {t('clear_unavail_robots')} + + {t('clear_robots_description')} + + + {t('clear_robots_button')} + + + + ) +} diff --git a/app/src/organisms/AdvancedSettings/EnableDevTools.tsx b/app/src/organisms/AdvancedSettings/EnableDevTools.tsx new file mode 100644 index 00000000000..7e395a5a789 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/EnableDevTools.tsx @@ -0,0 +1,46 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { useSelector, useDispatch } from 'react-redux' + +import { + ALIGN_CENTER, + Box, + Flex, + JUSTIFY_SPACE_BETWEEN, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' + +import { StyledText } from '../../atoms/text' +import { ToggleButton } from '../../atoms/buttons' +import { getDevtoolsEnabled, toggleDevtools } from '../../redux/config' + +import type { Dispatch } from '../../redux/types' + +export function EnableDevTools(): JSX.Element { + const { t } = useTranslation('app_settings') + const devToolsOn = useSelector(getDevtoolsEnabled) + const dispatch = useDispatch() + const toggleDevTools = (): unknown => dispatch(toggleDevtools()) + + return ( + + + + {t('enable_dev_tools')} + + {t('enable_dev_tools_description')} + + + + ) +} diff --git a/app/src/organisms/AdvancedSettings/OT2AdvancedSettings.tsx b/app/src/organisms/AdvancedSettings/OT2AdvancedSettings.tsx new file mode 100644 index 00000000000..633d4cd1035 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/OT2AdvancedSettings.tsx @@ -0,0 +1,93 @@ +import * as React from 'react' +import { useSelector, useDispatch } from 'react-redux' +import { useTranslation } from 'react-i18next' +import { css } from 'styled-components' + +import { + Flex, + TYPOGRAPHY, + SPACING, + RadioGroup, + DIRECTION_COLUMN, +} from '@opentrons/components' +import { StyledText } from '../../atoms/text' +import { + resetUseTrashSurfaceForTipCal, + setUseTrashSurfaceForTipCal, +} from '../../redux/calibration' +import { getUseTrashSurfaceForTipCal } from '../../redux/config' + +import type { Dispatch, State } from '../../redux/types' + +const ALWAYS_BLOCK: 'always-block' = 'always-block' +const ALWAYS_TRASH: 'always-trash' = 'always-trash' +const ALWAYS_PROMPT: 'always-prompt' = 'always-prompt' + +type BlockSelection = + | typeof ALWAYS_BLOCK + | typeof ALWAYS_TRASH + | typeof ALWAYS_PROMPT + +export function OT2AdvancedSettings(): JSX.Element { + const { t } = useTranslation('app_settings') + const dispatch = useDispatch() + const useTrashSurfaceForTipCal = useSelector((state: State) => + getUseTrashSurfaceForTipCal(state) + ) + + const handleUseTrashSelection = (selection: BlockSelection): void => { + switch (selection) { + case ALWAYS_PROMPT: + dispatch(resetUseTrashSurfaceForTipCal()) + break + case ALWAYS_BLOCK: + dispatch(setUseTrashSurfaceForTipCal(false)) + break + case ALWAYS_TRASH: + dispatch(setUseTrashSurfaceForTipCal(true)) + break + } + } + + return ( + + + {t('ot2_advanced_settings')} + + + + {t('tip_length_cal_method')} + + ) => { + // you know this is a limited-selection field whose values are only + // the elements of BlockSelection; i know this is a limited-selection + // field whose values are only the elements of BlockSelection; but sadly, + // neither of us can get Flow to know it + handleUseTrashSelection(event.currentTarget.value as BlockSelection) + }} + options={[ + { name: t('cal_block'), value: ALWAYS_BLOCK }, + { name: t('trash_bin'), value: ALWAYS_TRASH }, + { name: t('prompt'), value: ALWAYS_PROMPT }, + ]} + /> + + + ) +} diff --git a/app/src/organisms/AdvancedSettings/OverridePathToPython.tsx b/app/src/organisms/AdvancedSettings/OverridePathToPython.tsx new file mode 100644 index 00000000000..31657b5ed62 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/OverridePathToPython.tsx @@ -0,0 +1,107 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { useSelector, useDispatch } from 'react-redux' + +import { + ALIGN_CENTER, + Box, + COLORS, + Flex, + Icon, + JUSTIFY_SPACE_BETWEEN, + Link, + SPACING_AUTO, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' + +import { StyledText } from '../../atoms/text' +import { TertiaryButton } from '../../atoms/buttons' +import { getPathToPythonOverride, resetConfigValue } from '../../redux/config' +import { + openPythonInterpreterDirectory, + changePythonPathOverrideConfig, +} from '../../redux/protocol-analysis' +import { + useTrackEvent, + ANALYTICS_CHANGE_PATH_TO_PYTHON_DIRECTORY, +} from '../../redux/analytics' + +import type { Dispatch } from '../../redux/types' + +export function OverridePathToPython(): JSX.Element { + const { t } = useTranslation('app_settings') + const pathToPythonInterpreter = useSelector(getPathToPythonOverride) + const dispatch = useDispatch() + const trackEvent = useTrackEvent() + + const handleClickPythonDirectoryChange: React.MouseEventHandler = _event => { + dispatch(changePythonPathOverrideConfig()) + trackEvent({ + name: ANALYTICS_CHANGE_PATH_TO_PYTHON_DIRECTORY, + properties: {}, + }) + } + + return ( + + + + {t('override_path_to_python')} + + + {t('opentrons_app_will_use_interpreter')} + + + {t('override_path')} + + {pathToPythonInterpreter !== null ? ( + dispatch(openPythonInterpreterDirectory())} + id="AdvancedSettings_sourceFolderLinkPython" + > + {pathToPythonInterpreter} + + + ) : ( + {t('no_specified_folder')} + )} + + {pathToPythonInterpreter !== null ? ( + + dispatch(resetConfigValue('python.pathToPythonOverride')) + } + id="AdvancedSettings_changePythonInterpreterSource" + > + {t('reset_to_default')} + + ) : ( + + {t('add_override_path')} + + )} + + ) +} diff --git a/app/src/organisms/AdvancedSettings/PreventRobotCaching.tsx b/app/src/organisms/AdvancedSettings/PreventRobotCaching.tsx new file mode 100644 index 00000000000..244d2f6b893 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/PreventRobotCaching.tsx @@ -0,0 +1,60 @@ +import * as React from 'react' +import { Trans, useTranslation } from 'react-i18next' +import { useDispatch, useSelector } from 'react-redux' + +import { + ALIGN_CENTER, + Box, + Flex, + JUSTIFY_SPACE_BETWEEN, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' + +import { StyledText } from '../../atoms/text' +import { ToggleButton } from '../../atoms/buttons' +import { getConfig, toggleConfigValue } from '../../redux/config' + +import type { Dispatch, State } from '../../redux/types' + +export function PreventRobotCaching(): JSX.Element { + const { t } = useTranslation('app_settings') + const displayUnavailRobots = useSelector((state: State) => { + return getConfig(state)?.discovery.disableCache ?? false + }) + const dispatch = useDispatch() + + return ( + + + + {t('prevent_robot_caching')} + + + + ), + }} + /> + + + dispatch(toggleConfigValue('discovery.disableCache'))} + id="AdvancedSettings_unavailableRobotsToggleButton" + /> + + ) +} diff --git a/app/src/organisms/AdvancedSettings/ShowHeaterShakerAttachmentModal.tsx b/app/src/organisms/AdvancedSettings/ShowHeaterShakerAttachmentModal.tsx new file mode 100644 index 00000000000..d4c139ebf83 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/ShowHeaterShakerAttachmentModal.tsx @@ -0,0 +1,58 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { useDispatch, useSelector } from 'react-redux' + +import { + getIsHeaterShakerAttached, + updateConfigValue, +} from '../../redux/config' + +import { + ALIGN_CENTER, + Box, + Flex, + JUSTIFY_SPACE_BETWEEN, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' + +import { StyledText } from '../../atoms/text' +import { ToggleButton } from '../../atoms/buttons' + +import type { Dispatch } from '../../redux/types' + +export function ShowHeaterShakerAttachmentModal(): JSX.Element { + const { t } = useTranslation('app_settings') + const dispatch = useDispatch() + const isHeaterShakerAttachmentModalVisible = useSelector( + getIsHeaterShakerAttached + ) + const toggleHeaterShakerModalVisibility = (): void => { + dispatch( + updateConfigValue( + 'modules.heaterShaker.isAttached', + Boolean(!isHeaterShakerAttachmentModalVisible) + ) + ) + } + return ( + + + + {t('heater_shaker_attach_visible')} + + {t('heater_shaker_attach_description')} + + + + ) +} diff --git a/app/src/organisms/AdvancedSettings/ShowLabwareOffsetSnippets.tsx b/app/src/organisms/AdvancedSettings/ShowLabwareOffsetSnippets.tsx new file mode 100644 index 00000000000..7223ca39e31 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/ShowLabwareOffsetSnippets.tsx @@ -0,0 +1,60 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { useSelector, useDispatch } from 'react-redux' + +import { + Flex, + Box, + ALIGN_CENTER, + JUSTIFY_SPACE_BETWEEN, + TYPOGRAPHY, + SPACING, +} from '@opentrons/components' + +import { StyledText } from '../../atoms/text' +import { ToggleButton } from '../../atoms/buttons' +import { + getIsLabwareOffsetCodeSnippetsOn, + updateConfigValue, +} from '../../redux/config' +import { Dispatch } from '../../redux/types' + +export function ShowLabwareOffsetSnippets(): JSX.Element { + const { t } = useTranslation(['app_settings', 'shared']) + const dispatch = useDispatch() + const isLabwareOffsetCodeSnippetsOn = useSelector( + getIsLabwareOffsetCodeSnippetsOn + ) + + const toggleLabwareOffsetData = (): void => { + dispatch( + updateConfigValue( + 'labware.showLabwareOffsetCodeSnippets', + Boolean(!isLabwareOffsetCodeSnippetsOn) + ) + ) + } + + return ( + + + + {t('show_labware_offset_snippets')} + + + {t('show_labware_offset_snippets_description')} + + + + + ) +} diff --git a/app/src/organisms/AdvancedSettings/U2EInformation.tsx b/app/src/organisms/AdvancedSettings/U2EInformation.tsx new file mode 100644 index 00000000000..09533b6dedb --- /dev/null +++ b/app/src/organisms/AdvancedSettings/U2EInformation.tsx @@ -0,0 +1,114 @@ +import * as React from 'react' +import { useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' + +import { + ALIGN_CENTER, + Box, + COLORS, + DIRECTION_COLUMN, + Flex, + JUSTIFY_SPACE_BETWEEN, + Link, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' + +import { Banner } from '../../atoms/Banner' +import { StyledText } from '../../atoms/text' +import { + getU2EAdapterDevice, + getU2EWindowsDriverStatus, + OUTDATED, +} from '../../redux/system-info' + +import type { State } from '../../redux/types' + +const REALTEK_URL = 'https://www.realtek.com/en/' + +export function U2EInformation(): JSX.Element { + const { t } = useTranslation('app_settings') + const device = useSelector(getU2EAdapterDevice) + const driverOutdated = useSelector((state: State) => { + const status = getU2EWindowsDriverStatus(state) + return status === OUTDATED + }) + + return ( + + + + {t('usb_to_ethernet_adapter_info')} + + + {t('usb_to_ethernet_adapter_info_description')} + + {driverOutdated && ( + + + + {t('usb_to_ethernet_adapter_toast_message')} + + + {t('usb_to_ethernet_adapter_link')} + + + + )} + {device === null ? ( + + {t('usb_to_ethernet_not_connected')} + + ) : ( + + + + {t('usb_to_ethernet_adapter_description')} + + {device?.productName} + + + + {t('usb_to_ethernet_adapter_manufacturer')} + + {device?.manufacturerName} + + + + {t('usb_to_ethernet_adapter_driver_version')} + + + {device?.windowsDriverVersion != null + ? device.windowsDriverVersion + : t('usb_to_ethernet_adapter_no_driver_version')} + + + + )} + + + ) +} diff --git a/app/src/organisms/AdvancedSettings/UpdatedChannel.tsx b/app/src/organisms/AdvancedSettings/UpdatedChannel.tsx new file mode 100644 index 00000000000..91742a6cff1 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/UpdatedChannel.tsx @@ -0,0 +1,82 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { useDispatch, useSelector } from 'react-redux' + +import { + Flex, + ALIGN_CENTER, + JUSTIFY_SPACE_BETWEEN, + DIRECTION_COLUMN, + TYPOGRAPHY, + SPACING, +} from '@opentrons/components' + +import { StyledText } from '../../atoms/text' +import { SelectField } from '../../atoms/SelectField' +import { + getUpdateChannel, + getUpdateChannelOptions, + updateConfigValue, +} from '../../redux/config' + +import type { SelectOption } from '../../atoms/SelectField/Select' +import type { Dispatch } from '../../redux/types' + +export function UpdatedChannel(): JSX.Element { + const { t } = useTranslation('app_settings') + const dispatch = useDispatch() + const channel = useSelector(getUpdateChannel) + const channelOptions: SelectOption[] = useSelector(getUpdateChannelOptions) + const handleChannel = (_: string, value: string): void => { + dispatch(updateConfigValue('update.channel', value)) + } + + const formatOptionLabel: React.ComponentProps< + typeof SelectField + >['formatOptionLabel'] = (option, index): JSX.Element => { + const { label, value } = option + return ( + + {value === 'latest' ? label : value} + + ) + } + + return ( + + + + {t('update_channel')} + + + {t('update_description')} + + + + {t('channel')} + + + + ) +} diff --git a/app/src/organisms/AdvancedSettings/__tests__/AdditionalCustomLabwareSourceFolder.test.tsx b/app/src/organisms/AdvancedSettings/__tests__/AdditionalCustomLabwareSourceFolder.test.tsx new file mode 100644 index 00000000000..e57b10f5ac5 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/__tests__/AdditionalCustomLabwareSourceFolder.test.tsx @@ -0,0 +1,59 @@ +import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' +import { renderWithProviders } from '@opentrons/components' +import { i18n } from '../../../i18n' +import { getCustomLabwareDirectory } from '../../../redux/custom-labware' +import { + useTrackEvent, + ANALYTICS_CHANGE_CUSTOM_LABWARE_SOURCE_FOLDER, +} from '../../../redux/analytics' + +import { AdditionalCustomLabwareSourceFolder } from '../AdditionalCustomLabwareSourceFolder' + +jest.mock('../../../redux/custom-labware') +jest.mock('../../../redux/analytics') + +const render = () => { + return renderWithProviders(, { + i18nInstance: i18n, + }) +} + +const mockTrackEvent = jest.fn() + +const mockGetCustomLabwarePath = getCustomLabwareDirectory as jest.MockedFunction< + typeof getCustomLabwareDirectory +> +const mockUseTrackEvent = useTrackEvent as jest.MockedFunction< + typeof useTrackEvent +> + +describe('AdditionalCustomLabwareSourceFolder', () => { + beforeEach(() => { + mockUseTrackEvent.mockReturnValue(mockTrackEvent) + mockGetCustomLabwarePath.mockReturnValue('') + }) + + it('renders the custom labware section with source folder selected', () => { + mockGetCustomLabwarePath.mockReturnValue('/mock/custom-labware-path') + render() + screen.getByText( + 'If you want to specify a folder to manually manage Custom Labware files, you can add the directory here.' + ) + screen.getByText('Additional Source Folder') + screen.getByRole('button', { name: 'Change labware source folder' }) + }) + + it('renders the custom labware section with no source folder selected', () => { + render() + screen.getByText('No additional source folder specified') + const btn = screen.getByRole('button', { + name: 'Add labware source folder', + }) + fireEvent.click(btn) + expect(mockTrackEvent).toHaveBeenCalledWith({ + name: ANALYTICS_CHANGE_CUSTOM_LABWARE_SOURCE_FOLDER, + properties: {}, + }) + }) +}) diff --git a/app/src/organisms/AdvancedSettings/__tests__/ClearUnavailableRobots.test.tsx b/app/src/organisms/AdvancedSettings/__tests__/ClearUnavailableRobots.test.tsx new file mode 100644 index 00000000000..5d714d74834 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/__tests__/ClearUnavailableRobots.test.tsx @@ -0,0 +1,115 @@ +import * as React from 'react' +import { screen, fireEvent } from '@testing-library/react' + +import { + renderWithProviders, + useConditionalConfirm, +} from '@opentrons/components' +import { i18n } from '../../../i18n' +import { + getReachableRobots, + getUnreachableRobots, +} from '../../../redux/discovery' +import { + mockReachableRobot, + mockUnreachableRobot, +} from '../../../redux/discovery/__fixtures__' +import { ClearUnavailableRobots } from '../ClearUnavailableRobots' + +jest.mock('@opentrons/components/src/hooks') +jest.mock('../../../redux/discovery') + +const mockGetUnreachableRobots = getUnreachableRobots as jest.MockedFunction< + typeof getUnreachableRobots +> +const mockGetReachableRobots = getReachableRobots as jest.MockedFunction< + typeof getReachableRobots +> +const mockUseConditionalConfirm = useConditionalConfirm as jest.MockedFunction< + typeof useConditionalConfirm +> + +const render = () => { + return renderWithProviders(, { + i18nInstance: i18n, + }) +} + +const mockConfirm = jest.fn() +const mockCancel = jest.fn() + +describe('ClearUnavailableRobots', () => { + beforeEach(() => { + mockGetUnreachableRobots.mockReturnValue([mockUnreachableRobot]) + mockGetReachableRobots.mockReturnValue([mockReachableRobot]) + mockUseConditionalConfirm.mockReturnValue({ + confirm: mockConfirm, + showConfirmation: true, + cancel: mockCancel, + }) + }) + + afterEach(() => {}) + + it('should render text and button', () => { + render() + screen.getByText('Clear Unavailable Robots') + screen.getByText( + 'Clear the list of unavailable robots on the Devices page. This action cannot be undone.' + ) + screen.getByRole('button', { + name: 'Clear unavailable robots list', + }) + }) + + it('should render modal when clicking clear button', () => { + render() + fireEvent.click( + screen.getByRole('button', { + name: 'Clear unavailable robots list', + }) + ) + screen.getByText('Clear unavailable robots?') + screen.getByText( + 'Clearing the list of unavailable robots on the Devices page cannot be undone.' + ) + screen.getByRole('button', { + name: 'cancel', + }) + screen.getByRole('button', { + name: 'Clear unavailable robots', + }) + }) + + it('should call mock confirmation when clicking clear button', () => { + render() + fireEvent.click( + screen.getByRole('button', { + name: 'Clear unavailable robots list', + }) + ) + + fireEvent.click( + screen.getByRole('button', { + name: 'Clear unavailable robots', + }) + ) + expect(mockConfirm).toHaveBeenCalled() + }) + + it('should call mock cancel when clicking cancel button', () => { + render() + fireEvent.click( + screen.getByRole('button', { + name: 'Clear unavailable robots list', + }) + ) + + fireEvent.click( + screen.getByRole('button', { + name: 'cancel', + }) + ) + expect(mockCancel).toHaveBeenCalled() + }) +}) diff --git a/app/src/organisms/AdvancedSettings/__tests__/EnableDevTools.test.tsx b/app/src/organisms/AdvancedSettings/__tests__/EnableDevTools.test.tsx new file mode 100644 index 00000000000..9b70ec18271 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/__tests__/EnableDevTools.test.tsx @@ -0,0 +1,51 @@ +import * as React from 'react' +import { screen, fireEvent } from '@testing-library/react' + +import { renderWithProviders } from '@opentrons/components' +import { i18n } from '../../../i18n' + +import { getDevtoolsEnabled, toggleDevtools } from '../../../redux/config' +import { EnableDevTools } from '../EnableDevTools' + +jest.mock('../../../redux/config') + +const mockGetDevtoolsEnabled = getDevtoolsEnabled as jest.MockedFunction< + typeof getDevtoolsEnabled +> +const mockToggleDevtools = toggleDevtools as jest.MockedFunction< + typeof toggleDevtools +> + +const render = () => { + return renderWithProviders(, { + i18nInstance: i18n, + }) +} + +describe('EnableDevTools', () => { + beforeEach(() => { + mockGetDevtoolsEnabled.mockReturnValue(true) + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + it('should render text and toggle button', () => { + render() + screen.getByText('Developer Tools') + screen.getByText( + 'Enabling this setting opens Developer Tools on app launch, enables additional logging and gives access to feature flags.' + ) + screen.getByRole('switch', { name: 'enable_dev_tools' }) + }) + + it('should call mock toggleConfigValue when clicking the toggle button', () => { + render() + const toggleButton = screen.getByRole('switch', { + name: 'enable_dev_tools', + }) + fireEvent.click(toggleButton) + expect(mockToggleDevtools).toHaveBeenCalled() + }) +}) diff --git a/app/src/organisms/AdvancedSettings/__tests__/OT2AdvancedSettings.test.tsx b/app/src/organisms/AdvancedSettings/__tests__/OT2AdvancedSettings.test.tsx new file mode 100644 index 00000000000..3e85270e9ff --- /dev/null +++ b/app/src/organisms/AdvancedSettings/__tests__/OT2AdvancedSettings.test.tsx @@ -0,0 +1,84 @@ +import * as React from 'react' +import { screen, fireEvent } from '@testing-library/react' + +import { renderWithProviders } from '@opentrons/components' +import { i18n } from '../../../i18n' + +import { + resetUseTrashSurfaceForTipCal, + setUseTrashSurfaceForTipCal, +} from '../../../redux/calibration' +import { getUseTrashSurfaceForTipCal } from '../../../redux/config' +import { OT2AdvancedSettings } from '../OT2AdvancedSettings' + +jest.mock('../../../redux/calibration') +jest.mock('../../../redux/config') + +const mockResetUseTrashSurfaceForTipCal = resetUseTrashSurfaceForTipCal as jest.MockedFunction< + typeof resetUseTrashSurfaceForTipCal +> + +const mockSetUseTrashSurfaceForTipCal = setUseTrashSurfaceForTipCal as jest.MockedFunction< + typeof setUseTrashSurfaceForTipCal +> + +const mockGetUseTrashSurfaceForTipCal = getUseTrashSurfaceForTipCal as jest.MockedFunction< + typeof getUseTrashSurfaceForTipCal +> + +const render = () => { + return renderWithProviders(, { + i18nInstance: i18n, + }) +} + +describe('OT2AdvancedSettings', () => { + beforeEach(() => { + mockGetUseTrashSurfaceForTipCal.mockReturnValue(true) + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + it('should render text and toggle button', () => { + render() + screen.getByText('OT-2 Advanced Settings') + screen.getByText('Tip Length Calibration Method') + screen.getByRole('radio', { + name: 'Always use calibration block to calibrate', + }) + screen.getByRole('radio', { name: 'Always use trash bin to calibrate' }) + screen.getByRole('radio', { + name: 'Always show the prompt to choose calibration block or trash bin', + }) + }) + + it('should call mock setUseTrashSurfaceForTipCal with false when selecting always block', () => { + render() + const radioButton = screen.getByRole('radio', { + name: 'Always use calibration block to calibrate', + }) + fireEvent.click(radioButton) + expect(mockSetUseTrashSurfaceForTipCal).toHaveBeenCalledWith(false) + }) + + it('should call mock setUseTrashSurfaceForTipCal with true when selecting always trash', () => { + mockGetUseTrashSurfaceForTipCal.mockReturnValue(false) + render() + const radioButton = screen.getByRole('radio', { + name: 'Always use trash bin to calibrate', + }) + fireEvent.click(radioButton) + expect(mockSetUseTrashSurfaceForTipCal).toHaveBeenCalledWith(true) + }) + + it('should call mock resetUseTrashSurfaceForTipCal when selecting always prompt', () => { + render() + const radioButton = screen.getByRole('radio', { + name: 'Always show the prompt to choose calibration block or trash bin', + }) + fireEvent.click(radioButton) + expect(mockResetUseTrashSurfaceForTipCal).toHaveBeenCalled() + }) +}) diff --git a/app/src/organisms/AdvancedSettings/__tests__/OverridePathToPython.test.tsx b/app/src/organisms/AdvancedSettings/__tests__/OverridePathToPython.test.tsx new file mode 100644 index 00000000000..23363633297 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/__tests__/OverridePathToPython.test.tsx @@ -0,0 +1,77 @@ +import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' + +import { renderWithProviders } from '@opentrons/components' + +import { i18n } from '../../../i18n' +import { getPathToPythonOverride } from '../../../redux/config' +import { + useTrackEvent, + ANALYTICS_CHANGE_PATH_TO_PYTHON_DIRECTORY, +} from '../../../redux/analytics' +import { openPythonInterpreterDirectory } from '../../../redux/protocol-analysis' + +import { OverridePathToPython } from '../OverridePathToPython' + +jest.mock('../../../redux/config') +jest.mock('../../../redux/analytics') +jest.mock('../../../redux/protocol-analysis') + +const render = () => { + return ( + renderWithProviders(), + { + i18nInstance: i18n, + } + ) +} + +const mockUseTrackEvent = useTrackEvent as jest.MockedFunction< + typeof useTrackEvent +> +const mockGetPathToPythonOverride = getPathToPythonOverride as jest.MockedFunction< + typeof getPathToPythonOverride +> +const mockOpenPythonInterpreterDirectory = openPythonInterpreterDirectory as jest.MockedFunction< + typeof openPythonInterpreterDirectory +> + +const mockTrackEvent = jest.fn() + +describe('OverridePathToPython', () => { + beforeEach(() => { + mockUseTrackEvent.mockReturnValue(mockTrackEvent) + }) + it('renders the path to python override text and button with no default path', () => { + mockGetPathToPythonOverride.mockReturnValue(null) + render() + screen.getByText('Override Path to Python') + screen.getByText( + 'If specified, the Opentrons App will use the Python interpreter at this path instead of the default bundled Python interpreter.' + ) + screen.getByText('override path') + screen.getByText('No path specified') + const button = screen.getByRole('button', { name: 'Add override path' }) + fireEvent.click(button) + expect(mockTrackEvent).toHaveBeenCalledWith({ + name: ANALYTICS_CHANGE_PATH_TO_PYTHON_DIRECTORY, + properties: {}, + }) + }) + + it('renders the path to python override text and button with a selected path', () => { + mockGetPathToPythonOverride.mockReturnValue('otherPath') + render() + screen.getByText('Override Path to Python') + screen.getByText( + 'If specified, the Opentrons App will use the Python interpreter at this path instead of the default bundled Python interpreter.' + ) + screen.getByText('override path') + const specifiedPath = screen.getByText('otherPath') + const button = screen.getByRole('button', { name: 'Reset to default' }) + fireEvent.click(button) + expect(mockGetPathToPythonOverride).toHaveBeenCalled() + fireEvent.click(specifiedPath) + expect(mockOpenPythonInterpreterDirectory).toHaveBeenCalled() + }) +}) diff --git a/app/src/organisms/AdvancedSettings/__tests__/PreventRobotCaching.test.tsx b/app/src/organisms/AdvancedSettings/__tests__/PreventRobotCaching.test.tsx new file mode 100644 index 00000000000..42a4d49d861 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/__tests__/PreventRobotCaching.test.tsx @@ -0,0 +1,63 @@ +import * as React from 'react' +import { when, resetAllWhenMocks } from 'jest-when' +import { screen, fireEvent } from '@testing-library/react' + +import { renderWithProviders } from '@opentrons/components' +import { i18n } from '../../../i18n' + +import { getConfig, toggleConfigValue } from '../../../redux/config' +import { PreventRobotCaching } from '../PreventRobotCaching' + +import type { State } from '../../../redux/types' + +jest.mock('../../../redux/config') + +const mockGetConfig = getConfig as jest.MockedFunction +const mockToggleConfigValue = toggleConfigValue as jest.MockedFunction< + typeof toggleConfigValue +> + +const MOCK_STATE: State = { + config: { + discovery: { + disableCache: false, + }, + }, +} as any + +const render = () => { + return renderWithProviders(, { + i18nInstance: i18n, + }) +} + +describe('PreventRobotCaching', () => { + beforeEach(() => { + when(mockGetConfig) + .calledWith(MOCK_STATE) + .mockReturnValue(MOCK_STATE.config) + }) + + afterEach(() => { + jest.clearAllMocks() + resetAllWhenMocks() + }) + + it('should render text and toggle button', () => { + render() + screen.getByText('Prevent Robot Caching') + screen.queryByText( + 'The app will immediately clear unavailable robots and will not remember unavailable robots while this is enabled. On networks with many robots, preventing caching may improve network performance at the expense of slower and less reliable robot discovery on app launch.' + ) + screen.getByRole('switch', { name: 'display_unavailable_robots' }) + }) + + it('should call mock toggleConfigValue when clicking the toggle button', () => { + render() + const toggleButton = screen.getByRole('switch', { + name: 'display_unavailable_robots', + }) + fireEvent.click(toggleButton) + expect(mockToggleConfigValue).toHaveBeenCalledWith('discovery.disableCache') + }) +}) diff --git a/app/src/organisms/AdvancedSettings/__tests__/ShowHeaterShakerAttachmentModal.test.tsx b/app/src/organisms/AdvancedSettings/__tests__/ShowHeaterShakerAttachmentModal.test.tsx new file mode 100644 index 00000000000..1daf08671f9 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/__tests__/ShowHeaterShakerAttachmentModal.test.tsx @@ -0,0 +1,65 @@ +import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' + +import { renderWithProviders } from '@opentrons/components' + +import { i18n } from '../../../i18n' +import { + getIsHeaterShakerAttached, + updateConfigValue, +} from '../../../redux/config' +import { ShowHeaterShakerAttachmentModal } from '../ShowHeaterShakerAttachmentModal' + +jest.mock('../../../redux/config') + +const mockGetIsHeaterShakerAttached = getIsHeaterShakerAttached as jest.MockedFunction< + typeof getIsHeaterShakerAttached +> +const mockUpdateConfigValue = updateConfigValue as jest.MockedFunction< + typeof updateConfigValue +> + +const render = () => { + return renderWithProviders(, { + i18nInstance: i18n, + }) +} + +describe('ShowHeaterShakerAttachmentModal', () => { + beforeEach(() => { + mockGetIsHeaterShakerAttached.mockReturnValue(true) + }) + + it('renders the toggle button on when showing heater shaker modal as false', () => { + render() + screen.getByText('Confirm Heater-Shaker Module Attachment') + screen.getByText( + 'Display a reminder to attach the Heater-Shaker properly before running a test shake or using it in a protocol.' + ) + const toggleButton = screen.getByRole('switch', { + name: 'show_heater_shaker_modal', + }) + expect(toggleButton.getAttribute('aria-checked')).toBe('false') + }) + + it('renders the toggle button on when showing heater shaker modal as true', () => { + mockGetIsHeaterShakerAttached.mockReturnValue(false) + render() + const toggleButton = screen.getByRole('switch', { + name: 'show_heater_shaker_modal', + }) + expect(toggleButton.getAttribute('aria-checked')).toBe('true') + }) + + it('should call mock function when clicking toggle button', () => { + render() + const toggleButton = screen.getByRole('switch', { + name: 'show_heater_shaker_modal', + }) + fireEvent.click(toggleButton) + expect(mockUpdateConfigValue).toHaveBeenCalledWith( + 'modules.heaterShaker.isAttached', + false + ) + }) +}) diff --git a/app/src/organisms/AdvancedSettings/__tests__/ShowLabwareOffsetSnippets.test.tsx b/app/src/organisms/AdvancedSettings/__tests__/ShowLabwareOffsetSnippets.test.tsx new file mode 100644 index 00000000000..ecce36d0631 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/__tests__/ShowLabwareOffsetSnippets.test.tsx @@ -0,0 +1,54 @@ +import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' + +import { i18n } from '../../../i18n' +import { renderWithProviders } from '@opentrons/components' +import { + getIsLabwareOffsetCodeSnippetsOn, + updateConfigValue, +} from '../../../redux/config' +import { ShowLabwareOffsetSnippets } from '../ShowLabwareOffsetSnippets' + +jest.mock('../../../redux/config') + +const mockGetIsLabwareOffsetCodeSnippetsOn = getIsLabwareOffsetCodeSnippetsOn as jest.MockedFunction< + typeof getIsLabwareOffsetCodeSnippetsOn +> +const mockUpdateConfigValue = updateConfigValue as jest.MockedFunction< + typeof updateConfigValue +> + +const render = () => { + return ( + renderWithProviders(), + { + i18nInstance: i18n, + } + ) +} + +describe('ShowLabwareOffsetSnippets', () => { + beforeEach(() => { + mockGetIsLabwareOffsetCodeSnippetsOn.mockReturnValue(true) + }) + it('renders the display show link to get labware offset data section', () => { + render() + screen.getByText('Show Labware Offset data code snippets') + screen.getByText( + 'Only for users who need to apply Labware Offset data outside of the Opentrons App. When enabled, code snippets for Jupyter Notebook and SSH are available during protocol setup.' + ) + screen.getByRole('switch', { name: 'show_link_to_get_labware_offset_data' }) + }) + + it('should call a mock function when clicking toggle button', () => { + render() + const toggleButton = screen.getByRole('switch', { + name: 'show_link_to_get_labware_offset_data', + }) + fireEvent.click(toggleButton) + expect(mockUpdateConfigValue).toHaveBeenCalledWith( + 'labware.showLabwareOffsetCodeSnippets', + false + ) + }) +}) diff --git a/app/src/organisms/AdvancedSettings/__tests__/U2EInformation.test.tsx b/app/src/organisms/AdvancedSettings/__tests__/U2EInformation.test.tsx new file mode 100644 index 00000000000..7cb79649ee7 --- /dev/null +++ b/app/src/organisms/AdvancedSettings/__tests__/U2EInformation.test.tsx @@ -0,0 +1,88 @@ +import * as React from 'react' +import { screen } from '@testing-library/react' +import { renderWithProviders } from '@opentrons/components' + +import { i18n } from '../../../i18n' +import { + getU2EAdapterDevice, + getU2EWindowsDriverStatus, + NOT_APPLICABLE, + OUTDATED, + UP_TO_DATE, +} from '../../../redux/system-info' +import * as Fixtures from '../../../redux/system-info/__fixtures__' + +import { U2EInformation } from '../U2EInformation' + +jest.mock('../../../redux/system-info') + +const mockGetU2EAdapterDevice = getU2EAdapterDevice as jest.MockedFunction< + typeof getU2EAdapterDevice +> +const mockGetU2EWindowsDriverStatus = getU2EWindowsDriverStatus as jest.MockedFunction< + typeof getU2EWindowsDriverStatus +> + +const render = () => { + return renderWithProviders(, { + i18nInstance: i18n, + }) +} + +describe('U2EInformation', () => { + beforeEach(() => { + mockGetU2EAdapterDevice.mockReturnValue(Fixtures.mockWindowsRealtekDevice) + mockGetU2EWindowsDriverStatus.mockReturnValue(OUTDATED) + }) + + it('render the usb-to-ethernet adapter information', () => { + render() + screen.getByText('USB-to-Ethernet Adapter Information') + screen.getByText( + 'Some OT-2s have an internal USB-to-Ethernet adapter. If your OT-2 uses this adapter, it will be added to your computer’s device list when you make a wired connection. If you have a Realtek adapter, it is essential that the driver is up to date.' + ) + screen.getByText('Description') + screen.getByText('Manufacturer') + screen.getByText('Driver Version') + }) + + it('renders the test data of the usb-to-ethernet adapter information with mac', () => { + mockGetU2EAdapterDevice.mockReturnValue({ + ...Fixtures.mockRealtekDevice, + }) + mockGetU2EWindowsDriverStatus.mockReturnValue(NOT_APPLICABLE) + render() + screen.getByText('USB 10/100 LAN') + screen.getByText('Realtek') + screen.getByText('Unknown') + expect( + screen.queryByText( + 'An update is available for Realtek USB-to-Ethernet adapter driver' + ) + ).not.toBeInTheDocument() + expect(screen.queryByText('go to Realtek.com')).not.toBeInTheDocument() + }) + + it('should render text and driver information', () => { + mockGetU2EWindowsDriverStatus.mockReturnValue(UP_TO_DATE) + render() + screen.getByText('Realtek USB FE Family Controller') + screen.getByText('Realtek') + screen.getByText('1.2.3') + expect( + screen.queryByText( + 'An update is available for Realtek USB-to-Ethernet adapter driver' + ) + ).not.toBeInTheDocument() + expect(screen.queryByText('go to Realtek.com')).not.toBeInTheDocument() + }) + + it('renders the not connected message and not display item titles when USB-to-Ethernet is not connected', () => { + mockGetU2EAdapterDevice.mockReturnValue(null) + render() + expect(screen.queryByText('Description')).not.toBeInTheDocument() + expect(screen.queryByText('Manufacturer')).not.toBeInTheDocument() + expect(screen.queryByText('Driver Version')).not.toBeInTheDocument() + screen.getByText('No USB-to-Ethernet adapter connected') + }) +}) diff --git a/app/src/organisms/AdvancedSettings/__tests__/UpdatedChannel.test.tsx b/app/src/organisms/AdvancedSettings/__tests__/UpdatedChannel.test.tsx new file mode 100644 index 00000000000..84ee9da2a8e --- /dev/null +++ b/app/src/organisms/AdvancedSettings/__tests__/UpdatedChannel.test.tsx @@ -0,0 +1,60 @@ +import * as React from 'react' +import { screen } from '@testing-library/react' +import { renderWithProviders } from '@opentrons/components' + +import { i18n } from '../../../i18n' +import { + getUpdateChannelOptions, + getUpdateChannel, + // updateConfigValue, +} from '../../../redux/config' +import { UpdatedChannel } from '../UpdatedChannel' + +jest.mock('../../../redux/config') + +const render = () => { + return renderWithProviders(, { i18nInstance: i18n }) +} + +const mockGetUpdateChannelOptions = getUpdateChannelOptions as jest.MockedFunction< + typeof getUpdateChannelOptions +> +const mockGetUpdateChannel = getUpdateChannel as jest.MockedFunction< + typeof getUpdateChannel +> +// const mockUpdateConfigValue = updateConfigValue as jest.MockedFunction< +// typeof updateConfigValue +// > + +describe('UpdatedChannel', () => { + beforeEach(() => { + mockGetUpdateChannelOptions.mockReturnValue([ + { + label: 'Stable', + value: 'latest', + }, + { label: 'Beta', value: 'beta' }, + { label: 'Alpha', value: 'alpha' }, + ]) + mockGetUpdateChannel.mockReturnValue('beta') + }) + it('renders text and selector', () => { + render() + screen.getByText('Update Channel') + screen.getByText( + 'Stable receives the latest stable releases. Beta allows you to try out new in-progress features before they launch in Stable channel, but they have not completed testing yet.' + ) + screen.getByRole('combobox', { name: '' }) + screen.getByText('beta') + }) + + // it('should call a mock function when selecting a channel', () => { + // render() + // const selectedOption = screen.getByRole('combobox') + // fireEvent.change(selectedOption, { target: { value: 'alpha' } }) + // expect(mockUpdateConfigValue).toHaveBeenCalledWith( + // 'update.channel', + // 'alpha' + // ) + // }) +}) diff --git a/app/src/organisms/AdvancedSettings/index.ts b/app/src/organisms/AdvancedSettings/index.ts new file mode 100644 index 00000000000..22d0598f09d --- /dev/null +++ b/app/src/organisms/AdvancedSettings/index.ts @@ -0,0 +1,10 @@ +export * from './AdditionalCustomLabwareSourceFolder' +export * from './ClearUnavailableRobots' +export * from './EnableDevTools' +export * from './OT2AdvancedSettings' +export * from './OverridePathToPython' +export * from './PreventRobotCaching' +export * from './ShowHeaterShakerAttachmentModal' +export * from './ShowLabwareOffsetSnippets' +export * from './U2EInformation' +export * from './UpdatedChannel' diff --git a/app/src/organisms/Alerts/__tests__/Alerts.test.tsx b/app/src/organisms/Alerts/__tests__/Alerts.test.tsx index 36742d505ea..631f8ba779b 100644 --- a/app/src/organisms/Alerts/__tests__/Alerts.test.tsx +++ b/app/src/organisms/Alerts/__tests__/Alerts.test.tsx @@ -1,156 +1,3 @@ -import * as React from 'react' -import { when } from 'jest-when' - -import { mountWithStore } from '@opentrons/components' -import * as AppAlerts from '../../../redux/alerts' -import { getAvailableShellUpdate } from '../../../redux/shell' -import { getHasJustUpdated } from '../../../redux/config' -import { TOAST_ANIMATION_DURATION } from '../../../atoms/Toast' -import { AlertsModal } from '../AlertsModal' -import { AnalyticsSettingsModal } from '../../AnalyticsSettingsModal' -import { U2EDriverOutdatedAlert } from '../U2EDriverOutdatedAlert' -import { UpdateAppModal } from '../../UpdateAppModal' -import { useRemoveActiveAppUpdateToast } from '..' - -import type { State } from '../../../redux/types' -import type { AlertId } from '../../../redux/alerts/types' - -jest.mock('../../AnalyticsSettingsModal', () => ({ - AnalyticsSettingsModal: () => <>, -})) -jest.mock('../U2EDriverOutdatedAlert', () => ({ - U2EDriverOutdatedAlert: () => <>, -})) -jest.mock('../../UpdateAppModal', () => ({ - UpdateAppModal: () => <>, -})) -jest.mock('../../../redux/alerts/selectors') -jest.mock('../../../redux/shell') -jest.mock('../../../redux/config') -jest.mock('..') - -const getActiveAlerts = AppAlerts.getActiveAlerts as jest.MockedFunction< - typeof AppAlerts.getActiveAlerts -> -const mockGetAvailableShellUpdate = getAvailableShellUpdate as jest.MockedFunction< - typeof getAvailableShellUpdate -> -const mockGetHasJustUpdated = getHasJustUpdated as jest.MockedFunction< - typeof getHasJustUpdated -> -const mockUseRemoveActiveAppUpdateToast = useRemoveActiveAppUpdateToast as jest.MockedFunction< - typeof useRemoveActiveAppUpdateToast -> - -const MOCK_STATE: State = { mockState: true } as any - describe('app-wide Alerts component', () => { - let props: React.ComponentProps - const mockUseRef = { current: null } - - const render = () => { - return mountWithStore>( - , - { - initialState: MOCK_STATE, - } - ) - } - - const stubActiveAlerts = (alertIds: AlertId[]): void => { - getActiveAlerts.mockImplementation((state: State): AlertId[] => { - expect(state).toEqual(MOCK_STATE) - return alertIds - }) - } - - beforeEach(() => { - stubActiveAlerts([]) - when(mockGetAvailableShellUpdate).mockReturnValue('true') - when(mockGetHasJustUpdated).mockReturnValue(false) - when(mockUseRemoveActiveAppUpdateToast).calledWith().mockReturnValue({ - removeActiveAppUpdateToast: jest.fn(), - }) - props = { - toastIdRef: mockUseRef, - } - }) - - afterEach(() => { - jest.resetAllMocks() - }) - - // TODO(mc, 2020-05-07): AnalyticsSettingsModal currently controls its own - // render; move its logic into `state.alerts` - it('should render AnalyticsSettingsModal', () => { - const { wrapper } = render() - expect(wrapper.exists(AnalyticsSettingsModal)).toBe(true) - }) - - it('should render a U2EDriverOutdatedAlert if alert is triggered', () => { - const { wrapper, store, refresh } = render() - expect(wrapper.exists(U2EDriverOutdatedAlert)).toBe(false) - - stubActiveAlerts([AppAlerts.ALERT_U2E_DRIVER_OUTDATED]) - refresh() - expect(wrapper.exists(U2EDriverOutdatedAlert)).toBe(true) - - wrapper.find(U2EDriverOutdatedAlert).invoke('dismissAlert')?.(true) - - expect(store.dispatch).toHaveBeenCalledWith( - AppAlerts.alertDismissed(AppAlerts.ALERT_U2E_DRIVER_OUTDATED, true) - ) - }) - it('should render a software update toast if a software update is available that is dismissed when clicked', () => { - const { wrapper, refresh } = render() - expect(wrapper.exists(UpdateAppModal)).toBe(false) - - stubActiveAlerts([AppAlerts.ALERT_APP_UPDATE_AVAILABLE]) - refresh() - - setTimeout(() => { - expect(wrapper.contains('View Update')).toBe(true) - wrapper.findWhere(node => node.text() === 'View Update').simulate('click') - setTimeout( - () => expect(wrapper.contains('View Update')).toBe(false), - TOAST_ANIMATION_DURATION - ) - }, TOAST_ANIMATION_DURATION) - }) - it('should render an UpdateAppModal if the app update toast is clicked', () => { - const { wrapper, store, refresh } = render() - expect(wrapper.exists(UpdateAppModal)).toBe(false) - - stubActiveAlerts([AppAlerts.ALERT_APP_UPDATE_AVAILABLE]) - refresh() - - setTimeout(() => { - expect(wrapper.contains('View Update')).toBe(true) - wrapper.findWhere(node => node.text() === 'View Update').simulate('click') - - expect(wrapper.exists(UpdateAppModal)).toBe(true) - - wrapper.find(UpdateAppModal).invoke('closeModal')?.(true) - - expect(store.dispatch).toHaveBeenCalledWith( - AppAlerts.alertDismissed(AppAlerts.ALERT_APP_UPDATE_AVAILABLE, true) - ) - }, TOAST_ANIMATION_DURATION) - }) - it('should render a success toast if the software update was successful', () => { - const { wrapper } = render() - when(mockGetHasJustUpdated).mockReturnValue(true) - - setTimeout(() => { - expect(wrapper.contains('successfully updated')).toBe(true) - }, TOAST_ANIMATION_DURATION) - }) - it('should not render an app update toast if a software update is no longer available', () => { - when(mockGetAvailableShellUpdate).mockReturnValue('false') - const { wrapper } = render() - setTimeout(() => { - expect(wrapper.contains('View Update')).toBe(false) - expect(mockUseRemoveActiveAppUpdateToast).toHaveBeenCalled() - }, TOAST_ANIMATION_DURATION) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/Alerts/__tests__/U2EDriverOutdatedAlert.test.tsx b/app/src/organisms/Alerts/__tests__/U2EDriverOutdatedAlert.test.tsx index 2691a21df63..5737f3336fe 100644 --- a/app/src/organisms/Alerts/__tests__/U2EDriverOutdatedAlert.test.tsx +++ b/app/src/organisms/Alerts/__tests__/U2EDriverOutdatedAlert.test.tsx @@ -1,100 +1,3 @@ -import * as React from 'react' -import { act } from 'react-dom/test-utils' -import { mount } from 'enzyme' - -import { AlertModal } from '@opentrons/components' -import * as Analytics from '../../../redux/analytics' -import { U2EDriverOutdatedAlert } from '../U2EDriverOutdatedAlert' - -jest.mock('../../../redux/analytics') - -jest.mock('react-router-dom', () => ({ - // TODO(mc, 2020-05-07): create a tested Link wrapper that's safe to mock - Link: () => <>, -})) - -// TODO(mc, 2020-05-07): remove this feature flag -jest.mock('../../../redux/config/hooks', () => ({ - useFeatureFlag: (flag: string) => flag === 'systemInfoEnabled', -})) - -const EXPECTED_DOWNLOAD_URL = - 'https://www.realtek.com/en/component/zoo/category/network-interface-controllers-10-100-1000m-gigabit-ethernet-usb-3-0-software' - -const useTrackEvent = Analytics.useTrackEvent as jest.MockedFunction< - typeof Analytics.useTrackEvent -> - describe('U2EDriverOutdatedAlert', () => { - const dismissAlert = jest.fn() - const trackEvent: ReturnType< - typeof Analytics.useTrackEvent - > = jest.fn() as any - const render = (): ReturnType => { - return mount() - } - - beforeEach(() => { - useTrackEvent.mockReturnValue(trackEvent) - }) - - afterEach(() => { - jest.resetAllMocks() - }) - - it('should render an AlertModal', () => { - const wrapper = render() - const alertModal = wrapper.find(AlertModal) - - expect(alertModal.prop('heading')).toBe( - 'Realtek USB-to-Ethernet Driver Update Available' - ) - }) - - it('should have a link to /network-and-system that dismisses the alert', () => { - const wrapper = render() - const link = wrapper.find('Link[to="/more/network-and-system"]') - - link.invoke('onClick')?.({} as React.MouseEvent) - - expect(link.prop('children')).toContain('view adapter info') - expect(dismissAlert).toHaveBeenCalledWith(false) - expect(trackEvent).toHaveBeenCalledWith({ - name: Analytics.ANALYTICS_U2E_DRIVE_ALERT_DISMISSED, - properties: { rememberDismiss: false }, - }) - }) - - it('should have a link to the Realtek website', () => { - const wrapper = render() - const link = wrapper.find(`a[href="${EXPECTED_DOWNLOAD_URL}"]`) - - link.invoke('onClick')?.({} as React.MouseEvent) - - expect(link.prop('children')).toContain('get update') - expect(dismissAlert).toHaveBeenCalledWith(false) - expect(trackEvent).toHaveBeenCalledWith({ - name: Analytics.ANALYTICS_U2E_DRIVE_LINK_CLICKED, - properties: { source: 'modal' }, - }) - }) - - it('should be able to perma-ignore the alert', () => { - const wrapper = render() - const checkbox = wrapper.find(`input[type="checkbox"]`) - - act(() => { - checkbox.simulate('change') - }) - wrapper.update() - wrapper.find('Link[to="/more/network-and-system"]').invoke('onClick')?.( - {} as React.MouseEvent - ) - - expect(dismissAlert).toHaveBeenCalledWith(true) - expect(trackEvent).toHaveBeenCalledWith({ - name: Analytics.ANALYTICS_U2E_DRIVE_ALERT_DISMISSED, - properties: { rememberDismiss: true }, - }) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/AnalyticsSettingsModal/AnalyticsToggle.tsx b/app/src/organisms/AnalyticsSettingsModal/AnalyticsToggle.tsx deleted file mode 100644 index 110bfafd4b0..00000000000 --- a/app/src/organisms/AnalyticsSettingsModal/AnalyticsToggle.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import * as React from 'react' -import { connect, MapStateToProps, MapDispatchToProps } from 'react-redux' -import { LabeledToggle } from '@opentrons/components' - -import { - toggleAnalyticsOptedIn, - getAnalyticsOptedIn, -} from '../../redux/analytics' - -import type { State } from '../../redux/types' - -interface SP { - optedIn: boolean -} - -interface DP { - toggleOptedIn: () => unknown -} - -type Props = SP & DP - -function AnalyticsToggleComponent(props: Props): JSX.Element { - return ( - -

- Help Opentrons improve its products and services by automatically - sending anonymous diagnostic and usage data. -

-

- This will allow us to learn things such as which features get used the - most, which parts of the process are taking longest to complete, and how - errors are generated. You can change this setting at any time. -

- - ) -} - -const mapStateToProps: MapStateToProps = state => { - return { - optedIn: getAnalyticsOptedIn(state), - } -} - -const mapDispatchToProps: MapDispatchToProps = dispatch => { - return { - toggleOptedIn: () => dispatch(toggleAnalyticsOptedIn()), - } -} - -export const AnalyticsToggle = connect( - mapStateToProps, - mapDispatchToProps -)(AnalyticsToggleComponent) diff --git a/app/src/organisms/AnalyticsSettingsModal/index.tsx b/app/src/organisms/AnalyticsSettingsModal/index.tsx index 9e32b303e93..bba698037aa 100644 --- a/app/src/organisms/AnalyticsSettingsModal/index.tsx +++ b/app/src/organisms/AnalyticsSettingsModal/index.tsx @@ -1,38 +1,72 @@ import * as React from 'react' import { useSelector, useDispatch } from 'react-redux' - +import { Trans, useTranslation } from 'react-i18next' +import { + Flex, + SPACING, + TYPOGRAPHY, + DIRECTION_COLUMN, + PrimaryButton, + JUSTIFY_FLEX_END, +} from '@opentrons/components' import { getAnalyticsOptInSeen, + toggleAnalyticsOptedIn, setAnalyticsOptInSeen, + getAnalyticsOptedIn, } from '../../redux/analytics' - -import { Modal, OutlineButton, SPACING } from '@opentrons/components' -import { AnalyticsToggle } from './AnalyticsToggle' -import { Portal } from '../../App/portal' +import { ExternalLink } from '../../atoms/Link/ExternalLink' +import { LegacyModal } from '../../molecules/LegacyModal' +import { StyledText } from '../../atoms/text' import type { Dispatch } from '../../redux/types' -// TODO(bc, 2021-02-04): i18n -const TITLE = 'Privacy Settings' -const CONTINUE = 'continue' +const PRIVACY_POLICY_LINK = 'https://opentrons.com/privacy-policy' // TODO(mc, 2020-05-07): move render logic to `state.alerts` export function AnalyticsSettingsModal(): JSX.Element | null { + const { t } = useTranslation('shared') const dispatch = useDispatch() const seen = useSelector(getAnalyticsOptInSeen) - const setSeen = (): unknown => dispatch(setAnalyticsOptInSeen()) + const hasOptedIn = useSelector(getAnalyticsOptedIn) + + const handleClick = (): void => { + dispatch(setAnalyticsOptInSeen()) + dispatch(toggleAnalyticsOptedIn()) + } - return !seen ? ( - - - - + {t('acknowledge_privacy')} +
+ } + footer={ + - {CONTINUE} - - - + + {t('agree')} + + + } + > + + + + }} + /> + + + {t('opentrons_privacy_policy')} + + + + ) : null } diff --git a/app/src/organisms/AppSettings/ConnectRobotSlideout.tsx b/app/src/organisms/AppSettings/ConnectRobotSlideout.tsx index dd49d17f28a..671150cba2c 100644 --- a/app/src/organisms/AppSettings/ConnectRobotSlideout.tsx +++ b/app/src/organisms/AppSettings/ConnectRobotSlideout.tsx @@ -105,7 +105,7 @@ export function ConnectRobotSlideout({ {t('searching')} @@ -118,7 +118,7 @@ export function ConnectRobotSlideout({ <> {t('discovery_timeout')} diff --git a/app/src/organisms/AppSettings/ManualIpHostnameForm.tsx b/app/src/organisms/AppSettings/ManualIpHostnameForm.tsx index 5abfd633962..105eb188c94 100644 --- a/app/src/organisms/AppSettings/ManualIpHostnameForm.tsx +++ b/app/src/organisms/AppSettings/ManualIpHostnameForm.tsx @@ -34,16 +34,16 @@ const StyledInput = styled.input` margin: ${SPACING.spacing4} 0; background-color: ${COLORS.white}; border-radius: ${SPACING.spacing4}; - border: 1px ${BORDERS.styleSolid} ${COLORS.medGreyEnabled}; + border: 1px ${BORDERS.styleSolid} ${COLORS.grey30}; height: ${SIZE_2}; font-size: ${TYPOGRAPHY.fontSizeP}; &:active { - border: 1px ${BORDERS.styleSolid} ${COLORS.darkGreyEnabled}; + border: 1px ${BORDERS.styleSolid} ${COLORS.grey50}; } &:hover { - border: 1px ${BORDERS.styleSolid} ${COLORS.blueEnabled}; + border: 1px ${BORDERS.styleSolid} ${COLORS.blue50}; } &:focus-visible { @@ -51,7 +51,7 @@ const StyledInput = styled.input` } &:disabled { - border: 1px ${BORDERS.styleSolid} ${COLORS.darkGreyDisabled}; + border: 1px ${BORDERS.styleSolid} ${COLORS.grey30}; } ` @@ -79,7 +79,7 @@ export function ManualIpHostnameForm({ const ip = values.ip.trim() const inputForm = document.getElementById('ip') if (inputForm != null) - inputForm.style.border = `1px solid ${String(COLORS.medGreyEnabled)}` + inputForm.style.border = `1px solid ${String(COLORS.grey30)}` addManualIpAndHostname(ip) resetForm() setMostRecentAddition(ip) @@ -92,7 +92,7 @@ export function ManualIpHostnameForm({ errors.ip = t('add_ip_error') const inputForm = document.getElementById('ip') if (inputForm != null) - inputForm.style.border = `1px solid ${String(COLORS.errorEnabled)}` + inputForm.style.border = `1px solid ${String(COLORS.red50)}` } return errors }, @@ -128,7 +128,7 @@ export function ManualIpHostnameForm({ {formik.errors.ip} diff --git a/app/src/organisms/AppSettings/ManualIpHostnameItem.tsx b/app/src/organisms/AppSettings/ManualIpHostnameItem.tsx index 2f5e2aba108..f5e8f00b77f 100644 --- a/app/src/organisms/AppSettings/ManualIpHostnameItem.tsx +++ b/app/src/organisms/AppSettings/ManualIpHostnameItem.tsx @@ -28,10 +28,10 @@ const CLOSE_ICON_STYLE = css` border-radius: 50%; &:hover { - background: ${COLORS.lightGreyHover}; + background: ${COLORS.grey30}; } &:active { - background: ${COLORS.lightGreyPressed}; + background: ${COLORS.grey35}; } ` interface IpHostnameItemProps { @@ -83,16 +83,14 @@ export function ManualIpHostnameItem({ {candidate} { }) it('renders correct title, body, and footer for ConnectRobotSlideout', () => { - const { getByText } = render(props) - getByText('Connect to a Robot via IP Address') - getByText('Enter an IP address or hostname to connect to a robot.') - getByText( + render(props) + screen.getByText('Connect to a Robot via IP Address') + screen.getByText('Enter an IP address or hostname to connect to a robot.') + screen.getByText( 'Opentrons recommends working with your network administrator to assign a static IP address to the robot.' ) - getByText('Learn more about connecting a robot manually') + screen.getByText('Learn more about connecting a robot manually') - getByText('Add IP Address or Hostname') + screen.getByText('Add IP Address or Hostname') }) it('renders the Add button, Done button, and input form', () => { - const { getByRole } = render(props) - getByRole('button', { name: 'Add' }) - getByRole('button', { name: 'Done' }) - expect(getByRole('textbox')).toBeInTheDocument() + render(props) + screen.getByRole('button', { name: 'Add' }) + screen.getByRole('button', { name: 'Done' }) + expect(screen.getByRole('textbox')).toBeInTheDocument() }) it('renders the link and it has the correct href attribute', () => { - const { getByText } = render(props) + render(props) const targetLink = 'https://support.opentrons.com/s/article/Manually-adding-a-robot-s-IP-address' - const link = getByText('Learn more about connecting a robot manually') - expect(link.closest('a')).toHaveAttribute('href', targetLink) + const link = screen.getByRole('link', { + name: 'Learn more about connecting a robot manually', + }) + expect(link).toHaveAttribute('href', targetLink) }) it('Clicking Add button without IP address/hostname should display an error message', async () => { - const { getByRole, findByText } = render(props) - const addButton = getByRole('button', { name: 'Add' }) + render(props) + const addButton = screen.getByRole('button', { name: 'Add' }) expect(addButton).toBeEnabled() - await fireEvent.click(addButton) - const errorMessage = await findByText('Enter an IP Address or Hostname') + fireEvent.click(addButton) + const errorMessage = await screen.findByText( + 'Enter an IP Address or Hostname' + ) expect(errorMessage).toBeInTheDocument() }) it('Clicking Add button with an IP address/hostname should display the IP address/hostname', async () => { - const { getByRole, getByText, queryByText } = render(props) + render(props) const newIpAddress = 'localhost' - const inputBox = getByRole('textbox') - const addButton = getByRole('button', { name: 'Add' }) - await act(async () => { - await fireEvent.change(inputBox, { target: { value: newIpAddress } }) - await fireEvent.click(addButton) - }) - - getByText(newIpAddress) - getByText('Searching for 30s') - expect(queryByText('Available')).toBeInTheDocument() + const inputBox = screen.getByRole('textbox') + const addButton = screen.getByRole('button', { name: 'Add' }) + fireEvent.change(inputBox, { target: { value: newIpAddress } }) + fireEvent.click(addButton) + + screen.getByText(newIpAddress) + screen.getByText('Searching for 30s') + screen.getByText('Available') }) it('Clicking Add button with an IP address/hostname should display the IP address/hostname and Available label', async () => { - const { getByRole, getByText, queryByText } = render(props) + render(props) const availableIpAddress = '192.168.1.1' - const inputBox = getByRole('textbox') - const addButton = getByRole('button', { name: 'Add' }) - await act(async () => { - await fireEvent.change(inputBox, { - target: { value: availableIpAddress }, - }) - await fireEvent.click(addButton) + const inputBox = screen.getByRole('textbox') + const addButton = screen.getByRole('button', { name: 'Add' }) + fireEvent.change(inputBox, { + target: { value: availableIpAddress }, }) - getByText(availableIpAddress) - queryByText('Available') + fireEvent.click(addButton) + screen.getByText(availableIpAddress) + screen.queryByText('Available') }) - it('Clicking Add button with an IP address/hostname should display the IP address/hostname and Not Found label', async () => { - const { getByRole, findByText } = render(props) - const notFoundIpAddress = '1.1.1.2' - const inputBox = getByRole('textbox') - const addButton = getByRole('button', { name: 'Add' }) - await act(async () => { - await fireEvent.change(inputBox, { - target: { value: notFoundIpAddress }, - }) - await fireEvent.click(addButton) - }) - findByText(notFoundIpAddress) - findByText('Not Found') - }) + it.todo( + 'Clicking Add button with an IP address/hostname should display the IP address/hostname and Not Found label' + ) + // NOTE: consider mocking formik here? + // , async () => { + // mockGetConfig.mockReturnValue({ discovery: { candidates: ['1.1.1.2'] } } as any) + // mockGetViewableRobots.mockReturnValue([] as any[]) + // render(props) + // const user = userEvent.setup() + // const notFoundIpAddress = '1.1.1.2' + // await user.type(screen.getByRole('textbox'), notFoundIpAddress) + // await user.click(screen.getByRole('button', { name: 'Add' })) + // await waitFor(() => + // expect(screen.getByText(notFoundIpAddress)) + // ) + // screen.getByText('Not Found') + // }) it('Clicking Close button in a row should remove an IP address/hostname', async () => { - const { queryByText, getByRole, getAllByTestId } = render(props) + render(props) const targetIpAddress = 'test' - const inputBox = getByRole('textbox') - const addButton = getByRole('button', { name: 'Add' }) - await act(async () => { - fireEvent.change(inputBox, { target: { value: targetIpAddress } }) - fireEvent.click(addButton) - }) - const removeButtons = getAllByTestId('close-button') + const inputBox = screen.getByRole('textbox') + const addButton = screen.getByRole('button', { name: 'Add' }) + fireEvent.change(inputBox, { target: { value: targetIpAddress } }) + fireEvent.click(addButton) + const removeButtons = screen.getAllByTestId('close-button') const btnLength = removeButtons.length fireEvent.click(removeButtons[btnLength - 1]) - expect(queryByText(targetIpAddress)).toBeFalsy() + expect(screen.queryByText(targetIpAddress)).toBeFalsy() }) it('Clicking close button should close the slideout', async () => { - const { getByTestId } = render(props) - const closeButton = getByTestId( + render(props) + const closeButton = screen.getByTestId( 'Slideout_icon_close_Connect to a Robot via IP Address' ) - await fireEvent.click(closeButton) + fireEvent.click(closeButton) expect(props.onCloseClick).toHaveBeenCalled() }) it('Clicking Done button should close the slideout', async () => { - const { getByRole } = render(props) - const doneButton = getByRole('button', { name: 'Done' }) - await fireEvent.click(doneButton) + render(props) + const doneButton = screen.getByRole('button', { name: 'Done' }) + fireEvent.click(doneButton) expect(props.onCloseClick).toHaveBeenCalled() }) }) diff --git a/app/src/organisms/AppSettings/__tests__/PreviousVersionModal.test.tsx b/app/src/organisms/AppSettings/__tests__/PreviousVersionModal.test.tsx index 4217190a0a0..425b7d34cbb 100644 --- a/app/src/organisms/AppSettings/__tests__/PreviousVersionModal.test.tsx +++ b/app/src/organisms/AppSettings/__tests__/PreviousVersionModal.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../i18n' import { @@ -18,19 +19,19 @@ const props: React.ComponentProps = { describe('PreviousVersionModal', () => { it('renders correct title and body text', () => { - const [{ getByText }] = render(props) - getByText('How to Restore a Previous Software Version') - getByText( + render(props) + screen.getByText('How to Restore a Previous Software Version') + screen.getByText( 'Opentrons does not recommend reverting to previous software versions, but you can access previous releases below. For best results, uninstall the existing app and remove its configuration files before installing the previous version.' ) }) it('renders correct support links', () => { - const [{ getByRole }] = render(props) - const uninstallLink = getByRole('link', { + render(props) + const uninstallLink = screen.getByRole('link', { name: 'Learn more about uninstalling the Opentrons App', }) expect(uninstallLink.getAttribute('href')).toBe(UNINSTALL_APP_URL) - const previousReleasesLink = getByRole('link', { + const previousReleasesLink = screen.getByRole('link', { name: 'View previous Opentrons releases', }) expect(previousReleasesLink.getAttribute('href')).toBe( @@ -38,9 +39,9 @@ describe('PreviousVersionModal', () => { ) }) it('renders the close button and calls closeModal when clicked', () => { - const [{ getByRole }] = render(props) - const closeButton = getByRole('button', { name: 'Close' }) - closeButton.click() + render(props) + const closeButton = screen.getByRole('button', { name: 'Close' }) + fireEvent.click(closeButton) expect(props.closeModal).toBeCalled() }) }) diff --git a/app/src/organisms/ApplyHistoricOffsets/LabwareOffsetTable.tsx b/app/src/organisms/ApplyHistoricOffsets/LabwareOffsetTable.tsx index 24871d8d340..c73326031b3 100644 --- a/app/src/organisms/ApplyHistoricOffsets/LabwareOffsetTable.tsx +++ b/app/src/organisms/ApplyHistoricOffsets/LabwareOffsetTable.tsx @@ -21,7 +21,7 @@ const OffsetTableHeader = styled('th')` padding: ${SPACING.spacing4}; ` const OffsetTableRow = styled('tr')` - background-color: ${COLORS.fundamentalsBackground}; + background-color: ${COLORS.grey10}; padding: ${SPACING.spacing8}; ` diff --git a/app/src/organisms/ApplyHistoricOffsets/__tests__/ApplyHistoricOffsets.test.tsx b/app/src/organisms/ApplyHistoricOffsets/__tests__/ApplyHistoricOffsets.test.tsx index 1f05d2c48f6..ab637f9b5b8 100644 --- a/app/src/organisms/ApplyHistoricOffsets/__tests__/ApplyHistoricOffsets.test.tsx +++ b/app/src/organisms/ApplyHistoricOffsets/__tests__/ApplyHistoricOffsets.test.tsx @@ -8,6 +8,7 @@ import { getIsLabwareOffsetCodeSnippetsOn } from '../../../redux/config' import { getLabwareDefinitionsFromCommands } from '../../LabwarePositionCheck/utils/labware' import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { OffsetCandidate } from '../hooks/useOffsetCandidatesForAnalysis' +import { fireEvent, screen } from '@testing-library/react' jest.mock('../../../redux/config') jest.mock('../../LabwarePositionCheck/utils/labware') @@ -64,46 +65,42 @@ const mockFourthCandidate: OffsetCandidate = { } describe('ApplyHistoricOffsets', () => { - let render: ( - props?: Partial> - ) => ReturnType const mockSetShouldApplyOffsets = jest.fn() - - beforeEach(() => { - render = props => - renderWithProviders>( - , - { i18nInstance: i18n } - ) - }) + const render = ( + props?: Partial> + ) => + renderWithProviders>( + , + { i18nInstance: i18n } + ) afterEach(() => { jest.resetAllMocks() }) it('renders correct copy when shouldApplyOffsets is true', () => { - const [{ getByText }] = render() - getByText('Apply labware offset data') - getByText('View data') + render() + screen.getByText('Apply labware offset data') + screen.getByText('View data') }) it('renders correct copy when shouldApplyOffsets is false', () => { - const [{ getByText }] = render({ shouldApplyOffsets: false }) - getByText('Apply labware offset data') - getByText('View data') + render({ shouldApplyOffsets: false }) + screen.getByText('Apply labware offset data') + screen.getByText('View data') }) it('renders view data modal when link clicked, with correct copy and table row for each candidate', () => { @@ -111,57 +108,62 @@ describe('ApplyHistoricOffsets', () => { mockLabwareDef, mockAdapterDef, ]) - const [{ getByText, getByRole, queryByText, getByTestId }] = render() - getByText('View data').click() + render() + const viewDataButton = screen.getByText('View data') + fireEvent.click(viewDataButton) - getByRole('heading', { name: 'Apply Stored Labware Offset Data?' }) - getByText( + screen.getByRole('heading', { name: 'Apply Stored Labware Offset Data?' }) + screen.getByText( 'This robot has offsets for labware used in this protocol. If you apply these offsets, you can still adjust them with Labware Position Check.' ) expect( - getByRole('link', { name: 'See how labware offsets work' }) + screen.getByRole('link', { name: 'See how labware offsets work' }) ).toHaveAttribute( 'href', 'https://support.opentrons.com/s/article/How-Labware-Offsets-work-on-the-OT-2' ) // first candidate table row - getByText('Slot 1') + screen.getByText('Slot 1') // second candidate table row - getByText('Slot 2') + screen.getByText('Slot 2') // 4th candidate a labware on adapter on module - getByText('Opentrons 96 PCR Adapter in Heater-Shaker Module GEN1 in Slot 3') + screen.getByText( + 'Opentrons 96 PCR Heater-Shaker Adapter in Heater-Shaker Module GEN1 in Slot 3' + ) // third candidate on module table row - getByText('Heater-Shaker Module GEN1 in Slot 3') - getByTestId( + screen.getByText('Heater-Shaker Module GEN1 in Slot 3') + const closeButton = screen.getByTestId( 'ModalHeader_icon_close_Apply Stored Labware Offset Data?' - ).click() - expect(queryByText('Apply Stored Labware Offset Data?')).toBeNull() + ) + fireEvent.click(closeButton) + expect(screen.queryByText('Apply Stored Labware Offset Data?')).toBeNull() }) it('renders view data modal when link clicked, with correct empty state if no candidates', () => { - const [{ getByText, getByRole, queryByText }] = render({ + render({ offsetCandidates: [], }) - getByText('No offset data available') - getByText('Learn more').click() + screen.getByText('No offset data available') + const learnMoreBUtton = screen.getByText('Learn more') + fireEvent.click(learnMoreBUtton) - getByRole('heading', { name: 'What is labware offset data?' }) + screen.getByRole('heading', { name: 'What is labware offset data?' }) - getByText( + screen.getByText( 'Labware offset data references previous protocol run labware locations to save you time. If all the labware in this protocol have been checked in previous runs, that data will be applied to this run.' ) - getByText( + screen.getByText( 'You can add new offsets with Labware Position Check in later steps.' ) expect( - getByRole('link', { name: 'See how labware offsets work' }) + screen.getByRole('link', { name: 'See how labware offsets work' }) ).toHaveAttribute( 'href', 'https://support.opentrons.com/s/article/How-Labware-Offsets-work-on-the-OT-2' ) - expect(queryByText('location')).toBeNull() + expect(screen.queryByText('location')).toBeNull() }) it('renders tabbed offset data with snippets when config option is selected', () => { @@ -170,10 +172,11 @@ describe('ApplyHistoricOffsets', () => { mockAdapterDef, ]) mockGetIsLabwareOffsetCodeSnippetsOn.mockReturnValue(true) - const [{ getByText }] = render() - getByText('View data').click() - expect(getByText('Table View')).toBeTruthy() - expect(getByText('Jupyter Notebook')).toBeTruthy() - expect(getByText('Command Line Interface (SSH)')).toBeTruthy() + render() + const viewDataButton = screen.getByText('View data') + fireEvent.click(viewDataButton) + expect(screen.getByText('Table View')).toBeTruthy() + expect(screen.getByText('Jupyter Notebook')).toBeTruthy() + expect(screen.getByText('Command Line Interface (SSH)')).toBeTruthy() }) }) diff --git a/app/src/organisms/ApplyHistoricOffsets/__tests__/LabwareOffsetTable.test.tsx b/app/src/organisms/ApplyHistoricOffsets/__tests__/LabwareOffsetTable.test.tsx index 4452d1408b4..9a2c76a0431 100644 --- a/app/src/organisms/ApplyHistoricOffsets/__tests__/LabwareOffsetTable.test.tsx +++ b/app/src/organisms/ApplyHistoricOffsets/__tests__/LabwareOffsetTable.test.tsx @@ -1,5 +1,6 @@ import * as React from 'react' import { renderWithProviders } from '@opentrons/components' +import { screen } from '@testing-library/react' import fixture_adapter from '@opentrons/shared-data/labware/definitions/2/opentrons_96_pcr_adapter/1.json' import fixture_96_wellplate from '@opentrons/shared-data/labware/definitions/2/opentrons_96_wellplate_200ul_pcr_full_skirt/1.json' import { i18n } from '../../../i18n' @@ -51,68 +52,63 @@ const mockFourthCandidate: OffsetCandidate = { createdAt: '2022-05-12T13:34:51.012179+00:00', runCreatedAt: '2022-05-12T13:33:51.012179+00:00', } +const render = () => + renderWithProviders>( + , + { i18nInstance: i18n } + ) describe('LabwareOffsetTable', () => { - let render: ( - props?: Partial> - ) => ReturnType - - beforeEach(() => { - render = () => - renderWithProviders>( - , - { i18nInstance: i18n } - ) - }) - afterEach(() => { jest.resetAllMocks() }) it('renders headers text and values for each candidate', () => { - const [{ getByText, queryAllByText }] = render() + render() // headers - getByText('location') - getByText('Run') - getByText('labware') - getByText('labware offset data') - expect(queryAllByText('X')).toHaveLength(4) - expect(queryAllByText('Y')).toHaveLength(4) - expect(queryAllByText('Z')).toHaveLength(4) + screen.getByText('location') + screen.getByText('Run') + screen.getByText('labware') + screen.getByText('labware offset data') + expect(screen.queryAllByText('X')).toHaveLength(4) + expect(screen.queryAllByText('Y')).toHaveLength(4) + expect(screen.queryAllByText('Z')).toHaveLength(4) // first candidate - getByText('Slot 1') - getByText(/7\/11\/2022/i) - getByText('First Fake Labware Display Name') - getByText('1.00') - getByText('2.00') - getByText('3.00') + screen.getByText('Slot 1') + screen.getByText(/7\/11\/2022/i) + screen.getByText('First Fake Labware Display Name') + screen.getByText('1.00') + screen.getByText('2.00') + screen.getByText('3.00') // second candidate - getByText('Slot 2') - getByText(/6\/11\/2022/i) - getByText('Second Fake Labware Display Name') - getByText('4.00') - getByText('5.00') - getByText('6.00') + screen.getByText('Slot 2') + screen.getByText(/6\/11\/2022/i) + screen.getByText('Second Fake Labware Display Name') + screen.getByText('4.00') + screen.getByText('5.00') + screen.getByText('6.00') // third candidate is adapter on module - getByText('Heater-Shaker Module GEN1 in Slot 3') - getByText(/5\/11\/2022/i) - getByText('Third Fake Labware Display Name') - getByText('7.00') - getByText('8.00') - getByText('9.00') + screen.getByText('Heater-Shaker Module GEN1 in Slot 3') + screen.getByText(/5\/11\/2022/i) + screen.getByText('Third Fake Labware Display Name') + screen.getByText('7.00') + screen.getByText('8.00') + screen.getByText('9.00') // fourth candidate is labware on adapter on module - getByText('Opentrons 96 PCR Adapter in Heater-Shaker Module GEN1 in Slot 3') - getByText('Fourth Fake Labware Display Name') - getByText('7.20') - getByText('8.10') - getByText('7.10') + screen.getByText( + 'Opentrons 96 PCR Heater-Shaker Adapter in Heater-Shaker Module GEN1 in Slot 3' + ) + screen.getByText('Fourth Fake Labware Display Name') + screen.getByText('7.20') + screen.getByText('8.10') + screen.getByText('7.10') }) }) diff --git a/app/src/organisms/ApplyHistoricOffsets/hooks/__tests__/useHistoricRunDetails.test.tsx b/app/src/organisms/ApplyHistoricOffsets/hooks/__tests__/useHistoricRunDetails.test.tsx index 3c396e4d5ef..8e72743a1cd 100644 --- a/app/src/organisms/ApplyHistoricOffsets/hooks/__tests__/useHistoricRunDetails.test.tsx +++ b/app/src/organisms/ApplyHistoricOffsets/hooks/__tests__/useHistoricRunDetails.test.tsx @@ -1,17 +1,18 @@ import * as React from 'react' import { when } from 'jest-when' -import { renderHook } from '@testing-library/react-hooks' -import { useAllRunsQuery } from '@opentrons/react-api-client' +import { renderHook, waitFor } from '@testing-library/react' + +import { useNotifyAllRunsQuery } from '../../../../resources/runs/useNotifyAllRunsQuery' import { useHistoricRunDetails } from '../useHistoricRunDetails' import { mockRunningRun } from '../../../RunTimeControl/__fixtures__' import { mockSuccessQueryResults } from '../../../../__fixtures__' import type { RunData } from '@opentrons/api-client' -jest.mock('@opentrons/react-api-client') +jest.mock('../../../../resources/runs/useNotifyAllRunsQuery') -const mockUseAllRunsQuery = useAllRunsQuery as jest.MockedFunction< - typeof useAllRunsQuery +const mockuseNotifyAllRunsQuery = useNotifyAllRunsQuery as jest.MockedFunction< + typeof useNotifyAllRunsQuery > const MOCK_RUN_LATER: RunData = { @@ -32,7 +33,7 @@ const MOCK_RUN_EARLIER: RunData = { } describe('useHistoricRunDetails', () => { - when(mockUseAllRunsQuery) + when(mockuseNotifyAllRunsQuery) .calledWith({}, {}, undefined) .mockReturnValue( mockSuccessQueryResults({ @@ -42,15 +43,16 @@ describe('useHistoricRunDetails', () => { ) it('returns historical run details with newest first', async () => { - const wrapper: React.FunctionComponent<{}> = ({ children }) => ( -
{children}
- ) - const { result, waitFor } = renderHook(useHistoricRunDetails, { wrapper }) - await waitFor(() => result.current != null) - expect(result.current).toEqual([MOCK_RUN_LATER, MOCK_RUN_EARLIER]) + const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + children, + }) =>
{children}
+ const { result } = renderHook(useHistoricRunDetails, { wrapper }) + await waitFor(() => { + expect(result.current).toEqual([MOCK_RUN_LATER, MOCK_RUN_EARLIER]) + }) }) it('returns historical run details with newest first to specific host', async () => { - when(mockUseAllRunsQuery) + when(mockuseNotifyAllRunsQuery) .calledWith({}, {}, { hostname: 'fakeIp' }) .mockReturnValue( mockSuccessQueryResults({ @@ -58,18 +60,19 @@ describe('useHistoricRunDetails', () => { links: {}, }) ) - const wrapper: React.FunctionComponent<{}> = ({ children }) => ( -
{children}
- ) - const { result, waitFor } = renderHook( + const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + children, + }) =>
{children}
+ const { result } = renderHook( () => useHistoricRunDetails({ hostname: 'fakeIp' }), { wrapper } ) - await waitFor(() => result.current != null) - expect(result.current).toEqual([ - MOCK_RUN_LATER, - MOCK_RUN_EARLIER, - MOCK_RUN_EARLIER, - ]) + await waitFor(() => { + expect(result.current).toEqual([ + MOCK_RUN_LATER, + MOCK_RUN_EARLIER, + MOCK_RUN_EARLIER, + ]) + }) }) }) diff --git a/app/src/organisms/ApplyHistoricOffsets/hooks/__tests__/useOffsetCandidatesForAnalysis.test.tsx b/app/src/organisms/ApplyHistoricOffsets/hooks/__tests__/useOffsetCandidatesForAnalysis.test.tsx index 9332788415e..47696eec10f 100644 --- a/app/src/organisms/ApplyHistoricOffsets/hooks/__tests__/useOffsetCandidatesForAnalysis.test.tsx +++ b/app/src/organisms/ApplyHistoricOffsets/hooks/__tests__/useOffsetCandidatesForAnalysis.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { resetAllWhenMocks, when } from 'jest-when' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook, waitFor } from '@testing-library/react' import fixture_tiprack_300_ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_300_ul.json' import { getLabwareDisplayName, @@ -111,22 +111,23 @@ describe('useOffsetCandidatesForAnalysis', () => { }) it('returns an empty array if robot ip but no analysis output', async () => { - const wrapper: React.FunctionComponent<{}> = ({ children }) => ( -
{children}
- ) - const { result, waitFor } = renderHook( + const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + children, + }) =>
{children}
+ const { result } = renderHook( () => useOffsetCandidatesForAnalysis(null, mockRobotIp), { wrapper } ) - await waitFor(() => result.current != null) - expect(result.current).toEqual([]) + await waitFor(() => { + expect(result.current).toEqual([]) + }) }) it('returns an empty array if no robot ip', async () => { - const wrapper: React.FunctionComponent<{}> = ({ children }) => ( -
{children}
- ) - const { result, waitFor } = renderHook( + const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + children, + }) =>
{children}
+ const { result } = renderHook( () => useOffsetCandidatesForAnalysis( storedProtocolDataFixture.mostRecentAnalysis, @@ -134,14 +135,15 @@ describe('useOffsetCandidatesForAnalysis', () => { ), { wrapper } ) - await waitFor(() => result.current != null) - expect(result.current).toEqual([]) + await waitFor(() => { + expect(result.current).toEqual([]) + }) }) it('returns candidates for each first match with newest first', async () => { - const wrapper: React.FunctionComponent<{}> = ({ children }) => ( -
{children}
- ) - const { result, waitFor } = renderHook( + const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + children, + }) =>
{children}
+ const { result } = renderHook( () => useOffsetCandidatesForAnalysis( storedProtocolDataFixture.mostRecentAnalysis, @@ -149,20 +151,21 @@ describe('useOffsetCandidatesForAnalysis', () => { ), { wrapper } ) - await waitFor(() => result.current != null) - expect(result.current).toEqual([ - { - ...mockFirstDupCandidate, - labwareDisplayName: getLabwareDisplayName(mockLabwareDef), - }, - { - ...mockSecondCandidate, - labwareDisplayName: getLabwareDisplayName(mockLabwareDef), - }, - { - ...mockThirdCandidate, - labwareDisplayName: getLabwareDisplayName(mockLabwareDef), - }, - ]) + await waitFor(() => { + expect(result.current).toEqual([ + { + ...mockFirstDupCandidate, + labwareDisplayName: getLabwareDisplayName(mockLabwareDef), + }, + { + ...mockSecondCandidate, + labwareDisplayName: getLabwareDisplayName(mockLabwareDef), + }, + { + ...mockThirdCandidate, + labwareDisplayName: getLabwareDisplayName(mockLabwareDef), + }, + ]) + }) }) }) diff --git a/app/src/organisms/ApplyHistoricOffsets/hooks/getLabwareLocationCombos.ts b/app/src/organisms/ApplyHistoricOffsets/hooks/getLabwareLocationCombos.ts index b297775880f..433f7e37b2c 100644 --- a/app/src/organisms/ApplyHistoricOffsets/hooks/getLabwareLocationCombos.ts +++ b/app/src/organisms/ApplyHistoricOffsets/hooks/getLabwareLocationCombos.ts @@ -1,6 +1,11 @@ import isEqual from 'lodash/isEqual' -import { getLabwareDefURI } from '@opentrons/shared-data' +import { + FLEX_SINGLE_SLOT_ADDRESSABLE_AREAS, + getLabwareDefURI, + OT2_SINGLE_SLOT_ADDRESSABLE_AREAS, +} from '@opentrons/shared-data' import type { + AddressableAreaName, ProtocolAnalysisOutput, RunTimeCommand, } from '@opentrons/shared-data' @@ -18,104 +23,126 @@ export function getLabwareLocationCombos( labware: ProtocolAnalysisOutput['labware'], modules: ProtocolAnalysisOutput['modules'] ): LabwareLocationCombo[] { - return commands.reduce((acc, command) => { - if (command.commandType === 'loadLabware') { - if ( - command.result?.definition == null || - command.result.definition.parameters.format === 'trash' - ) - return acc - const definitionUri = getLabwareDefURI(command.result.definition) - if (command.params.location === 'offDeck') { - return acc - } else if ('moduleId' in command.params.location) { - const { moduleId } = command.params.location - const modLocation = resolveModuleLocation(modules, moduleId) - return modLocation == null - ? acc - : appendLocationComboIfUniq(acc, { - location: modLocation, - definitionUri, - labwareId: command.result.labwareId, - moduleId, - }) - } else if ('labwareId' in command.params.location) { - const { - adapterOffsetLocation, - moduleIdUnderAdapter, - } = resolveAdapterLocation( - labware, - modules, - command.params.location.labwareId + return commands + .reduce((acc, command) => { + if (command.commandType === 'loadLabware') { + if ( + command.result?.definition == null || + command.result.definition.parameters.format === 'trash' ) - return adapterOffsetLocation == null - ? acc - : appendLocationComboIfUniq(acc, { - location: adapterOffsetLocation, - definitionUri, - labwareId: command.result.labwareId, - moduleId: moduleIdUnderAdapter, - adapterId: command.params.location.labwareId, - }) - } else { - return appendLocationComboIfUniq(acc, { - location: command.params.location, - definitionUri, - labwareId: command.result.labwareId, - }) - } - } else if (command.commandType === 'moveLabware') { - const labwareEntity = labware.find(l => l.id === command.params.labwareId) - if (labwareEntity == null) { - console.warn( - 'moveLabware command specified a labwareId that could not be found in the labware entities' + return acc + const definitionUri = getLabwareDefURI(command.result.definition) + if (command.params.location === 'offDeck') { + return acc + } else if ('moduleId' in command.params.location) { + const { moduleId } = command.params.location + const modLocation = resolveModuleLocation(modules, moduleId) + return modLocation == null + ? acc + : appendLocationComboIfUniq(acc, { + location: modLocation, + definitionUri, + labwareId: command.result.labwareId, + moduleId, + }) + } else if ('labwareId' in command.params.location) { + const { + adapterOffsetLocation, + moduleIdUnderAdapter, + } = resolveAdapterLocation( + labware, + modules, + command.params.location.labwareId + ) + return adapterOffsetLocation == null + ? acc + : appendLocationComboIfUniq(acc, { + location: adapterOffsetLocation, + definitionUri, + labwareId: command.result.labwareId, + moduleId: moduleIdUnderAdapter, + adapterId: command.params.location.labwareId, + }) + } else { + return appendLocationComboIfUniq(acc, { + location: { + slotName: + 'addressableAreaName' in command.params.location + ? command.params.location.addressableAreaName + : command.params.location.slotName, + }, + definitionUri, + labwareId: command.result.labwareId, + }) + } + } else if (command.commandType === 'moveLabware') { + const labwareEntity = labware.find( + l => l.id === command.params.labwareId ) + if (labwareEntity == null) { + console.warn( + 'moveLabware command specified a labwareId that could not be found in the labware entities' + ) + return acc + } + if (command.params.newLocation === 'offDeck') { + return acc + } else if ('moduleId' in command.params.newLocation) { + const modLocation = resolveModuleLocation( + modules, + command.params.newLocation.moduleId + ) + return modLocation == null + ? acc + : appendLocationComboIfUniq(acc, { + location: modLocation, + definitionUri: labwareEntity.definitionUri, + labwareId: command.params.labwareId, + moduleId: command.params.newLocation.moduleId, + }) + } else if ('labwareId' in command.params.newLocation) { + const { + adapterOffsetLocation, + moduleIdUnderAdapter, + } = resolveAdapterLocation( + labware, + modules, + command.params.newLocation.labwareId + ) + return adapterOffsetLocation == null + ? acc + : appendLocationComboIfUniq(acc, { + location: adapterOffsetLocation, + definitionUri: labwareEntity.definitionUri, + labwareId: command.params.labwareId, + moduleId: moduleIdUnderAdapter, + adapterId: command.params.newLocation.labwareId, + }) + } else { + return appendLocationComboIfUniq(acc, { + location: { + slotName: + 'addressableAreaName' in command.params.newLocation + ? command.params.newLocation.addressableAreaName + : command.params.newLocation.slotName, + }, + definitionUri: labwareEntity.definitionUri, + labwareId: command.params.labwareId, + }) + } + } else { return acc } - if (command.params.newLocation === 'offDeck') { - return acc - } else if ('moduleId' in command.params.newLocation) { - const modLocation = resolveModuleLocation( - modules, - command.params.newLocation.moduleId - ) - return modLocation == null - ? acc - : appendLocationComboIfUniq(acc, { - location: modLocation, - definitionUri: labwareEntity.definitionUri, - labwareId: command.params.labwareId, - moduleId: command.params.newLocation.moduleId, - }) - } else if ('labwareId' in command.params.newLocation) { - const { - adapterOffsetLocation, - moduleIdUnderAdapter, - } = resolveAdapterLocation( - labware, - modules, - command.params.newLocation.labwareId + }, []) + .filter( + ({ location }) => + FLEX_SINGLE_SLOT_ADDRESSABLE_AREAS.includes( + location.slotName as AddressableAreaName + ) || + OT2_SINGLE_SLOT_ADDRESSABLE_AREAS.includes( + location.slotName as AddressableAreaName ) - return adapterOffsetLocation == null - ? acc - : appendLocationComboIfUniq(acc, { - location: adapterOffsetLocation, - definitionUri: labwareEntity.definitionUri, - labwareId: command.params.labwareId, - moduleId: moduleIdUnderAdapter, - adapterId: command.params.newLocation.labwareId, - }) - } else { - return appendLocationComboIfUniq(acc, { - location: command.params.newLocation, - definitionUri: labwareEntity.definitionUri, - labwareId: command.params.labwareId, - }) - } - } else { - return acc - } - }, []) + ) } function appendLocationComboIfUniq( @@ -191,7 +218,10 @@ function resolveAdapterLocation( } else { adapterOffsetLocation = { definitionUri: labwareDefUri, - slotName: labwareEntity.location.slotName, + slotName: + 'addressableAreaName' in labwareEntity.location + ? labwareEntity.location.addressableAreaName + : labwareEntity.location.slotName, } } return { diff --git a/app/src/organisms/ApplyHistoricOffsets/hooks/useHistoricRunDetails.ts b/app/src/organisms/ApplyHistoricOffsets/hooks/useHistoricRunDetails.ts index 13b9b8bf581..c86e5b3df92 100644 --- a/app/src/organisms/ApplyHistoricOffsets/hooks/useHistoricRunDetails.ts +++ b/app/src/organisms/ApplyHistoricOffsets/hooks/useHistoricRunDetails.ts @@ -1,11 +1,11 @@ -import { useAllRunsQuery } from '@opentrons/react-api-client' +import { useNotifyAllRunsQuery } from '../../../resources/runs/useNotifyAllRunsQuery' import type { HostConfig, RunData } from '@opentrons/api-client' export function useHistoricRunDetails( hostOverride?: HostConfig | null ): RunData[] { - const { data: allHistoricRuns } = useAllRunsQuery({}, {}, hostOverride) + const { data: allHistoricRuns } = useNotifyAllRunsQuery({}, {}, hostOverride) return allHistoricRuns == null ? [] diff --git a/app/src/organisms/Breadcrumbs/__tests__/Breadcrumbs.test.tsx b/app/src/organisms/Breadcrumbs/__tests__/Breadcrumbs.test.tsx index cd80b9374aa..c47a93aa85f 100644 --- a/app/src/organisms/Breadcrumbs/__tests__/Breadcrumbs.test.tsx +++ b/app/src/organisms/Breadcrumbs/__tests__/Breadcrumbs.test.tsx @@ -3,6 +3,7 @@ import { MemoryRouter, Route, Switch } from 'react-router-dom' import { when } from 'jest-when' import { renderWithProviders } from '@opentrons/components' +import { fireEvent, screen } from '@testing-library/react' import { i18n } from '../../../i18n' import { @@ -90,43 +91,33 @@ describe('Breadcrumbs', () => { .mockReturnValue(PROTOCOL_NAME) }) it('renders an array of device breadcrumbs', () => { - const [{ getByText }] = render( - `/devices/${ROBOT_NAME}/protocol-runs/${RUN_ID}` - ) - - getByText('Devices') - getByText('otie') - getByText(CREATED_AT) + render(`/devices/${ROBOT_NAME}/protocol-runs/${RUN_ID}`) + screen.getByText('Devices') + screen.getByText('otie') + screen.getByText(CREATED_AT) }) it('renders an array of protocol breadcrumbs', () => { - const [{ getByText }] = render(`/protocols/${PROTOCOL_KEY}`) - - getByText('Protocols') - getByText(PROTOCOL_NAME) + render(`/protocols/${PROTOCOL_KEY}`) + screen.getByText('Protocols') + screen.getByText(PROTOCOL_NAME) }) it('does not render devices breadcrumb when in on device mode', () => { when(mockGetIsOnDevice) .calledWith({} as State) .mockReturnValue(true) - const [{ getByText, queryByText }] = render( - `/devices/${ROBOT_NAME}/protocol-runs/${RUN_ID}` - ) - - expect(queryByText('Devices')).toBeNull() - getByText('otie') - getByText(CREATED_AT) + render(`/devices/${ROBOT_NAME}/protocol-runs/${RUN_ID}`) + expect(screen.queryByText('Devices')).toBeNull() + screen.getByText('otie') + screen.getByText(CREATED_AT) }) it('goes to the correct path when an inactive breadcrumb is clicked', () => { - const [{ getByText }] = render( - `/devices/${ROBOT_NAME}/protocol-runs/${RUN_ID}` - ) - - getByText('protocol run details path matched') - const otieBreadcrumb = getByText('otie') - otieBreadcrumb.click() - getByText('device details path matched') + render(`/devices/${ROBOT_NAME}/protocol-runs/${RUN_ID}`) + screen.getByText('protocol run details path matched') + const otieBreadcrumb = screen.getByText('otie') + fireEvent.click(otieBreadcrumb) + screen.getByText('device details path matched') }) }) diff --git a/app/src/organisms/Breadcrumbs/index.tsx b/app/src/organisms/Breadcrumbs/index.tsx index 59344002e1b..2f25ea12fbf 100644 --- a/app/src/organisms/Breadcrumbs/index.tsx +++ b/app/src/organisms/Breadcrumbs/index.tsx @@ -40,7 +40,7 @@ function CrumbName({ crumbName, isLastCrumb }: CrumbNameProps): JSX.Element { return ( describe('CalibrateDeck', () => { - let render: ( - props?: Partial> - ) => ReturnType let dispatchRequests: DispatchRequestsType const mockDeckCalSession: Sessions.DeckCalibrationSession = { id: 'fake_session_id', ...mockDeckCalibrationSessionAttributes, } + const render = ( + props: Partial> = {} + ) => { + const { + showSpinner = false, + isJogging = false, + session = mockDeckCalSession, + } = props + return renderWithProviders>( + , + { i18nInstance: i18n } + ) + } const SPECS: CalibrateDeckSpec[] = [ { heading: 'Before you begin', currentStep: 'sessionStarted' }, @@ -66,33 +83,14 @@ describe('CalibrateDeck', () => { beforeEach(() => { dispatchRequests = jest.fn() when(mockGetDeckDefinitions).calledWith().mockReturnValue({}) - - render = (props = {}) => { - const { - showSpinner = false, - isJogging = false, - session = mockDeckCalSession, - } = props - return renderWithProviders>( - , - { i18nInstance: i18n } - ) - } }) - afterEach(() => { resetAllWhenMocks() }) SPECS.forEach(spec => { it(`renders correct contents when currentStep is ${spec.currentStep}`, () => { - const { getByRole, queryByRole } = render({ + render({ session: { ...mockDeckCalSession, details: { @@ -100,38 +98,38 @@ describe('CalibrateDeck', () => { currentStep: spec.currentStep, }, }, - })[0] + }) SPECS.forEach(({ currentStep, heading }) => { if (currentStep === spec.currentStep) { expect( - getByRole('heading', { name: spec.heading }) + screen.getByRole('heading', { name: spec.heading }) ).toBeInTheDocument() } else { - expect(queryByRole('heading', { name: heading })).toBeNull() + expect(screen.queryByRole('heading', { name: heading })).toBeNull() } }) }) }) it('renders confirm exit on exit click', () => { - const { getByRole, queryByRole } = render()[0] - + render() expect( - queryByRole('heading', { + screen.queryByRole('heading', { name: 'Deck Calibration progress will be lost', }) ).toBeNull() - getByRole('button', { name: 'Exit' }).click() + const exitButton = screen.getByRole('button', { name: 'Exit' }) + fireEvent.click(exitButton) expect( - getByRole('heading', { + screen.getByRole('heading', { name: 'Deck Calibration progress will be lost', }) ).toBeInTheDocument() }) it('does not render contents when showSpinner is true', () => { - const { queryByRole } = render({ + render({ showSpinner: true, session: { ...mockDeckCalSession, @@ -140,8 +138,10 @@ describe('CalibrateDeck', () => { currentStep: 'sessionStarted', }, }, - })[0] - expect(queryByRole('heading', { name: 'Before you begin' })).toBeNull() + }) + expect( + screen.queryByRole('heading', { name: 'Before you begin' }) + ).toBeNull() }) it('does dispatch jog requests when not isJogging', () => { @@ -153,8 +153,9 @@ describe('CalibrateDeck', () => { currentStep: Sessions.DECK_STEP_PREPARING_PIPETTE, }, } - const { getByRole } = render({ isJogging: false, session })[0] - getByRole('button', { name: 'forward' }).click() + render({ isJogging: false, session }) + const forwardButton = screen.getByRole('button', { name: 'forward' }) + fireEvent.click(forwardButton) expect(dispatchRequests).toHaveBeenCalledWith( Sessions.createSessionCommand('robot-name', session.id, { command: Sessions.sharedCalCommands.JOG, @@ -172,8 +173,9 @@ describe('CalibrateDeck', () => { currentStep: Sessions.DECK_STEP_PREPARING_PIPETTE, }, } - const { getByRole } = render({ isJogging: true, session })[0] - getByRole('button', { name: 'forward' }).click() + render({ isJogging: true, session }) + const forwardButton = screen.getByRole('button', { name: 'forward' }) + fireEvent.click(forwardButton) expect(dispatchRequests).not.toHaveBeenCalledWith( Sessions.createSessionCommand('robot-name', session.id, { command: Sessions.sharedCalCommands.JOG, diff --git a/app/src/organisms/CalibrateDeck/index.tsx b/app/src/organisms/CalibrateDeck/index.tsx index 89b009fb9a3..87d0a65f432 100644 --- a/app/src/organisms/CalibrateDeck/index.tsx +++ b/app/src/organisms/CalibrateDeck/index.tsx @@ -1,7 +1,9 @@ // Deck Calibration Orchestration Component import * as React from 'react' import { useTranslation } from 'react-i18next' +import { useQueryClient } from 'react-query' +import { useHost } from '@opentrons/react-api-client' import { getPipetteModelSpecs } from '@opentrons/shared-data' import { useConditionalConfirm } from '@opentrons/components' @@ -65,11 +67,15 @@ export function CalibrateDeck( dispatchRequests, showSpinner, isJogging, + exitBeforeDeckConfigCompletion, offsetInvalidationHandler, } = props const { currentStep, instrument, labware, supportedCommands } = session?.details || {} + const queryClient = useQueryClient() + const host = useHost() + const { showConfirmation: showConfirmExit, confirm: confirmExit, @@ -96,6 +102,17 @@ export function CalibrateDeck( } function cleanUpAndExit(): void { + queryClient + .invalidateQueries([host, 'calibration']) + .catch((e: Error) => + console.error(`error invalidating calibration queries: ${e.message}`) + ) + if ( + exitBeforeDeckConfigCompletion && + currentStep !== Sessions.DECK_STEP_CALIBRATION_COMPLETE + ) { + exitBeforeDeckConfigCompletion.current = true + } if (session?.id) { dispatchRequests( Sessions.createSessionCommand(robotName, session.id, { @@ -158,6 +175,7 @@ export function CalibrateDeck( supportedCommands={supportedCommands} defaultTipracks={instrument?.defaultTipracks} calInvalidationHandler={offsetInvalidationHandler} + allowChangeTipRack /> )} diff --git a/app/src/organisms/CalibrateDeck/types.ts b/app/src/organisms/CalibrateDeck/types.ts index 2a19f540420..b2df75e4a6d 100644 --- a/app/src/organisms/CalibrateDeck/types.ts +++ b/app/src/organisms/CalibrateDeck/types.ts @@ -1,11 +1,12 @@ -import type { DeckCalibrationSession } from '../../redux/sessions/types' import { DispatchRequestsType } from '../../redux/robot-api' - +import type { MutableRefObject } from 'react' +import type { DeckCalibrationSession } from '../../redux/sessions/types' export interface CalibrateDeckParentProps { robotName: string session: DeckCalibrationSession | null dispatchRequests: DispatchRequestsType showSpinner: boolean isJogging: boolean + exitBeforeDeckConfigCompletion?: MutableRefObject offsetInvalidationHandler?: () => void } diff --git a/app/src/organisms/CalibratePipetteOffset/__tests__/CalibratePipetteOffset.test.tsx b/app/src/organisms/CalibratePipetteOffset/__tests__/CalibratePipetteOffset.test.tsx index 97d2626aa3c..61206b154e4 100644 --- a/app/src/organisms/CalibratePipetteOffset/__tests__/CalibratePipetteOffset.test.tsx +++ b/app/src/organisms/CalibratePipetteOffset/__tests__/CalibratePipetteOffset.test.tsx @@ -11,6 +11,7 @@ import { mockPipetteOffsetCalibrationSessionAttributes } from '../../../redux/se import { CalibratePipetteOffset } from '../index' import type { PipetteOffsetCalibrationStep } from '../../../redux/sessions/types' import { DispatchRequestsType } from '../../../redux/robot-api' +import { fireEvent, screen } from '@testing-library/react' jest.mock('@opentrons/components/src/hardware-sim/Deck/getDeckDefinitions') jest.mock('../../../redux/sessions/selectors') @@ -28,9 +29,27 @@ const mockGetDeckDefinitions = getDeckDefinitions as jest.MockedFunction< describe('CalibratePipetteOffset', () => { let dispatchRequests: DispatchRequestsType - let render: ( - props?: Partial> - ) => ReturnType + const render = ( + props: Partial> = {} + ) => { + const { + showSpinner = false, + isJogging = false, + session = mockPipOffsetCalSession, + } = props + return renderWithProviders< + React.ComponentType + >( + , + { i18nInstance: i18n } + ) + } let mockPipOffsetCalSession: Sessions.PipetteOffsetCalibrationSession const SPECS: CalibratePipetteOffsetSpec[] = [ { heading: 'Before you begin', currentStep: 'sessionStarted' }, @@ -59,26 +78,6 @@ describe('CalibratePipetteOffset', () => { id: 'fake_session_id', ...mockPipetteOffsetCalibrationSessionAttributes, } - - render = (props = {}) => { - const { - showSpinner = false, - isJogging = false, - session = mockPipOffsetCalSession, - } = props - return renderWithProviders< - React.ComponentType - >( - , - { i18nInstance: i18n } - ) - } }) afterEach(() => { @@ -87,7 +86,7 @@ describe('CalibratePipetteOffset', () => { SPECS.forEach(spec => { it(`renders correct contents when currentStep is ${spec.currentStep}`, () => { - const { getByRole, queryByRole } = render({ + render({ session: { ...mockPipOffsetCalSession, details: { @@ -95,38 +94,38 @@ describe('CalibratePipetteOffset', () => { currentStep: spec.currentStep, }, }, - })[0] + }) SPECS.forEach(({ currentStep, heading }) => { if (currentStep === spec.currentStep) { expect( - getByRole('heading', { name: spec.heading }) + screen.getByRole('heading', { name: spec.heading }) ).toBeInTheDocument() } else { - expect(queryByRole('heading', { name: heading })).toBeNull() + expect(screen.queryByRole('heading', { name: heading })).toBeNull() } }) }) }) it('renders confirm exit on exit click', () => { - const { getByRole, queryByRole } = render()[0] - + render() expect( - queryByRole('heading', { + screen.queryByRole('heading', { name: 'Pipette Offset Calibration progress will be lost', }) ).toBeNull() - getByRole('button', { name: 'Exit' }).click() + const exitButton = screen.getByRole('button', { name: 'Exit' }) + fireEvent.click(exitButton) expect( - getByRole('heading', { + screen.getByRole('heading', { name: 'Pipette Offset Calibration progress will be lost', }) ).toBeInTheDocument() }) it('does not render contents when showSpinner is true', () => { - const { queryByRole } = render({ + render({ showSpinner: true, session: { ...mockPipOffsetCalSession, @@ -135,8 +134,10 @@ describe('CalibratePipetteOffset', () => { currentStep: 'sessionStarted', }, }, - })[0] - expect(queryByRole('heading', { name: 'Before you begin' })).toBeNull() + }) + expect( + screen.queryByRole('heading', { name: 'Before you begin' }) + ).toBeNull() }) it('does dispatch jog requests when not isJogging', () => { @@ -148,8 +149,9 @@ describe('CalibratePipetteOffset', () => { currentStep: Sessions.PIP_OFFSET_STEP_PREPARING_PIPETTE, }, } - const { getByRole } = render({ isJogging: false, session })[0] - getByRole('button', { name: 'forward' }).click() + render({ isJogging: false, session }) + const forwardButton = screen.getByRole('button', { name: 'forward' }) + fireEvent.click(forwardButton) expect(dispatchRequests).toHaveBeenCalledWith( Sessions.createSessionCommand('robot-name', session.id, { command: Sessions.sharedCalCommands.JOG, @@ -167,8 +169,9 @@ describe('CalibratePipetteOffset', () => { currentStep: Sessions.PIP_OFFSET_STEP_PREPARING_PIPETTE, }, } - const { getByRole } = render({ isJogging: true, session })[0] - getByRole('button', { name: 'forward' }).click() + render({ isJogging: true, session }) + const forwardButton = screen.getByRole('button', { name: 'forward' }) + fireEvent.click(forwardButton) expect(dispatchRequests).not.toHaveBeenCalledWith( Sessions.createSessionCommand('robot-name', session.id, { command: Sessions.sharedCalCommands.JOG, diff --git a/app/src/organisms/CalibratePipetteOffset/__tests__/useCalibratePipetteOffset.test.tsx b/app/src/organisms/CalibratePipetteOffset/__tests__/useCalibratePipetteOffset.test.tsx index 464e65f15ee..c1d3e27d20a 100644 --- a/app/src/organisms/CalibratePipetteOffset/__tests__/useCalibratePipetteOffset.test.tsx +++ b/app/src/organisms/CalibratePipetteOffset/__tests__/useCalibratePipetteOffset.test.tsx @@ -1,165 +1,3 @@ -import * as React from 'react' -import uniqueId from 'lodash/uniqueId' -import { i18n } from '../../../i18n' -import { mountWithProviders, AlertPrimaryButton } from '@opentrons/components' -import { act } from 'react-dom/test-utils' - -import * as RobotApi from '../../../redux/robot-api' -import * as Sessions from '../../../redux/sessions' -import { mockPipetteOffsetCalibrationSessionAttributes } from '../../../redux/sessions/__fixtures__' - -import { useCalibratePipetteOffset } from '../useCalibratePipetteOffset' -import { pipetteOffsetCalibrationStarted } from '../../../redux/analytics' - -import type { Invoker } from '../useCalibratePipetteOffset' - -jest.mock('../../../redux/sessions/selectors') -jest.mock('../../../redux/robot-api/selectors') -jest.mock('lodash/uniqueId') - -const mockUniqueId = uniqueId as jest.MockedFunction -const mockGetRobotSessionOfType = Sessions.getRobotSessionOfType as jest.MockedFunction< - typeof Sessions.getRobotSessionOfType -> -const mockGetRequestById = RobotApi.getRequestById as jest.MockedFunction< - typeof RobotApi.getRequestById -> - describe('useCalibratePipetteOffset hook', () => { - let startCalibration: Invoker - let CalWizardComponent: JSX.Element | null - const robotName = 'robotName' - const mountString = 'left' - const onComplete = jest.fn() - - const TestUseCalibratePipetteOffset = (): JSX.Element => { - const [_startCalibration, _CalWizardComponent] = useCalibratePipetteOffset( - robotName, - { - mount: mountString, - shouldRecalibrateTipLength: false, - hasCalibrationBlock: false, - tipRackDefinition: null, - }, - onComplete - ) - React.useEffect(() => { - startCalibration = _startCalibration - CalWizardComponent = _CalWizardComponent - }) - return <>{CalWizardComponent} - } - - beforeEach(() => { - let mockIdCounter = 0 - mockUniqueId.mockImplementation(() => `mockId_${mockIdCounter++}`) - }) - - afterEach(() => { - jest.resetAllMocks() - }) - - it('returns start callback, and no wizard if session not present', () => { - const { store } = mountWithProviders(, { - initialState: { robotApi: {}, sessions: {} }, - i18nInstance: i18n, - }) - expect(typeof startCalibration).toBe('function') - expect(CalWizardComponent).toBe(null) - - act(() => startCalibration({})) - - expect(store.dispatch).toHaveBeenCalledWith({ - ...Sessions.ensureSession( - robotName, - Sessions.SESSION_TYPE_PIPETTE_OFFSET_CALIBRATION, - { - mount: mountString, - shouldRecalibrateTipLength: false, - hasCalibrationBlock: false, - tipRackDefinition: null, - } - ), - meta: { requestId: expect.any(String) }, - }) - expect(store.dispatch).toHaveBeenCalledWith( - pipetteOffsetCalibrationStarted(mountString, false, false, null) - ) - }) - - it('accepts createParam overrides in start callback', () => { - const { store } = mountWithProviders(, { - initialState: { robotApi: {}, sessions: {} }, - i18nInstance: i18n, - }) - expect(typeof startCalibration).toBe('function') - expect(CalWizardComponent).toBe(null) - - act(() => - startCalibration({ - overrideParams: { mount: 'other-mount', hasCalibrationBlock: true }, - }) - ) - - expect(store.dispatch).toHaveBeenCalledWith({ - ...Sessions.ensureSession( - robotName, - Sessions.SESSION_TYPE_PIPETTE_OFFSET_CALIBRATION, - { - mount: 'other-mount', - shouldRecalibrateTipLength: false, - hasCalibrationBlock: true, - tipRackDefinition: null, - } - ), - meta: { requestId: expect.any(String) }, - }) - }) - - it('wizard should appear after create request succeeds with session and close on closeWizard', () => { - const seshId = 'fake-session-id' - const mockPipOffsetCalSession = { - id: seshId, - ...mockPipetteOffsetCalibrationSessionAttributes, - details: { - ...mockPipetteOffsetCalibrationSessionAttributes.details, - currentStep: Sessions.PIP_OFFSET_STEP_CALIBRATION_COMPLETE, - }, - } - - const { store, wrapper } = mountWithProviders( - , - { - initialState: { robotApi: {} }, - i18nInstance: i18n, - } - ) - mockGetRobotSessionOfType.mockReturnValue(mockPipOffsetCalSession) - mockGetRequestById.mockReturnValue({ - status: RobotApi.SUCCESS, - response: { - method: 'POST', - ok: true, - path: '/', - status: 200, - }, - }) - act(() => startCalibration({})) - wrapper.setProps({}) - expect(CalWizardComponent).not.toBe(null) - - wrapper.find('button[aria-label="Exit"]').invoke('onClick')?.( - {} as React.MouseEvent - ) - wrapper.find(AlertPrimaryButton).invoke('onClick')?.({} as React.MouseEvent) - wrapper.setProps({}) - expect(store.dispatch).toHaveBeenCalledWith({ - ...Sessions.deleteSession(robotName, seshId), - meta: { requestId: expect.any(String) }, - }) - mockGetRobotSessionOfType.mockReturnValue(null) - wrapper.setProps({}) - expect(CalWizardComponent).toBe(null) - expect(onComplete).toHaveBeenCalled() - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/CalibratePipetteOffset/index.tsx b/app/src/organisms/CalibratePipetteOffset/index.tsx index 00f4fe49c77..1862f7e8b05 100644 --- a/app/src/organisms/CalibratePipetteOffset/index.tsx +++ b/app/src/organisms/CalibratePipetteOffset/index.tsx @@ -1,7 +1,9 @@ // Pipette Offset Calibration Orchestration Component import * as React from 'react' import { useTranslation } from 'react-i18next' +import { useQueryClient } from 'react-query' +import { useHost } from '@opentrons/react-api-client' import { getPipetteModelSpecs } from '@opentrons/shared-data' import { useConditionalConfirm } from '@opentrons/components' @@ -60,6 +62,9 @@ export function CalibratePipetteOffset( const { currentStep, instrument, labware, supportedCommands } = session?.details ?? {} + const queryClient = useQueryClient() + const host = useHost() + const { showConfirmation: showConfirmExit, confirm: confirmExit, @@ -92,6 +97,11 @@ export function CalibratePipetteOffset( } function cleanUpAndExit(): void { + queryClient + .invalidateQueries([host, 'calibration']) + .catch((e: Error) => + console.error(`error invalidating calibration queries: ${e.message}`) + ) if (session?.id != null) { dispatchRequests( Sessions.createSessionCommand(robotName, session.id, { diff --git a/app/src/organisms/CalibrateTipLength/__tests__/AskForCalibrationBlockModal.test.tsx b/app/src/organisms/CalibrateTipLength/__tests__/AskForCalibrationBlockModal.test.tsx index 194dc35a593..2a5197c3c09 100644 --- a/app/src/organisms/CalibrateTipLength/__tests__/AskForCalibrationBlockModal.test.tsx +++ b/app/src/organisms/CalibrateTipLength/__tests__/AskForCalibrationBlockModal.test.tsx @@ -4,56 +4,56 @@ import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../i18n' import { setUseTrashSurfaceForTipCal } from '../../../redux/calibration' import { AskForCalibrationBlockModal } from '../AskForCalibrationBlockModal' +import { fireEvent, screen } from '@testing-library/react' describe('AskForCalibrationBlockModal', () => { - let onResponse: jest.MockedFunction<() => {}> - - let render: ( - props?: Partial> - ) => ReturnType - - beforeEach(() => { - onResponse = jest.fn() - render = () => - renderWithProviders< - React.ComponentProps - >( - , - { i18nInstance: i18n } - ) - }) + const onResponse = jest.fn() + const render = () => { + return renderWithProviders< + React.ComponentProps + >( + , + { i18nInstance: i18n } + ) + } afterEach(() => { jest.resetAllMocks() }) it('saves preference when not checked and use trash is clicked', () => { - const [{ getByRole }, { dispatch }] = render() - getByRole('checkbox').click() - getByRole('button', { name: 'Use trash bin' }).click() + const { dispatch } = render()[1] + const checkbox = screen.getByRole('checkbox') + fireEvent.click(checkbox) + const button = screen.getByRole('button', { name: 'Use trash bin' }) + fireEvent.click(button) expect(dispatch).not.toHaveBeenCalled() expect(onResponse).toHaveBeenCalledWith(false) }) it('does not save preference when not checked and use trash is clicked', () => { - const [{ getByRole }, { dispatch }] = render() - getByRole('button', { name: 'Use Calibration Block' }).click() + const { dispatch } = render()[1] + const button = screen.getByRole('button', { name: 'Use Calibration Block' }) + fireEvent.click(button) expect(dispatch).toHaveBeenCalledWith(setUseTrashSurfaceForTipCal(false)) expect(onResponse).toHaveBeenCalledWith(true) }) it('saves preference when not checked and use block is clicked', () => { - const [{ getByRole }, { dispatch }] = render() - getByRole('checkbox').click() - getByRole('button', { name: 'Use trash bin' }).click() + const { dispatch } = render()[1] + const checkbox = screen.getByRole('checkbox') + fireEvent.click(checkbox) + const button = screen.getByRole('button', { name: 'Use trash bin' }) + fireEvent.click(button) expect(dispatch).not.toHaveBeenCalled() expect(onResponse).toHaveBeenCalledWith(false) }) it('does not save preference when not checked and use block is clicked', () => { - const [{ getByRole }, { dispatch }] = render() - getByRole('button', { name: 'Use Calibration Block' }).click() + const { dispatch } = render()[1] + const button = screen.getByRole('button', { name: 'Use Calibration Block' }) + fireEvent.click(button) expect(dispatch).toHaveBeenCalledWith(setUseTrashSurfaceForTipCal(false)) expect(onResponse).toHaveBeenCalledWith(true) }) diff --git a/app/src/organisms/CalibrateTipLength/__tests__/CalibrateTipLength.test.tsx b/app/src/organisms/CalibrateTipLength/__tests__/CalibrateTipLength.test.tsx index a1ce8879ad5..3fdb0926203 100644 --- a/app/src/organisms/CalibrateTipLength/__tests__/CalibrateTipLength.test.tsx +++ b/app/src/organisms/CalibrateTipLength/__tests__/CalibrateTipLength.test.tsx @@ -10,6 +10,7 @@ import { mockTipLengthCalibrationSessionAttributes } from '../../../redux/sessio import { CalibrateTipLength } from '../index' import type { TipLengthCalibrationStep } from '../../../redux/sessions/types' +import { fireEvent, screen } from '@testing-library/react' jest.mock('@opentrons/components/src/hardware-sim/Deck/getDeckDefinitions') jest.mock('../../../redux/sessions/selectors') @@ -26,14 +27,30 @@ const mockGetDeckDefinitions = getDeckDefinitions as jest.MockedFunction< > describe('CalibrateTipLength', () => { - let render: ( - props?: Partial> - ) => ReturnType - let dispatchRequests: jest.MockedFunction<() => {}> - let mockTipLengthSession: Sessions.TipLengthCalibrationSession = { + const dispatchRequests = jest.fn() + const mockTipLengthSession: Sessions.TipLengthCalibrationSession = { id: 'fake_session_id', ...mockTipLengthCalibrationSessionAttributes, } + const render = ( + props: Partial> = {} + ) => { + const { + showSpinner = false, + isJogging = false, + session = mockTipLengthSession, + } = props + return renderWithProviders>( + , + { i18nInstance: i18n } + ) + } const SPECS: CalibrateTipLengthSpec[] = [ { heading: 'Before you begin', currentStep: 'sessionStarted' }, @@ -55,42 +72,17 @@ describe('CalibrateTipLength', () => { ] beforeEach(() => { - dispatchRequests = jest.fn() when(mockGetDeckDefinitions).calledWith().mockReturnValue({}) - - mockTipLengthSession = { - id: 'fake_session_id', - ...mockTipLengthCalibrationSessionAttributes, - } - - render = (props = {}) => { - const { - showSpinner = false, - isJogging = false, - session = mockTipLengthSession, - } = props - return renderWithProviders< - React.ComponentType - >( - , - { i18nInstance: i18n } - ) - } }) afterEach(() => { resetAllWhenMocks() + jest.resetAllMocks() }) SPECS.forEach(spec => { it(`renders correct contents when currentStep is ${spec.currentStep}`, () => { - const { getByRole, queryByRole } = render({ + render({ session: { ...mockTipLengthSession, details: { @@ -98,38 +90,38 @@ describe('CalibrateTipLength', () => { currentStep: spec.currentStep, }, }, - })[0] + }) SPECS.forEach(({ currentStep, heading }) => { if (currentStep === spec.currentStep) { expect( - getByRole('heading', { name: spec.heading }) + screen.getByRole('heading', { name: spec.heading }) ).toBeInTheDocument() } else { - expect(queryByRole('heading', { name: heading })).toBeNull() + expect(screen.queryByRole('heading', { name: heading })).toBeNull() } }) }) }) it('renders confirm exit on exit click', () => { - const { getByRole, queryByRole } = render()[0] - + render() expect( - queryByRole('heading', { + screen.queryByRole('heading', { name: 'Tip Length Calibration progress will be lost', }) ).toBeNull() - getByRole('button', { name: 'Exit' }).click() + const exitButton = screen.getByRole('button', { name: 'Exit' }) + fireEvent.click(exitButton) expect( - getByRole('heading', { + screen.getByRole('heading', { name: 'Tip Length Calibration progress will be lost', }) ).toBeInTheDocument() }) it('does not render contents when showSpinner is true', () => { - const { queryByRole } = render({ + render({ showSpinner: true, session: { ...mockTipLengthSession, @@ -138,8 +130,10 @@ describe('CalibrateTipLength', () => { currentStep: 'sessionStarted', }, }, - })[0] - expect(queryByRole('heading', { name: 'Before you begin' })).toBeNull() + }) + expect( + screen.queryByRole('heading', { name: 'Before you begin' }) + ).toBeNull() }) it('does dispatch jog requests when not isJogging', () => { @@ -152,7 +146,8 @@ describe('CalibrateTipLength', () => { }, } const { getByRole } = render({ isJogging: false, session })[0] - getByRole('button', { name: 'forward' }).click() + const forwardButton = getByRole('button', { name: 'forward' }) + fireEvent.click(forwardButton) expect(dispatchRequests).toHaveBeenCalledWith( Sessions.createSessionCommand('robot-name', session.id, { command: Sessions.sharedCalCommands.JOG, @@ -170,8 +165,9 @@ describe('CalibrateTipLength', () => { currentStep: Sessions.DECK_STEP_PREPARING_PIPETTE, }, } - const { getByRole } = render({ isJogging: true, session })[0] - getByRole('button', { name: 'forward' }).click() + render({ isJogging: true, session }) + const forwardButton = screen.getByRole('button', { name: 'forward' }) + fireEvent.click(forwardButton) expect(dispatchRequests).not.toHaveBeenCalledWith( Sessions.createSessionCommand('robot-name', session.id, { command: Sessions.sharedCalCommands.JOG, diff --git a/app/src/organisms/CalibrateTipLength/index.tsx b/app/src/organisms/CalibrateTipLength/index.tsx index c1ffa1f5ae7..21016afa1de 100644 --- a/app/src/organisms/CalibrateTipLength/index.tsx +++ b/app/src/organisms/CalibrateTipLength/index.tsx @@ -1,8 +1,10 @@ // Tip Length Calibration Orchestration Component import * as React from 'react' import { useTranslation } from 'react-i18next' +import { useQueryClient } from 'react-query' import { css } from 'styled-components' +import { useHost } from '@opentrons/react-api-client' import { getPipetteModelSpecs } from '@opentrons/shared-data' import { useConditionalConfirm } from '@opentrons/components' @@ -69,8 +71,13 @@ export function CalibrateTipLength( dispatchRequests, isJogging, offsetInvalidationHandler, + allowChangeTipRack = false, } = props - const { currentStep, instrument, labware } = session?.details ?? {} + const { currentStep, instrument, labware, supportedCommands } = + session?.details ?? {} + + const queryClient = useQueryClient() + const host = useHost() const isMulti = React.useMemo(() => { const spec = @@ -96,6 +103,11 @@ export function CalibrateTipLength( } function cleanUpAndExit(): void { + queryClient + .invalidateQueries([host, 'calibration']) + .catch((e: Error) => + console.error(`error invalidating calibration queries: ${e.message}`) + ) if (session?.id != null) { dispatchRequests( Sessions.createSessionCommand(robotName, session.id, { @@ -161,7 +173,9 @@ export function CalibrateTipLength( calBlock={calBlock} currentStep={currentStep} sessionType={session.sessionType} + supportedCommands={supportedCommands} calInvalidationHandler={offsetInvalidationHandler} + allowChangeTipRack={allowChangeTipRack} /> )} diff --git a/app/src/organisms/CalibrateTipLength/types.ts b/app/src/organisms/CalibrateTipLength/types.ts index 48f685343e1..bcb791c5f5d 100644 --- a/app/src/organisms/CalibrateTipLength/types.ts +++ b/app/src/organisms/CalibrateTipLength/types.ts @@ -7,5 +7,6 @@ export interface CalibrateTipLengthParentProps { dispatchRequests: DispatchRequestsType showSpinner: boolean isJogging: boolean + allowChangeTipRack?: boolean offsetInvalidationHandler?: () => void } diff --git a/app/src/organisms/CalibrationPanels/CalibrationLabwareRender.tsx b/app/src/organisms/CalibrationPanels/CalibrationLabwareRender.tsx index 26b8c52461a..b82b79d5dd6 100644 --- a/app/src/organisms/CalibrationPanels/CalibrationLabwareRender.tsx +++ b/app/src/organisms/CalibrationPanels/CalibrationLabwareRender.tsx @@ -14,28 +14,32 @@ import { import { getLabwareDisplayName, getIsTiprack } from '@opentrons/shared-data' import styles from './styles.css' -import type { LabwareDefinition2, DeckSlot } from '@opentrons/shared-data' +import type { + LabwareDefinition2, + CoordinateTuple, +} from '@opentrons/shared-data' const SHORT = 'SHORT' const TALL = 'TALL' interface CalibrationLabwareRenderProps { labwareDef: LabwareDefinition2 - slotDef: DeckSlot + slotDefPosition: CoordinateTuple | null } export function CalibrationLabwareRender( props: CalibrationLabwareRenderProps ): JSX.Element { - const { labwareDef, slotDef } = props + const { labwareDef, slotDefPosition } = props + const title = getLabwareDisplayName(labwareDef) const isTiprack = getIsTiprack(labwareDef) // TODO: we can change this boolean to check to isCalibrationBlock instead of isTiprack to render any labware return isTiprack ? ( @@ -52,21 +56,24 @@ export function CalibrationLabwareRender( ) : ( - + ) } export function CalibrationBlockRender( props: CalibrationLabwareRenderProps ): JSX.Element | null { - const { labwareDef, slotDef } = props + const { labwareDef, slotDefPosition } = props switch (labwareDef.parameters.loadName) { case 'opentrons_calibrationblock_short_side_right': { return ( - + {t('calibration_on_opentrons_tips_is_important')} diff --git a/app/src/organisms/CalibrationPanels/CompleteConfirmation.tsx b/app/src/organisms/CalibrationPanels/CompleteConfirmation.tsx index 18a35bcc6c7..6a8c6531ed0 100644 --- a/app/src/organisms/CalibrationPanels/CompleteConfirmation.tsx +++ b/app/src/organisms/CalibrationPanels/CompleteConfirmation.tsx @@ -44,7 +44,7 @@ export function CompleteConfirmation( {visualAid != null ? ( visualAid ) : ( - + )} {t('flow_complete', { flowName })} diff --git a/app/src/organisms/CalibrationPanels/ConfirmExit.tsx b/app/src/organisms/CalibrationPanels/ConfirmExit.tsx index abff685f924..700cb8b826a 100644 --- a/app/src/organisms/CalibrationPanels/ConfirmExit.tsx +++ b/app/src/organisms/CalibrationPanels/ConfirmExit.tsx @@ -43,7 +43,7 @@ export function ConfirmExit(props: ConfirmExitProps): JSX.Element { {heading != null ? ( diff --git a/app/src/organisms/CalibrationPanels/DeckSetup.tsx b/app/src/organisms/CalibrationPanels/DeckSetup.tsx index 3b3b208b381..40a73d2cd89 100644 --- a/app/src/organisms/CalibrationPanels/DeckSetup.tsx +++ b/app/src/organisms/CalibrationPanels/DeckSetup.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import map from 'lodash/map' + import { RobotWorkSpace, Flex, @@ -11,14 +12,18 @@ import { SPACING, PrimaryButton, } from '@opentrons/components' +import { + getLabwareDisplayName, + getPositionFromSlotId, +} from '@opentrons/shared-data' import { getDeckDefinitions } from '@opentrons/components/src/hardware-sim/Deck/getDeckDefinitions' -import { getLabwareDisplayName } from '@opentrons/shared-data' import * as Sessions from '../../redux/sessions' import { StyledText } from '../../atoms/text' import { NeedHelpLink } from './NeedHelpLink' import { CalibrationLabwareRender } from './CalibrationLabwareRender' +import type { AddressableArea } from '@opentrons/shared-data' import type { CalibrationPanelProps } from './types' const TIPRACK = 'tip rack' @@ -98,35 +103,32 @@ export function DeckSetup(props: CalibrationPanelProps): JSX.Element { 'fixedTrash', ]} deckDef={deckDef} + showDeckLayers viewBox={`-46 -10 ${488} ${390}`} // TODO: put these in variables > {({ deckSlotsById }) => - map( - deckSlotsById, - ( - slot: typeof deckSlotsById[keyof typeof deckSlotsById], - slotId - ) => { - if (!slot.matingSurfaceUnitVector) return null // if slot has no mating surface, don't render anything in it - let labwareDef = null - if (String(tipRack?.slot) === slotId) { - labwareDef = tipRack?.definition - } else if ( - calBlock != null && - String(calBlock?.slot) === slotId - ) { - labwareDef = calBlock?.definition - } - - return labwareDef != null ? ( - - ) : null + map(deckSlotsById, (slot: AddressableArea, slotId) => { + if (!slot.matingSurfaceUnitVector) return null // if slot has no mating surface, don't render anything in it + let labwareDef = null + if (String(tipRack?.slot) === slotId) { + labwareDef = tipRack?.definition + } else if ( + calBlock != null && + String(calBlock?.slot) === slotId + ) { + labwareDef = calBlock?.definition } - ) + + const slotDefPosition = getPositionFromSlotId(slot.id, deckDef) + + return labwareDef != null ? ( + + ) : null + }) }
diff --git a/app/src/organisms/CalibrationPanels/Introduction/__tests__/Introduction.test.tsx b/app/src/organisms/CalibrationPanels/Introduction/__tests__/Introduction.test.tsx index bccf4a9202b..9043aaea665 100644 --- a/app/src/organisms/CalibrationPanels/Introduction/__tests__/Introduction.test.tsx +++ b/app/src/organisms/CalibrationPanels/Introduction/__tests__/Introduction.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { mockCalibrationCheckLabware } from '../../../../redux/sessions/__fixtures__' @@ -15,30 +16,30 @@ const mockChooseTipRack = ChooseTipRack as jest.MockedFunction< const mockCalInvalidationHandler = jest.fn() describe('Introduction', () => { - let render: ( - props?: Partial> - ) => ReturnType const mockSendCommands = jest.fn() const mockCleanUpAndExit = jest.fn() + const render = ( + props: Partial> = {} + ) => { + return renderWithProviders( + , + { + i18nInstance: i18n, + } + ) + } beforeEach(() => { mockChooseTipRack.mockReturnValue(
mock choose tip rack
) - render = (props = {}) => - renderWithProviders( - , - { - i18nInstance: i18n, - } - ) }) afterEach(() => { @@ -46,70 +47,77 @@ describe('Introduction', () => { }) it('renders correct text', () => { - const { getByRole, queryByRole } = render()[0] - getByRole('heading', { name: 'Before you begin' }) - getByRole('button', { name: 'Get started' }) - getByRole('link', { name: 'Need help?' }) - expect(queryByRole('button', { name: 'Change tip rack' })).toBe(null) + render() + screen.getByRole('heading', { name: 'Before you begin' }) + screen.getByRole('button', { name: 'Get started' }) + screen.getByRole('link', { name: 'Need help?' }) + expect(screen.queryByRole('button', { name: 'Change tip rack' })).toBe(null) }) - it('renders change tip rack button if deck calibration', () => { - const { getByRole, getByText, queryByRole } = render({ + it('renders change tip rack button if allowChangeTipRack', () => { + render({ sessionType: Sessions.SESSION_TYPE_DECK_CALIBRATION, - })[0] - const button = getByRole('button', { name: 'Change tip rack' }) - button.click() - getByText('mock choose tip rack') - expect(queryByRole('heading', { name: 'Before you begin' })).toBe(null) + allowChangeTipRack: true, + }) + const button = screen.getByRole('button', { name: 'Change tip rack' }) + fireEvent.click(button) + screen.getByText('mock choose tip rack') + expect(screen.queryByRole('heading', { name: 'Before you begin' })).toBe( + null + ) }) it('clicking proceed loads alternate tiprack if load labware supported for session', () => { - const { getByRole } = render({ + render({ sessionType: Sessions.SESSION_TYPE_DECK_CALIBRATION, supportedCommands: [Sessions.sharedCalCommands.LOAD_LABWARE], - })[0] - getByRole('button', { name: 'Get started' }).click() + }) + const startButton = screen.getByRole('button', { name: 'Get started' }) + fireEvent.click(startButton) expect(mockSendCommands).toHaveBeenCalledWith({ command: 'calibration.loadLabware', data: { tiprackDefinition: mockCalibrationCheckLabware.definition }, }) }) it('clicking proceed loads default if load labware is not supported for session', () => { - const { getByRole } = render({ - sessionType: Sessions.SESSION_TYPE_DECK_CALIBRATION, - })[0] - getByRole('button', { name: 'Get started' }).click() + render({ sessionType: Sessions.SESSION_TYPE_DECK_CALIBRATION }) + const startButton = screen.getByRole('button', { name: 'Get started' }) + fireEvent.click(startButton) expect(mockSendCommands).toHaveBeenCalledWith({ command: 'calibration.loadLabware', }) }) it('displays the InvalidationWarning when necessary - Deck session', () => { - const [{ getByText }] = render({ + render({ sessionType: Sessions.SESSION_TYPE_DECK_CALIBRATION, calInvalidationHandler: mockCalInvalidationHandler, }) - getByText('Recalibrating the deck clears pipette offset data') - getByText('Pipette offsets for both mounts will have to be recalibrated.') + screen.getByText('Recalibrating the deck clears pipette offset data') + screen.getByText( + 'Pipette offsets for both mounts will have to be recalibrated.' + ) }) it('displays the InvalidationWarning when necessary - Tip Length session', () => { - const [{ getByText }] = render({ + render({ sessionType: Sessions.SESSION_TYPE_TIP_LENGTH_CALIBRATION, calInvalidationHandler: mockCalInvalidationHandler, }) - getByText('Recalibrating tip length will clear pipette offset data.') + screen.getByText('Recalibrating tip length will clear pipette offset data.') }) it('calls the calInvalidationHandler when appropriate', () => { - const [{ getByRole }] = render({ + render({ sessionType: Sessions.SESSION_TYPE_DECK_CALIBRATION, calInvalidationHandler: mockCalInvalidationHandler, }) - getByRole('button', { name: 'Get started' }).click() + const startButton = screen.getByRole('button', { name: 'Get started' }) + fireEvent.click(startButton) expect(mockCalInvalidationHandler).toHaveBeenCalled() }) it('does not call the calInvalidationHandler if not a deck or tip length session', () => { - const [{ getByRole }] = render({ + render({ sessionType: Sessions.SESSION_TYPE_PIPETTE_OFFSET_CALIBRATION, calInvalidationHandler: mockCalInvalidationHandler, }) - getByRole('button', { name: 'Get started' }).click() + const startButton = screen.getByRole('button', { name: 'Get started' }) + fireEvent.click(startButton) expect(mockCalInvalidationHandler).not.toHaveBeenCalled() }) }) diff --git a/app/src/organisms/CalibrationPanels/Introduction/index.tsx b/app/src/organisms/CalibrationPanels/Introduction/index.tsx index 9a70d1ea0ad..5bdc25ce51c 100644 --- a/app/src/organisms/CalibrationPanels/Introduction/index.tsx +++ b/app/src/organisms/CalibrationPanels/Introduction/index.tsx @@ -35,6 +35,7 @@ export function Introduction(props: CalibrationPanelProps): JSX.Element { instruments, supportedCommands, calInvalidationHandler, + allowChangeTipRack = false, } = props const { t } = useTranslation('robot_calibration') @@ -167,7 +168,7 @@ export function Introduction(props: CalibrationPanelProps): JSX.Element { > - {sessionType === Sessions.SESSION_TYPE_DECK_CALIBRATION ? ( + {allowChangeTipRack ? ( setShowChooseTipRack(true)}> {t('change_tip_rack')} diff --git a/app/src/organisms/CalibrationPanels/LoadingState.tsx b/app/src/organisms/CalibrationPanels/LoadingState.tsx index 8f6ed2e913e..0bc24a1e9be 100644 --- a/app/src/organisms/CalibrationPanels/LoadingState.tsx +++ b/app/src/organisms/CalibrationPanels/LoadingState.tsx @@ -24,12 +24,7 @@ export function LoadingState(props: LoadingStateProps): JSX.Element { alignItems={ALIGN_CENTER} minHeight="32rem" > - + {header != null ? {header} : null} {body != null ? {body} : null} diff --git a/app/src/organisms/CalibrationPanels/NeedHelpLink.tsx b/app/src/organisms/CalibrationPanels/NeedHelpLink.tsx index cff91296dd4..01dac649b39 100644 --- a/app/src/organisms/CalibrationPanels/NeedHelpLink.tsx +++ b/app/src/organisms/CalibrationPanels/NeedHelpLink.tsx @@ -23,7 +23,7 @@ export function NeedHelpLink(props: NeedHelpLinkProps): JSX.Element { return ( { - let render: ( - props?: Partial> - ) => ReturnType - const mockCleanUpAndExit = jest.fn() - - beforeEach(() => { - render = (props = {}) => { - const { proceed = mockCleanUpAndExit, flowName, body, visualAid } = props - return renderWithProviders( - , - { i18nInstance: i18n } - ) - } - }) + const render = ( + props: Partial> = {} + ) => { + const { proceed = mockCleanUpAndExit, flowName, body, visualAid } = props + return renderWithProviders( + , + { i18nInstance: i18n } + ) + } afterEach(() => { jest.resetAllMocks() }) it('clicking continue sends exit command and deletes session', () => { - const { getByRole } = render()[0] - getByRole('button', { name: 'exit' }).click() + render() + const button = screen.getByRole('button', { name: 'exit' }) + fireEvent.click(button) expect(mockCleanUpAndExit).toHaveBeenCalled() }) it('renders heading and body text if present', () => { - const { getByRole, getByText } = render({ + render({ flowName: 'fake flow name', body: 'fake body text', - })[0] - - getByRole('heading', { name: 'fake flow name complete!' }) - getByText('fake body text') + }) + screen.getByRole('heading', { name: 'fake flow name complete!' }) + screen.getByText('fake body text') }) it('renders visual aid in place of icon if present', () => { - const { getByText } = render({ visualAid: 'fake visual aid' })[0] - getByText('fake visual aid') + render({ visualAid: 'fake visual aid' }) + screen.getByText('fake visual aid') }) }) diff --git a/app/src/organisms/CalibrationPanels/__tests__/ConfirmCrashRecovery.test.tsx b/app/src/organisms/CalibrationPanels/__tests__/ConfirmCrashRecovery.test.tsx index 62cda1811bd..0ea1ecd69c7 100644 --- a/app/src/organisms/CalibrationPanels/__tests__/ConfirmCrashRecovery.test.tsx +++ b/app/src/organisms/CalibrationPanels/__tests__/ConfirmCrashRecovery.test.tsx @@ -1,46 +1,46 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../i18n' import { ConfirmCrashRecovery } from '../ConfirmCrashRecovery' describe('ConfirmCrashRecovery', () => { - let render: ( - props?: Partial> - ) => ReturnType const mockBack = jest.fn() const mockConfirm = jest.fn() + const render = ( + props: Partial> = {} + ) => { + const { back = mockBack, confirm = mockConfirm } = props + return renderWithProviders( + , + { i18nInstance: i18n } + ) + } - beforeEach(() => { - render = (props = {}) => { - const { back = mockBack, confirm = mockConfirm } = props - return renderWithProviders( - , - { i18nInstance: i18n } - ) - } - }) afterEach(() => { jest.resetAllMocks() }) it('clicking resume goes back', () => { - const { getByRole } = render()[0] - getByRole('button', { name: 'resume' }).click() + render() + const button = screen.getByRole('button', { name: 'resume' }) + fireEvent.click(button) expect(mockBack).toHaveBeenCalled() }) it('clicking start over confirms start over', () => { - const { getByRole } = render()[0] - getByRole('button', { name: 'Start over' }).click() + render() + const button = screen.getByRole('button', { name: 'Start over' }) + fireEvent.click(button) expect(mockConfirm).toHaveBeenCalled() }) it('renders correct copy', () => { - const { getByText, getByRole } = render()[0] - getByRole('heading', { name: 'Start over?' }) - getByText('Starting over will cancel your calibration progress.') - getByText( + render() + screen.getByRole('heading', { name: 'Start over?' }) + screen.getByText('Starting over will cancel your calibration progress.') + screen.getByText( 'If you bent a tip, be sure to replace it with an undamaged tip in position A1 of the tip rack before resuming calibration.' ) }) diff --git a/app/src/organisms/CalibrationPanels/__tests__/ConfirmExit.test.tsx b/app/src/organisms/CalibrationPanels/__tests__/ConfirmExit.test.tsx index b3b87fe60a9..9350ae7415e 100644 --- a/app/src/organisms/CalibrationPanels/__tests__/ConfirmExit.test.tsx +++ b/app/src/organisms/CalibrationPanels/__tests__/ConfirmExit.test.tsx @@ -1,54 +1,52 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../i18n' import { ConfirmExit } from '../ConfirmExit' describe('ConfirmExit', () => { - let render: ( - props?: Partial> - ) => ReturnType - const mockBack = jest.fn() const mockExit = jest.fn() - - beforeEach(() => { - render = (props = {}) => { - const { heading, body } = props - return renderWithProviders( - , - { i18nInstance: i18n } - ) - } - }) + const render = ( + props: Partial> = {} + ) => { + const { heading, body } = props + return renderWithProviders( + , + { i18nInstance: i18n } + ) + } afterEach(() => { jest.resetAllMocks() }) it('clicking confirm exit calls exit', () => { - const { getByRole } = render()[0] - getByRole('button', { name: 'exit' }).click() + render() + const button = screen.getByRole('button', { name: 'exit' }) + fireEvent.click(button) expect(mockExit).toHaveBeenCalled() }) it('clicking back calls back', () => { - const { getByRole } = render()[0] - getByRole('button', { name: 'Go back' }).click() + render() + const button = screen.getByRole('button', { name: 'Go back' }) + fireEvent.click(button) expect(mockBack).toHaveBeenCalled() }) it('renders body and heading text if present', () => { - const { getByRole, getByText } = render({ + render({ heading: 'fake heading', body: 'fake body', - })[0] - getByRole('heading', { name: 'fake heading' }) - getByText('fake heading') + }) + screen.getByRole('heading', { name: 'fake heading' }) + screen.getByText('fake heading') }) }) diff --git a/app/src/organisms/CalibrationPanels/__tests__/DeckSetup.test.tsx b/app/src/organisms/CalibrationPanels/__tests__/DeckSetup.test.tsx index fef0d125d7e..73eeec7beaf 100644 --- a/app/src/organisms/CalibrationPanels/__tests__/DeckSetup.test.tsx +++ b/app/src/organisms/CalibrationPanels/__tests__/DeckSetup.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { getDeckDefinitions } from '@opentrons/components/src/hardware-sim/Deck/getDeckDefinitions' import { i18n } from '../../../i18n' @@ -22,42 +23,41 @@ const mockGetDeckDefinitions = getDeckDefinitions as jest.MockedFunction< > describe('DeckSetup', () => { - let render: ( - props?: Partial> - ) => ReturnType - const mockSendCommands = jest.fn() const mockDeleteSession = jest.fn() + const render = ( + props: Partial> = {} + ) => { + const { + mount = 'left', + isMulti = false, + tipRack = mockDeckCalTipRack, + calBlock = null, + sendCommands = mockSendCommands, + cleanUpAndExit = mockDeleteSession, + currentStep = Sessions.DECK_STEP_LABWARE_LOADED, + sessionType = Sessions.SESSION_TYPE_DECK_CALIBRATION, + activePipette, + } = props + return renderWithProviders( + , + { i18nInstance: i18n } + ) + } + beforeEach(() => { mockGetDeckDefinitions.mockReturnValue({}) - render = (props = {}) => { - const { - mount = 'left', - isMulti = false, - tipRack = mockDeckCalTipRack, - calBlock = null, - sendCommands = mockSendCommands, - cleanUpAndExit = mockDeleteSession, - currentStep = Sessions.DECK_STEP_LABWARE_LOADED, - sessionType = Sessions.SESSION_TYPE_DECK_CALIBRATION, - activePipette, - } = props - return renderWithProviders( - , - { i18nInstance: i18n } - ) - } }) afterEach(() => { @@ -65,9 +65,8 @@ describe('DeckSetup', () => { }) it('clicking continue proceeds to next step', () => { - const { getByRole } = render()[0] - - getByRole('button', { name: 'Confirm placement' }).click() + render() + fireEvent.click(screen.getByRole('button', { name: 'Confirm placement' })) expect(mockSendCommands).toHaveBeenCalledWith({ command: Sessions.sharedCalCommands.MOVE_TO_TIP_RACK, @@ -75,60 +74,64 @@ describe('DeckSetup', () => { }) it('copy is correct if cal block present for tlc', () => { - const { getByText, getByRole, queryByText } = render({ + render({ sessionType: Sessions.SESSION_TYPE_TIP_LENGTH_CALIBRATION, calBlock: mockTipLengthCalBlock, - })[0] + }) - getByRole('heading', { name: 'Prepare the space' }) - getByText('Place a full 300ul Tiprack FIXTURE into slot 8') - getByText("Place the Calibration Block into it's designated slot") - expect(queryByText('To check the left pipette:')).toBeNull() - expect(queryByText('Clear all other deck slots')).toBeNull() + screen.getByRole('heading', { name: 'Prepare the space' }) + screen.getByText('Place a full 300ul Tiprack FIXTURE into slot 8') + screen.getByText("Place the Calibration Block into it's designated slot") + expect(screen.queryByText('To check the left pipette:')).toBeNull() + expect(screen.queryByText('Clear all other deck slots')).toBeNull() }) it('copy is correct if cal block not present for tlc', () => { - const { getByText, getByRole, queryByText } = render({ + render({ sessionType: Sessions.SESSION_TYPE_TIP_LENGTH_CALIBRATION, calBlock: null, - })[0] + }) - getByRole('heading', { name: 'Prepare the space' }) - getByText('Place a full 300ul Tiprack FIXTURE into slot 8') + screen.getByRole('heading', { name: 'Prepare the space' }) + screen.getByText('Place a full 300ul Tiprack FIXTURE into slot 8') expect( - queryByText("Place the Calibration Block into it's designated slot") + screen.queryByText( + "Place the Calibration Block into it's designated slot" + ) ).toBeNull() - expect(queryByText('To check the left pipette:')).toBeNull() - expect(queryByText('Clear all other deck slots')).toBeNull() + expect(screen.queryByText('To check the left pipette:')).toBeNull() + expect(screen.queryByText('Clear all other deck slots')).toBeNull() }) it('copy is correct if cal block present for health check', () => { - const { getByText, getByRole } = render({ + render({ sessionType: Sessions.SESSION_TYPE_CALIBRATION_HEALTH_CHECK, calBlock: mockTipLengthCalBlock, activePipette: mockRobotCalibrationCheckSessionDetails.activePipette, - })[0] + }) - getByRole('heading', { name: 'Prepare the space' }) - getByText('Place a full fake tiprack display name into slot 8') - getByText("Place the Calibration Block into it's designated slot") - getByText('To check the left pipette:') - getByText('Clear all other deck slots') + screen.getByRole('heading', { name: 'Prepare the space' }) + screen.getByText('Place a full fake tiprack display name into slot 8') + screen.getByText("Place the Calibration Block into it's designated slot") + screen.getByText('To check the left pipette:') + screen.getByText('Clear all other deck slots') }) it('copy is correct if cal block not present for health check', () => { - const { getByText, getByRole, queryByText } = render({ + render({ sessionType: Sessions.SESSION_TYPE_CALIBRATION_HEALTH_CHECK, calBlock: null, activePipette: mockRobotCalibrationCheckSessionDetails.activePipette, - })[0] + }) - getByRole('heading', { name: 'Prepare the space' }) - getByText('Place a full fake tiprack display name into slot 8') - getByText('To check the left pipette:') - getByText('Clear all other deck slots') + screen.getByRole('heading', { name: 'Prepare the space' }) + screen.getByText('Place a full fake tiprack display name into slot 8') + screen.getByText('To check the left pipette:') + screen.getByText('Clear all other deck slots') expect( - queryByText("Place the Calibration Block into it's designated slot") + screen.queryByText( + "Place the Calibration Block into it's designated slot" + ) ).toBeNull() }) }) diff --git a/app/src/organisms/CalibrationPanels/__tests__/MeasureNozzle.test.tsx b/app/src/organisms/CalibrationPanels/__tests__/MeasureNozzle.test.tsx index 4b63147a67b..c4e8a02643b 100644 --- a/app/src/organisms/CalibrationPanels/__tests__/MeasureNozzle.test.tsx +++ b/app/src/organisms/CalibrationPanels/__tests__/MeasureNozzle.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../i18n' import { @@ -10,63 +11,59 @@ import * as Sessions from '../../../redux/sessions' import { MeasureNozzle } from '../MeasureNozzle' describe('MeasureNozzle', () => { - let render: ( - props?: Partial> - ) => ReturnType - const mockSendCommands = jest.fn() const mockDeleteSession = jest.fn() - - beforeEach(() => { - render = (props = {}) => { - const { - mount = 'left', - isMulti = false, - tipRack = mockTipLengthTipRack, - calBlock = mockTipLengthCalBlock, - sendCommands = mockSendCommands, - cleanUpAndExit = mockDeleteSession, - currentStep = Sessions.TIP_LENGTH_STEP_MEASURING_NOZZLE_OFFSET, - sessionType = Sessions.SESSION_TYPE_TIP_LENGTH_CALIBRATION, - } = props - return renderWithProviders( - , - { i18nInstance: i18n } - ) - } - }) + const render = ( + props: Partial> = {} + ) => { + const { + mount = 'left', + isMulti = false, + tipRack = mockTipLengthTipRack, + calBlock = mockTipLengthCalBlock, + sendCommands = mockSendCommands, + cleanUpAndExit = mockDeleteSession, + currentStep = Sessions.TIP_LENGTH_STEP_MEASURING_NOZZLE_OFFSET, + sessionType = Sessions.SESSION_TYPE_TIP_LENGTH_CALIBRATION, + } = props + return renderWithProviders( + , + { i18nInstance: i18n } + ) + } afterEach(() => { jest.resetAllMocks() }) it('renders the confirm crash modal when invoked', () => { - const { getByText, queryByText } = render()[0] + render() expect( - queryByText('Starting over will cancel your calibration progress.') + screen.queryByText('Starting over will cancel your calibration progress.') ).toBeNull() - const crashLink = getByText('Start over') - crashLink.click() - getByText('Starting over will cancel your calibration progress.') + const crashLink = screen.getByText('Start over') + fireEvent.click(crashLink) + screen.getByText('Starting over will cancel your calibration progress.') }) it('renders the need help link', () => { - const { getByRole } = render()[0] - getByRole('link', { name: 'Need help?' }) + render() + screen.getByRole('link', { name: 'Need help?' }) }) it('jogging sends command', () => { - const { getByRole } = render()[0] - getByRole('button', { name: 'forward' }).click() + render() + const button = screen.getByRole('button', { name: 'forward' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith({ command: Sessions.sharedCalCommands.JOG, @@ -75,10 +72,9 @@ describe('MeasureNozzle', () => { }) it('clicking proceed sends save offset and move to tip rack commands for tip length cal', () => { - const { getByRole } = render({ - sessionType: Sessions.SESSION_TYPE_TIP_LENGTH_CALIBRATION, - })[0] - getByRole('button', { name: 'Confirm placement' }).click() + render({ sessionType: Sessions.SESSION_TYPE_TIP_LENGTH_CALIBRATION }) + const button = screen.getByRole('button', { name: 'Confirm placement' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith( { command: Sessions.sharedCalCommands.SAVE_OFFSET, @@ -90,10 +86,9 @@ describe('MeasureNozzle', () => { }) it('clicking proceed sends only move to tip rack commands for cal health check', () => { - const { getByRole } = render({ - sessionType: Sessions.SESSION_TYPE_CALIBRATION_HEALTH_CHECK, - })[0] - getByRole('button', { name: 'Confirm placement' }).click() + render({ sessionType: Sessions.SESSION_TYPE_CALIBRATION_HEALTH_CHECK }) + const button = screen.getByRole('button', { name: 'Confirm placement' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith({ command: Sessions.sharedCalCommands.MOVE_TO_TIP_RACK, }) diff --git a/app/src/organisms/CalibrationPanels/__tests__/MeasureTip.test.tsx b/app/src/organisms/CalibrationPanels/__tests__/MeasureTip.test.tsx index 0ff9f8192c0..1e1b9b2c857 100644 --- a/app/src/organisms/CalibrationPanels/__tests__/MeasureTip.test.tsx +++ b/app/src/organisms/CalibrationPanels/__tests__/MeasureTip.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../i18n' import { @@ -10,63 +11,59 @@ import * as Sessions from '../../../redux/sessions' import { MeasureTip } from '../MeasureTip' describe('MeasureTip', () => { - let render: ( - props?: Partial> - ) => ReturnType - const mockSendCommands = jest.fn() const mockDeleteSession = jest.fn() - - beforeEach(() => { - render = (props = {}) => { - const { - mount = 'left', - isMulti = false, - tipRack = mockTipLengthTipRack, - calBlock = mockTipLengthCalBlock, - sendCommands = mockSendCommands, - cleanUpAndExit = mockDeleteSession, - currentStep = Sessions.TIP_LENGTH_STEP_MEASURING_NOZZLE_OFFSET, - sessionType = Sessions.SESSION_TYPE_TIP_LENGTH_CALIBRATION, - } = props - return renderWithProviders( - , - { i18nInstance: i18n } - ) - } - }) + const render = ( + props: Partial> = {} + ) => { + const { + mount = 'left', + isMulti = false, + tipRack = mockTipLengthTipRack, + calBlock = mockTipLengthCalBlock, + sendCommands = mockSendCommands, + cleanUpAndExit = mockDeleteSession, + currentStep = Sessions.TIP_LENGTH_STEP_MEASURING_NOZZLE_OFFSET, + sessionType = Sessions.SESSION_TYPE_TIP_LENGTH_CALIBRATION, + } = props + return renderWithProviders( + , + { i18nInstance: i18n } + ) + } afterEach(() => { jest.resetAllMocks() }) it('renders the confirm crash modal when invoked', () => { - const { getByText, queryByText } = render()[0] + render() expect( - queryByText('Starting over will cancel your calibration progress.') + screen.queryByText('Starting over will cancel your calibration progress.') ).toBeNull() - const crashLink = getByText('Start over') - crashLink.click() - getByText('Starting over will cancel your calibration progress.') + const crashLink = screen.getByText('Start over') + fireEvent.click(crashLink) + screen.getByText('Starting over will cancel your calibration progress.') }) it('renders the need help link', () => { - const { getByRole } = render()[0] - getByRole('link', { name: 'Need help?' }) + render() + screen.getByRole('link', { name: 'Need help?' }) }) it('jogging sends command', () => { - const { getByRole } = render()[0] - getByRole('button', { name: 'forward' }).click() + render() + const button = screen.getByRole('button', { name: 'forward' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith({ command: Sessions.sharedCalCommands.JOG, @@ -75,10 +72,9 @@ describe('MeasureTip', () => { }) it('clicking proceed sends save offset and move to tip rack commands for tip length cal', () => { - const { getByRole } = render({ - sessionType: Sessions.SESSION_TYPE_TIP_LENGTH_CALIBRATION, - })[0] - getByRole('button', { name: 'Confirm placement' }).click() + render({ sessionType: Sessions.SESSION_TYPE_TIP_LENGTH_CALIBRATION }) + const button = screen.getByRole('button', { name: 'Confirm placement' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith( { command: Sessions.sharedCalCommands.SAVE_OFFSET, @@ -90,10 +86,9 @@ describe('MeasureTip', () => { }) it('clicking proceed sends only move to tip rack commands for cal health check', () => { - const { getByRole } = render({ - sessionType: Sessions.SESSION_TYPE_CALIBRATION_HEALTH_CHECK, - })[0] - getByRole('button', { name: 'Confirm placement' }).click() + render({ sessionType: Sessions.SESSION_TYPE_CALIBRATION_HEALTH_CHECK }) + const button = screen.getByRole('button', { name: 'Confirm placement' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith( { command: Sessions.checkCommands.COMPARE_POINT, diff --git a/app/src/organisms/CalibrationPanels/__tests__/SaveXYPoint.test.tsx b/app/src/organisms/CalibrationPanels/__tests__/SaveXYPoint.test.tsx index 446fb3e3279..7048b03c6ac 100644 --- a/app/src/organisms/CalibrationPanels/__tests__/SaveXYPoint.test.tsx +++ b/app/src/organisms/CalibrationPanels/__tests__/SaveXYPoint.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../i18n' @@ -7,144 +8,141 @@ import * as Sessions from '../../../redux/sessions' import { SaveXYPoint } from '../SaveXYPoint' describe('SaveXYPoint', () => { - let render: ( - props?: Partial> - ) => ReturnType - const mockSendCommands = jest.fn() const mockDeleteSession = jest.fn() + const render = ( + props: Partial> = {} + ) => { + const { + mount = 'left', + isMulti = false, + tipRack = mockDeckCalTipRack, + sendCommands = mockSendCommands, + cleanUpAndExit = mockDeleteSession, + currentStep = Sessions.DECK_STEP_SAVING_POINT_ONE, + sessionType = Sessions.SESSION_TYPE_DECK_CALIBRATION, + } = props + return renderWithProviders( + , + { i18nInstance: i18n } + ) + } - beforeEach(() => { - render = (props = {}) => { - const { - mount = 'left', - isMulti = false, - tipRack = mockDeckCalTipRack, - sendCommands = mockSendCommands, - cleanUpAndExit = mockDeleteSession, - currentStep = Sessions.DECK_STEP_SAVING_POINT_ONE, - sessionType = Sessions.SESSION_TYPE_DECK_CALIBRATION, - } = props - return renderWithProviders( - , - { i18nInstance: i18n } - ) - } - }) afterEach(() => { jest.resetAllMocks() }) it('displays proper assets for slot 1 left multi', () => { - const { getByLabelText } = render({ + render({ mount: 'left', isMulti: true, currentStep: Sessions.DECK_STEP_SAVING_POINT_ONE, - })[0] - getByLabelText('left multi channel pipette moving to slot 1') + }) + screen.getByLabelText('left multi channel pipette moving to slot 1') }) it('displays proper asset for slot 1 right multi', () => { - const { getByLabelText } = render({ + render({ mount: 'right', isMulti: true, currentStep: Sessions.DECK_STEP_SAVING_POINT_ONE, - })[0] - getByLabelText('right multi channel pipette moving to slot 1') + }) + screen.getByLabelText('right multi channel pipette moving to slot 1') }) it('displays proper asset for slot 1 left single', () => { - const { getByLabelText } = render({ + render({ mount: 'left', isMulti: false, currentStep: Sessions.DECK_STEP_SAVING_POINT_ONE, - })[0] - getByLabelText('left single channel pipette moving to slot 1') + }) + screen.getByLabelText('left single channel pipette moving to slot 1') }) it('displays proper asset for slot 1 right single', () => { - const { getByLabelText } = render({ + render({ mount: 'right', isMulti: false, currentStep: Sessions.DECK_STEP_SAVING_POINT_ONE, - })[0] - getByLabelText('right single channel pipette moving to slot 1') + }) + screen.getByLabelText('right single channel pipette moving to slot 1') }) it('displays proper asset for slot 3 left multi', () => { - const { getByLabelText } = render({ + render({ mount: 'left', isMulti: true, currentStep: Sessions.DECK_STEP_SAVING_POINT_TWO, - })[0] - getByLabelText('left multi channel pipette moving to slot 3') + }) + screen.getByLabelText('left multi channel pipette moving to slot 3') }) it('displays proper asset for slot 3 right multi', () => { - const { getByLabelText } = render({ + render({ mount: 'right', isMulti: true, currentStep: Sessions.DECK_STEP_SAVING_POINT_TWO, - })[0] - getByLabelText('right multi channel pipette moving to slot 3') + }) + screen.getByLabelText('right multi channel pipette moving to slot 3') }) it('displays proper asset for slot 3 left single', () => { - const { getByLabelText } = render({ + render({ mount: 'left', isMulti: false, currentStep: Sessions.DECK_STEP_SAVING_POINT_TWO, - })[0] - getByLabelText('left single channel pipette moving to slot 3') + }) + screen.getByLabelText('left single channel pipette moving to slot 3') }) it('displays proper asset for slot 3 right single', () => { - const { getByLabelText } = render({ + render({ mount: 'right', isMulti: false, currentStep: Sessions.DECK_STEP_SAVING_POINT_TWO, - })[0] - getByLabelText('right single channel pipette moving to slot 3') + }) + screen.getByLabelText('right single channel pipette moving to slot 3') }) it('displays proper asset for slot 7 left multi', () => { - const { getByLabelText } = render({ + render({ mount: 'left', isMulti: true, currentStep: Sessions.DECK_STEP_SAVING_POINT_THREE, - })[0] - getByLabelText('left multi channel pipette moving to slot 7') + }) + screen.getByLabelText('left multi channel pipette moving to slot 7') }) it('displays proper asset for slot 7 right multi', () => { - const { getByLabelText } = render({ + render({ mount: 'right', isMulti: true, currentStep: Sessions.DECK_STEP_SAVING_POINT_THREE, - })[0] - getByLabelText('right multi channel pipette moving to slot 7') + }) + screen.getByLabelText('right multi channel pipette moving to slot 7') }) it('displays proper asset for slot 7 left single', () => { - const { getByLabelText } = render({ + render({ mount: 'left', isMulti: false, currentStep: Sessions.DECK_STEP_SAVING_POINT_THREE, - })[0] - getByLabelText('left single channel pipette moving to slot 7') + }) + screen.getByLabelText('left single channel pipette moving to slot 7') }) it('displays proper asset for slot 7 right single', () => { - const { getByLabelText } = render({ + render({ mount: 'right', isMulti: false, currentStep: Sessions.DECK_STEP_SAVING_POINT_THREE, - })[0] - getByLabelText('right single channel pipette moving to slot 7') + }) + screen.getByLabelText('right single channel pipette moving to slot 7') }) it('jogging sends command', () => { - const { getByRole } = render()[0] - getByRole('button', { name: 'forward' }).click() + render() + const button = screen.getByRole('button', { name: 'forward' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith({ command: Sessions.sharedCalCommands.JOG, @@ -153,26 +151,27 @@ describe('SaveXYPoint', () => { }) it('renders the confirm crash modal when invoked', () => { - const { getByText, queryByText } = render()[0] + render() expect( - queryByText('Starting over will cancel your calibration progress.') + screen.queryByText('Starting over will cancel your calibration progress.') ).toBeNull() - const crashLink = getByText('Start over') - crashLink.click() - getByText('Starting over will cancel your calibration progress.') + const crashLink = screen.getByText('Start over') + fireEvent.click(crashLink) + screen.getByText('Starting over will cancel your calibration progress.') }) it('renders the need help link', () => { - const { getByRole } = render()[0] - getByRole('link', { name: 'Need help?' }) + render() + screen.getByRole('link', { name: 'Need help?' }) }) it('proceeding in deck cal session sends save offset and move to point two commands when current step is savingPointOne', () => { - const { getByRole } = render({ + render({ sessionType: Sessions.SESSION_TYPE_DECK_CALIBRATION, currentStep: Sessions.DECK_STEP_SAVING_POINT_ONE, - })[0] - getByRole('button', { name: 'Confirm placement' }).click() + }) + const button = screen.getByRole('button', { name: 'Confirm placement' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith( { command: Sessions.sharedCalCommands.SAVE_OFFSET, diff --git a/app/src/organisms/CalibrationPanels/__tests__/SaveZPoint.test.tsx b/app/src/organisms/CalibrationPanels/__tests__/SaveZPoint.test.tsx index ef106ce75bf..67ea6a9be10 100644 --- a/app/src/organisms/CalibrationPanels/__tests__/SaveZPoint.test.tsx +++ b/app/src/organisms/CalibrationPanels/__tests__/SaveZPoint.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../i18n' @@ -10,64 +11,62 @@ import * as Sessions from '../../../redux/sessions' import { SaveZPoint } from '../SaveZPoint' describe('SaveZPoint', () => { - let render: ( - props?: Partial> - ) => ReturnType - const mockSendCommands = jest.fn() const mockDeleteSession = jest.fn() - beforeEach(() => { - render = (props = {}) => { - const { - mount = 'left', - isMulti = false, - tipRack = mockDeckCalTipRack, - sendCommands = mockSendCommands, - cleanUpAndExit = mockDeleteSession, - currentStep = Sessions.DECK_STEP_JOGGING_TO_DECK, - sessionType = Sessions.SESSION_TYPE_DECK_CALIBRATION, - calBlock, - } = props - return renderWithProviders( - , - { i18nInstance: i18n } - ) - } - }) + const render = ( + props: Partial> = {} + ) => { + const { + mount = 'left', + isMulti = false, + tipRack = mockDeckCalTipRack, + sendCommands = mockSendCommands, + cleanUpAndExit = mockDeleteSession, + currentStep = Sessions.DECK_STEP_JOGGING_TO_DECK, + sessionType = Sessions.SESSION_TYPE_DECK_CALIBRATION, + calBlock, + } = props + return renderWithProviders( + , + { i18nInstance: i18n } + ) + } + afterEach(() => { jest.resetAllMocks() }) it('displays proper asset for left multi', () => { - const { getByLabelText } = render({ mount: 'left', isMulti: true })[0] - getByLabelText('left multi channel pipette moving to slot 5') + render({ mount: 'left', isMulti: true }) + screen.getByLabelText('left multi channel pipette moving to slot 5') }) it('displays proper asset for right multi', () => { - const { getByLabelText } = render({ mount: 'right', isMulti: true })[0] - getByLabelText('right multi channel pipette moving to slot 5') + render({ mount: 'right', isMulti: true }) + screen.getByLabelText('right multi channel pipette moving to slot 5') }) it('displays proper asset for left single', () => { - const { getByLabelText } = render({ mount: 'left', isMulti: false })[0] - getByLabelText('left single channel pipette moving to slot 5') + render({ mount: 'left', isMulti: false }) + screen.getByLabelText('left single channel pipette moving to slot 5') }) it('displays proper asset for right single', () => { - const { getByLabelText } = render({ mount: 'right', isMulti: false })[0] - getByLabelText('right single channel pipette moving to slot 5') + render({ mount: 'right', isMulti: false }) + screen.getByLabelText('right single channel pipette moving to slot 5') }) it('jogging sends command', () => { - const { getByRole } = render()[0] - getByRole('button', { name: 'up' }).click() + render() + const button = screen.getByRole('button', { name: 'up' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith({ command: Sessions.sharedCalCommands.JOG, @@ -76,25 +75,24 @@ describe('SaveZPoint', () => { }) it('renders the confirm crash modal when invoked', () => { - const { getByText, queryByText } = render()[0] + render() expect( - queryByText('Starting over will cancel your calibration progress.') + screen.queryByText('Starting over will cancel your calibration progress.') ).toBeNull() - const crashLink = getByText('Start over') - crashLink.click() - getByText('Starting over will cancel your calibration progress.') + const crashLink = screen.getByText('Start over') + fireEvent.click(crashLink) + screen.getByText('Starting over will cancel your calibration progress.') }) it('renders the need help link', () => { - const { getByRole } = render()[0] - getByRole('link', { name: 'Need help?' }) + render() + screen.getByRole('link', { name: 'Need help?' }) }) it('clicking proceed sends save offset and move to point one commands for deck cal', () => { - const { getByRole } = render({ - sessionType: Sessions.SESSION_TYPE_DECK_CALIBRATION, - })[0] - getByRole('button', { name: 'Confirm placement' }).click() + render({ sessionType: Sessions.SESSION_TYPE_DECK_CALIBRATION }) + const button = screen.getByRole('button', { name: 'Confirm placement' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith( { command: Sessions.sharedCalCommands.SAVE_OFFSET, @@ -106,10 +104,9 @@ describe('SaveZPoint', () => { }) it('clicking proceed sends save offset and move to point one commands for pipette offset cal', () => { - const { getByRole } = render({ - sessionType: Sessions.SESSION_TYPE_PIPETTE_OFFSET_CALIBRATION, - })[0] - getByRole('button', { name: 'Confirm placement' }).click() + render({ sessionType: Sessions.SESSION_TYPE_PIPETTE_OFFSET_CALIBRATION }) + const button = screen.getByRole('button', { name: 'Confirm placement' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith( { command: Sessions.sharedCalCommands.SAVE_OFFSET, @@ -121,10 +118,9 @@ describe('SaveZPoint', () => { }) it('clicking proceed sends compare point and move to point one commands for health check', () => { - const { getByRole } = render({ - sessionType: Sessions.SESSION_TYPE_CALIBRATION_HEALTH_CHECK, - })[0] - getByRole('button', { name: 'Confirm placement' }).click() + render({ sessionType: Sessions.SESSION_TYPE_CALIBRATION_HEALTH_CHECK }) + const button = screen.getByRole('button', { name: 'Confirm placement' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith( { command: Sessions.checkCommands.COMPARE_POINT, @@ -136,50 +132,44 @@ describe('SaveZPoint', () => { }) it('pip offset cal session type shows correct text', () => { - const { getByText, getByRole } = render({ - sessionType: Sessions.SESSION_TYPE_PIPETTE_OFFSET_CALIBRATION, - })[0] + render({ sessionType: Sessions.SESSION_TYPE_PIPETTE_OFFSET_CALIBRATION }) - getByRole('heading', { name: 'Calibrate z-axis in slot 5' }) - getByText( + screen.getByRole('heading', { name: 'Calibrate z-axis in slot 5' }) + screen.getByText( 'Jog the pipette until the tip is barely touching (less than 0.1 mm) the deck in slot 5.' ) - getByText( + screen.getByText( 'If the pipette is over the embossed 5, on the ridge of the slot, or hard to see, switch to the x- and y-axis controls to move the pipette across the deck.' ) }) it('deck cal session type shows correct text', () => { - const { getByText, getByRole } = render({ - sessionType: Sessions.SESSION_TYPE_DECK_CALIBRATION, - })[0] + render({ sessionType: Sessions.SESSION_TYPE_DECK_CALIBRATION }) - getByRole('heading', { name: 'Calibrate z-axis in slot 5' }) - getByText( + screen.getByRole('heading', { name: 'Calibrate z-axis in slot 5' }) + screen.getByText( 'Jog the pipette until the tip is barely touching (less than 0.1 mm) the deck in slot 5.' ) - getByText( + screen.getByText( 'If the pipette is over the embossed 5, on the ridge of the slot, or hard to see, switch to the x- and y-axis controls to move the pipette across the deck.' ) }) it('health check session type shows correct text with block', () => { - const { getByText, getByRole } = render({ + render({ sessionType: Sessions.SESSION_TYPE_CALIBRATION_HEALTH_CHECK, calBlock: mockTipLengthCalBlock, - })[0] - getByRole('heading', { name: 'Check z-axis on slot 5' }) - getByText( + }) + screen.getByRole('heading', { name: 'Check z-axis on slot 5' }) + screen.getByText( 'Jog the pipette until the tip is barely touching (less than 0.1 mm) the deck in slot 5.' ) }) it('health check session type shows correct text without block', () => { - const { getByText, getByRole } = render({ - sessionType: Sessions.SESSION_TYPE_CALIBRATION_HEALTH_CHECK, - })[0] - getByRole('heading', { name: 'Check z-axis on slot 5' }) - getByText( + render({ sessionType: Sessions.SESSION_TYPE_CALIBRATION_HEALTH_CHECK }) + screen.getByRole('heading', { name: 'Check z-axis on slot 5' }) + screen.getByText( 'Jog the pipette until the tip is barely touching (less than 0.1 mm) the deck in slot 5.' ) }) diff --git a/app/src/organisms/CalibrationPanels/__tests__/TipConfirmation.test.tsx b/app/src/organisms/CalibrationPanels/__tests__/TipConfirmation.test.tsx index 98277ba6a0b..6a7c03f3037 100644 --- a/app/src/organisms/CalibrationPanels/__tests__/TipConfirmation.test.tsx +++ b/app/src/organisms/CalibrationPanels/__tests__/TipConfirmation.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../i18n' import { mockDeckCalTipRack } from '../../../redux/sessions/__fixtures__' @@ -7,88 +8,80 @@ import * as Sessions from '../../../redux/sessions' import { TipConfirmation } from '../TipConfirmation' describe('TipConfirmation', () => { - let render: ( - props?: Partial> - ) => ReturnType - const mockSendCommands = jest.fn() const mockDeleteSession = jest.fn() - - beforeEach(() => { - render = (props = {}) => { - const { - mount = 'left', - isMulti = false, - tipRack = mockDeckCalTipRack, - sendCommands = mockSendCommands, - cleanUpAndExit = mockDeleteSession, - currentStep = Sessions.DECK_STEP_INSPECTING_TIP, - sessionType = Sessions.SESSION_TYPE_DECK_CALIBRATION, - } = props - return renderWithProviders( - , - { i18nInstance: i18n } - ) - } - }) + const render = ( + props: Partial> = {} + ) => { + const { + mount = 'left', + isMulti = false, + tipRack = mockDeckCalTipRack, + sendCommands = mockSendCommands, + cleanUpAndExit = mockDeleteSession, + currentStep = Sessions.DECK_STEP_INSPECTING_TIP, + sessionType = Sessions.SESSION_TYPE_DECK_CALIBRATION, + } = props + return renderWithProviders( + , + { i18nInstance: i18n } + ) + } afterEach(() => { jest.resetAllMocks() }) it('renders correct heading', () => { - const { getByRole } = render()[0] - - getByRole('heading', { name: 'Did pipette pick up tip successfully?' }) + render() + screen.getByRole('heading', { + name: 'Did pipette pick up tip successfully?', + }) }) it('clicking invalidate tip send invalidate tip command', () => { - const { getByRole } = render()[0] - - getByRole('button', { name: 'try again' }).click() + render() + const button = screen.getByRole('button', { name: 'try again' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith({ command: Sessions.sharedCalCommands.INVALIDATE_TIP, }) }) it('proceeds to move to deck for pipette offset calibration', () => { - const { getByRole } = render({ - sessionType: Sessions.SESSION_TYPE_PIPETTE_OFFSET_CALIBRATION, - })[0] - getByRole('button', { name: 'yes' }).click() + render({ sessionType: Sessions.SESSION_TYPE_PIPETTE_OFFSET_CALIBRATION }) + const button = screen.getByRole('button', { name: 'yes' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith({ command: Sessions.sharedCalCommands.MOVE_TO_DECK, }) }) it('proceeds to move to deck for deck calibration', () => { - const { getByRole } = render({ - sessionType: Sessions.SESSION_TYPE_PIPETTE_OFFSET_CALIBRATION, - })[0] - getByRole('button', { name: 'yes' }).click() + render({ sessionType: Sessions.SESSION_TYPE_PIPETTE_OFFSET_CALIBRATION }) + const button = screen.getByRole('button', { name: 'yes' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith({ command: Sessions.sharedCalCommands.MOVE_TO_DECK, }) }) it('proceeds to move to reference point for tip length calibration', () => { - const { getByRole } = render({ - sessionType: Sessions.SESSION_TYPE_TIP_LENGTH_CALIBRATION, - })[0] - getByRole('button', { name: 'yes' }).click() + render({ sessionType: Sessions.SESSION_TYPE_TIP_LENGTH_CALIBRATION }) + const button = screen.getByRole('button', { name: 'yes' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith({ command: Sessions.sharedCalCommands.MOVE_TO_REFERENCE_POINT, }) }) it('proceeds to move to reference point for calibration health check', () => { - const { getByRole } = render({ - sessionType: Sessions.SESSION_TYPE_CALIBRATION_HEALTH_CHECK, - })[0] - getByRole('button', { name: 'yes' }).click() + render({ sessionType: Sessions.SESSION_TYPE_CALIBRATION_HEALTH_CHECK }) + const button = screen.getByRole('button', { name: 'yes' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith({ command: Sessions.sharedCalCommands.MOVE_TO_REFERENCE_POINT, }) diff --git a/app/src/organisms/CalibrationPanels/__tests__/TipPickUp.test.tsx b/app/src/organisms/CalibrationPanels/__tests__/TipPickUp.test.tsx index 528aae5de00..d9ed1ae694c 100644 --- a/app/src/organisms/CalibrationPanels/__tests__/TipPickUp.test.tsx +++ b/app/src/organisms/CalibrationPanels/__tests__/TipPickUp.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../i18n' import { mockDeckCalTipRack } from '../../../redux/sessions/__fixtures__' @@ -7,47 +8,42 @@ import * as Sessions from '../../../redux/sessions' import { TipPickUp } from '../TipPickUp' describe('TipPickUp', () => { - let render: ( - props?: Partial> - ) => ReturnType - const mockSendCommands = jest.fn() const mockDeleteSession = jest.fn() - - beforeEach(() => { - render = (props = {}) => { - const { - mount = 'left', - isMulti = false, - tipRack = mockDeckCalTipRack, - sendCommands = mockSendCommands, - cleanUpAndExit = mockDeleteSession, - currentStep = Sessions.DECK_STEP_PREPARING_PIPETTE, - sessionType = Sessions.SESSION_TYPE_DECK_CALIBRATION, - } = props - return renderWithProviders( - , - { i18nInstance: i18n } - ) - } - }) + const render = ( + props: Partial> = {} + ) => { + const { + mount = 'left', + isMulti = false, + tipRack = mockDeckCalTipRack, + sendCommands = mockSendCommands, + cleanUpAndExit = mockDeleteSession, + currentStep = Sessions.DECK_STEP_PREPARING_PIPETTE, + sessionType = Sessions.SESSION_TYPE_DECK_CALIBRATION, + } = props + return renderWithProviders( + , + { i18nInstance: i18n } + ) + } afterEach(() => { jest.resetAllMocks() }) it('jogging sends command', () => { - const { getByRole } = render()[0] - getByRole('button', { name: 'forward' }).click() - + render() + const button = screen.getByRole('button', { name: 'forward' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith({ command: Sessions.sharedCalCommands.JOG, data: { vector: [0, -0.1, 0] }, @@ -55,25 +51,26 @@ describe('TipPickUp', () => { }) it('clicking pick up tip sends pick up tip command', () => { - const { getByRole } = render()[0] - getByRole('button', { name: 'Pick up tip' }).click() + render() + const button = screen.getByRole('button', { name: 'Pick up tip' }) + fireEvent.click(button) expect(mockSendCommands).toHaveBeenCalledWith({ command: Sessions.sharedCalCommands.PICK_UP_TIP, }) }) it('renders the need help link', () => { - const { getByRole } = render()[0] - getByRole('link', { name: 'Need help?' }) + render() + screen.getByRole('link', { name: 'Need help?' }) }) it('renders the confirm crash modal when invoked', () => { - const { getByText, queryByText } = render()[0] + render() expect( - queryByText('Starting over will cancel your calibration progress.') + screen.queryByText('Starting over will cancel your calibration progress.') ).toBeNull() - const crashLink = getByText('Start over') - crashLink.click() - getByText('Starting over will cancel your calibration progress.') + const crashLink = screen.getByText('Start over') + fireEvent.click(crashLink) + screen.getByText('Starting over will cancel your calibration progress.') }) }) diff --git a/app/src/organisms/CalibrationPanels/__tests__/useConfirmCrashRecovery.test.tsx b/app/src/organisms/CalibrationPanels/__tests__/useConfirmCrashRecovery.test.tsx index 3a14954bf53..63700d26d66 100644 --- a/app/src/organisms/CalibrationPanels/__tests__/useConfirmCrashRecovery.test.tsx +++ b/app/src/organisms/CalibrationPanels/__tests__/useConfirmCrashRecovery.test.tsx @@ -1,8 +1,8 @@ import * as React from 'react' -import { act, renderHook } from '@testing-library/react-hooks' +import { fireEvent, renderHook } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' -import { LEFT, renderWithProviders } from '@opentrons/components' - +import { LEFT } from '@opentrons/shared-data' +import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../i18n' import { useConfirmCrashRecovery } from '../useConfirmCrashRecovery' import { mockCalibrationCheckLabware } from '../../../redux/sessions/__fixtures__' @@ -12,10 +12,7 @@ import { sharedCalCommands, } from '../../../redux/sessions' -import type { CalibrationPanelProps } from '../types' - describe('useConfirmCrashRecovery', () => { - let wrapper: React.FunctionComponent<{}> const mockSendCommands = jest.fn() const mockProps = { cleanUpAndExit: jest.fn(), @@ -26,26 +23,22 @@ describe('useConfirmCrashRecovery', () => { sessionType: SESSION_TYPE_DECK_CALIBRATION, } - beforeEach(() => { - wrapper = ({ children }) => ( - {children} - ) - }) afterEach(() => { jest.resetAllMocks() }) it('renders the link text', () => { - const { result } = renderHook< - CalibrationPanelProps, - [link: JSX.Element, confirmation: JSX.Element | null] - >( + const { result } = renderHook( () => useConfirmCrashRecovery({ ...mockProps, sendCommands: mockSendCommands, }), - { wrapper } + { + wrapper: ({ children }) => ( + {children} + ), + } ) const [link, confirmation] = result.current expect(link).not.toBeNull() @@ -59,16 +52,17 @@ describe('useConfirmCrashRecovery', () => { }) it('renders the modal with the right props when you click the link', () => { - const { result } = renderHook< - CalibrationPanelProps, - [link: JSX.Element, confirmation: JSX.Element | null] - >( + const { result } = renderHook( () => useConfirmCrashRecovery({ ...mockProps, sendCommands: mockSendCommands, }), - { wrapper } + { + wrapper: ({ children }) => ( + {children} + ), + } ) // render returned confirmation if not null, otherwise render the link @@ -77,7 +71,7 @@ describe('useConfirmCrashRecovery', () => { { i18nInstance: i18n } )[0] // click the link to launch the modal - act(() => getByRole('button', { name: 'Start over' }).click()) + fireEvent.click(getByRole('button', { name: 'Start over' })) // the confirmation should now not be null expect(result.current[1]).not.toBeNull() // the explicitly rerender to incorporate newly non-null confirmation @@ -85,14 +79,14 @@ describe('useConfirmCrashRecovery', () => { // click the "back" link in the confirmation const closeConfirmationButton = getByRole('button', { name: 'resume' }) - act(() => closeConfirmationButton.click()) + fireEvent.click(closeConfirmationButton) // the confirmation should now be null once more expect(result.current[1]).toBeNull() // open the confirmation again and click the proceed to start over button - act(() => getByRole('button', { name: 'Start over' }).click()) + fireEvent.click(getByRole('button', { name: 'Start over' })) const startOverButton = getByRole('button', { name: 'Start over' }) - startOverButton.click() + fireEvent.click(startOverButton) expect(mockSendCommands).toHaveBeenCalledWith({ command: sharedCalCommands.INVALIDATE_LAST_ACTION, }) diff --git a/app/src/organisms/CalibrationPanels/types.ts b/app/src/organisms/CalibrationPanels/types.ts index 16d9f9d60fd..cc8700aa8be 100644 --- a/app/src/organisms/CalibrationPanels/types.ts +++ b/app/src/organisms/CalibrationPanels/types.ts @@ -32,4 +32,5 @@ export interface CalibrationPanelProps { supportedCommands?: SessionCommandString[] | null defaultTipracks?: LabwareDefinition2[] | null calInvalidationHandler?: () => void + allowChangeTipRack?: boolean } diff --git a/app/src/organisms/CalibrationStatusCard/__tests__/CalibrationStatusCard.test.tsx b/app/src/organisms/CalibrationStatusCard/__tests__/CalibrationStatusCard.test.tsx index ce4192512a1..d89de5ae57c 100644 --- a/app/src/organisms/CalibrationStatusCard/__tests__/CalibrationStatusCard.test.tsx +++ b/app/src/organisms/CalibrationStatusCard/__tests__/CalibrationStatusCard.test.tsx @@ -1,5 +1,6 @@ import * as React from 'react' import { MemoryRouter } from 'react-router-dom' +import { fireEvent, screen } from '@testing-library/react' import { resetAllWhenMocks } from 'jest-when' import { renderWithProviders } from '@opentrons/components' @@ -53,77 +54,77 @@ describe('CalibrationStatusCard', () => { } it('renders a calibration status title and description', () => { - const [{ getByText }] = render(props) - - getByText('Calibration Status') - getByText( + render(props) + screen.getByText('Calibration Status') + screen.getByText( `For accurate and precise movement, calibrate the robot's deck, pipette offsets, and tip lengths.` ) }) it('renders a complete status label', () => { - const [{ getByText }] = render(props) - getByText('Calibration complete') + render(props) + screen.getByText('Calibration complete') }) it('renders a missing status label', () => { mockUseCalibrationTaskList.mockReturnValue( expectedIncompleteDeckCalTaskList ) - const [{ getByText }] = render(props) - getByText('Missing calibration data') + render(props) + screen.getByText('Missing calibration data') }) it('renders a recommended status label when the deck is bad', () => { mockUseCalibrationTaskList.mockReturnValue(expectedBadDeckTaskList) - const [{ getByText }] = render(props) - getByText('Calibration recommended') + render(props) + screen.getByText('Calibration recommended') }) it('renders a recommended status label when both the deck and offset is bad', () => { mockUseCalibrationTaskList.mockReturnValue( expectedBadDeckAndPipetteOffsetTaskList ) - const [{ getByText }] = render(props) - getByText('Calibration recommended') + render(props) + screen.getByText('Calibration recommended') }) it('renders a recommended status label when everything is bad', () => { mockUseCalibrationTaskList.mockReturnValue(expectedBadEverythingTaskList) - const [{ getByText }] = render(props) - getByText('Calibration recommended') + render(props) + screen.getByText('Calibration recommended') }) it('renders a recommended status label when the offset is bad', () => { mockUseCalibrationTaskList.mockReturnValue(expectedBadPipetteOffsetTaskList) - const [{ getByText }] = render(props) - getByText('Calibration recommended') + render(props) + screen.getByText('Calibration recommended') }) it('renders a recommended status label when the tip length is bad', () => { mockUseCalibrationTaskList.mockReturnValue(expectedBadTipLengthTaskList) - const [{ getByText }] = render(props) - getByText('Calibration recommended') + render(props) + screen.getByText('Calibration recommended') }) it('renders a recommended status label when both the tip length and offset is bad', () => { mockUseCalibrationTaskList.mockReturnValue( expectedBadTipLengthAndOffsetTaskList ) - const [{ getByText }] = render(props) - getByText('Calibration recommended') + render(props) + screen.getByText('Calibration recommended') }) it('renders a "See how robot calibration works button"', () => { - const [{ getByRole }] = render(props) - getByRole('button', { name: 'See how robot calibration works' }).click() + render(props) + fireEvent.click( + screen.getByRole('button', { name: 'See how robot calibration works' }) + ) expect(mockSetShowHowCalibrationWorksModal).toBeCalled() }) it('renders a link to launch the calibration dashboard', () => { - const [{ getByRole }] = render(props) - - const calibrationDashboardLink = getByRole('link', { + render(props) + const calibrationDashboardLink = screen.getByRole('link', { name: 'Launch calibration', }) expect(calibrationDashboardLink.getAttribute('href')).toEqual( diff --git a/app/src/organisms/CalibrationStatusCard/index.tsx b/app/src/organisms/CalibrationStatusCard/index.tsx index 5f1fa062047..bbedf033ff5 100644 --- a/app/src/organisms/CalibrationStatusCard/index.tsx +++ b/app/src/organisms/CalibrationStatusCard/index.tsx @@ -37,20 +37,20 @@ export function CalibrationStatusCard({ const { taskListStatus } = useCalibrationTaskList() // start off assuming we are missing calibrations - let statusLabelBackgroundColor: string = COLORS.errorEnabled - let statusLabelIconColor: string = COLORS.errorEnabled + let statusLabelBackgroundColor: string = COLORS.red30 + let statusLabelIconColor: string = COLORS.red60 let statusLabelText = t('missing_calibration_data') // if the tasklist is empty, though, all calibrations are good if (taskListStatus === 'complete') { - statusLabelBackgroundColor = COLORS.successEnabled - statusLabelIconColor = COLORS.successEnabled + statusLabelBackgroundColor = COLORS.green30 + statusLabelIconColor = COLORS.green60 statusLabelText = t('calibration_complete') // if we have tasks and they are all marked bad, then we should // strongly suggest they re-do those calibrations } else if (taskListStatus === 'bad') { - statusLabelBackgroundColor = COLORS.warningEnabled - statusLabelIconColor = COLORS.warningEnabled + statusLabelBackgroundColor = COLORS.yellow30 + statusLabelIconColor = COLORS.yellow60 statusLabelText = t('calibration_recommended') } @@ -75,11 +75,9 @@ export function CalibrationStatusCard({
diff --git a/app/src/organisms/CalibrationTaskList/__tests__/CalibrationTaskList.test.tsx b/app/src/organisms/CalibrationTaskList/__tests__/CalibrationTaskList.test.tsx index 798a798f1a8..75aed8b1fc9 100644 --- a/app/src/organisms/CalibrationTaskList/__tests__/CalibrationTaskList.test.tsx +++ b/app/src/organisms/CalibrationTaskList/__tests__/CalibrationTaskList.test.tsx @@ -21,6 +21,7 @@ import { useAttachedPipettes, } from '../../Devices/hooks' import { mockLeftProtoPipette } from '../../../redux/pipettes/__fixtures__' +import { fireEvent } from '@testing-library/react' jest.mock('../../Devices/hooks') jest.mock('../../ProtocolUpload/hooks') @@ -43,6 +44,7 @@ const render = (robotName: string = 'otie') => { pipOffsetCalLauncher={mockPipOffsetCalLauncher} tipLengthCalLauncher={mockTipLengthCalLauncher} deckCalLauncher={mockDeckCalLauncher} + exitBeforeDeckConfigCompletion={false} /> , { @@ -85,7 +87,7 @@ describe('CalibrationTaskList', () => { const [{ getByText, rerender }] = render() expect(getByText('Calibrate')).toBeTruthy() // Complete screen will only render if a wizard has been launched - getByText('Calibrate').click() + fireEvent.click(getByText('Calibrate')) rerender( { pipOffsetCalLauncher={mockPipOffsetCalLauncher} tipLengthCalLauncher={mockTipLengthCalLauncher} deckCalLauncher={mockDeckCalLauncher} + exitBeforeDeckConfigCompletion={false} /> ) @@ -110,7 +113,7 @@ describe('CalibrationTaskList', () => { expect(getAllByText('Calibration recommended')).toHaveLength(3) expect(getByRole('button', { name: 'Calibrate' })).toBeTruthy() getByText('Right Mount') - getByText('Calibrate').click() + fireEvent.click(getByText('Calibrate')) rerender( { pipOffsetCalLauncher={mockPipOffsetCalLauncher} tipLengthCalLauncher={mockTipLengthCalLauncher} deckCalLauncher={mockDeckCalLauncher} + exitBeforeDeckConfigCompletion={false} /> ) @@ -134,7 +138,7 @@ describe('CalibrationTaskList', () => { expect(getByRole('button', { name: 'Calibrate' })).toBeTruthy() getByText('Left Mount') getByText('Right Mount') - getByText('Calibrate').click() + fireEvent.click(getByText('Calibrate')) rerender( { pipOffsetCalLauncher={mockPipOffsetCalLauncher} tipLengthCalLauncher={mockTipLengthCalLauncher} deckCalLauncher={mockDeckCalLauncher} + exitBeforeDeckConfigCompletion={false} /> ) @@ -158,7 +163,7 @@ describe('CalibrationTaskList', () => { expect(getByRole('button', { name: 'Calibrate' })).toBeTruthy() getByText('Left Mount') getByText('Right Mount') - getByText('Calibrate').click() + fireEvent.click(getByText('Calibrate')) rerender( { pipOffsetCalLauncher={mockPipOffsetCalLauncher} tipLengthCalLauncher={mockTipLengthCalLauncher} deckCalLauncher={mockDeckCalLauncher} + exitBeforeDeckConfigCompletion={false} /> ) @@ -178,10 +184,10 @@ describe('CalibrationTaskList', () => { ) const [{ getAllByText, getByText, rerender }] = render() - getByText('Left Mount').click() + fireEvent.click(getByText('Left Mount')) const recalibrateLinks = getAllByText('Recalibrate') // this includes the deck and Left Mount subtasks CTAs expect(recalibrateLinks).toHaveLength(3) - recalibrateLinks[2].click() + fireEvent.click(recalibrateLinks[2]) rerender( { pipOffsetCalLauncher={mockPipOffsetCalLauncher} tipLengthCalLauncher={mockTipLengthCalLauncher} deckCalLauncher={mockDeckCalLauncher} + exitBeforeDeckConfigCompletion={false} /> ) @@ -201,10 +208,10 @@ describe('CalibrationTaskList', () => { ) const [{ getAllByText, getByText, rerender }] = render() - getByText('Left Mount').click() + fireEvent.click(getByText('Left Mount')) const recalibrateLinks = getAllByText('Recalibrate') expect(recalibrateLinks).toHaveLength(3) - recalibrateLinks[0].click() + fireEvent.click(recalibrateLinks[0]) rerender( { pipOffsetCalLauncher={mockPipOffsetCalLauncher} tipLengthCalLauncher={mockTipLengthCalLauncher} deckCalLauncher={mockDeckCalLauncher} + exitBeforeDeckConfigCompletion={false} /> ) expect(getByText('Calibrations complete!')).toBeTruthy() }) + it('exiting a recalibrate wizard from a task will allow the current calibrations screen to show', () => { + mockUseCalibrationTaskList.mockReturnValueOnce( + expectedIncompleteRightMountTaskList + ) + + const [{ getByText, rerender }] = render() + const recalibrateLink = getByText('Recalibrate') + fireEvent.click(recalibrateLink) + rerender( + + + + ) + expect(getByText('Using current calibrations.')).toBeTruthy() + }) + it('prevents the user from launching calibrations or recalibrations from a task when a protocol run is active', () => { mockUseCalibrationTaskList.mockReturnValueOnce( expectedIncompleteDeckCalTaskList @@ -227,7 +257,7 @@ describe('CalibrationTaskList', () => { const [{ getAllByText, rerender }] = render() const calibrateButtons = getAllByText('Calibrate') expect(calibrateButtons).toHaveLength(1) // only deck's calibration button should be shown - calibrateButtons[0].click() + fireEvent.click(calibrateButtons[0]) expect(mockDeckCalLauncher).not.toHaveBeenCalled() rerender( @@ -236,12 +266,13 @@ describe('CalibrationTaskList', () => { pipOffsetCalLauncher={mockPipOffsetCalLauncher} tipLengthCalLauncher={mockTipLengthCalLauncher} deckCalLauncher={mockDeckCalLauncher} + exitBeforeDeckConfigCompletion={false} /> ) const recalibrateLinks = getAllByText('Recalibrate') expect(recalibrateLinks).toHaveLength(1) // only deck's recalibration link should be shown - recalibrateLinks[0].click() + fireEvent.click(recalibrateLinks[0]) expect(mockDeckCalLauncher).not.toHaveBeenCalled() }) @@ -254,7 +285,7 @@ describe('CalibrationTaskList', () => { const [{ getAllByText, getByText, rerender }] = render() const calibrateButtons = getAllByText('Calibrate') expect(calibrateButtons).toHaveLength(1) // only the left mounts tip length button should show - calibrateButtons[0].click() + fireEvent.click(calibrateButtons[0]) expect(mockTipLengthCalLauncher).not.toHaveBeenCalled() rerender( @@ -263,13 +294,14 @@ describe('CalibrationTaskList', () => { pipOffsetCalLauncher={mockPipOffsetCalLauncher} tipLengthCalLauncher={mockTipLengthCalLauncher} deckCalLauncher={mockDeckCalLauncher} + exitBeforeDeckConfigCompletion={false} /> ) - getByText('Left Mount').click() + fireEvent.click(getByText('Left Mount')) const recalibrateLinks = getAllByText('Recalibrate') expect(recalibrateLinks).toHaveLength(3) // deck and left mounts links are showing - recalibrateLinks[1].click() + fireEvent.click(recalibrateLinks[1]) expect(mockTipLengthCalLauncher).not.toHaveBeenCalled() }) }) diff --git a/app/src/organisms/CalibrationTaskList/index.tsx b/app/src/organisms/CalibrationTaskList/index.tsx index c1f1986f587..0bc71ec01d7 100644 --- a/app/src/organisms/CalibrationTaskList/index.tsx +++ b/app/src/organisms/CalibrationTaskList/index.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { css } from 'styled-components' import { useTranslation } from 'react-i18next' import { useHistory } from 'react-router-dom' @@ -35,6 +36,7 @@ interface CalibrationTaskListProps { pipOffsetCalLauncher: DashboardCalOffsetInvoker tipLengthCalLauncher: DashboardCalTipLengthInvoker deckCalLauncher: DashboardCalDeckInvoker + exitBeforeDeckConfigCompletion: boolean } export function CalibrationTaskList({ @@ -42,6 +44,7 @@ export function CalibrationTaskList({ pipOffsetCalLauncher, tipLengthCalLauncher, deckCalLauncher, + exitBeforeDeckConfigCompletion, }: CalibrationTaskListProps): JSX.Element { const prevActiveIndex = React.useRef<[number, number] | null>(null) const [hasLaunchedWizard, setHasLaunchedWizard] = React.useState( @@ -87,20 +90,20 @@ export function CalibrationTaskList({ }, [activeIndex, hasLaunchedWizard]) // start off assuming we are missing calibrations - let statusLabelBackgroundColor: string = COLORS.errorEnabled - let statusLabelIconColor: string = COLORS.errorEnabled + let statusLabelBackgroundColor: string = COLORS.red30 + let statusLabelIconColor: string = COLORS.red50 let statusLabelText = t('missing_calibration_data') // if the tasklist is empty, though, all calibrations are good if (taskListStatus === 'complete') { - statusLabelBackgroundColor = COLORS.successEnabled - statusLabelIconColor = COLORS.successEnabled + statusLabelBackgroundColor = COLORS.green30 + statusLabelIconColor = COLORS.green50 statusLabelText = t('calibration_complete') // if we have tasks and they are all marked bad, then we should // strongly suggest they re-do those calibrations } else if (taskListStatus === 'bad') { - statusLabelBackgroundColor = COLORS.warningEnabled - statusLabelIconColor = COLORS.warningEnabled + statusLabelBackgroundColor = COLORS.yellow30 + statusLabelIconColor = COLORS.yellow50 statusLabelText = t('calibration_recommended') } @@ -111,8 +114,12 @@ export function CalibrationTaskList({ history.push(`/devices/${robotName}/robot-settings/calibration`) } fullPage - backgroundColor={COLORS.fundamentalsBackground} + backgroundColor={COLORS.grey10} childrenPadding={`${SPACING.spacing16} ${SPACING.spacing24} ${SPACING.spacing24} ${SPACING.spacing4}`} + css={css` + width: 50rem; + height: 47.5rem; + `} > {showCompletionScreen ? ( - + {exitBeforeDeckConfigCompletion ? ( + + ) : ( + + )} - {t('calibrations_complete')} + {exitBeforeDeckConfigCompletion + ? t('using_current_calibrations') + : t('calibrations_complete')} diff --git a/app/src/organisms/ChangePipette/ConfirmPipette.tsx b/app/src/organisms/ChangePipette/ConfirmPipette.tsx index ea44722b065..2b7b75da8da 100644 --- a/app/src/organisms/ChangePipette/ConfirmPipette.tsx +++ b/app/src/organisms/ChangePipette/ConfirmPipette.tsx @@ -13,10 +13,11 @@ import { CheckPipettesButton } from './CheckPipettesButton' import { SimpleWizardBody } from '../../molecules/SimpleWizardBody' import { LevelPipette } from './LevelPipette' -import type { +import { PipetteNameSpecs, PipetteModelSpecs, PipetteDisplayCategory, + OT2_ROBOT_TYPE, } from '@opentrons/shared-data' import type { PipetteOffsetCalibration } from '../../redux/calibration/types' import type { Mount } from '../../redux/pipettes/types' @@ -110,7 +111,8 @@ export function ConfirmPipette(props: ConfirmPipetteProps): JSX.Element { return !confirmPipetteLevel && (wrongWantedPipette != null || (props.wantedPipette != null && success)) && actualPipette != null && - actualPipette.channels === 8 ? ( + actualPipette.channels === 8 && + actualPipette.displayCategory === 'GEN2' ? ( <> {!success && !wrongWantedPipette && !confirmPipetteLevel && ( diff --git a/app/src/organisms/ChangePipette/ExitModal.tsx b/app/src/organisms/ChangePipette/ExitModal.tsx index ee362ed8862..d2848c01bf5 100644 --- a/app/src/organisms/ChangePipette/ExitModal.tsx +++ b/app/src/organisms/ChangePipette/ExitModal.tsx @@ -25,7 +25,7 @@ export function ExitModal(props: Props): JSX.Element { return ( () const finalRequestId = React.useRef(null) @@ -184,7 +184,7 @@ export function ChangePipette(props: Props): JSX.Element | null { marginTop={SPACING.spacing24} marginBottom={SPACING.spacing8} > - {t('moving_gantry')} + {t('shared:stand_back_robot_is_in_motion')}
) diff --git a/app/src/organisms/CheckCalibration/ResultsSummary/CalibrationHealthCheckResults.tsx b/app/src/organisms/CheckCalibration/ResultsSummary/CalibrationHealthCheckResults.tsx index c6c258158b1..50e5e5b2a45 100644 --- a/app/src/organisms/CheckCalibration/ResultsSummary/CalibrationHealthCheckResults.tsx +++ b/app/src/organisms/CheckCalibration/ResultsSummary/CalibrationHealthCheckResults.tsx @@ -13,11 +13,11 @@ import { StyledText } from '../../../atoms/text' import { StatusLabel } from '../../../atoms/StatusLabel' interface CalibrationHealthCheckResultsProps { - isCalibrationCompleted: boolean + isCalibrationRecommended: boolean } export const CalibrationHealthCheckResults = ({ - isCalibrationCompleted, + isCalibrationRecommended, }: CalibrationHealthCheckResultsProps): JSX.Element => { const { t } = useTranslation('robot_calibration') return ( @@ -25,19 +25,15 @@ export const CalibrationHealthCheckResults = ({ {t('calibration_health_check_results')} diff --git a/app/src/organisms/CheckCalibration/ResultsSummary/CalibrationResult.tsx b/app/src/organisms/CheckCalibration/ResultsSummary/CalibrationResult.tsx index d22c452cfc3..f0bd59b1652 100644 --- a/app/src/organisms/CheckCalibration/ResultsSummary/CalibrationResult.tsx +++ b/app/src/organisms/CheckCalibration/ResultsSummary/CalibrationResult.tsx @@ -16,7 +16,7 @@ import { StyledText } from '../../../atoms/text' import { RenderResult } from './RenderResult' export const RESULT_SUMMARY_STYLE = css` - border: 1px solid ${COLORS.medGreyEnabled}; + border: 1px solid ${COLORS.grey30}; border-radius: ${BORDERS.radiusSoftCorners}; ` diff --git a/app/src/organisms/CheckCalibration/ResultsSummary/RenderMountInformation.tsx b/app/src/organisms/CheckCalibration/ResultsSummary/RenderMountInformation.tsx index 56f979d7af3..55473d04003 100644 --- a/app/src/organisms/CheckCalibration/ResultsSummary/RenderMountInformation.tsx +++ b/app/src/organisms/CheckCalibration/ResultsSummary/RenderMountInformation.tsx @@ -32,7 +32,7 @@ export const RenderMountInformation = ({ {`${mount} MOUNT`} {pipette != null ? ( diff --git a/app/src/organisms/CheckCalibration/ResultsSummary/RenderResult.tsx b/app/src/organisms/CheckCalibration/ResultsSummary/RenderResult.tsx index 44e891c5ab9..b07545a25dd 100644 --- a/app/src/organisms/CheckCalibration/ResultsSummary/RenderResult.tsx +++ b/app/src/organisms/CheckCalibration/ResultsSummary/RenderResult.tsx @@ -20,7 +20,7 @@ export const RenderResult = ({ isBadCal }: RenderResultProps): JSX.Element => { return ( {isBadCal ? t('recalibration_recommended') : t('good_calibration')} @@ -28,7 +28,7 @@ export const RenderResult = ({ isBadCal }: RenderResultProps): JSX.Element => { diff --git a/app/src/organisms/CheckCalibration/ResultsSummary/__tests__/CalibrationHealthCheckResults.test.tsx b/app/src/organisms/CheckCalibration/ResultsSummary/__tests__/CalibrationHealthCheckResults.test.tsx index f7bf80788f5..4e72d2fb78e 100644 --- a/app/src/organisms/CheckCalibration/ResultsSummary/__tests__/CalibrationHealthCheckResults.test.tsx +++ b/app/src/organisms/CheckCalibration/ResultsSummary/__tests__/CalibrationHealthCheckResults.test.tsx @@ -15,7 +15,7 @@ describe('CalibrationHealthCheckResults', () => { let props: React.ComponentProps beforeEach(() => { props = { - isCalibrationCompleted: true, + isCalibrationRecommended: false, } }) @@ -23,23 +23,23 @@ describe('CalibrationHealthCheckResults', () => { const { getByText, getByTestId } = render(props) getByText('Calibration Health Check Results') const statusLabel = getByText('Calibration complete') - expect(statusLabel).toHaveStyle(`color: ${String(COLORS.darkBlackEnabled)}`) + expect(statusLabel).toHaveStyle(`color: ${String(COLORS.black90)}`) expect(statusLabel).toHaveStyle( `font-weight: ${String(TYPOGRAPHY.fontWeightSemiBold)}` ) expect(getByTestId('status_circle')).toHaveStyle( - `color: ${String(COLORS.successEnabled)}` + `color: ${String(COLORS.green50)}` ) expect(getByTestId('status_circle')).toHaveStyle(`height: 0.3125rem`) expect(getByTestId('status_circle')).toHaveStyle(`width: 0.3125rem`) }) it('should render title and warning StatusLabel when calibration results includes bad', () => { - props.isCalibrationCompleted = false + props.isCalibrationRecommended = true const { getByText, getByTestId } = render(props) getByText('Calibration recommended') expect(getByTestId('status_circle')).toHaveStyle( - `color: ${String(COLORS.warningEnabled)}` + `color: ${String(COLORS.yellow50)}` ) }) }) diff --git a/app/src/organisms/CheckCalibration/ResultsSummary/__tests__/RenderResult.test.tsx b/app/src/organisms/CheckCalibration/ResultsSummary/__tests__/RenderResult.test.tsx index 36b8e3ff04c..c2f463b5c6d 100644 --- a/app/src/organisms/CheckCalibration/ResultsSummary/__tests__/RenderResult.test.tsx +++ b/app/src/organisms/CheckCalibration/ResultsSummary/__tests__/RenderResult.test.tsx @@ -23,7 +23,7 @@ describe('RenderResult', () => { const { getByText, getByTestId } = render(props) getByText('Good calibration') const icon = getByTestId('RenderResult_icon') - expect(icon).toHaveStyle(`color: ${String(COLORS.successEnabled)}`) + expect(icon).toHaveStyle(`color: ${String(COLORS.green50)}`) expect(icon).toHaveStyle(`height: ${String(SIZE_1)}`) expect(icon).toHaveStyle(`width: ${String(SIZE_1)}`) }) @@ -33,7 +33,7 @@ describe('RenderResult', () => { const { getByText, getByTestId } = render(props) getByText('Recalibration recommended') const icon = getByTestId('RenderResult_icon') - expect(icon).toHaveStyle(`color: ${String(COLORS.warningEnabled)}`) + expect(icon).toHaveStyle(`color: ${String(COLORS.yellow50)}`) expect(icon).toHaveStyle(`height: ${String(SIZE_1)}`) expect(icon).toHaveStyle(`width: ${String(SIZE_1)}`) }) diff --git a/app/src/organisms/CheckCalibration/ResultsSummary/index.tsx b/app/src/organisms/CheckCalibration/ResultsSummary/index.tsx index 624f8946b91..54ba1e6110b 100644 --- a/app/src/organisms/CheckCalibration/ResultsSummary/index.tsx +++ b/app/src/organisms/CheckCalibration/ResultsSummary/index.tsx @@ -111,7 +111,7 @@ export function ResultsSummary( // check all calibration status // if all of them are good, this returns true. otherwise return false - const isCalibrationCompleted = (): boolean => { + const isCalibrationRecommended = (): boolean => { const isOffsetsBad = pipetteResultsBad(calibrationsByMount.left.calibration).offsetBad && pipetteResultsBad(calibrationsByMount.right.calibration).offsetBad @@ -130,7 +130,7 @@ export function ResultsSummary( > diff --git a/app/src/organisms/CheckCalibration/__tests__/CheckCalibration.test.tsx b/app/src/organisms/CheckCalibration/__tests__/CheckCalibration.test.tsx index 8330d215205..98cb02cbfbc 100644 --- a/app/src/organisms/CheckCalibration/__tests__/CheckCalibration.test.tsx +++ b/app/src/organisms/CheckCalibration/__tests__/CheckCalibration.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' import { when, resetAllWhenMocks } from 'jest-when' import { renderWithProviders } from '@opentrons/components' @@ -24,15 +25,33 @@ const mockGetDeckDefinitions = getDeckDefinitions as jest.MockedFunction< > describe('CheckCalibration', () => { - let render: ( - props?: Partial> - ) => ReturnType - let dispatchRequests: jest.MockedFunction + const dispatchRequests = jest.fn() const mockCalibrationCheckSession: Sessions.CalibrationCheckSession = { id: 'fake_check_session_id', ...mockCalibrationCheckSessionAttributes, } + const render = ( + props: Partial> = {} + ) => { + const { + showSpinner = false, + isJogging = false, + session = mockCalibrationCheckSession, + } = props + return renderWithProviders>( + , + { i18nInstance: i18n } + ) + } + const SPECS: CheckCalibrationSpec[] = [ { heading: 'Before you begin', currentStep: 'sessionStarted' }, { heading: 'Prepare the space', currentStep: 'labwareLoaded' }, @@ -66,38 +85,16 @@ describe('CheckCalibration', () => { beforeEach(() => { when(mockGetDeckDefinitions).calledWith().mockReturnValue({}) - - dispatchRequests = jest.fn() - - render = ( - props: Partial> = {} - ) => { - const { - showSpinner = false, - isJogging = false, - session = mockCalibrationCheckSession, - } = props - return renderWithProviders>( - , - { i18nInstance: i18n } - ) - } }) afterEach(() => { resetAllWhenMocks() + jest.resetAllMocks() }) SPECS.forEach(spec => { it(`renders correct contents when currentStep is ${spec.currentStep}`, () => { - const { getByRole, queryByRole } = render({ + render({ session: { ...mockCalibrationCheckSession, details: { @@ -105,38 +102,38 @@ describe('CheckCalibration', () => { currentStep: spec.currentStep, }, }, - })[0] + }) SPECS.forEach(({ currentStep, heading }) => { if (currentStep === spec.currentStep) { expect( - getByRole('heading', { name: spec.heading }) + screen.getByRole('heading', { name: spec.heading }) ).toBeInTheDocument() } else { - expect(queryByRole('heading', { name: heading })).toBeNull() + expect(screen.queryByRole('heading', { name: heading })).toBeNull() } }) }) }) it('renders confirm exit on exit click', () => { - const { getByRole, queryByRole } = render()[0] - + render() expect( - queryByRole('heading', { + screen.queryByRole('heading', { name: 'Calibration Health Check progress will be lost', }) ).toBeNull() - getByRole('button', { name: 'Exit' }).click() + const button = screen.getByRole('button', { name: 'Exit' }) + fireEvent.click(button) expect( - getByRole('heading', { + screen.getByRole('heading', { name: 'Calibration Health Check progress will be lost', }) ).toBeInTheDocument() }) it('does not render contents when showSpinner is true', () => { - const { queryByRole } = render({ + render({ showSpinner: true, session: { ...mockCalibrationCheckSession, @@ -145,8 +142,10 @@ describe('CheckCalibration', () => { currentStep: 'sessionStarted', }, }, - })[0] - expect(queryByRole('heading', { name: 'Before you begin' })).toBeNull() + }) + expect( + screen.queryByRole('heading', { name: 'Before you begin' }) + ).toBeNull() }) it('does dispatch jog requests when not isJogging', () => { @@ -158,8 +157,9 @@ describe('CheckCalibration', () => { currentStep: Sessions.DECK_STEP_PREPARING_PIPETTE, }, } - const { getByRole } = render({ isJogging: false, session })[0] - getByRole('button', { name: 'forward' }).click() + render({ isJogging: false, session }) + const button = screen.getByRole('button', { name: 'forward' }) + fireEvent.click(button) expect(dispatchRequests).toHaveBeenCalledWith( Sessions.createSessionCommand('robot-name', session.id, { command: Sessions.sharedCalCommands.JOG, @@ -177,8 +177,9 @@ describe('CheckCalibration', () => { currentStep: Sessions.DECK_STEP_PREPARING_PIPETTE, }, } - const { getByRole } = render({ isJogging: true, session })[0] - getByRole('button', { name: 'forward' }).click() + render({ isJogging: true, session }) + const button = screen.getByRole('button', { name: 'forward' }) + fireEvent.click(button) expect(dispatchRequests).not.toHaveBeenCalledWith( Sessions.createSessionCommand('robot-name', session.id, { command: Sessions.sharedCalCommands.JOG, diff --git a/app/src/organisms/CheckCalibration/__tests__/ReturnTip.test.tsx b/app/src/organisms/CheckCalibration/__tests__/ReturnTip.test.tsx index 15ccb375f46..a16ef3ebd23 100644 --- a/app/src/organisms/CheckCalibration/__tests__/ReturnTip.test.tsx +++ b/app/src/organisms/CheckCalibration/__tests__/ReturnTip.test.tsx @@ -1,104 +1,3 @@ -import * as React from 'react' -import { mount } from 'enzyme' -import * as Fixtures from '../../../redux/sessions/__fixtures__' -import * as Sessions from '../../../redux/sessions' -import { ReturnTip } from '../ReturnTip' - -import type { ReactWrapper } from 'enzyme' -import type { Mount } from '@opentrons/components' - -const mockSessionDetails = Fixtures.mockRobotCalibrationCheckSessionDetails - describe('ReturnTip', () => { - let render: ( - props?: Partial< - React.ComponentProps & { pipMount: Mount } - > - ) => ReactWrapper> - let mockSendCommands: jest.MockedFunction - - const getContinueButton = ( - wrapper: ReactWrapper> - ) => wrapper.find('button[aria-label="return tip"]') - - beforeEach(() => { - mockSendCommands = jest.fn() - - render = (props = {}) => { - const { - pipMount = 'left', - isMulti = false, - tipRack = Fixtures.mockDeckCalTipRack, - calBlock = null, - sendCommands = mockSendCommands, - cleanUpAndExit = jest.fn(), - currentStep = Sessions.CHECK_STEP_RESULTS_SUMMARY, - sessionType = Sessions.SESSION_TYPE_CALIBRATION_HEALTH_CHECK, - comparisonsByPipette = mockSessionDetails.comparisonsByPipette, - instruments = mockSessionDetails.instruments, - activePipette = mockSessionDetails.activePipette, - } = props - return mount( - - ) - } - }) - - afterEach(() => { - jest.resetAllMocks() - }) - - it('on continue, if final pipette, return tip and transition', () => { - const wrapper = render({ - activePipette: { - ...mockSessionDetails.activePipette, - rank: Sessions.CHECK_PIPETTE_RANK_SECOND, - }, - }) - getContinueButton(wrapper).invoke('onClick')?.({} as React.MouseEvent) - - expect(mockSendCommands).toHaveBeenCalledWith( - { command: Sessions.checkCommands.RETURN_TIP }, - { command: Sessions.checkCommands.TRANSITION } - ) - }) - - it('on continue, if first pipette with diff tip racks, return tip and switch', () => { - const wrapper = render() - getContinueButton(wrapper).invoke('onClick')?.({} as React.MouseEvent) - - expect(mockSendCommands).toHaveBeenCalledWith( - { command: Sessions.checkCommands.RETURN_TIP }, - { command: Sessions.checkCommands.CHECK_SWITCH_PIPETTE } - ) - }) - - it('on continue, if first pipette with same tip racks, return tip and switch, then move to ref point', () => { - const wrapper = render({ - instruments: mockSessionDetails.instruments.map(i => ({ - ...i, - tipRackLoadName: 'same-tip-rack-name', - })), - }) - getContinueButton(wrapper).invoke('onClick')?.({} as React.MouseEvent) - - expect(mockSendCommands).toHaveBeenCalledWith( - { command: Sessions.checkCommands.RETURN_TIP }, - { command: Sessions.checkCommands.CHECK_SWITCH_PIPETTE }, - { command: Sessions.checkCommands.MOVE_TO_REFERENCE_POINT } - ) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/ChildNavigation/ChildNavigation.stories.tsx b/app/src/organisms/ChildNavigation/ChildNavigation.stories.tsx new file mode 100644 index 00000000000..c39b4b20dc1 --- /dev/null +++ b/app/src/organisms/ChildNavigation/ChildNavigation.stories.tsx @@ -0,0 +1,50 @@ +import * as React from 'react' +import { touchScreenViewport } from '../../DesignTokens/constants' +import { SmallButton } from '../../atoms/buttons' +import { ChildNavigation } from '.' +import type { Story, Meta } from '@storybook/react' + +export default { + title: 'ODD/Organisms/ChildNavigation', + parameters: touchScreenViewport, +} as Meta + +const Template: Story> = args => ( + +) +export const Default = Template.bind({}) +Default.args = { + header: 'Header', +} + +export const TitleWithNormalSmallButton = Template.bind({}) +TitleWithNormalSmallButton.args = { + header: 'Header', + buttonText: 'ButtonText', + onClickButton: () => {}, +} + +export const TitleWithLinkButton = Template.bind({}) +TitleWithLinkButton.args = { + header: 'Header', + buttonText: 'Setup Instructions', + buttonType: 'tertiaryLowLight', + iconName: 'information', + iconPlacement: 'startIcon', + onClickButton: () => {}, +} + +export const TitleWithTwoButtons = Template.bind({}) +const secondaryButtonProps: React.ComponentProps = { + onClick: () => {}, + buttonText: 'Setup Instructions', + buttonType: 'tertiaryLowLight', + iconName: 'information', + iconPlacement: 'startIcon', +} +TitleWithTwoButtons.args = { + header: 'Header', + buttonText: 'ButtonText', + onClickButton: () => {}, + secondaryButtonProps, +} diff --git a/app/src/organisms/ChildNavigation/__tests__/ChildNavigation.test.tsx b/app/src/organisms/ChildNavigation/__tests__/ChildNavigation.test.tsx new file mode 100644 index 00000000000..81380cf9ffe --- /dev/null +++ b/app/src/organisms/ChildNavigation/__tests__/ChildNavigation.test.tsx @@ -0,0 +1,74 @@ +import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' + +import { renderWithProviders } from '@opentrons/components' +import { SmallButton } from '../../../atoms/buttons' +import { ChildNavigation } from '..' + +const render = (props: React.ComponentProps) => + renderWithProviders() + +const mockOnClickBack = jest.fn() +const mockOnClickButton = jest.fn() +const mockOnClickSecondaryButton = jest.fn() + +const mockSecondaryButtonProps: React.ComponentProps = { + onClick: mockOnClickSecondaryButton, + buttonText: 'Setup Instructions', + buttonType: 'tertiaryLowLight', + iconName: 'information', + iconPlacement: 'startIcon', +} + +describe('ChildNavigation', () => { + let props: React.ComponentProps + + beforeEach(() => { + props = { + header: 'mock header', + onClickBack: mockOnClickBack, + } + }) + + it('should render text and back button', () => { + render(props) + screen.getByText('mock header') + screen.getByTestId('ChildNavigation_Back_Button') + }) + + it('should call a mock function when tapping the back button', () => { + render(props) + fireEvent.click(screen.getByTestId('ChildNavigation_Back_Button')) + expect(mockOnClickBack).toHaveBeenCalled() + }) + + it('should render text, back button and small button', () => { + props = { + ...props, + buttonText: 'mock button', + onClickButton: mockOnClickButton, + } + render(props) + screen.getByText('mock header') + screen.getByTestId('ChildNavigation_Back_Button') + const mockButton = screen.getByText('mock button') + fireEvent.click(mockButton) + expect(mockOnClickButton).toHaveBeenCalled() + }) + + it('should render text, back button and 2 buttons', () => { + props = { + ...props, + buttonText: 'mock button', + onClickButton: mockOnClickButton, + secondaryButtonProps: mockSecondaryButtonProps, + } + render(props) + screen.getByText('mock header') + screen.getByTestId('ChildNavigation_Back_Button') + screen.getByText('mock button') + const secondaryButton = screen.getByText('Setup Instructions') + fireEvent.click(secondaryButton) + expect(mockOnClickSecondaryButton).toHaveBeenCalled() + }) +}) diff --git a/app/src/organisms/ChildNavigation/index.tsx b/app/src/organisms/ChildNavigation/index.tsx index ffe65792ac4..e50a4e8bbe7 100644 --- a/app/src/organisms/ChildNavigation/index.tsx +++ b/app/src/organisms/ChildNavigation/index.tsx @@ -4,6 +4,7 @@ import styled from 'styled-components' import { ALIGN_CENTER, COLORS, + DIRECTION_ROW, Flex, Icon, JUSTIFY_FLEX_START, @@ -19,7 +20,12 @@ import { SmallButton } from '../../atoms/buttons' import { InlineNotification } from '../../atoms/InlineNotification' import { StyledText } from '../../atoms/text' +import type { IconName } from '@opentrons/components' import type { InlineNotificationProps } from '../../atoms/InlineNotification' +import type { + IconPlacement, + SmallButtonTypes, +} from '../../atoms/buttons/SmallButton' interface ChildNavigationProps { header: string @@ -27,6 +33,10 @@ interface ChildNavigationProps { buttonText?: React.ReactNode inlineNotification?: InlineNotificationProps onClickButton?: React.MouseEventHandler + buttonType?: SmallButtonTypes + iconName?: IconName + iconPlacement?: IconPlacement + secondaryButtonProps?: React.ComponentProps } export function ChildNavigation({ @@ -35,6 +45,10 @@ export function ChildNavigation({ inlineNotification, onClickBack, onClickButton, + buttonType = 'primary', + iconName, + iconPlacement, + secondaryButtonProps, }: ChildNavigationProps): JSX.Element { return ( - - + + {header} {onClickButton != null && buttonText != null ? ( - + + {secondaryButtonProps != null ? ( + + ) : null} + + + ) : null} {inlineNotification != null ? ( -const mockDeckThumbnail = DeckThumbnail as jest.MockedFunction< - typeof DeckThumbnail -> const mockUseTrackCreateProtocolRunEvent = useTrackCreateProtocolRunEvent as jest.MockedFunction< typeof useTrackCreateProtocolRunEvent > @@ -50,7 +45,6 @@ describe('ChooseProtocolSlideout', () => { () => new Promise(resolve => resolve({})) ) mockGetStoredProtocols.mockReturnValue([storedProtocolDataFixture]) - mockDeckThumbnail.mockReturnValue(
mock Deck Thumbnail
) mockUseCreateRunFromProtocol.mockReturnValue({ createRunFromProtocolSource: mockCreateRunFromProtocol, reset: jest.fn(), @@ -64,53 +58,48 @@ describe('ChooseProtocolSlideout', () => { }) it('renders slideout if showSlideout true', () => { - const [{ queryAllByText }] = render({ + render({ robot: mockConnectableRobot, onCloseClick: jest.fn(), showSlideout: true, }) - expect(queryAllByText('Choose Protocol to Run')).not.toBeFalsy() - expect(queryAllByText(mockConnectableRobot.name)).not.toBeFalsy() - }) - it('does not render slideout if showSlideout false', () => { - const [{ queryAllByText }] = render({ - robot: mockConnectableRobot, - onCloseClick: jest.fn(), - showSlideout: true, - }) - expect(queryAllByText('Choose Protocol to Run').length).toEqual(0) - expect(queryAllByText(mockConnectableRobot.name).length).toEqual(0) + screen.getByText(/choose protocol to run/i) + screen.getByText(/opentrons-robot-name/i) }) it('renders an available protocol option for every stored protocol if any', () => { - const [{ getByText, queryByRole }] = render({ + render({ robot: mockConnectableRobot, onCloseClick: jest.fn(), showSlideout: true, }) - getByText('mock Deck Thumbnail') - getByText('fakeSrcFileName') - expect(queryByRole('heading', { name: 'No protocols found' })).toBeNull() + screen.getByLabelText('protocol deck map') + screen.getByText('fakeSrcFileName') + expect( + screen.queryByRole('heading', { name: 'No protocols found' }) + ).toBeNull() }) it('renders an empty state if no protocol options', () => { mockGetStoredProtocols.mockReturnValue([]) - const [{ getByRole, queryByText }] = render({ + render({ robot: mockConnectableRobot, onCloseClick: jest.fn(), showSlideout: true, }) - expect(queryByText('mock Deck Thumbnail')).toBeNull() - expect(queryByText('fakeSrcFileName')).toBeNull() + expect(screen.queryByLabelText('protocol deck map')).toBeNull() + expect(screen.queryByText('fakeSrcFileName')).toBeNull() expect( - getByRole('heading', { name: 'No protocols found' }) + screen.getByRole('heading', { name: 'No protocols found' }) ).toBeInTheDocument() }) it('calls createRunFromProtocolSource if CTA clicked', () => { - const [{ getByRole }] = render({ + render({ robot: mockConnectableRobot, onCloseClick: jest.fn(), showSlideout: true, }) - const proceedButton = getByRole('button', { name: 'Proceed to setup' }) + const proceedButton = screen.getByRole('button', { + name: 'Proceed to setup', + }) fireEvent.click(proceedButton) expect(mockCreateRunFromProtocol).toHaveBeenCalledWith({ files: [expect.any(File)], @@ -126,19 +115,21 @@ describe('ChooseProtocolSlideout', () => { reset: jest.fn(), runCreationErrorCode: 500, }) - const [{ getByRole, getByText }] = render({ + render({ robot: mockConnectableRobot, onCloseClick: jest.fn(), showSlideout: true, }) - const proceedButton = getByRole('button', { name: 'Proceed to setup' }) - proceedButton.click() + const proceedButton = screen.getByRole('button', { + name: 'Proceed to setup', + }) + fireEvent.click(proceedButton) expect(mockCreateRunFromProtocol).toHaveBeenCalledWith({ files: [expect.any(File)], protocolKey: storedProtocolDataFixture.protocolKey, }) expect(mockTrackCreateProtocolRunEvent).toHaveBeenCalled() - expect(getByText('run creation error')).toBeInTheDocument() + expect(screen.getByText('run creation error')).toBeInTheDocument() }) it('renders error state when run creation error code is 409', () => { @@ -149,20 +140,24 @@ describe('ChooseProtocolSlideout', () => { reset: jest.fn(), runCreationErrorCode: 409, }) - const [{ getByRole, getByText }] = render({ + render({ robot: mockConnectableRobot, onCloseClick: jest.fn(), showSlideout: true, }) - const proceedButton = getByRole('button', { name: 'Proceed to setup' }) - proceedButton.click() + const proceedButton = screen.getByRole('button', { + name: 'Proceed to setup', + }) + fireEvent.click(proceedButton) expect(mockCreateRunFromProtocol).toHaveBeenCalledWith({ files: [expect.any(File)], protocolKey: storedProtocolDataFixture.protocolKey, }) expect(mockTrackCreateProtocolRunEvent).toHaveBeenCalled() - getByText('This robot is busy and can’t run this protocol right now.') - const link = getByRole('link', { name: 'Go to Robot' }) + screen.getByText( + 'This robot is busy and can’t run this protocol right now.' + ) + const link = screen.getByRole('link', { name: 'Go to Robot' }) fireEvent.click(link) expect(link.getAttribute('href')).toEqual('/devices/opentrons-robot-name') }) diff --git a/app/src/organisms/ChooseProtocolSlideout/index.tsx b/app/src/organisms/ChooseProtocolSlideout/index.tsx index 3e7b7b1fdfe..2b928495a7b 100644 --- a/app/src/organisms/ChooseProtocolSlideout/index.tsx +++ b/app/src/organisms/ChooseProtocolSlideout/index.tsx @@ -8,19 +8,21 @@ import { useSelector } from 'react-redux' import { css } from 'styled-components' import { - SPACING, - SIZE_1, - TYPOGRAPHY, ALIGN_CENTER, - JUSTIFY_CENTER, - Box, - Flex, BORDERS, + Box, + COLORS, DIRECTION_COLUMN, DISPLAY_BLOCK, + Flex, Icon, + JUSTIFY_CENTER, + OVERFLOW_WRAP_ANYWHERE, PrimaryButton, - COLORS, + ProtocolDeck, + SIZE_1, + SPACING, + TYPOGRAPHY, } from '@opentrons/components' import { useLogger } from '../../logger' @@ -30,12 +32,11 @@ import { appShellRequestor } from '../../redux/shell/remote' import { Slideout } from '../../atoms/Slideout' import { StyledText } from '../../atoms/text' import { MiniCard } from '../../molecules/MiniCard' -import { DeckThumbnail } from '../../molecules/DeckThumbnail' import { useTrackCreateProtocolRunEvent } from '../Devices/hooks' import { useCreateRunFromProtocol } from '../ChooseRobotToRunProtocolSlideout/useCreateRunFromProtocol' import { ApplyHistoricOffsets } from '../ApplyHistoricOffsets' import { useOffsetCandidatesForAnalysis } from '../ApplyHistoricOffsets/hooks/useOffsetCandidatesForAnalysis' - +import { getAnalysisStatus } from '../ProtocolsLanding/utils' import type { Robot } from '../../redux/discovery/types' import type { StoredProtocolData } from '../../redux/protocol-storage' import type { State } from '../../redux/types' @@ -58,9 +59,17 @@ export function ChooseProtocolSlideoutComponent( selectedProtocol, setSelectedProtocol, ] = React.useState(null) + const analysisStatus = getAnalysisStatus( + false, + selectedProtocol?.mostRecentAnalysis + ) + const missingAnalysisData = + analysisStatus === 'error' || analysisStatus === 'stale' + const [shouldApplyOffsets, setShouldApplyOffsets] = React.useState(true) const offsetCandidates = useOffsetCandidatesForAnalysis( - selectedProtocol?.mostRecentAnalysis ?? null, + (!missingAnalysisData ? selectedProtocol?.mostRecentAnalysis : null) ?? + null, robot.ip ) @@ -134,9 +143,21 @@ export function ChooseProtocolSlideoutComponent( offsetCandidates={offsetCandidates} shouldApplyOffsets={shouldApplyOffsets} setShouldApplyOffsets={setShouldApplyOffsets} - commands={selectedProtocol?.mostRecentAnalysis?.commands ?? []} - labware={selectedProtocol?.mostRecentAnalysis?.labware ?? []} - modules={selectedProtocol?.mostRecentAnalysis?.modules ?? []} + commands={ + (!missingAnalysisData + ? selectedProtocol?.mostRecentAnalysis?.commands + : []) ?? [] + } + labware={ + (!missingAnalysisData + ? selectedProtocol?.mostRecentAnalysis?.labware + : []) ?? [] + } + modules={ + (!missingAnalysisData + ? selectedProtocol?.mostRecentAnalysis?.modules + : []) ?? [] + } /> - + + handleSelectProtocol(storedProtocol)} > @@ -223,17 +248,16 @@ function StoredProtocolList(props: StoredProtocolListProps): JSX.Element { height="4.25rem" width="4.75rem" > - + {!missingAnalysisData ? ( + + ) : null} {storedProtocol.mostRecentAnalysis?.metadata ?.protocolName ?? @@ -241,13 +265,18 @@ function StoredProtocolList(props: StoredProtocolListProps): JSX.Element { storedProtocol.protocolKey}
- {runCreationError != null && isSelected ? ( + {(runCreationError != null || missingAnalysisData) && + isSelected ? ( <> ) : null} @@ -256,8 +285,8 @@ function StoredProtocolList(props: StoredProtocolListProps): JSX.Element { {runCreationError != null && isSelected ? ( ) : null} - + {missingAnalysisData && isSelected ? ( + + {analysisStatus === 'stale' + ? t('protocol_analysis_stale') + : t('protocol_analysis_failed')} + { + + ), + }} + /> + } + + ) : null} + ) })}
@@ -298,11 +358,11 @@ function StoredProtocolList(props: StoredProtocolListProps): JSX.Element { css={css` ${BORDERS.cardOutlineBorder} &:hover { - border-color: ${COLORS.medGreyEnabled}; + border-color: ${COLORS.grey30}; } `} > - + void isSelected: boolean - isOnDifferentSoftwareVersion: boolean + isSelectedRobotOnDifferentSoftwareVersion: boolean registerRobotBusyStatus: React.Dispatch isError?: boolean showIdleOnly?: boolean @@ -47,7 +48,7 @@ export function AvailableRobotOption( onClick, isSelected, isError = false, - isOnDifferentSoftwareVersion, + isSelectedRobotOnDifferentSoftwareVersion, showIdleOnly = false, registerRobotBusyStatus, } = props @@ -58,11 +59,11 @@ export function AvailableRobotOption( getRobotModelByName(state, robotName) ) - const { data: runsData } = useAllRunsQuery( + const { data: runsData } = useNotifyAllRunsQuery( { pageLength: 0 }, { onSuccess: data => { - if (data?.links?.current != null) + if ((data as Runs)?.links?.current != null) registerRobotBusyStatus({ type: 'robotIsBusy', robotName }) else { registerRobotBusyStatus({ type: 'robotIsIdle', robotName }) @@ -99,7 +100,9 @@ export function AvailableRobotOption(
- {(isError || isOnDifferentSoftwareVersion) && isSelected ? ( + {(isError || isSelectedRobotOnDifferentSoftwareVersion) && + isSelected ? ( <> - + ) : null} - {isOnDifferentSoftwareVersion && isSelected ? ( + {isSelectedRobotOnDifferentSoftwareVersion && isSelected ? ( a { - color: ${COLORS.errorText}; + color: ${COLORS.red60}; text-decoration: ${TYPOGRAPHY.textDecorationUnderline}; } `} diff --git a/app/src/organisms/ChooseRobotSlideout/__tests__/ChooseRobotSlideout.test.tsx b/app/src/organisms/ChooseRobotSlideout/__tests__/ChooseRobotSlideout.test.tsx index f30fc4e8028..2a4ec6fda28 100644 --- a/app/src/organisms/ChooseRobotSlideout/__tests__/ChooseRobotSlideout.test.tsx +++ b/app/src/organisms/ChooseRobotSlideout/__tests__/ChooseRobotSlideout.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { renderWithProviders } from '@opentrons/components' import { StaticRouter } from 'react-router-dom' -import { fireEvent } from '@testing-library/react' +import { fireEvent, screen } from '@testing-library/react' import { i18n } from '../../../i18n' import { @@ -11,7 +11,6 @@ import { getUnreachableRobots, startDiscovery, } from '../../../redux/discovery' -import { getRobotUpdateDisplayInfo } from '../../../redux/robot-update' import { mockConnectableRobot, mockReachableRobot, @@ -24,9 +23,6 @@ jest.mock('../../../redux/discovery') jest.mock('../../../redux/robot-update') jest.mock('../../../redux/networking') -const mockGetBuildrootUpdateDisplayInfo = getRobotUpdateDisplayInfo as jest.MockedFunction< - typeof getRobotUpdateDisplayInfo -> const mockGetConnectableRobots = getConnectableRobots as jest.MockedFunction< typeof getConnectableRobots > @@ -59,11 +55,6 @@ const mockSetSelectedRobot = jest.fn() describe('ChooseRobotSlideout', () => { beforeEach(() => { - mockGetBuildrootUpdateDisplayInfo.mockReturnValue({ - autoUpdateAction: '', - autoUpdateDisabledReason: null, - updateFromFileDisabledReason: null, - }) mockGetConnectableRobots.mockReturnValue([mockConnectableRobot]) mockGetUnreachableRobots.mockReturnValue([mockUnreachableRobot]) mockGetReachableRobots.mockReturnValue([mockReachableRobot]) @@ -76,76 +67,72 @@ describe('ChooseRobotSlideout', () => { }) it('renders slideout if isExpanded true', () => { - const [{ queryAllByText }] = render({ + render({ onCloseClick: jest.fn(), isExpanded: true, + isSelectedRobotOnDifferentSoftwareVersion: false, selectedRobot: null, setSelectedRobot: jest.fn(), title: 'choose robot slideout title', + robotType: 'OT-2 Standard', }) - expect(queryAllByText('Choose Robot to Run')).not.toBeFalsy() - expect(queryAllByText('fakeSrcFileName')).not.toBeFalsy() - }) - it('does not render slideout if isExpanded false', () => { - const [{ queryAllByText }] = render({ - onCloseClick: jest.fn(), - isExpanded: true, - selectedRobot: null, - setSelectedRobot: jest.fn(), - title: 'choose robot slideout title', - }) - expect(queryAllByText('Choose Robot to Run').length).toEqual(0) - expect(queryAllByText('fakeSrcFileName').length).toEqual(0) + screen.getByText('choose robot slideout title') }) it('shows a warning if the protocol has failed analysis', () => { - const [{ getByText }] = render({ + render({ onCloseClick: jest.fn(), isExpanded: true, + isSelectedRobotOnDifferentSoftwareVersion: false, selectedRobot: null, setSelectedRobot: jest.fn(), title: 'choose robot slideout title', isAnalysisError: true, + robotType: 'OT-2 Standard', }) - getByText( + screen.getByText( 'This protocol failed in-app analysis. It may be unusable on robots without custom software configurations.' ) }) it('renders an available robot option for every connectable robot, and link for other robots', () => { - const [{ queryByText }] = render({ + render({ onCloseClick: jest.fn(), isExpanded: true, + isSelectedRobotOnDifferentSoftwareVersion: false, selectedRobot: null, setSelectedRobot: jest.fn(), title: 'choose robot slideout title', + robotType: 'OT-2 Standard', }) - expect(queryByText('opentrons-robot-name')).toBeInTheDocument() - expect( - queryByText('2 unavailable robots are not listed.') - ).toBeInTheDocument() + screen.getByText('opentrons-robot-name') + screen.getByText('2 unavailable robots are not listed.') }) it('if scanning, show robots, but do not show link to other devices', () => { mockGetScanning.mockReturnValue(true) - const [{ queryByText }] = render({ + render({ onCloseClick: jest.fn(), isExpanded: true, + isSelectedRobotOnDifferentSoftwareVersion: false, selectedRobot: null, setSelectedRobot: jest.fn(), title: 'choose robot slideout title', + robotType: 'OT-2 Standard', }) - expect(queryByText('opentrons-robot-name')).toBeInTheDocument() + screen.getByText('opentrons-robot-name') expect( - queryByText('2 unavailable robots are not listed.') + screen.queryByText('2 unavailable robots are not listed.') ).not.toBeInTheDocument() }) it('if not scanning, show refresh button, start discovery if clicked', () => { - const [{ getByRole }, { dispatch }] = render({ + const { dispatch } = render({ onCloseClick: jest.fn(), isExpanded: true, + isSelectedRobotOnDifferentSoftwareVersion: false, selectedRobot: null, setSelectedRobot: mockSetSelectedRobot, title: 'choose robot slideout title', - }) - const refreshButton = getByRole('button', { name: 'refresh' }) + robotType: 'OT-2 Standard', + })[1] + const refreshButton = screen.getByRole('button', { name: 'refresh' }) fireEvent.click(refreshButton) expect(mockStartDiscovery).toHaveBeenCalled() expect(dispatch).toHaveBeenCalledWith({ type: 'mockStartDiscovery' }) @@ -155,23 +142,25 @@ describe('ChooseRobotSlideout', () => { { ...mockConnectableRobot, name: 'otherRobot', ip: 'otherIp' }, mockConnectableRobot, ]) - const [{ getByText }] = render({ + render({ onCloseClick: jest.fn(), isExpanded: true, + isSelectedRobotOnDifferentSoftwareVersion: false, selectedRobot: null, setSelectedRobot: mockSetSelectedRobot, title: 'choose robot slideout title', + robotType: 'OT-2 Standard', }) expect(mockSetSelectedRobot).toBeCalledWith({ ...mockConnectableRobot, name: 'otherRobot', ip: 'otherIp', }) - const mockRobot = getByText('opentrons-robot-name') - mockRobot.click() // unselect default robot + const mockRobot = screen.getByText('opentrons-robot-name') + fireEvent.click(mockRobot) // unselect default robot expect(mockSetSelectedRobot).toBeCalledWith(mockConnectableRobot) - const otherRobot = getByText('otherRobot') - otherRobot.click() + const otherRobot = screen.getByText('otherRobot') + fireEvent.click(otherRobot) expect(mockSetSelectedRobot).toBeCalledWith({ ...mockConnectableRobot, name: 'otherRobot', diff --git a/app/src/organisms/ChooseRobotSlideout/index.tsx b/app/src/organisms/ChooseRobotSlideout/index.tsx index e196a8bdcb4..40b5c7197dd 100644 --- a/app/src/organisms/ChooseRobotSlideout/index.tsx +++ b/app/src/organisms/ChooseRobotSlideout/index.tsx @@ -5,38 +5,40 @@ import { NavLink } from 'react-router-dom' import { css } from 'styled-components' import { - SPACING, - Icon, - Flex, - Link, - COLORS, + ALIGN_CENTER, + ALIGN_FLEX_END, BORDERS, + COLORS, DIRECTION_COLUMN, + DIRECTION_ROW, DISPLAY_INLINE_BLOCK, - TYPOGRAPHY, - SIZE_1, - ALIGN_CENTER, - ALIGN_FLEX_END, + Flex, + Icon, JUSTIFY_CENTER, + Link, + OVERFLOW_WRAP_ANYWHERE, + SIZE_1, SIZE_4, - DIRECTION_ROW, + SPACING, + TYPOGRAPHY, } from '@opentrons/components' +import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE } from '@opentrons/shared-data' import { getConnectableRobots, getReachableRobots, getUnreachableRobots, getScanning, startDiscovery, + RE_ROBOT_MODEL_OT2, RE_ROBOT_MODEL_OT3, - ROBOT_MODEL_OT3, } from '../../redux/discovery' -import { getRobotUpdateDisplayInfo } from '../../redux/robot-update' import { Banner } from '../../atoms/Banner' import { Slideout } from '../../atoms/Slideout' import { StyledText } from '../../atoms/text' import { AvailableRobotOption } from './AvailableRobotOption' +import type { RobotType } from '@opentrons/shared-data' import type { SlideoutProps } from '../../atoms/Slideout' import type { UseCreateRun } from '../../organisms/ChooseRobotToRunProtocolSlideout/useCreateRunFromProtocol' import type { State, Dispatch } from '../../redux/types' @@ -81,10 +83,13 @@ function robotBusyStatusByNameReducer( interface ChooseRobotSlideoutProps extends Omit, Partial { + isSelectedRobotOnDifferentSoftwareVersion: boolean + robotType: RobotType | null selectedRobot: Robot | null setSelectedRobot: (robot: Robot | null) => void - showOT3Only?: boolean isAnalysisError?: boolean + isAnalysisStale?: boolean + showIdleOnly?: boolean } export function ChooseRobotSlideout( @@ -96,31 +101,54 @@ export function ChooseRobotSlideout( onCloseClick, title, footer, - showOT3Only = false, isAnalysisError = false, + isAnalysisStale = false, isCreatingRun = false, + isSelectedRobotOnDifferentSoftwareVersion, reset: resetCreateRun, runCreationError, runCreationErrorCode, selectedRobot, setSelectedRobot, + robotType, + showIdleOnly = false, } = props const dispatch = useDispatch() const isScanning = useSelector((state: State) => getScanning(state)) const unhealthyReachableRobots = useSelector((state: State) => getReachableRobots(state) - ).filter(robot => - showOT3Only ? RE_ROBOT_MODEL_OT3.test(robot.robotModel) : true - ) + ).filter(robot => { + if (robotType === FLEX_ROBOT_TYPE) { + return RE_ROBOT_MODEL_OT3.test(robot.robotModel) + } else if (robotType === OT2_ROBOT_TYPE) { + return RE_ROBOT_MODEL_OT2.test(robot.robotModel) + } else { + return true + } + }) const unreachableRobots = useSelector((state: State) => getUnreachableRobots(state) - ).filter(robot => - showOT3Only ? RE_ROBOT_MODEL_OT3.test(robot.robotModel) : true - ) + ).filter(robot => { + if (robotType === FLEX_ROBOT_TYPE) { + return RE_ROBOT_MODEL_OT3.test(robot.robotModel) + } else if (robotType === OT2_ROBOT_TYPE) { + return RE_ROBOT_MODEL_OT2.test(robot.robotModel) + } else { + return true + } + }) const healthyReachableRobots = useSelector((state: State) => getConnectableRobots(state) - ).filter(robot => (showOT3Only ? robot.robotModel === ROBOT_MODEL_OT3 : true)) + ).filter(robot => { + if (robotType === FLEX_ROBOT_TYPE) { + return robot.robotModel === FLEX_ROBOT_TYPE + } else if (robotType === OT2_ROBOT_TYPE) { + return robot.robotModel === OT2_ROBOT_TYPE + } else { + return true + } + }) const [robotBusyStatusByName, registerRobotBusyStatus] = React.useReducer( robotBusyStatusByNameReducer, @@ -140,25 +168,9 @@ export function ChooseRobotSlideout( } }, [healthyReachableRobots, selectedRobot, setSelectedRobot]) - const isSelectedRobotOnWrongVersionOfSoftware = [ - 'upgrade', - 'downgrade', - ].includes( - useSelector((state: State) => { - const value = - selectedRobot != null - ? getRobotUpdateDisplayInfo(state, selectedRobot.name) - : { autoUpdateAction: '' } - return value - })?.autoUpdateAction - ) - const unavailableCount = unhealthyReachableRobots.length + unreachableRobots.length - // for now, the only use case for showing idle only is also the only use case for showing OT-3 only - const showIdleOnly = showOT3Only - return ( {t('protocol_failed_app_analysis')} ) : null} + {isAnalysisStale ? ( + {t('protocol_outdated_app_analysis')} + ) : null} {isScanning ? ( {t('app_settings:searching')} @@ -184,7 +199,7 @@ export function ChooseRobotSlideout( name="ot-spinner" spin size="1.25rem" - color={COLORS.darkGreyEnabled} + color={COLORS.grey50} /> ) : ( @@ -203,7 +218,7 @@ export function ChooseRobotSlideout( css={css` ${BORDERS.cardOutlineBorder} &:hover { - border-color: ${COLORS.medGreyEnabled}; + border-color: ${COLORS.grey30}; } `} flexDirection={DIRECTION_COLUMN} @@ -222,11 +237,9 @@ export function ChooseRobotSlideout( const isSelected = selectedRobot != null && selectedRobot.ip === robot.ip return ( - <> + { if (!isCreatingRun) { resetCreateRun?.() @@ -235,8 +248,8 @@ export function ChooseRobotSlideout( }} isError={runCreationError != null} isSelected={isSelected} - isOnDifferentSoftwareVersion={ - isSelectedRobotOnWrongVersionOfSoftware + isSelectedRobotOnDifferentSoftwareVersion={ + isSelectedRobotOnDifferentSoftwareVersion } showIdleOnly={showIdleOnly} registerRobotBusyStatus={registerRobotBusyStatus} @@ -244,8 +257,8 @@ export function ChooseRobotSlideout( {runCreationError != null && isSelected && ( )} - + ) }) )} @@ -282,7 +295,7 @@ export function ChooseRobotSlideout( textAlign={TYPOGRAPHY.textAlignCenter} marginTop={SPACING.spacing24} > - + {showIdleOnly ? t('unavailable_or_busy_robot_not_listed', { count: unavailableCount + reducerBusyCount, diff --git a/app/src/organisms/ChooseRobotToRunProtocolSlideout/__tests__/ChooseRobotToRunProtocolSlideout.test.tsx b/app/src/organisms/ChooseRobotToRunProtocolSlideout/__tests__/ChooseRobotToRunProtocolSlideout.test.tsx index d8167945e83..39304bd76c7 100644 --- a/app/src/organisms/ChooseRobotToRunProtocolSlideout/__tests__/ChooseRobotToRunProtocolSlideout.test.tsx +++ b/app/src/organisms/ChooseRobotToRunProtocolSlideout/__tests__/ChooseRobotToRunProtocolSlideout.test.tsx @@ -1,14 +1,11 @@ import * as React from 'react' import { renderWithProviders } from '@opentrons/components' import { StaticRouter } from 'react-router-dom' -import { fireEvent } from '@testing-library/react' +import { fireEvent, screen } from '@testing-library/react' import { when, resetAllWhenMocks } from 'jest-when' import { i18n } from '../../../i18n' -import { - useProtocolDetailsForRun, - useTrackCreateProtocolRunEvent, -} from '../../../organisms/Devices/hooks' +import { useTrackCreateProtocolRunEvent } from '../../../organisms/Devices/hooks' import { useCloseCurrentRun, useCurrentRunId, @@ -33,7 +30,6 @@ import { useCreateRunFromProtocol } from '../useCreateRunFromProtocol' import { useOffsetCandidatesForAnalysis } from '../../ApplyHistoricOffsets/hooks/useOffsetCandidatesForAnalysis' import { ChooseRobotToRunProtocolSlideout } from '../' -import type { ProtocolDetails } from '../../../organisms/Devices/hooks' import type { State } from '../../../redux/types' jest.mock('../../../organisms/Devices/hooks') @@ -77,9 +73,6 @@ const mockUseCurrentRunStatus = useCurrentRunStatus as jest.MockedFunction< typeof useCurrentRunStatus > -const mockUseProtocolDetailsForRun = useProtocolDetailsForRun as jest.MockedFunction< - typeof useProtocolDetailsForRun -> const mockUseCreateRunFromProtocol = useCreateRunFromProtocol as jest.MockedFunction< typeof useCreateRunFromProtocol > @@ -132,9 +125,6 @@ describe('ChooseRobotToRunProtocolSlideout', () => { }) mockUseCurrentRunId.mockReturnValue(null) mockUseCurrentRunStatus.mockReturnValue(null) - mockUseProtocolDetailsForRun.mockReturnValue({ - displayName: 'A Protocol for Otie', - } as ProtocolDetails) when(mockUseCreateRunFromProtocol) .calledWith( expect.any(Object), @@ -173,53 +163,48 @@ describe('ChooseRobotToRunProtocolSlideout', () => { }) it('renders slideout if showSlideout true', () => { - const [{ queryAllByText }] = render({ + render({ storedProtocolData: storedProtocolDataFixture, onCloseClick: jest.fn(), showSlideout: true, }) - expect(queryAllByText('Choose Robot to Run')).not.toBeFalsy() - expect(queryAllByText('fakeSrcFileName')).not.toBeFalsy() - }) - it('does not render slideout if showSlideout false', () => { - const [{ queryAllByText }] = render({ - storedProtocolData: storedProtocolDataFixture, - onCloseClick: jest.fn(), - showSlideout: true, - }) - expect(queryAllByText('Choose Robot to Run').length).toEqual(0) - expect(queryAllByText('fakeSrcFileName').length).toEqual(0) + screen.getByText(/Choose Robot to Run/i) + screen.getByText(/fakeSrcFileName/i) }) it('renders an available robot option for every connectable robot, and link for other robots', () => { - const [{ queryByText }] = render({ + render({ storedProtocolData: storedProtocolDataFixture, onCloseClick: jest.fn(), showSlideout: true, }) - expect(queryByText('opentrons-robot-name')).toBeInTheDocument() - expect( - queryByText('2 unavailable robots are not listed.') - ).toBeInTheDocument() + mockGetUnreachableRobots.mockReturnValue([ + { ...mockUnreachableRobot, robotModel: 'OT-3 Standard' }, + ]) + mockGetReachableRobots.mockReturnValue([ + { ...mockReachableRobot, robotModel: 'OT-3 Standard' }, + ]) + screen.getByText('opentrons-robot-name') + screen.getByText('2 unavailable or busy robots are not listed.') }) it('if scanning, show robots, but do not show link to other devices', () => { mockGetScanning.mockReturnValue(true) - const [{ queryByText }] = render({ + render({ storedProtocolData: storedProtocolDataFixture, onCloseClick: jest.fn(), showSlideout: true, }) - expect(queryByText('opentrons-robot-name')).toBeInTheDocument() + screen.getByText('opentrons-robot-name') expect( - queryByText('2 unavailable robots are not listed.') + screen.queryByText('2 unavailable robots are not listed.') ).not.toBeInTheDocument() }) it('if not scanning, show refresh button, start discovery if clicked', () => { - const [{ getByRole }, { dispatch }] = render({ + const { dispatch } = render({ storedProtocolData: storedProtocolDataFixture, onCloseClick: jest.fn(), showSlideout: true, - }) - const refreshButton = getByRole('button', { name: 'refresh' }) + })[1] + const refreshButton = screen.getByRole('button', { name: 'refresh' }) fireEvent.click(refreshButton) expect(mockStartDiscovery).toHaveBeenCalled() expect(dispatch).toHaveBeenCalledWith({ type: 'mockStartDiscovery' }) @@ -229,20 +214,22 @@ describe('ChooseRobotToRunProtocolSlideout', () => { { ...mockConnectableRobot, name: 'otherRobot', ip: 'otherIp' }, mockConnectableRobot, ]) - const [{ getByRole, getByText }] = render({ + render({ storedProtocolData: storedProtocolDataFixture, onCloseClick: jest.fn(), showSlideout: true, }) - const proceedButton = getByRole('button', { name: 'Proceed to setup' }) + const proceedButton = screen.getByRole('button', { + name: 'Proceed to setup', + }) expect(proceedButton).not.toBeDisabled() - const otherRobot = getByText('otherRobot') - otherRobot.click() // unselect default robot + const otherRobot = screen.getByText('otherRobot') + fireEvent.click(otherRobot) // unselect default robot expect(proceedButton).not.toBeDisabled() - const mockRobot = getByText('opentrons-robot-name') - mockRobot.click() + const mockRobot = screen.getByText('opentrons-robot-name') + fireEvent.click(mockRobot) expect(proceedButton).not.toBeDisabled() - proceedButton.click() + fireEvent.click(proceedButton) expect(mockCreateRunFromProtocolSource).toHaveBeenCalledWith({ files: [expect.any(File)], protocolKey: storedProtocolDataFixture.protocolKey, @@ -257,20 +244,20 @@ describe('ChooseRobotToRunProtocolSlideout', () => { autoUpdateDisabledReason: null, updateFromFileDisabledReason: null, }) - const [{ getByRole, getByText }] = render({ + render({ storedProtocolData: storedProtocolDataFixture, onCloseClick: jest.fn(), showSlideout: true, }) - const proceedButton = getByRole('button', { name: 'Proceed to setup' }) + const proceedButton = screen.getByRole('button', { + name: 'Proceed to setup', + }) expect(proceedButton).toBeDisabled() - expect( - getByText( - 'A robot software update is required to run protocols with this version of the Opentrons App.' - ) - ).toBeInTheDocument() - const linkToRobotDetails = getByText('Go to Robot') - linkToRobotDetails.click() + screen.getByText( + 'A robot software update is required to run protocols with this version of the Opentrons App.' + ) + const linkToRobotDetails = screen.getByText('Go to Robot') + fireEvent.click(linkToRobotDetails) }) it('renders error state when there is a run creation error', () => { @@ -281,19 +268,21 @@ describe('ChooseRobotToRunProtocolSlideout', () => { reset: jest.fn(), runCreationErrorCode: 500, }) - const [{ getByRole, getByText }] = render({ + render({ storedProtocolData: storedProtocolDataFixture, onCloseClick: jest.fn(), showSlideout: true, }) - const proceedButton = getByRole('button', { name: 'Proceed to setup' }) - proceedButton.click() + const proceedButton = screen.getByRole('button', { + name: 'Proceed to setup', + }) + fireEvent.click(proceedButton) expect(mockCreateRunFromProtocolSource).toHaveBeenCalledWith({ files: [expect.any(File)], protocolKey: storedProtocolDataFixture.protocolKey, }) expect(mockTrackCreateProtocolRunEvent).toHaveBeenCalled() - expect(getByText('run creation error')).toBeInTheDocument() + expect(screen.getByText('run creation error')).toBeInTheDocument() }) it('renders error state when run creation error code is 409', () => { @@ -304,20 +293,24 @@ describe('ChooseRobotToRunProtocolSlideout', () => { reset: jest.fn(), runCreationErrorCode: 409, }) - const [{ getByRole, getByText }] = render({ + render({ storedProtocolData: storedProtocolDataFixture, onCloseClick: jest.fn(), showSlideout: true, }) - const proceedButton = getByRole('button', { name: 'Proceed to setup' }) - proceedButton.click() + const proceedButton = screen.getByRole('button', { + name: 'Proceed to setup', + }) + fireEvent.click(proceedButton) expect(mockCreateRunFromProtocolSource).toHaveBeenCalledWith({ files: [expect.any(File)], protocolKey: storedProtocolDataFixture.protocolKey, }) expect(mockTrackCreateProtocolRunEvent).toHaveBeenCalled() - getByText('This robot is busy and can’t run this protocol right now.') - const link = getByRole('link', { name: 'Go to Robot' }) + screen.getByText( + 'This robot is busy and can’t run this protocol right now.' + ) + const link = screen.getByRole('link', { name: 'Go to Robot' }) fireEvent.click(link) expect(link.getAttribute('href')).toEqual('/devices/opentrons-robot-name') }) @@ -339,7 +332,7 @@ describe('ChooseRobotToRunProtocolSlideout', () => { mockConnectableRobot, { ...mockConnectableRobot, name: 'otherRobot', ip: 'otherIp' }, ]) - const [{ getByRole }] = render({ + render({ storedProtocolData: storedProtocolDataFixture, onCloseClick: jest.fn(), showSlideout: true, @@ -355,9 +348,11 @@ describe('ChooseRobotToRunProtocolSlideout', () => { }, ] ) - expect(getByRole('checkbox')).toBeChecked() - const proceedButton = getByRole('button', { name: 'Proceed to setup' }) - proceedButton.click() + expect(screen.getByRole('checkbox')).toBeChecked() + const proceedButton = screen.getByRole('button', { + name: 'Proceed to setup', + }) + fireEvent.click(proceedButton) expect(mockCreateRunFromProtocolSource).toHaveBeenCalledWith({ files: [expect.any(File)], protocolKey: storedProtocolDataFixture.protocolKey, @@ -384,17 +379,19 @@ describe('ChooseRobotToRunProtocolSlideout', () => { mockConnectableRobot, { ...mockConnectableRobot, name: 'otherRobot', ip: 'otherIp' }, ]) - const [{ getByRole, getByText }] = render({ + render({ storedProtocolData: storedProtocolDataFixture, onCloseClick: jest.fn(), showSlideout: true, }) - const otherRobot = getByText('otherRobot') - otherRobot.click() // unselect default robot + const otherRobot = screen.getByText('otherRobot') + fireEvent.click(otherRobot) // unselect default robot - expect(getByRole('checkbox')).toBeChecked() - const proceedButton = getByRole('button', { name: 'Proceed to setup' }) - proceedButton.click() + expect(screen.getByRole('checkbox')).toBeChecked() + const proceedButton = screen.getByRole('button', { + name: 'Proceed to setup', + }) + fireEvent.click(proceedButton) expect(mockUseCreateRunFromProtocol).nthCalledWith( 2, expect.any(Object), diff --git a/app/src/organisms/ChooseRobotToRunProtocolSlideout/index.tsx b/app/src/organisms/ChooseRobotToRunProtocolSlideout/index.tsx index 20a9c9ed733..c4e50fc5a88 100644 --- a/app/src/organisms/ChooseRobotToRunProtocolSlideout/index.tsx +++ b/app/src/organisms/ChooseRobotToRunProtocolSlideout/index.tsx @@ -14,6 +14,8 @@ import { } from '@opentrons/components' import { getRobotUpdateDisplayInfo } from '../../redux/robot-update' +import { OPENTRONS_USB } from '../../redux/discovery' +import { appShellRequestor } from '../../redux/shell/remote' import { useTrackCreateProtocolRunEvent } from '../Devices/hooks' import { ApplyHistoricOffsets } from '../ApplyHistoricOffsets' import { useOffsetCandidatesForAnalysis } from '../ApplyHistoricOffsets/hooks/useOffsetCandidatesForAnalysis' @@ -82,7 +84,13 @@ export function ChooseRobotToRunProtocolSlideoutComponent( }) }, }, - selectedRobot != null ? { hostname: selectedRobot.ip } : null, + selectedRobot != null + ? { + hostname: selectedRobot.ip, + requestor: + selectedRobot?.ip === OPENTRONS_USB ? appShellRequestor : undefined, + } + : null, shouldApplyOffsets ? offsetCandidates.map(({ vector, location, definitionUri }) => ({ vector, @@ -96,18 +104,14 @@ export function ChooseRobotToRunProtocolSlideoutComponent( createRunFromProtocolSource({ files: srcFileObjects, protocolKey }) } - const isSelectedRobotOnWrongVersionOfSoftware = [ + const { autoUpdateAction } = useSelector((state: State) => + getRobotUpdateDisplayInfo(state, selectedRobot?.name ?? '') + ) + + const isSelectedRobotOnDifferentSoftwareVersion = [ 'upgrade', 'downgrade', - ].includes( - useSelector((state: State) => { - const value = - selectedRobot != null - ? getRobotUpdateDisplayInfo(state, selectedRobot.name) - : { autoUpdateAction: '' } - return value - })?.autoUpdateAction - ) + ].includes(autoUpdateAction) if ( protocolKey == null || @@ -127,9 +131,18 @@ export function ChooseRobotToRunProtocolSlideoutComponent( first(srcFileNames) ?? protocolKey + // intentionally show both robot types if analysis has any error + const robotType = + mostRecentAnalysis != null && mostRecentAnalysis.errors.length === 0 + ? mostRecentAnalysis?.robotType ?? null + : null + return ( {isCreatingRun ? ( @@ -163,10 +176,12 @@ export function ChooseRobotToRunProtocolSlideoutComponent( } selectedRobot={selectedRobot} setSelectedRobot={setSelectedRobot} + robotType={robotType} isCreatingRun={isCreatingRun} reset={resetCreateRun} runCreationError={runCreationError} runCreationErrorCode={runCreationErrorCode} + showIdleOnly={true} /> ) } diff --git a/app/src/organisms/CommandText/LoadCommandText.tsx b/app/src/organisms/CommandText/LoadCommandText.tsx index 09272ba3494..52ddc0ec7da 100644 --- a/app/src/organisms/CommandText/LoadCommandText.tsx +++ b/app/src/organisms/CommandText/LoadCommandText.tsx @@ -5,14 +5,12 @@ import { getOccludedSlotCountForModule, LoadLabwareRunTimeCommand, } from '@opentrons/shared-data' -import { - getPipetteNameSpecs, - OT2_STANDARD_MODEL, -} from '@opentrons/shared-data/js' +import { getPipetteNameSpecs } from '@opentrons/shared-data/js' import type { RunTimeCommand, CompletedProtocolAnalysis, + RobotType, } from '@opentrons/shared-data' import { getLabwareName, @@ -25,11 +23,13 @@ import { interface LoadCommandTextProps { command: RunTimeCommand robotSideAnalysis: CompletedProtocolAnalysis + robotType: RobotType } export const LoadCommandText = ({ command, robotSideAnalysis, + robotType, }: LoadCommandTextProps): JSX.Element | null => { const { t } = useTranslation('run_details') @@ -50,7 +50,7 @@ export const LoadCommandText = ({ case 'loadModule': { const occludedSlotCount = getOccludedSlotCountForModule( getModuleType(command.params.model), - robotSideAnalysis.robotType ?? OT2_STANDARD_MODEL + robotType ) return t('load_module_protocol_setup', { count: occludedSlotCount, @@ -75,7 +75,7 @@ export const LoadCommandText = ({ moduleModel != null ? getOccludedSlotCountForModule( getModuleType(moduleModel), - robotSideAnalysis.robotType ?? OT2_STANDARD_MODEL + robotType ) : 1, labware: command.result?.definition.metadata.displayName, @@ -136,7 +136,10 @@ export const LoadCommandText = ({ ? t('load_labware_info_protocol_setup_off_deck', { labware }) : t('load_labware_info_protocol_setup_no_module', { labware, - slot_name: command.params.location?.slotName, + slot_name: + 'addressableAreaName' in command.params.location + ? command.params.location.addressableAreaName + : command.params.location.slotName, }) } } diff --git a/app/src/organisms/CommandText/MoveLabwareCommandText.tsx b/app/src/organisms/CommandText/MoveLabwareCommandText.tsx index 8f20c8ef1c1..f2a68a76fd2 100644 --- a/app/src/organisms/CommandText/MoveLabwareCommandText.tsx +++ b/app/src/organisms/CommandText/MoveLabwareCommandText.tsx @@ -1,21 +1,23 @@ import { useTranslation } from 'react-i18next' -import type { - CompletedProtocolAnalysis, - MoveLabwareRunTimeCommand, -} from '@opentrons/shared-data/' +import { GRIPPER_WASTE_CHUTE_ADDRESSABLE_AREA } from '@opentrons/shared-data' import { getLabwareName } from './utils' import { getLabwareDisplayLocation } from './utils/getLabwareDisplayLocation' import { getFinalLabwareLocation } from './utils/getFinalLabwareLocation' - +import type { + CompletedProtocolAnalysis, + MoveLabwareRunTimeCommand, + RobotType, +} from '@opentrons/shared-data' interface MoveLabwareCommandTextProps { command: MoveLabwareRunTimeCommand robotSideAnalysis: CompletedProtocolAnalysis + robotType: RobotType } export function MoveLabwareCommandText( props: MoveLabwareCommandTextProps ): JSX.Element { const { t } = useTranslation('protocol_command_text') - const { command, robotSideAnalysis } = props + const { command, robotSideAnalysis, robotType } = props const { labwareId, newLocation, strategy } = command.params const allPreviousCommands = robotSideAnalysis.commands.slice( @@ -26,24 +28,41 @@ export function MoveLabwareCommandText( const newDisplayLocation = getLabwareDisplayLocation( robotSideAnalysis, newLocation, - t + t, + robotType + ) + + const location = newDisplayLocation.includes( + GRIPPER_WASTE_CHUTE_ADDRESSABLE_AREA ) + ? 'Waste Chute' + : newDisplayLocation return strategy === 'usingGripper' ? t('move_labware_using_gripper', { labware: getLabwareName(robotSideAnalysis, labwareId), old_location: oldLocation != null - ? getLabwareDisplayLocation(robotSideAnalysis, oldLocation, t) + ? getLabwareDisplayLocation( + robotSideAnalysis, + oldLocation, + t, + robotType + ) : '', - new_location: newDisplayLocation, + new_location: location, }) : t('move_labware_manually', { labware: getLabwareName(robotSideAnalysis, labwareId), old_location: oldLocation != null - ? getLabwareDisplayLocation(robotSideAnalysis, oldLocation, t) + ? getLabwareDisplayLocation( + robotSideAnalysis, + oldLocation, + t, + robotType + ) : '', - new_location: newDisplayLocation, + new_location: location, }) } diff --git a/app/src/organisms/CommandText/PipettingCommandText.tsx b/app/src/organisms/CommandText/PipettingCommandText.tsx index ad5e5900588..2ac59c1a788 100644 --- a/app/src/organisms/CommandText/PipettingCommandText.tsx +++ b/app/src/organisms/CommandText/PipettingCommandText.tsx @@ -1,43 +1,57 @@ import { useTranslation } from 'react-i18next' + import { CompletedProtocolAnalysis, - AspirateRunTimeCommand, - DispenseRunTimeCommand, - BlowoutRunTimeCommand, - MoveToWellRunTimeCommand, - DropTipRunTimeCommand, - PickUpTipRunTimeCommand, getLabwareDefURI, + RobotType, } from '@opentrons/shared-data' + import { getLabwareDefinitionsFromCommands } from '../LabwarePositionCheck/utils/labware' import { getLoadedLabware } from './utils/accessors' -import { getLabwareName, getLabwareDisplayLocation } from './utils' +import { + getLabwareName, + getLabwareDisplayLocation, + getFinalLabwareLocation, + getWellRange, +} from './utils' +import type { + PipetteName, + PipettingRunTimeCommand, +} from '@opentrons/shared-data' -type PipettingRunTimeCommmand = - | AspirateRunTimeCommand - | DispenseRunTimeCommand - | BlowoutRunTimeCommand - | MoveToWellRunTimeCommand - | DropTipRunTimeCommand - | PickUpTipRunTimeCommand interface PipettingCommandTextProps { - command: PipettingRunTimeCommmand + command: PipettingRunTimeCommand robotSideAnalysis: CompletedProtocolAnalysis + robotType: RobotType } export const PipettingCommandText = ({ command, robotSideAnalysis, + robotType, }: PipettingCommandTextProps): JSX.Element | null => { const { t } = useTranslation('protocol_command_text') - const { labwareId, wellName } = command.params - const labwareLocation = getLoadedLabware(robotSideAnalysis, labwareId) - ?.location + const labwareId = + 'labwareId' in command.params ? command.params.labwareId : '' + const wellName = 'wellName' in command.params ? command.params.wellName : '' + const allPreviousCommands = robotSideAnalysis.commands.slice( + 0, + robotSideAnalysis.commands.findIndex(c => c.id === command.id) + ) + const labwareLocation = getFinalLabwareLocation( + labwareId, + allPreviousCommands + ) const displayLocation = labwareLocation != null - ? getLabwareDisplayLocation(robotSideAnalysis, labwareLocation, t) + ? getLabwareDisplayLocation( + robotSideAnalysis, + labwareLocation, + t, + robotType + ) : '' switch (command.commandType) { case 'aspirate': { @@ -78,13 +92,6 @@ export const PipettingCommandText = ({ flow_rate: flowRate, }) } - case 'moveToWell': { - return t('move_to_well', { - well_name: wellName, - labware: getLabwareName(robotSideAnalysis, labwareId), - labware_location: displayLocation, - }) - } case 'dropTip': { const loadedLabware = getLoadedLabware(robotSideAnalysis, labwareId) const labwareDefinitions = getLabwareDefinitionsFromCommands( @@ -105,12 +112,39 @@ export const PipettingCommandText = ({ }) } case 'pickUpTip': { + const pipetteId = command.params.pipetteId + const pipetteName: + | PipetteName + | undefined = robotSideAnalysis.pipettes.find( + pip => pip.id === pipetteId + )?.pipetteName + return t('pickup_tip', { - well_name: wellName, + well_range: getWellRange( + pipetteId, + allPreviousCommands, + wellName, + pipetteName + ), labware: getLabwareName(robotSideAnalysis, labwareId), labware_location: displayLocation, }) } + case 'dropTipInPlace': { + return t('drop_tip_in_place') + } + case 'dispenseInPlace': { + const { volume, flowRate } = command.params + return t('dispense_in_place', { volume: volume, flow_rate: flowRate }) + } + case 'blowOutInPlace': { + const { flowRate } = command.params + return t('blowout_in_place', { flow_rate: flowRate }) + } + case 'aspirateInPlace': { + const { flowRate, volume } = command.params + return t('aspirate_in_place', { volume, flow_rate: flowRate }) + } default: { console.warn( 'PipettingCommandText encountered a command with an unrecognized commandType: ', diff --git a/app/src/organisms/CommandText/TemperatureCommandText.tsx b/app/src/organisms/CommandText/TemperatureCommandText.tsx index 5040092166f..2d09926add2 100644 --- a/app/src/organisms/CommandText/TemperatureCommandText.tsx +++ b/app/src/organisms/CommandText/TemperatureCommandText.tsx @@ -5,7 +5,7 @@ import type { TCSetTargetBlockTemperatureCreateCommand, TCSetTargetLidTemperatureCreateCommand, HeaterShakerSetTargetTemperatureCreateCommand, -} from '@opentrons/shared-data/protocol/types/schemaV7/command/module' +} from '@opentrons/shared-data' type TemperatureCreateCommand = | TemperatureModuleSetTargetTemperatureCreateCommand diff --git a/app/src/organisms/CommandText/__fixtures__/mockRobotSideAnalysis.json b/app/src/organisms/CommandText/__fixtures__/mockRobotSideAnalysis.json index bb4d9c6181f..0f084ae89b6 100644 --- a/app/src/organisms/CommandText/__fixtures__/mockRobotSideAnalysis.json +++ b/app/src/organisms/CommandText/__fixtures__/mockRobotSideAnalysis.json @@ -6331,6 +6331,66 @@ "result": {}, "startedAt": "2023-01-31T21:53:14.615361+00:00", "completedAt": "2023-01-31T21:53:14.616757+00:00" + }, + { + "id": "aca688ed-4916-496d-aae8-ca0e6e56c47b", + "key": "e4be36b4-500c-45dd-8405-73115c80aa4c", + "commandType": "moveToAddressableArea", + "createdAt": "2023-11-29T20:31:00.780650+00:00", + "startedAt": "2023-11-29T20:31:29.248207+00:00", + "completedAt": "2023-11-29T20:31:33.972466+00:00", + "status": "succeeded", + "params": { + "forceDirect": false, + "pipetteId": "c51ddc01-2d21-4e8a-9b10-2cef033488e8", + "addressableAreaName": "1ChannelWasteChute", + "offset": { "x": 0, "y": 0, "z": 0 } + } + }, + { + "id": "aca688ed-4916-496d-aae8-ca0e6e56c47c", + "key": "e4be36b4-500c-45dd-8405-73115c80aa44", + "commandType": "moveToAddressableArea", + "createdAt": "2023-11-29T20:31:00.780650+00:00", + "startedAt": "2023-11-29T20:31:29.248207+00:00", + "completedAt": "2023-11-29T20:31:33.972466+00:00", + "status": "succeeded", + "params": { + "forceDirect": false, + "pipetteId": "c51ddc01-2d21-4e8a-9b10-2cef033488e8", + "addressableAreaName": "fixedTrash", + "offset": { "x": 0, "y": 0, "z": 0 } + } + }, + { + "id": "aca688ed-4916-496d-aae8-ca0e6e56c47d", + "key": "e4be36b4-500c-45dd-8405-73115c80aa4z", + "commandType": "moveToAddressableArea", + "createdAt": "2023-11-29T20:31:00.780650+00:00", + "startedAt": "2023-11-29T20:31:29.248207+00:00", + "completedAt": "2023-11-29T20:31:33.972466+00:00", + "status": "succeeded", + "params": { + "forceDirect": false, + "pipetteId": "c51ddc01-2d21-4e8a-9b10-2cef033488e8", + "addressableAreaName": "movableTrashD3", + "offset": { "x": 0, "y": 0, "z": 0 } + } + }, + { + "id": "aca688ed-4916-496d-aae8-ca0e6e56c47e", + "key": "e4be36b4-500c-45dd-8405-73115c80aa4x", + "commandType": "moveToAddressableArea", + "createdAt": "2023-11-29T20:31:00.780650+00:00", + "startedAt": "2023-11-29T20:31:29.248207+00:00", + "completedAt": "2023-11-29T20:31:33.972466+00:00", + "status": "succeeded", + "params": { + "forceDirect": false, + "pipetteId": "c51ddc01-2d21-4e8a-9b10-2cef033488e8", + "addressableAreaName": "D3", + "offset": { "x": 0, "y": 0, "z": 0 } + } } ], "errors": [], diff --git a/app/src/organisms/CommandText/__tests__/CommandText.test.tsx b/app/src/organisms/CommandText/__tests__/CommandText.test.tsx index d2172535e45..9bc879b7b4d 100644 --- a/app/src/organisms/CommandText/__tests__/CommandText.test.tsx +++ b/app/src/organisms/CommandText/__tests__/CommandText.test.tsx @@ -1,23 +1,31 @@ import * as React from 'react' import { renderWithProviders } from '@opentrons/components' +import { + FLEX_ROBOT_TYPE, + OT2_ROBOT_TYPE, + GRIPPER_WASTE_CHUTE_ADDRESSABLE_AREA, + MoveToAddressableAreaForDropTipRunTimeCommand, +} from '@opentrons/shared-data' import { i18n } from '../../../i18n' import { CommandText } from '../' import { mockRobotSideAnalysis } from '../__fixtures__' -import type { MoveToWellRunTimeCommand } from '@opentrons/shared-data/protocol/types/schemaV7/command/gantry' import type { + AspirateInPlaceRunTimeCommand, + BlowoutInPlaceRunTimeCommand, BlowoutRunTimeCommand, - DispenseRunTimeCommand, ConfigureForVolumeRunTimeCommand, -} from '@opentrons/shared-data/protocol/types/schemaV7/command/pipetting' -import type { + DispenseInPlaceRunTimeCommand, + DispenseRunTimeCommand, + DropTipInPlaceRunTimeCommand, + DropTipRunTimeCommand, + LabwareDefinition2, LoadLabwareRunTimeCommand, LoadLiquidRunTimeCommand, -} from '@opentrons/shared-data/protocol/types/schemaV7/command/setup' -import { - LabwareDefinition2, + MoveToAddressableAreaRunTimeCommand, + MoveToWellRunTimeCommand, + PrepareToAspirateRunTimeCommand, RunTimeCommand, - DropTipRunTimeCommand, } from '@opentrons/shared-data' describe('CommandText', () => { @@ -30,6 +38,7 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( , { i18nInstance: i18n } @@ -48,6 +57,7 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( , { i18nInstance: i18n } @@ -73,6 +83,7 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( , { i18nInstance: i18n } @@ -82,6 +93,26 @@ describe('CommandText', () => { ) } }) + it('renders correct text for dispenseInPlace', () => { + const { getByText } = renderWithProviders( + , + { i18nInstance: i18n } + )[0] + getByText('Dispensing 50 µL in place at 300 µL/sec') + }) it('renders correct text for blowout', () => { const dispenseCommand = mockRobotSideAnalysis.commands.find( c => c.commandType === 'dispense' @@ -95,6 +126,7 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( , { i18nInstance: i18n } @@ -104,6 +136,45 @@ describe('CommandText', () => { ) } }) + it('renders correct text for blowOutInPlace', () => { + const { getByText } = renderWithProviders( + , + { i18nInstance: i18n } + )[0] + getByText('Blowing out in place at 300 µL/sec') + }) + it('renders correct text for aspirateInPlace', () => { + const { getByText } = renderWithProviders( + , + { i18nInstance: i18n } + )[0] + getByText('Aspirating 10 µL in place at 300 µL/sec') + }) it('renders correct text for moveToWell', () => { const dispenseCommand = mockRobotSideAnalysis.commands.find( c => c.commandType === 'aspirate' @@ -117,6 +188,7 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( , { i18nInstance: i18n } @@ -124,6 +196,136 @@ describe('CommandText', () => { getByText('Moving to well A1 of NEST 1 Well Reservoir 195 mL in Slot 5') } }) + it('renders correct text for labware involving an addressable area slot', () => { + const { getByText } = renderWithProviders( + , + { + i18nInstance: i18n, + } + )[0] + getByText( + 'Moving Opentrons 96 Tip Rack 300 µL using gripper from Slot 9 to Slot 5' + ) + }) + it('renders correct text for moveToAddressableArea for Waste Chutes', () => { + const { getByText } = renderWithProviders( + , + { i18nInstance: i18n } + )[0] + getByText('Moving to Waste Chute') + }) + it('renders correct text for moveToAddressableArea for Fixed Trash', () => { + const { getByText } = renderWithProviders( + , + { i18nInstance: i18n } + )[0] + getByText('Moving to Fixed Trash') + }) + it('renders correct text for moveToAddressableArea for Trash Bins', () => { + const { getByText } = renderWithProviders( + , + { i18nInstance: i18n } + )[0] + getByText('Moving to Trash Bin in D3') + }) + it('renders correct text for moveToAddressableAreaForDropTip for Trash Bin', () => { + const { getByText } = renderWithProviders( + , + { i18nInstance: i18n } + )[0] + getByText('Dropping tip into Trash Bin in D3') + }) + it('renders correct text for moveToAddressableArea for slots', () => { + const { getByText } = renderWithProviders( + , + { i18nInstance: i18n } + )[0] + getByText('Moving to D3') + }) it('renders correct text for configureForVolume', () => { const command = { commandType: 'configureForVolume', @@ -136,12 +338,31 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( , { i18nInstance: i18n } )[0] getByText('Configure P300 Single-Channel GEN1 to aspirate 1 µL') }) + it('renders correct text for prepareToAspirate', () => { + const command = { + commandType: 'prepareToAspirate', + params: { + pipetteId: 'f6d1c83c-9d1b-4d0d-9de3-e6d649739cfb', + }, + } as PrepareToAspirateRunTimeCommand + + const { getByText } = renderWithProviders( + , + { i18nInstance: i18n } + )[0] + getByText('Preparing P300 Single-Channel GEN1 to aspirate') + }) it('renders correct text for dropTip', () => { const command = mockRobotSideAnalysis.commands.find( c => c.commandType === 'dropTip' @@ -151,6 +372,7 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( , { i18nInstance: i18n } @@ -162,6 +384,7 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( { )[0] getByText('Returning tip to A1 of Opentrons 96 Tip Rack 300 µL in Slot 9') }) + it('renders correct text for dropTipInPlace', () => { + const { getByText } = renderWithProviders( + , + { i18nInstance: i18n } + )[0] + getByText('Dropping tip in place') + }) it('renders correct text for pickUpTip', () => { const command = mockRobotSideAnalysis.commands.find( c => c.commandType === 'pickUpTip' @@ -187,12 +428,13 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( , { i18nInstance: i18n } )[0] getByText( - 'Picking up tip from A1 of Opentrons 96 Tip Rack 300 µL in Slot 9' + 'Picking up tip(s) from A1 of Opentrons 96 Tip Rack 300 µL in Slot 9' ) } }) @@ -205,6 +447,7 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( , { i18nInstance: i18n } @@ -221,6 +464,7 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( , { i18nInstance: i18n } @@ -236,6 +480,7 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( , { i18nInstance: i18n } @@ -250,6 +495,7 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( , { i18nInstance: i18n } @@ -264,6 +510,7 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( , { i18nInstance: i18n } @@ -301,6 +548,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -324,6 +572,7 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( , { i18nInstance: i18n } @@ -364,6 +613,7 @@ describe('CommandText', () => { const { getByText } = renderWithProviders( , { i18nInstance: i18n } @@ -386,6 +636,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -409,6 +660,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -431,6 +683,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -454,6 +707,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -479,6 +733,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -502,6 +757,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -509,7 +765,7 @@ describe('CommandText', () => { )[0] getByText('Setting Target Temperature of Heater-Shaker to 20°C') }) - it('renders correct text for thermocycler/runProfile', () => { + it('renders correct text for thermocycler/runProfile on Desktop', () => { const mockProfileSteps = [ { holdSeconds: 10, celsius: 20 }, { holdSeconds: 30, celsius: 40 }, @@ -528,6 +784,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -539,6 +796,40 @@ describe('CommandText', () => { getByText('temperature: 20°C, seconds: 10') getByText('temperature: 40°C, seconds: 30') }) + it('renders correct text for thermocycler/runProfile on ODD', () => { + const mockProfileSteps = [ + { holdSeconds: 10, celsius: 20 }, + { holdSeconds: 30, celsius: 40 }, + ] + const { getByText, queryByText } = renderWithProviders( + , + { + i18nInstance: i18n, + } + )[0] + getByText( + 'Thermocycler starting 2 repetitions of cycle composed of the following steps:' + ) + getByText('temperature: 20°C, seconds: 10') + expect( + queryByText('temperature: 40°C, seconds: 30') + ).not.toBeInTheDocument() + }) it('renders correct text for heaterShaker/setAndWaitForShakeSpeed', () => { const { getByText } = renderWithProviders( { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -578,6 +870,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -600,6 +893,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -622,6 +916,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -674,6 +969,7 @@ describe('CommandText', () => { } as RunTimeCommand } robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -699,6 +995,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -721,6 +1018,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -743,6 +1041,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -765,6 +1064,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -787,6 +1087,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -809,6 +1110,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -831,6 +1133,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -853,6 +1156,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -875,6 +1179,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -901,6 +1206,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -929,6 +1235,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -957,6 +1264,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -985,6 +1293,7 @@ describe('CommandText', () => { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, @@ -994,6 +1303,37 @@ describe('CommandText', () => { 'Moving Opentrons 96 Tip Rack 300 µL using gripper from Slot 9 to off deck' ) }) + it('renders correct text for move labware with gripper to waste chute', () => { + const { getByText } = renderWithProviders( + , + { + i18nInstance: i18n, + } + )[0] + getByText( + 'Moving Opentrons 96 Tip Rack 300 µL using gripper from Slot 9 to Waste Chute' + ) + }) it('renders correct text for move labware with gripper to module', () => { const { getByText } = renderWithProviders( { completedAt: null, }} robotSideAnalysis={mockRobotSideAnalysis} + robotType={FLEX_ROBOT_TYPE} />, { i18nInstance: i18n, diff --git a/app/src/organisms/CommandText/index.tsx b/app/src/organisms/CommandText/index.tsx index faf901fca3c..62f3fec5253 100644 --- a/app/src/organisms/CommandText/index.tsx +++ b/app/src/organisms/CommandText/index.tsx @@ -1,15 +1,29 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' -import { Flex, DIRECTION_COLUMN, SPACING } from '@opentrons/components' +import { + Flex, + DIRECTION_COLUMN, + SPACING, + ALIGN_CENTER, +} from '@opentrons/components' import { getPipetteNameSpecs, RunTimeCommand } from '@opentrons/shared-data' +import { + getAddressableAreaDisplayName, + getLabwareName, + getLabwareDisplayLocation, + getFinalLabwareLocation, +} from './utils' import { StyledText } from '../../atoms/text' import { LoadCommandText } from './LoadCommandText' import { PipettingCommandText } from './PipettingCommandText' import { TemperatureCommandText } from './TemperatureCommandText' import { MoveLabwareCommandText } from './MoveLabwareCommandText' -import type { CompletedProtocolAnalysis } from '@opentrons/shared-data/js' +import type { + CompletedProtocolAnalysis, + RobotType, +} from '@opentrons/shared-data/js' import type { StyleProps } from '@opentrons/components' const SIMPLE_TRANSLATION_KEY_BY_COMMAND_TYPE: { @@ -38,21 +52,34 @@ const SIMPLE_TRANSLATION_KEY_BY_COMMAND_TYPE: { interface Props extends StyleProps { command: RunTimeCommand robotSideAnalysis: CompletedProtocolAnalysis + robotType: RobotType + isOnDevice?: boolean } export function CommandText(props: Props): JSX.Element | null { - const { command, robotSideAnalysis, ...styleProps } = props + const { + command, + robotSideAnalysis, + robotType, + isOnDevice = false, + ...styleProps + } = props const { t } = useTranslation('protocol_command_text') switch (command.commandType) { case 'aspirate': + case 'aspirateInPlace': case 'dispense': + case 'dispenseInPlace': case 'blowout': - case 'moveToWell': + case 'blowOutInPlace': case 'dropTip': + case 'dropTipInPlace': case 'pickUpTip': { return ( - + ) } @@ -62,7 +89,7 @@ export function CommandText(props: Props): JSX.Element | null { case 'loadLiquid': { return ( - + ) } @@ -81,10 +108,17 @@ export function CommandText(props: Props): JSX.Element | null { const { profile } = command.params const steps = profile.map( ({ holdSeconds, celsius }: { holdSeconds: number; celsius: number }) => - t('tc_run_profile_steps', { celsius: celsius, seconds: holdSeconds }) + t('tc_run_profile_steps', { + celsius: celsius, + seconds: holdSeconds, + }).trim() ) return ( - + {t('tc_starting_profile', { repetitions: Object.keys(steps).length, @@ -92,9 +126,13 @@ export function CommandText(props: Props): JSX.Element | null {
    - {steps.map((step: string, index: number) => ( -
  • {step}
  • - ))} + {isOnDevice ? ( +
  • {steps[0]}
  • + ) : ( + steps.map((step: string, index: number) => ( +
  • {step}
  • + )) + )}
@@ -132,10 +170,37 @@ export function CommandText(props: Props): JSX.Element | null {
) } + case 'moveToWell': { + const { wellName, labwareId } = command.params + const allPreviousCommands = robotSideAnalysis.commands.slice( + 0, + robotSideAnalysis.commands.findIndex(c => c.id === command.id) + ) + const labwareLocation = getFinalLabwareLocation( + labwareId, + allPreviousCommands + ) + const displayLocation = + labwareLocation != null + ? getLabwareDisplayLocation( + robotSideAnalysis, + labwareLocation, + t, + robotType + ) + : '' + return t('move_to_well', { + well_name: wellName, + labware: getLabwareName(robotSideAnalysis, labwareId), + labware_location: displayLocation, + }) + } case 'moveLabware': { return ( - + ) } @@ -157,6 +222,71 @@ export function CommandText(props: Props): JSX.Element | null {
) } + case 'configureNozzleLayout': { + const { configurationParams, pipetteId } = command.params + const pipetteName = robotSideAnalysis.pipettes.find( + pip => pip.id === pipetteId + )?.pipetteName + + // TODO (sb, 11/9/23): Add support for other configurations when needed + return ( + + {t('configure_nozzle_layout', { + amount: configurationParams.style === 'COLUMN' ? '8' : 'all', + pipette: + pipetteName != null + ? getPipetteNameSpecs(pipetteName)?.displayName + : '', + })} + + ) + } + case 'prepareToAspirate': { + const { pipetteId } = command.params + const pipetteName = robotSideAnalysis.pipettes.find( + pip => pip.id === pipetteId + )?.pipetteName + + return ( + + {t('prepare_to_aspirate', { + pipette: + pipetteName != null + ? getPipetteNameSpecs(pipetteName)?.displayName + : '', + })} + + ) + } + case 'moveToAddressableArea': { + const addressableAreaDisplayName = getAddressableAreaDisplayName( + robotSideAnalysis, + command.id, + t + ) + + return ( + + {t('move_to_addressable_area', { + addressable_area: addressableAreaDisplayName, + })} + + ) + } + case 'moveToAddressableAreaForDropTip': { + const addressableAreaDisplayName = getAddressableAreaDisplayName( + robotSideAnalysis, + command.id, + t + ) + return ( + + {t('move_to_addressable_area_drop_tip', { + addressable_area: addressableAreaDisplayName, + })} + + ) + } case 'touchTip': case 'home': case 'savePosition': diff --git a/app/src/organisms/CommandText/utils/getAddressableAreaDisplayName.ts b/app/src/organisms/CommandText/utils/getAddressableAreaDisplayName.ts new file mode 100644 index 00000000000..cba0f3ca2cd --- /dev/null +++ b/app/src/organisms/CommandText/utils/getAddressableAreaDisplayName.ts @@ -0,0 +1,59 @@ +import type { + AddressableAreaName, + CompletedProtocolAnalysis, + MoveToAddressableAreaParams, +} from '@opentrons/shared-data' +import type { TFunction } from 'i18next' + +export function getAddressableAreaDisplayName( + analysis: CompletedProtocolAnalysis, + commandId: string, + t: TFunction +): string { + const addressableAreaCommand = (analysis?.commands ?? []).find( + command => command.id === commandId + ) + + if ( + addressableAreaCommand == null || + !('addressableAreaName' in addressableAreaCommand.params) + ) { + return '' + } + + const addressableAreaName: MoveToAddressableAreaParams['addressableAreaName'] = + addressableAreaCommand.params.addressableAreaName + + if (addressableAreaName.includes('movableTrash')) { + const slotName = getMovableTrashSlot(addressableAreaName) + return t('trash_bin_in_slot', { slot_name: slotName }) + } else if (addressableAreaName.includes('WasteChute')) { + return t('waste_chute') + } else if (addressableAreaName === 'fixedTrash') return t('fixed_trash') + else return addressableAreaName +} + +const getMovableTrashSlot = ( + addressableAreaName: AddressableAreaName +): string => { + switch (addressableAreaName) { + case 'movableTrashA1': + return 'A1' + case 'movableTrashA3': + return 'A3' + case 'movableTrashB1': + return 'B1' + case 'movableTrashB3': + return 'B3' + case 'movableTrashC1': + return 'C1' + case 'movableTrashC3': + return 'C3' + case 'movableTrashD1': + return 'D1' + case 'movableTrashD3': + return 'D3' + default: + return '' + } +} diff --git a/app/src/organisms/CommandText/utils/getLabwareDisplayLocation.ts b/app/src/organisms/CommandText/utils/getLabwareDisplayLocation.ts index 3852d4655ca..67128059463 100644 --- a/app/src/organisms/CommandText/utils/getLabwareDisplayLocation.ts +++ b/app/src/organisms/CommandText/utils/getLabwareDisplayLocation.ts @@ -5,18 +5,21 @@ import { getModuleType, getOccludedSlotCountForModule, LabwareLocation, - OT2_STANDARD_MODEL, } from '@opentrons/shared-data' import { getModuleDisplayLocation } from './getModuleDisplayLocation' import { getModuleModel } from './getModuleModel' import { getLabwareDefinitionsFromCommands } from '../../LabwarePositionCheck/utils/labware' -import type { CompletedProtocolAnalysis } from '@opentrons/shared-data/' -import type { TFunction } from 'react-i18next' +import type { + CompletedProtocolAnalysis, + RobotType, +} from '@opentrons/shared-data/' +import type { TFunction } from 'i18next' export function getLabwareDisplayLocation( robotSideAnalysis: CompletedProtocolAnalysis, location: LabwareLocation, - t: TFunction<'protocol_command_text'>, + t: TFunction, + robotType: RobotType, isOnDevice?: boolean ): string { if (location === 'offDeck') { @@ -25,6 +28,10 @@ export function getLabwareDisplayLocation( return isOnDevice ? location.slotName : t('slot', { slot_name: location.slotName }) + } else if ('addressableAreaName' in location) { + return isOnDevice + ? location.addressableAreaName + : t('slot', { slot_name: location.addressableAreaName }) } else if ('moduleId' in location) { const moduleModel = getModuleModel(robotSideAnalysis, location.moduleId) if (moduleModel == null) { @@ -40,7 +47,7 @@ export function getLabwareDisplayLocation( : t('module_in_slot', { count: getOccludedSlotCountForModule( getModuleType(moduleModel), - robotSideAnalysis.robotType ?? OT2_STANDARD_MODEL + robotType ), module: getModuleDisplayName(moduleModel), slot_name: slotName, @@ -69,6 +76,11 @@ export function getLabwareDisplayLocation( adapter: adapterDisplayName, slot: adapter.location.slotName, }) + } else if ('addressableAreaName' in adapter.location) { + return t('adapter_in_slot', { + adapter: adapterDisplayName, + slot: adapter.location.addressableAreaName, + }) } else if ('moduleId' in adapter.location) { const moduleIdUnderAdapter = adapter.location.moduleId const moduleModel = robotSideAnalysis.modules.find( @@ -85,7 +97,7 @@ export function getLabwareDisplayLocation( return t('adapter_in_mod_in_slot', { count: getOccludedSlotCountForModule( getModuleType(moduleModel), - robotSideAnalysis.robotType ?? OT2_STANDARD_MODEL + robotType ), module: getModuleDisplayName(moduleModel), adapter: adapterDisplayName, diff --git a/app/src/organisms/CommandText/utils/getWellRange.ts b/app/src/organisms/CommandText/utils/getWellRange.ts new file mode 100644 index 00000000000..7676aef6969 --- /dev/null +++ b/app/src/organisms/CommandText/utils/getWellRange.ts @@ -0,0 +1,46 @@ +import { + getPipetteNameSpecs, + PipetteName, + RunTimeCommand, +} from '@opentrons/shared-data' + +/** + * @param pipetteName name of pipette being used + * @param commands list of commands to search within + * @param wellName the target well for pickup tip + * @returns WellRange string of wells pipette will pickup tips from + */ +export function getWellRange( + pipetteId: string, + commands: RunTimeCommand[], + wellName: string, + pipetteName?: PipetteName +): string { + const pipetteChannels = pipetteName + ? getPipetteNameSpecs(pipetteName)?.channels ?? 1 + : 1 + let usedChannels = pipetteChannels + if (pipetteChannels === 96) { + for (const c of commands.reverse()) { + if ( + c.commandType === 'configureNozzleLayout' && + c.params?.pipetteId === pipetteId + ) { + // TODO(sb, 11/9/23): add support for quadrant and row configurations when needed + if (c.params.configurationParams.style === 'SINGLE') { + usedChannels = 1 + } else if (c.params.configurationParams.style === 'COLUMN') { + usedChannels = 8 + } + break + } + } + } + if (usedChannels === 96) { + return 'A1 - H12' + } else if (usedChannels === 8) { + const column = wellName.substr(1) + return `A${column} - H${column}` + } + return wellName +} diff --git a/app/src/organisms/CommandText/utils/index.ts b/app/src/organisms/CommandText/utils/index.ts index 851260f6790..2e8b67884fd 100644 --- a/app/src/organisms/CommandText/utils/index.ts +++ b/app/src/organisms/CommandText/utils/index.ts @@ -1,6 +1,9 @@ +export * from './getAddressableAreaDisplayName' export * from './getLabwareName' export * from './getPipetteNameOnMount' export * from './getModuleModel' export * from './getModuleDisplayLocation' export * from './getLiquidDisplayName' export * from './getLabwareDisplayLocation' +export * from './getFinalLabwareLocation' +export * from './getWellRange' diff --git a/app/src/organisms/ConfigurePipette/ConfigForm.tsx b/app/src/organisms/ConfigurePipette/ConfigForm.tsx index 5c640e6957b..919d4224f7a 100644 --- a/app/src/organisms/ConfigurePipette/ConfigForm.tsx +++ b/app/src/organisms/ConfigurePipette/ConfigForm.tsx @@ -16,13 +16,12 @@ import { } from './ConfigFormGroup' import type { FormikProps } from 'formik' +import type { FormValues } from './ConfigFormGroup' import type { PipetteSettingsField, PipetteSettingsFieldsMap, - PipetteSettingsFieldsUpdate, -} from '../../redux/pipettes/types' - -import type { FormValues } from './ConfigFormGroup' + UpdatePipetteSettingsData, +} from '@opentrons/api-client' export interface DisplayFieldProps extends PipetteSettingsField { name: string @@ -38,7 +37,7 @@ export interface DisplayQuirkFieldProps { export interface ConfigFormProps { settings: PipetteSettingsFieldsMap updateInProgress: boolean - updateSettings: (fields: PipetteSettingsFieldsUpdate) => unknown + updateSettings: (params: UpdatePipetteSettingsData) => void groupLabels: string[] formId: string } @@ -96,14 +95,16 @@ export class ConfigForm extends React.Component { } handleSubmit: (values: FormValues) => void = values => { - const params = mapValues(values, v => { - if (v === true || v === false) return v + const fields = mapValues< + FormValues, + { value: PipetteSettingsField['value'] } | null + >(values, v => { + if (v === true || v === false) return { value: v } if (v === '' || v == null) return null - return Number(v) + return { value: Number(v) } }) - // @ts-expect-error TODO updateSettings type doesn't include boolean for values of params, but they could be returned. - this.props.updateSettings(params) + this.props.updateSettings({ fields }) } getFieldValue( @@ -161,7 +162,6 @@ export class ConfigForm extends React.Component { PipetteSettingsFieldsMap, string | boolean >(fields, f => { - // @ts-expect-error TODO: PipetteSettingsFieldsMap doesn't include a boolean value, despite checking for it here if (f.value === true || f.value === false) return f.value // @ts-expect-error(sa, 2021-05-27): avoiding src code change, use optional chain to access f.value return f.value !== f.default ? f.value.toString() : '' diff --git a/app/src/organisms/ConfigurePipette/ConfigFormGroup.tsx b/app/src/organisms/ConfigurePipette/ConfigFormGroup.tsx index 227577474dd..919e4660d5d 100644 --- a/app/src/organisms/ConfigurePipette/ConfigFormGroup.tsx +++ b/app/src/organisms/ConfigurePipette/ConfigFormGroup.tsx @@ -96,7 +96,7 @@ export function ConfigInput(props: ConfigInputProps): JSX.Element { const { field } = props const { name, units, displayName } = field const id = makeId(field.name) - const _default = field.default.toString() + const _default = field.default?.toString() return ( diff --git a/app/src/organisms/ConfigurePipette/__tests__/ConfigurePipette.test.tsx b/app/src/organisms/ConfigurePipette/__tests__/ConfigurePipette.test.tsx index 0158956dfef..a2d9aca36e7 100644 --- a/app/src/organisms/ConfigurePipette/__tests__/ConfigurePipette.test.tsx +++ b/app/src/organisms/ConfigurePipette/__tests__/ConfigurePipette.test.tsx @@ -4,7 +4,6 @@ import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../i18n' import * as RobotApi from '../../../redux/robot-api' import { ConfigurePipette } from '../../ConfigurePipette' -import { getAttachedPipetteSettingsFieldsById } from '../../../redux/pipettes' import { mockPipetteSettingsFieldsMap } from '../../../redux/pipettes/__fixtures__' import { getConfig } from '../../../redux/config' @@ -13,7 +12,6 @@ import type { State } from '../../../redux/types' jest.mock('../../../redux/robot-api') jest.mock('../../../redux/config') -jest.mock('../../../redux/pipettes') const mockGetConfig = getConfig as jest.MockedFunction const mockUseDispatchApiRequest = RobotApi.useDispatchApiRequest as jest.MockedFunction< @@ -22,9 +20,6 @@ const mockUseDispatchApiRequest = RobotApi.useDispatchApiRequest as jest.MockedF const mockGetRequestById = RobotApi.getRequestById as jest.MockedFunction< typeof RobotApi.getRequestById > -const mockGetAttachedPipetteSettingsFieldsById = getAttachedPipetteSettingsFieldsById as jest.MockedFunction< - typeof getAttachedPipetteSettingsFieldsById -> const render = (props: React.ComponentProps) => { return renderWithProviders(, { @@ -40,9 +35,10 @@ describe('ConfigurePipette', () => { beforeEach(() => { props = { - pipetteId: 'id', + isUpdateLoading: false, + updateError: null, + settings: mockPipetteSettingsFieldsMap, robotName: mockRobotName, - updateRequest: { status: 'pending' }, updateSettings: jest.fn(), closeModal: jest.fn(), formId: 'id', @@ -59,9 +55,6 @@ describe('ConfigurePipette', () => { }, }) mockGetConfig.mockReturnValue({} as any) - when(mockGetAttachedPipetteSettingsFieldsById) - .calledWith({} as State, mockRobotName, 'id') - .mockReturnValue(mockPipetteSettingsFieldsMap) dispatchApiRequest = jest.fn() when(mockUseDispatchApiRequest) .calledWith() diff --git a/app/src/organisms/ConfigurePipette/index.tsx b/app/src/organisms/ConfigurePipette/index.tsx index 43b4227b4d7..326f9e5792e 100644 --- a/app/src/organisms/ConfigurePipette/index.tsx +++ b/app/src/organisms/ConfigurePipette/index.tsx @@ -1,72 +1,52 @@ import * as React from 'react' -import { useSelector } from 'react-redux' import { useTranslation } from 'react-i18next' import { Box } from '@opentrons/components' -import { SUCCESS, FAILURE, PENDING } from '../../redux/robot-api' + import { ConfigForm } from './ConfigForm' import { ConfigErrorBanner } from './ConfigErrorBanner' import type { - AttachedPipette, - PipetteSettingsFieldsUpdate, -} from '../../redux/pipettes/types' -import { getAttachedPipetteSettingsFieldsById } from '../../redux/pipettes' -import type { RequestState } from '../../redux/robot-api/types' -import type { State } from '../../redux/types' + PipetteSettingsFieldsMap, + UpdatePipetteSettingsData, +} from '@opentrons/api-client' interface Props { closeModal: () => void - pipetteId: AttachedPipette['id'] - updateRequest: RequestState | null - updateSettings: (fields: PipetteSettingsFieldsUpdate) => void + updateSettings: (params: UpdatePipetteSettingsData) => void + updateError: Error | null + isUpdateLoading: boolean robotName: string formId: string + settings: PipetteSettingsFieldsMap } export function ConfigurePipette(props: Props): JSX.Element { const { - closeModal, - pipetteId, - updateRequest, updateSettings, - robotName, + updateError, + isUpdateLoading, formId, + settings, } = props const { t } = useTranslation('device_details') - const settings = useSelector((state: State) => - getAttachedPipetteSettingsFieldsById(state, robotName, pipetteId) - ) const groupLabels = [ t('plunger_positions'), t('tip_pickup_drop'), t('power_force'), ] - const updateError: string | null = - updateRequest && updateRequest.status === FAILURE - ? // @ts-expect-error(sa, 2021-05-27): avoiding src code change, need to type narrow - updateRequest.error.message || t('an_error_occurred_while_updating') - : null - - // when an in-progress request completes, close modal if response was ok - React.useEffect(() => { - if (updateRequest?.status === SUCCESS) { - closeModal() - } - }, [updateRequest, closeModal]) - return ( - {updateError && } - {settings != null && pipetteId != null && ( - + {updateError != null && ( + )} + ) } diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/AddFixtureModal.stories.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/AddFixtureModal.stories.tsx new file mode 100644 index 00000000000..cc5ddd4f4e7 --- /dev/null +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/AddFixtureModal.stories.tsx @@ -0,0 +1,31 @@ +import * as React from 'react' +import { QueryClient, QueryClientProvider } from 'react-query' +import { touchScreenViewport } from '../../DesignTokens/constants' +import { AddFixtureModal } from './AddFixtureModal' +import type { Story, Meta } from '@storybook/react' + +export default { + title: 'ODD/Organisms/AddFixtureModal', + argTypes: { + modalSize: { + options: ['small', 'medium', 'large'], + control: { type: 'radio' }, + }, + onOutsideClick: { action: 'clicked' }, + }, + parameters: touchScreenViewport, +} as Meta + +const queryClient = new QueryClient() +const Template: Story> = args => ( + + + +) + +export const Default = Template.bind({}) +Default.args = { + fixtureLocation: 'cutoutD3', + setShowAddFixtureModal: () => {}, + isOnDevice: true, +} diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/AddFixtureModal.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/AddFixtureModal.tsx new file mode 100644 index 00000000000..85ce0f3128c --- /dev/null +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/AddFixtureModal.tsx @@ -0,0 +1,291 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { css } from 'styled-components' + +import { + ALIGN_CENTER, + BORDERS, + Btn, + COLORS, + DIRECTION_COLUMN, + DIRECTION_ROW, + Flex, + JUSTIFY_SPACE_BETWEEN, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' +import { + useDeckConfigurationQuery, + useUpdateDeckConfigurationMutation, +} from '@opentrons/react-api-client' +import { + getCutoutDisplayName, + getFixtureDisplayName, + STAGING_AREA_CUTOUTS, + STAGING_AREA_RIGHT_SLOT_FIXTURE, + TRASH_BIN_ADAPTER_FIXTURE, + WASTE_CHUTE_CUTOUT, + WASTE_CHUTE_FIXTURES, +} from '@opentrons/shared-data' + +import { StyledText } from '../../atoms/text' +import { ODD_FOCUS_VISIBLE } from '../../atoms/buttons/constants' +import { TertiaryButton } from '../../atoms/buttons' +import { Modal } from '../../molecules/Modal' +import { LegacyModal } from '../../molecules/LegacyModal' + +import type { + CutoutConfig, + CutoutId, + CutoutFixtureId, + DeckConfiguration, +} from '@opentrons/shared-data' +import type { ModalHeaderBaseProps } from '../../molecules/Modal/types' +import type { LegacyModalProps } from '../../molecules/LegacyModal' + +const GENERIC_WASTE_CHUTE_OPTION = 'WASTE_CHUTE' + +interface AddFixtureModalProps { + cutoutId: CutoutId + setShowAddFixtureModal: (showAddFixtureModal: boolean) => void + setCurrentDeckConfig?: React.Dispatch> + providedFixtureOptions?: CutoutFixtureId[] + isOnDevice?: boolean +} + +export function AddFixtureModal({ + cutoutId, + setShowAddFixtureModal, + setCurrentDeckConfig, + providedFixtureOptions, + isOnDevice = false, +}: AddFixtureModalProps): JSX.Element { + const { t } = useTranslation(['device_details', 'shared']) + const { updateDeckConfiguration } = useUpdateDeckConfigurationMutation() + const deckConfig = useDeckConfigurationQuery()?.data ?? [] + const [showWasteChuteOptions, setShowWasteChuteOptions] = React.useState( + false + ) + + const modalHeader: ModalHeaderBaseProps = { + title: t('add_to_slot', { + slotName: getCutoutDisplayName(cutoutId), + }), + hasExitIcon: providedFixtureOptions == null, + onClick: () => setShowAddFixtureModal(false), + } + + const modalProps: LegacyModalProps = { + title: t('add_to_slot', { + slotName: getCutoutDisplayName(cutoutId), + }), + onClose: () => setShowAddFixtureModal(false), + closeOnOutsideClick: true, + childrenPadding: SPACING.spacing24, + width: '26.75rem', + } + + const availableFixtures: CutoutFixtureId[] = [TRASH_BIN_ADAPTER_FIXTURE] + if (STAGING_AREA_CUTOUTS.includes(cutoutId)) { + availableFixtures.push(STAGING_AREA_RIGHT_SLOT_FIXTURE) + } + + const handleAddODD = (requiredFixtureId: CutoutFixtureId): void => { + if (setCurrentDeckConfig != null) + setCurrentDeckConfig( + (prevDeckConfig: DeckConfiguration): DeckConfiguration => + prevDeckConfig.map((fixture: CutoutConfig) => + fixture.cutoutId === cutoutId + ? { ...fixture, cutoutFixtureId: requiredFixtureId } + : fixture + ) + ) + + setShowAddFixtureModal(false) + } + + const fixtureOptions = providedFixtureOptions ?? availableFixtures + const fixtureOptionsWithDisplayNames: Array< + [CutoutFixtureId | 'WASTE_CHUTE', string] + > = fixtureOptions.map(fixture => [fixture, getFixtureDisplayName(fixture)]) + + const showSelectWasteChuteOptions = + cutoutId === WASTE_CHUTE_CUTOUT && providedFixtureOptions == null + + const fixtureOptionsWithDisplayNamesAndGenericWasteChute = fixtureOptionsWithDisplayNames.concat( + showSelectWasteChuteOptions + ? [[GENERIC_WASTE_CHUTE_OPTION, t('waste_chute')]] + : [] + ) + + fixtureOptionsWithDisplayNamesAndGenericWasteChute.sort((a, b) => + a[1].localeCompare(b[1]) + ) + + const wasteChuteOptionsWithDisplayNames = WASTE_CHUTE_FIXTURES.map( + fixture => [fixture, getFixtureDisplayName(fixture)] + ).sort((a, b) => a[1].localeCompare(b[1])) as Array<[CutoutFixtureId, string]> + + const displayedFixtureOptions = showWasteChuteOptions + ? wasteChuteOptionsWithDisplayNames + : fixtureOptionsWithDisplayNamesAndGenericWasteChute + + const handleAddDesktop = (requiredFixtureId: CutoutFixtureId): void => { + const newDeckConfig = deckConfig.map(fixture => + fixture.cutoutId === cutoutId + ? { ...fixture, cutoutFixtureId: requiredFixtureId } + : fixture + ) + + updateDeckConfiguration(newDeckConfig) + setShowAddFixtureModal(false) + } + + return ( + <> + {isOnDevice ? ( + + providedFixtureOptions != null + ? null + : setShowAddFixtureModal(false) + } + > + + {t('add_to_slot_description')} + + {displayedFixtureOptions.map( + ([cutoutFixtureOption, fixtureDisplayName]) => { + const onClickHandler = + cutoutFixtureOption === GENERIC_WASTE_CHUTE_OPTION + ? () => setShowWasteChuteOptions(true) + : () => handleAddODD(cutoutFixtureOption) + const buttonText = + cutoutFixtureOption === GENERIC_WASTE_CHUTE_OPTION + ? t('select_options') + : t('add') + + return ( + + + + {fixtureDisplayName} + + {buttonText} + + + ) + } + )} + + + + ) : ( + + + {t('add_fixture_description')} + + {displayedFixtureOptions.map( + ([cutoutFixtureOption, fixtureDisplayName]) => { + const onClickHandler = + cutoutFixtureOption === GENERIC_WASTE_CHUTE_OPTION + ? () => setShowWasteChuteOptions(true) + : () => handleAddDesktop(cutoutFixtureOption) + const buttonText = + cutoutFixtureOption === GENERIC_WASTE_CHUTE_OPTION + ? t('select_options') + : t('add') + + return ( + + + + {fixtureDisplayName} + + + {buttonText} + + + + ) + } + )} + + + {showWasteChuteOptions ? ( + setShowWasteChuteOptions(false)} + aria-label="back" + paddingX={SPACING.spacing16} + marginTop={'1.44rem'} + marginBottom={'0.56rem'} + > + + {t('shared:go_back')} + + + ) : null} + + )} + + ) +} + +const FIXTURE_BUTTON_STYLE = css` + background-color: ${COLORS.grey35}; + cursor: default; + border-radius: ${BORDERS.borderRadiusSize3}; + box-shadow: none; + + &:focus { + background-color: ${COLORS.grey40}; + box-shadow: none; + } + + &:hover { + border: none; + box-shadow: none; + background-color: ${COLORS.grey35}; + } + + &:focus-visible { + box-shadow: ${ODD_FOCUS_VISIBLE}; + background-color: ${COLORS.grey35}; + } + + &:active { + background-color: ${COLORS.grey40}; + } + + &:disabled { + background-color: ${COLORS.grey35}; + color: ${COLORS.grey50}; + } +` +const GO_BACK_BUTTON_STYLE = css` + ${TYPOGRAPHY.pSemiBold}; + color: ${COLORS.grey50}; + + &:hover { + opacity: 70%; + } +` diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/DeckConfigurationDiscardChangesModal.stories.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/DeckConfigurationDiscardChangesModal.stories.tsx new file mode 100644 index 00000000000..d6b26521619 --- /dev/null +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/DeckConfigurationDiscardChangesModal.stories.tsx @@ -0,0 +1,24 @@ +import * as React from 'react' +import { touchScreenViewport } from '../../DesignTokens/constants' +import { DeckConfigurationDiscardChangesModal } from './DeckConfigurationDiscardChangesModal' +import type { Story, Meta } from '@storybook/react' + +export default { + title: 'ODD/Organisms/DeckConfigurationDiscardChangesModalProps', + argTypes: { + modalSize: { + options: ['small', 'medium', 'large'], + control: { type: 'radio' }, + }, + onOutsideClick: { action: 'clicked' }, + }, + parameters: touchScreenViewport, +} as Meta + +const Template: Story< + React.ComponentProps +> = args => +export const Default = Template.bind({}) +Default.args = { + setShowConfirmationModal: () => {}, +} diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/DeckConfigurationDiscardChangesModal.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/DeckConfigurationDiscardChangesModal.tsx new file mode 100644 index 00000000000..d672bcd9098 --- /dev/null +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/DeckConfigurationDiscardChangesModal.tsx @@ -0,0 +1,60 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { useHistory } from 'react-router-dom' + +import { + DIRECTION_COLUMN, + DIRECTION_ROW, + Flex, + SPACING, +} from '@opentrons/components' + +import { StyledText } from '../../atoms/text' +import { SmallButton } from '../../atoms/buttons' +import { Modal } from '../../molecules/Modal' + +import { ModalHeaderBaseProps } from '../../molecules/Modal/types' + +interface DeckConfigurationDiscardChangesModalProps { + setShowConfirmationModal: (showConfirmationModal: boolean) => void +} + +export function DeckConfigurationDiscardChangesModal({ + setShowConfirmationModal, +}: DeckConfigurationDiscardChangesModalProps): JSX.Element { + const { t } = useTranslation('device_details') + const modalHeader: ModalHeaderBaseProps = { + title: t('changes_will_be_lost'), + } + const history = useHistory() + + const handleDiscard = (): void => { + setShowConfirmationModal(false) + history.goBack() + } + + return ( + + + {t('changes_will_be_lost_description')} + + + setShowConfirmationModal(false)} + /> + + + + ) +} diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/DeckFixtureSetupInstructionsModal.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/DeckFixtureSetupInstructionsModal.tsx new file mode 100644 index 00000000000..6decd45012f --- /dev/null +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/DeckFixtureSetupInstructionsModal.tsx @@ -0,0 +1,112 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { + ALIGN_FLEX_END, + COLORS, + DIRECTION_COLUMN, + DIRECTION_ROW, + Flex, + PrimaryButton, + SPACING, +} from '@opentrons/components' +import { StyledText } from '../../atoms/text' +import { ExternalLink } from '../../atoms/Link/ExternalLink' +import { Modal } from '../../molecules/Modal' +import { LegacyModal } from '../../molecules/LegacyModal' + +import type { ModalHeaderBaseProps } from '../../molecules/Modal/types' +import type { LegacyModalProps } from '../../molecules/LegacyModal' + +import imgSrc from '../../assets/images/on-device-display/deck_fixture_setup_qrcode.png' + +const SETUP_INSTRUCTION_URL = + 'https://support.opentrons.com/s/article/Deck-configuration-on-Opentrons-Flex' +const IMG_ALT = 'QRCode for Deck fixture setup instructions page' + +interface DeckFixtureSetupInstructionsModalProps { + setShowSetupInstructionsModal: (showSetupInstructionsModal: boolean) => void + isOnDevice?: boolean +} + +export function DeckFixtureSetupInstructionsModal({ + setShowSetupInstructionsModal, + isOnDevice = false, +}: DeckFixtureSetupInstructionsModalProps): JSX.Element { + const { i18n, t } = useTranslation(['device_details', 'shared']) + const modalHeader: ModalHeaderBaseProps = { + title: t('deck_fixture_setup_instructions'), + iconName: 'information', + iconColor: COLORS.black90, + hasExitIcon: true, + onClick: () => setShowSetupInstructionsModal(false), + } + + const modalProps: LegacyModalProps = { + title: t('deck_fixture_setup_instructions'), + onClose: () => setShowSetupInstructionsModal(false), + closeOnOutsideClick: true, + childrenPadding: SPACING.spacing24, + width: '39.3125rem', + } + + return ( + <> + {isOnDevice ? ( + setShowSetupInstructionsModal(false)} + > + + + + {t('deck_fixture_setup_modal_top_description')} + + + {t('deck_fixture_setup_modal_bottom_description')} + + + + + {IMG_ALT} + + + + ) : ( + + + + + + + {t('deck_fixture_setup_modal_top_description')} + + + {t('deck_fixture_setup_modal_bottom_description_desktop')} + + + + {t('deck_fixture_setup_instructions')} + + + + {IMG_ALT} + + + + {i18n.format(t('shared:close'), 'capitalize')} + + + + )} + + ) +} diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/TouchScreenDeckFixtureSetupInstructionModal.stories.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/TouchScreenDeckFixtureSetupInstructionModal.stories.tsx new file mode 100644 index 00000000000..5fcc8d339a9 --- /dev/null +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/TouchScreenDeckFixtureSetupInstructionModal.stories.tsx @@ -0,0 +1,25 @@ +import * as React from 'react' +import { touchScreenViewport } from '../../DesignTokens/constants' +import { DeckFixtureSetupInstructionsModal } from './DeckFixtureSetupInstructionsModal' +import type { Story, Meta } from '@storybook/react' + +export default { + title: 'ODD/Organisms/DeckFixtureSetupInstructionsModal', + argTypes: { + modalSize: { + options: ['small', 'medium', 'large'], + control: { type: 'radio' }, + }, + onOutsideClick: { action: 'clicked' }, + }, + parameters: touchScreenViewport, +} as Meta + +const Template: Story< + React.ComponentProps +> = args => +export const Default = Template.bind({}) +Default.args = { + setShowSetupInstructionsModal: () => {}, + isOnDevice: true, +} diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/AddFixtureModal.test.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/AddFixtureModal.test.tsx new file mode 100644 index 00000000000..27f9428dc3c --- /dev/null +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/AddFixtureModal.test.tsx @@ -0,0 +1,180 @@ +import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' +import { renderWithProviders } from '@opentrons/components' +import { + useDeckConfigurationQuery, + useUpdateDeckConfigurationMutation, +} from '@opentrons/react-api-client' +import { + getFixtureDisplayName, + WASTE_CHUTE_FIXTURES, +} from '@opentrons/shared-data' + +import { i18n } from '../../../i18n' +import { AddFixtureModal } from '../AddFixtureModal' + +import type { UseQueryResult } from 'react-query' +import type { DeckConfiguration } from '@opentrons/shared-data' + +jest.mock('@opentrons/react-api-client') +const mockSetShowAddFixtureModal = jest.fn() +const mockUpdateDeckConfiguration = jest.fn() +const mockSetCurrentDeckConfig = jest.fn() + +const mockUseUpdateDeckConfigurationMutation = useUpdateDeckConfigurationMutation as jest.MockedFunction< + typeof useUpdateDeckConfigurationMutation +> +const mockUseDeckConfigurationQuery = useDeckConfigurationQuery as jest.MockedFunction< + typeof useDeckConfigurationQuery +> + +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + }) +} + +describe('Touchscreen AddFixtureModal', () => { + let props: React.ComponentProps + + beforeEach(() => { + props = { + cutoutId: 'cutoutD3', + setShowAddFixtureModal: mockSetShowAddFixtureModal, + setCurrentDeckConfig: mockSetCurrentDeckConfig, + isOnDevice: true, + } + mockUseUpdateDeckConfigurationMutation.mockReturnValue({ + updateDeckConfiguration: mockUpdateDeckConfiguration, + } as any) + mockUseDeckConfigurationQuery.mockReturnValue(({ + data: [], + } as unknown) as UseQueryResult) + }) + + it('should render text and buttons', () => { + render(props) + screen.getByText('Add to slot D3') + screen.getByText( + 'Choose a fixture below to add to your deck configuration. It will be referenced during protocol analysis.' + ) + screen.getByText('Staging area slot') + screen.getByText('Trash bin') + screen.getByText('Waste chute') + expect(screen.getAllByText('Add').length).toBe(2) + expect(screen.getAllByText('Select options').length).toBe(1) + }) + + it('should a mock function when tapping app button', () => { + render(props) + fireEvent.click(screen.getAllByText('Add')[0]) + expect(mockSetCurrentDeckConfig).toHaveBeenCalled() + }) + + it('when fixture options are provided, should only render those options', () => { + props = { + ...props, + providedFixtureOptions: ['trashBinAdapter'], + } + render(props) + screen.getByText('Add to slot D3') + screen.getByText( + 'Choose a fixture below to add to your deck configuration. It will be referenced during protocol analysis.' + ) + expect(screen.queryByText('Staging area slot')).toBeNull() + screen.getByText('Trash bin') + expect(screen.queryByText('Waste chute')).toBeNull() + expect(screen.getAllByText('Add').length).toBe(1) + expect(screen.queryByText('Select options')).toBeNull() + }) +}) + +describe('Desktop AddFixtureModal', () => { + let props: React.ComponentProps + + beforeEach(() => { + props = { + cutoutId: 'cutoutD3', + setShowAddFixtureModal: mockSetShowAddFixtureModal, + } + mockUseUpdateDeckConfigurationMutation.mockReturnValue({ + updateDeckConfiguration: mockUpdateDeckConfiguration, + } as any) + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + it('should render text and buttons slot D3', () => { + render(props) + screen.getByText('Add to slot D3') + screen.getByText( + 'Add this fixture to your deck configuration. It will be referenced during protocol analysis.' + ) + screen.getByText('Staging area slot') + screen.getByText('Trash bin') + screen.getByText('Waste chute') + expect(screen.getAllByRole('button', { name: 'Add' }).length).toBe(2) + expect( + screen.getAllByRole('button', { name: 'Select options' }).length + ).toBe(1) + }) + + it('should render text and buttons slot A1', () => { + props = { ...props, cutoutId: 'cutoutA1' } + render(props) + screen.getByText('Add to slot A1') + screen.getByText( + 'Add this fixture to your deck configuration. It will be referenced during protocol analysis.' + ) + screen.getByText('Trash bin') + screen.getByRole('button', { name: 'Add' }) + }) + + it('should render text and buttons slot B3', () => { + props = { ...props, cutoutId: 'cutoutB3' } + render(props) + screen.getByText('Add to slot B3') + screen.getByText( + 'Add this fixture to your deck configuration. It will be referenced during protocol analysis.' + ) + screen.getByText('Staging area slot') + screen.getByText('Trash bin') + expect(screen.getAllByRole('button', { name: 'Add' }).length).toBe(2) + }) + + it('should call a mock function when clicking add button', () => { + props = { ...props, cutoutId: 'cutoutA1' } + render(props) + fireEvent.click(screen.getByRole('button', { name: 'Add' })) + expect(mockUpdateDeckConfiguration).toHaveBeenCalled() + }) + + it('should display appropriate Waste Chute options when the generic Waste Chute button is clicked', () => { + render(props) + fireEvent.click(screen.getByRole('button', { name: 'Select options' })) + expect(screen.getAllByRole('button', { name: 'Add' }).length).toBe( + WASTE_CHUTE_FIXTURES.length + ) + + WASTE_CHUTE_FIXTURES.forEach(cutoutId => { + const displayText = getFixtureDisplayName(cutoutId) + screen.getByText(displayText) + }) + }) + + it('should allow a user to exit the Waste Chute submenu by clicking "go back"', () => { + render(props) + fireEvent.click(screen.getByRole('button', { name: 'Select options' })) + + fireEvent.click(screen.getByText('Go back')) + screen.getByText('Staging area slot') + screen.getByText('Trash bin') + screen.getByText('Waste chute') + expect(screen.getAllByRole('button', { name: 'Add' }).length).toBe(2) + expect( + screen.getAllByRole('button', { name: 'Select options' }).length + ).toBe(1) + }) +}) diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckConfigurationDiscardChangesModal.test.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckConfigurationDiscardChangesModal.test.tsx new file mode 100644 index 00000000000..2bbb4ffb550 --- /dev/null +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckConfigurationDiscardChangesModal.test.tsx @@ -0,0 +1,60 @@ +import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' +import { renderWithProviders } from '@opentrons/components' + +import { i18n } from '../../../i18n' +import { DeckConfigurationDiscardChangesModal } from '../DeckConfigurationDiscardChangesModal' + +const mockFunc = jest.fn() +const mockGoBack = jest.fn() + +jest.mock('react-router-dom', () => { + const reactRouterDom = jest.requireActual('react-router-dom') + return { + ...reactRouterDom, + useHistory: () => ({ goBack: mockGoBack } as any), + } +}) + +const render = ( + props: React.ComponentProps +) => { + return renderWithProviders( + , + { + i18nInstance: i18n, + } + ) +} + +describe('DeckConfigurationDiscardChangesModal', () => { + let props: React.ComponentProps + + beforeEach(() => { + props = { + setShowConfirmationModal: mockFunc, + } + }) + it('should render text and buttons', () => { + render(props) + screen.getByText('Changes will be lost') + screen.getByText( + 'Are you sure you want to exit without saving your deck configuration?' + ) + screen.getByText('Discard changes') + screen.getByText('Continue editing') + }) + + it('should call a mock function when tapping discard changes button', () => { + render(props) + fireEvent.click(screen.getByText('Discard changes')) + expect(mockFunc).toHaveBeenCalledWith(false) + expect(mockGoBack).toHaveBeenCalled() + }) + + it('should call a mock function when tapping continue editing button', () => { + render(props) + fireEvent.click(screen.getByText('Continue editing')) + expect(mockFunc).toHaveBeenCalledWith(false) + }) +}) diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckFixtureSetupInstructionsModal.test.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckFixtureSetupInstructionsModal.test.tsx new file mode 100644 index 00000000000..f1abe3fa445 --- /dev/null +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckFixtureSetupInstructionsModal.test.tsx @@ -0,0 +1,76 @@ +import * as React from 'react' + +import { renderWithProviders } from '@opentrons/components' + +import { i18n } from '../../../i18n' + +import { DeckFixtureSetupInstructionsModal } from '../DeckFixtureSetupInstructionsModal' +import { fireEvent } from '@testing-library/react' + +const mockFunc = jest.fn() +const PNG_FILE_NAME = 'deck_fixture_setup_qrcode.png' + +const render = ( + props: React.ComponentProps +) => { + return renderWithProviders(, { + i18nInstance: i18n, + }) +} + +describe('Touchscreen DeckFixtureSetupInstructionsModal', () => { + let props: React.ComponentProps + + beforeEach(() => { + props = { + setShowSetupInstructionsModal: mockFunc, + isOnDevice: true, + } + }) + + it('should render text and image', () => { + const [{ getByText, getByRole }] = render(props) + getByText('Deck fixture setup instructions') + getByText( + "First, unscrew and remove the deck slot where you'll install a fixture. Then put the fixture in place and attach it as needed." + ) + getByText( + 'For details on installing different fixture types, scan the QR code or search for “deck configuration” on support.opentrons.com' + ) + const img = getByRole('img') + expect(img.getAttribute('src')).toEqual(PNG_FILE_NAME) + }) + + it('should call a mock function when tapping the close icon', () => { + const [{ getByLabelText }] = render(props) + fireEvent.click(getByLabelText('closeIcon')) + expect(mockFunc).toHaveBeenCalled() + }) +}) + +describe('Desktop DeckFixtureSetupInstructionsModal', () => { + let props: React.ComponentProps + + beforeEach(() => { + props = { + setShowSetupInstructionsModal: mockFunc, + } + }) + + it('should render text, image, and button', () => { + const [{ getAllByText, getByText, getByRole, queryByText }] = render(props) + expect(getAllByText('Deck fixture setup instructions').length).toBe(2) + getByText( + "First, unscrew and remove the deck slot where you'll install a fixture. Then put the fixture in place and attach it as needed." + ) + getByText( + 'For detailed instructions for different types of fixtures, scan the QR code or go to the link below.' + ) + const img = getByRole('img') + expect(img.getAttribute('src')).toEqual(PNG_FILE_NAME) + expect( + queryByText('www.opentrons.com/support/fixtures') + ).not.toBeInTheDocument() + getByRole('button', { name: 'Close' }) + }) +}) diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeviceDetailsDeckConfiguration.test.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeviceDetailsDeckConfiguration.test.tsx new file mode 100644 index 00000000000..7b4e9acf6ca --- /dev/null +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeviceDetailsDeckConfiguration.test.tsx @@ -0,0 +1,171 @@ +import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' +import { when, resetAllWhenMocks } from 'jest-when' + +import { + DeckConfigurator, + partialComponentPropsMatcher, + renderWithProviders, +} from '@opentrons/components' +import { + useDeckConfigurationQuery, + useUpdateDeckConfigurationMutation, +} from '@opentrons/react-api-client' + +import { i18n } from '../../../i18n' +import { useIsRobotViewable, useRunStatuses } from '../../Devices/hooks' +import { DeckFixtureSetupInstructionsModal } from '../DeckFixtureSetupInstructionsModal' +import { useIsEstopNotDisengaged } from '../../../resources/devices/hooks/useIsEstopNotDisengaged' +import { DeviceDetailsDeckConfiguration } from '../' +import { useNotifyCurrentMaintenanceRun } from '../../../resources/maintenance_runs/useNotifyCurrentMaintenanceRun' + +import type { MaintenanceRun } from '@opentrons/api-client' + +jest.mock('@opentrons/components/src/hardware-sim/DeckConfigurator/index') +jest.mock('@opentrons/react-api-client') +jest.mock('../DeckFixtureSetupInstructionsModal') +jest.mock('../../Devices/hooks') +jest.mock('../../../resources/maintenance_runs/useNotifyCurrentMaintenanceRun') +jest.mock('../../../resources/devices/hooks/useIsEstopNotDisengaged') + +const ROBOT_NAME = 'otie' +const mockUpdateDeckConfiguration = jest.fn() +const RUN_STATUSES = { + isRunRunning: false, + isRunStill: false, + isRunTerminal: false, + isRunIdle: false, +} +const mockCurrnetMaintenanceRun = { + data: { id: 'mockMaintenanceRunId' }, +} as MaintenanceRun + +const mockUseDeckConfigurationQuery = useDeckConfigurationQuery as jest.MockedFunction< + typeof useDeckConfigurationQuery +> +const mockUseUpdateDeckConfigurationMutation = useUpdateDeckConfigurationMutation as jest.MockedFunction< + typeof useUpdateDeckConfigurationMutation +> +const mockDeckFixtureSetupInstructionsModal = DeckFixtureSetupInstructionsModal as jest.MockedFunction< + typeof DeckFixtureSetupInstructionsModal +> +const mockDeckConfigurator = DeckConfigurator as jest.MockedFunction< + typeof DeckConfigurator +> +const mockUseRunStatuses = useRunStatuses as jest.MockedFunction< + typeof useRunStatuses +> +const mockUseNotifyCurrentMaintenanceRun = useNotifyCurrentMaintenanceRun as jest.MockedFunction< + typeof useNotifyCurrentMaintenanceRun +> +const mockUseIsEstopNotDisengaged = useIsEstopNotDisengaged as jest.MockedFunction< + typeof useIsEstopNotDisengaged +> +const mockUseIsRobotViewable = useIsRobotViewable as jest.MockedFunction< + typeof useIsRobotViewable +> + +const render = ( + props: React.ComponentProps +) => { + return renderWithProviders(, { + i18nInstance: i18n, + }) +} + +describe('DeviceDetailsDeckConfiguration', () => { + let props: React.ComponentProps + + beforeEach(() => { + props = { + robotName: ROBOT_NAME, + } + mockUseDeckConfigurationQuery.mockReturnValue({ data: [] } as any) + mockUseUpdateDeckConfigurationMutation.mockReturnValue({ + updateDeckConfiguration: mockUpdateDeckConfiguration, + } as any) + mockDeckFixtureSetupInstructionsModal.mockReturnValue( +
mock DeckFixtureSetupInstructionsModal
+ ) + when(mockDeckConfigurator).mockReturnValue(
mock DeckConfigurator
) + mockUseRunStatuses.mockReturnValue(RUN_STATUSES) + mockUseNotifyCurrentMaintenanceRun.mockReturnValue({ + data: {}, + } as any) + when(mockUseIsEstopNotDisengaged) + .calledWith(ROBOT_NAME) + .mockReturnValue(false) + when(mockUseIsRobotViewable).calledWith(ROBOT_NAME).mockReturnValue(true) + }) + + afterEach(() => { + resetAllWhenMocks() + }) + + it('should render text and button', () => { + render(props) + screen.getByText('otie deck configuration') + screen.getByRole('button', { name: 'Setup Instructions' }) + screen.getByText('Location') + screen.getByText('Fixture') + screen.getByText('mock DeckConfigurator') + }) + + it('should render DeckFixtureSetupInstructionsModal when clicking text button', () => { + render(props) + fireEvent.click(screen.getByRole('button', { name: 'Setup Instructions' })) + screen.getByText('mock DeckFixtureSetupInstructionsModal') + }) + + it('should render banner and make deck configurator disabled when running', () => { + RUN_STATUSES.isRunRunning = true + mockUseRunStatuses.mockReturnValue(RUN_STATUSES) + when(mockDeckConfigurator) + .calledWith(partialComponentPropsMatcher({ readOnly: true })) + .mockReturnValue(
disabled mock DeckConfigurator
) + render(props) + screen.getByText( + 'Deck configuration is not available when run is in progress' + ) + screen.getByText('disabled mock DeckConfigurator') + }) + + it('should render banner and make deck configurator disabled when a maintenance run exists', () => { + mockUseNotifyCurrentMaintenanceRun.mockReturnValue({ + data: mockCurrnetMaintenanceRun, + } as any) + when(mockDeckConfigurator) + .calledWith(partialComponentPropsMatcher({ readOnly: true })) + .mockReturnValue(
disabled mock DeckConfigurator
) + render(props) + screen.getByText( + 'Deck configuration is not available when the robot is busy' + ) + screen.getByText('disabled mock DeckConfigurator') + }) + + it('should render no deck fixtures, if deck configs are not set', () => { + when(mockUseDeckConfigurationQuery) + .calledWith() + .mockReturnValue([] as any) + render(props) + screen.getByText('No deck fixtures') + }) + + it('should render disabled deck configurator when e-stop is pressed', () => { + when(mockUseIsEstopNotDisengaged) + .calledWith(ROBOT_NAME) + .mockReturnValue(true) + when(mockDeckConfigurator) + .calledWith(partialComponentPropsMatcher({ readOnly: true })) + .mockReturnValue(
disabled mock DeckConfigurator
) + render(props) + screen.getByText('disabled mock DeckConfigurator') + }) + + it('should render not viewable text when robot is not viewable', () => { + when(mockUseIsRobotViewable).calledWith(ROBOT_NAME).mockReturnValue(false) + render(props) + screen.getByText('Robot must be on the network to see deck configuration') + }) +}) diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/index.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/index.tsx new file mode 100644 index 00000000000..4e51bd06fb0 --- /dev/null +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/index.tsx @@ -0,0 +1,272 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { css } from 'styled-components' + +import { + ALIGN_CENTER, + ALIGN_FLEX_START, + BORDERS, + COLORS, + DeckConfigurator, + DIRECTION_COLUMN, + DIRECTION_ROW, + Flex, + JUSTIFY_CENTER, + JUSTIFY_SPACE_BETWEEN, + Link, + SIZE_4, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' +import { + useDeckConfigurationQuery, + useUpdateDeckConfigurationMutation, +} from '@opentrons/react-api-client' +import { + getCutoutDisplayName, + getFixtureDisplayName, + SINGLE_RIGHT_CUTOUTS, + SINGLE_SLOT_FIXTURES, + SINGLE_LEFT_SLOT_FIXTURE, + SINGLE_RIGHT_SLOT_FIXTURE, +} from '@opentrons/shared-data' + +import { useNotifyCurrentMaintenanceRun } from '../../resources/maintenance_runs/useNotifyCurrentMaintenanceRun' +import { StyledText } from '../../atoms/text' +import { Banner } from '../../atoms/Banner' +import { DeckFixtureSetupInstructionsModal } from './DeckFixtureSetupInstructionsModal' +import { AddFixtureModal } from './AddFixtureModal' +import { useIsRobotViewable, useRunStatuses } from '../Devices/hooks' +import { useIsEstopNotDisengaged } from '../../resources/devices/hooks/useIsEstopNotDisengaged' + +import type { CutoutId } from '@opentrons/shared-data' + +const DECK_CONFIG_REFETCH_INTERVAL = 5000 +const RUN_REFETCH_INTERVAL = 5000 + +interface DeviceDetailsDeckConfigurationProps { + robotName: string +} + +export function DeviceDetailsDeckConfiguration({ + robotName, +}: DeviceDetailsDeckConfigurationProps): JSX.Element | null { + const { t } = useTranslation('device_details') + const [ + showSetupInstructionsModal, + setShowSetupInstructionsModal, + ] = React.useState(false) + const [showAddFixtureModal, setShowAddFixtureModal] = React.useState( + false + ) + const [targetCutoutId, setTargetCutoutId] = React.useState( + null + ) + + const deckConfig = + useDeckConfigurationQuery({ refetchInterval: DECK_CONFIG_REFETCH_INTERVAL }) + .data ?? [] + const { updateDeckConfiguration } = useUpdateDeckConfigurationMutation() + const { isRunRunning } = useRunStatuses() + const { data: maintenanceRunData } = useNotifyCurrentMaintenanceRun({ + refetchInterval: RUN_REFETCH_INTERVAL, + }) + const isEstopNotDisengaged = useIsEstopNotDisengaged(robotName) + const isMaintenanceRunExisting = maintenanceRunData?.data?.id != null + const isRobotViewable = useIsRobotViewable(robotName) + + const handleClickAdd = (cutoutId: CutoutId): void => { + setTargetCutoutId(cutoutId) + setShowAddFixtureModal(true) + } + + const handleClickRemove = (cutoutId: CutoutId): void => { + const isRightCutout = SINGLE_RIGHT_CUTOUTS.includes(cutoutId) + const singleSlotFixture = isRightCutout + ? SINGLE_RIGHT_SLOT_FIXTURE + : SINGLE_LEFT_SLOT_FIXTURE + + const newDeckConfig = deckConfig.map(fixture => + fixture.cutoutId === cutoutId + ? { ...fixture, cutoutFixtureId: singleSlotFixture } + : fixture + ) + + updateDeckConfiguration(newDeckConfig) + } + + // do not show standard slot in fixture display list + const fixtureDisplayList = deckConfig.filter( + fixture => + fixture.cutoutFixtureId != null && + !SINGLE_SLOT_FIXTURES.includes(fixture.cutoutFixtureId) + ) + + return ( + <> + {showAddFixtureModal && targetCutoutId != null ? ( + + ) : null} + {showSetupInstructionsModal ? ( + + ) : null} + + + + {`${robotName} ${t('deck_configuration')}`} + + setShowSetupInstructionsModal(true)} + > + {t('setup_instructions')} + + + {isRobotViewable ? ( + + {isRunRunning ? ( + + {t( + 'deck_configuration_is_not_available_when_run_is_in_progress' + )} + + ) : null} + {isMaintenanceRunExisting ? ( + + {t('deck_configuration_is_not_available_when_robot_is_busy')} + + ) : null} + + + + + + + {t('location')} + {t('fixture')} + + {fixtureDisplayList.length > 0 ? ( + fixtureDisplayList.map(fixture => ( + + + {getCutoutDisplayName(fixture.cutoutId)} + + + {getFixtureDisplayName(fixture.cutoutFixtureId)} + + + )) + ) : ( + + {t('no_deck_fixtures')} + + )} + + + + ) : ( + + + {t('offline_deck_configuration')} + + + )} + + + ) +} + +const DECK_CONFIG_SECTION_STYLE = css` + flex-direction: ${DIRECTION_ROW}; + grid-gap: ${SPACING.spacing40}; + @media screen and (max-width: 1024px) { + flex-direction: ${DIRECTION_COLUMN}; + align-items: ${ALIGN_CENTER}; + grid-gap: ${SPACING.spacing32}; + } +` diff --git a/app/src/organisms/Devices/CalibrationStatusBanner.tsx b/app/src/organisms/Devices/CalibrationStatusBanner.tsx index 9cbaab869c1..9a31d25f1c5 100644 --- a/app/src/organisms/Devices/CalibrationStatusBanner.tsx +++ b/app/src/organisms/Devices/CalibrationStatusBanner.tsx @@ -43,7 +43,7 @@ export function CalibrationStatusBanner({ { }, ], } as any) - const wrapper: React.FunctionComponent<{}> = ({ children }) => ( - {children} - ) + const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + children, + }) => {children} const { result } = renderHook( () => useHeaterShakerModuleIdsFromRun(RUN_ID_1), { wrapper } @@ -133,9 +133,9 @@ describe('useHeaterShakerModuleIdsFromRun', () => { ], } as any) - const wrapper: React.FunctionComponent<{}> = ({ children }) => ( - {children} - ) + const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + children, + }) => {children} const { result } = renderHook( () => useHeaterShakerModuleIdsFromRun(RUN_ID_1), { wrapper } diff --git a/app/src/organisms/Devices/HeaterShakerIsRunningModal/index.tsx b/app/src/organisms/Devices/HeaterShakerIsRunningModal/index.tsx index 6f834f70aa6..8c16b8b134f 100644 --- a/app/src/organisms/Devices/HeaterShakerIsRunningModal/index.tsx +++ b/app/src/organisms/Devices/HeaterShakerIsRunningModal/index.tsx @@ -20,7 +20,7 @@ import { HeaterShakerModule } from '../../../redux/modules/types' import { HeaterShakerModuleCard } from '../HeaterShakerWizard/HeaterShakerModuleCard' import { HEATERSHAKER_MODULE_TYPE } from '@opentrons/shared-data' -import type { HeaterShakerDeactivateShakerCreateCommand } from '@opentrons/shared-data/protocol/types/schemaV7/command/module' +import type { HeaterShakerDeactivateShakerCreateCommand } from '@opentrons/shared-data' interface HeaterShakerIsRunningModalProps { closeModal: () => void @@ -50,7 +50,7 @@ export const HeaterShakerIsRunningModal = ( name="alert-circle" marginX={SPACING.spacing8} size={SPACING.spacing20} - color={COLORS.warningEnabled} + color={COLORS.yellow50} data-testid="HeaterShakerIsRunning_warning_icon" /> {t('heater_shaker_is_shaking')} diff --git a/app/src/organisms/Devices/HeaterShakerWizard/HeaterShakerModuleCard.tsx b/app/src/organisms/Devices/HeaterShakerWizard/HeaterShakerModuleCard.tsx index ede66bcdfcb..43b7b40222f 100644 --- a/app/src/organisms/Devices/HeaterShakerWizard/HeaterShakerModuleCard.tsx +++ b/app/src/organisms/Devices/HeaterShakerWizard/HeaterShakerModuleCard.tsx @@ -30,7 +30,7 @@ export const HeaterShakerModuleCard = ( return ( {getModuleDisplayName(module.moduleModel)} diff --git a/app/src/organisms/Devices/HistoricalProtocolRun.tsx b/app/src/organisms/Devices/HistoricalProtocolRun.tsx index 2d86cce40df..40b5f6911fd 100644 --- a/app/src/organisms/Devices/HistoricalProtocolRun.tsx +++ b/app/src/organisms/Devices/HistoricalProtocolRun.tsx @@ -4,14 +4,15 @@ import { css } from 'styled-components' import { useHistory } from 'react-router-dom' import { useSelector } from 'react-redux' import { - Flex, + ALIGN_CENTER, + BORDERS, Box, - Icon, - SPACING, COLORS, + Flex, + Icon, JUSTIFY_SPACE_AROUND, - ALIGN_CENTER, - BORDERS, + OVERFLOW_WRAP_ANYWHERE, + SPACING, } from '@opentrons/components' import { StyledText } from '../../atoms/text' import { getStoredProtocols } from '../../redux/protocol-storage' @@ -25,7 +26,7 @@ import type { State } from '../../redux/types' const CLICK_STYLE = css` cursor: pointer; - overflow-wrap: anywhere; + overflow-wrap: ${OVERFLOW_WRAP_ANYWHERE}; ` interface HistoricalProtocolRunProps { @@ -68,7 +69,7 @@ export function HistoricalProtocolRun( padding={SPACING.spacing8} borderTop={BORDERS.lineBorder} backgroundColor={ - run.status === 'running' ? COLORS.lightBlue : COLORS.white + run.status === 'running' ? COLORS.blue10 : COLORS.white } width="100%" > @@ -114,7 +115,7 @@ export function HistoricalProtocolRun( as="p" width="35%" data-testid={`RecentProtocolRuns_Protocol_${String(protocolKey)}`} - overflowWrap="anywhere" + overflowWrap={OVERFLOW_WRAP_ANYWHERE} marginRight={SPACING.spacing16} > {protocolName} @@ -129,7 +130,7 @@ export function HistoricalProtocolRun( {runStatus === 'running' && ( @@ -82,7 +82,7 @@ export function HistoricalProtocolRunOffsetDrawer( return ( diff --git a/app/src/organisms/Devices/HistoricalProtocolRunOverflowMenu.tsx b/app/src/organisms/Devices/HistoricalProtocolRunOverflowMenu.tsx index 9c44ef4511f..440c371ec53 100644 --- a/app/src/organisms/Devices/HistoricalProtocolRunOverflowMenu.tsx +++ b/app/src/organisms/Devices/HistoricalProtocolRunOverflowMenu.tsx @@ -33,6 +33,7 @@ import { } from '../../redux/analytics' import { getRobotUpdateDisplayInfo } from '../../redux/robot-update' import { useDownloadRunLog, useTrackProtocolRunEvent } from './hooks' +import { useIsEstopNotDisengaged } from '../../resources/devices/hooks/useIsEstopNotDisengaged' import type { Run } from '@opentrons/api-client' import type { State } from '../../redux/types' @@ -46,7 +47,7 @@ export interface HistoricalProtocolRunOverflowMenuProps { export function HistoricalProtocolRunOverflowMenu( props: HistoricalProtocolRunOverflowMenuProps ): JSX.Element { - const { runId } = props + const { runId, robotName } = props const { menuOverlay, handleOverflowClick, @@ -57,9 +58,10 @@ export function HistoricalProtocolRunOverflowMenu( onClickOutside: () => setShowOverflowMenu(false), }) const { downloadRunLog, isRunLogLoading } = useDownloadRunLog( - props.robotName, + robotName, runId ) + const isEstopNotDisengaged = useIsEstopNotDisengaged(robotName) return ( - + {showOverflowMenu ? ( <> diff --git a/app/src/organisms/Devices/InstrumentsAndModules.tsx b/app/src/organisms/Devices/InstrumentsAndModules.tsx index 621cbd44f8b..4b9de8ef02e 100644 --- a/app/src/organisms/Devices/InstrumentsAndModules.tsx +++ b/app/src/organisms/Devices/InstrumentsAndModules.tsx @@ -23,16 +23,20 @@ import { import { StyledText } from '../../atoms/text' import { Banner } from '../../atoms/Banner' +import { PipetteRecalibrationWarning } from './PipetteCard/PipetteRecalibrationWarning' import { useCurrentRunId } from '../ProtocolUpload/hooks' import { ModuleCard } from '../ModuleCard' import { FirmwareUpdateModal } from '../FirmwareUpdateModal' -import { useIsOT3, useIsRobotViewable, useRunStatuses } from './hooks' +import { useIsFlex, useIsRobotViewable, useRunStatuses } from './hooks' import { getIs96ChannelPipetteAttached, getOffsetCalibrationForMount, + getShowPipetteCalibrationWarning, } from './utils' import { PipetteCard } from './PipetteCard' import { GripperCard } from '../GripperCard' +import { useIsEstopNotDisengaged } from '../../resources/devices/hooks/useIsEstopNotDisengaged' + import type { BadGripper, BadPipette, @@ -59,12 +63,13 @@ export function InstrumentsAndModules({ )?.data ?? { left: undefined, right: undefined } const isRobotViewable = useIsRobotViewable(robotName) const currentRunId = useCurrentRunId() - const { isRunTerminal } = useRunStatuses() - const isOT3 = useIsOT3(robotName) + const { isRunTerminal, isRunRunning } = useRunStatuses() + const isFlex = useIsFlex(robotName) const [ subsystemToUpdate, setSubsystemToUpdate, ] = React.useState(null) + const isEstopNotDisengaged = useIsEstopNotDisengaged(robotName) const { data: attachedInstruments } = useInstrumentsQuery({ refetchInterval: EQUIPMENT_POLL_MS, @@ -104,6 +109,9 @@ export function InstrumentsAndModules({ ) const attachPipetteRequired = attachedLeftPipette == null && attachedRightPipette == null + const calibratePipetteRequired = + attachedLeftPipette?.data?.calibratedOffset?.last_modified == null && + attachedRightPipette?.data?.calibratedOffset?.last_modified == null const updatePipetteFWRequired = badLeftPipette != null || badRightPipette != null @@ -113,7 +121,7 @@ export function InstrumentsAndModules({ // the need for hardcoded heights without limitation, array will be split equally // or left column will contain 1 more item than right column // TODO(bh, 2022-10-27): once we're using real gripper data, combine the extension mount/module data into columns pre-render - const halfAttachedModulesSize = isOT3 + const halfAttachedModulesSize = isFlex ? Math.floor(attachedModules?.length / 2) : Math.ceil(attachedModules?.length / 2) const leftColumnModules = attachedModules?.slice(0, halfAttachedModulesSize) @@ -126,7 +134,7 @@ export function InstrumentsAndModules({ const pipetteOffsetCalibrations = useAllPipetteOffsetCalibrationsQuery({ refetchInterval: FETCH_PIPETTE_CAL_POLL, - enabled: !isOT3, + enabled: !isFlex, })?.data?.data ?? [] const leftMountOffsetCalibration = getOffsetCalibrationForMount( pipetteOffsetCalibrations, @@ -151,6 +159,8 @@ export function InstrumentsAndModules({ subsystem={subsystemToUpdate} proceed={() => setSubsystemToUpdate(null)} description={t('updating_firmware')} + proceedDescription={t('firmware_up_to_date')} + isOnDevice={false} /> )} @@ -180,6 +190,13 @@ export function InstrumentsAndModules({ {t('robot_control_not_available')} )} + {isRobotViewable && + getShowPipetteCalibrationWarning(attachedInstruments) && + (isRunTerminal || currentRunId == null) ? ( + + + + ) : null} {isRobotViewable ? ( setSubsystemToUpdate('pipette_left')} - isRunActive={currentRunId != null && !isRunTerminal} + isRunActive={currentRunId != null && isRunRunning} + isEstopNotDisengaged={isEstopNotDisengaged} /> - {isOT3 && ( + {isFlex && ( )} {leftColumnModules.map((module, index) => ( @@ -226,6 +247,7 @@ export function InstrumentsAndModules({ module={module} isLoadedInRun={false} attachPipetteRequired={attachPipetteRequired} + calibratePipetteRequired={calibratePipetteRequired} updatePipetteFWRequired={updatePipetteFWRequired} /> ))} @@ -245,8 +267,9 @@ export function InstrumentsAndModules({ : null } isPipetteCalibrated={ - isOT3 && attachedRightPipette?.ok - ? attachedRightPipette?.data?.calibratedOffset != null + isFlex && attachedRightPipette?.ok + ? attachedRightPipette?.data?.calibratedOffset + ?.last_modified != null : rightMountOffsetCalibration != null } mount={RIGHT} @@ -254,7 +277,8 @@ export function InstrumentsAndModules({ pipetteIs96Channel={false} pipetteIsBad={badRightPipette != null} updatePipette={() => setSubsystemToUpdate('pipette_right')} - isRunActive={currentRunId != null && !isRunTerminal} + isRunActive={currentRunId != null && isRunRunning} + isEstopNotDisengaged={isEstopNotDisengaged} /> )} {rightColumnModules.map((module, index) => ( @@ -266,6 +290,7 @@ export function InstrumentsAndModules({ module={module} isLoadedInRun={false} attachPipetteRequired={attachPipetteRequired} + calibratePipetteRequired={calibratePipetteRequired} updatePipetteFWRequired={updatePipetteFWRequired} /> ))} @@ -283,7 +308,7 @@ export function InstrumentsAndModules({ {/* TODO(bh, 2022-10-20): insert "offline" image when provided by illustrator */} {t('offline_instruments_and_modules')} diff --git a/app/src/organisms/Devices/ModuleInfo.tsx b/app/src/organisms/Devices/ModuleInfo.tsx index 2c84f16afff..49aefd3ab3f 100644 --- a/app/src/organisms/Devices/ModuleInfo.tsx +++ b/app/src/organisms/Devices/ModuleInfo.tsx @@ -76,14 +76,14 @@ export const ModuleInfo = (props: ModuleInfoProps): JSX.Element => { {!isAttached ? t('module_not_connected') : t('module_connected')} @@ -92,13 +92,13 @@ export const ModuleInfo = (props: ModuleInfoProps): JSX.Element => { ) : null} {getModuleDisplayName(moduleModel)} {i18n.format(t('current_version'), 'upperCase')} @@ -73,7 +73,7 @@ export const AboutPipetteSlideout = ( {i18n.format(t('serial_number'), 'upperCase')} diff --git a/app/src/organisms/Devices/PipetteCard/PipetteOverflowMenu.tsx b/app/src/organisms/Devices/PipetteCard/PipetteOverflowMenu.tsx index 38122e1edd1..f28dd30ac87 100644 --- a/app/src/organisms/Devices/PipetteCard/PipetteOverflowMenu.tsx +++ b/app/src/organisms/Devices/PipetteCard/PipetteOverflowMenu.tsx @@ -1,5 +1,6 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' + import { Flex, POSITION_RELATIVE, @@ -8,20 +9,24 @@ import { SPACING, DIRECTION_COLUMN, } from '@opentrons/components' -import { MenuItem } from '../../../atoms/MenuList/MenuItem' -import { Divider } from '../../../atoms/structure' - import { - isOT3Pipette, + isFlexPipette, PipetteModelSpecs, PipetteName, } from '@opentrons/shared-data' + +import { MenuItem } from '../../../atoms/MenuList/MenuItem' +import { Divider } from '../../../atoms/structure' + import type { Mount } from '../../../redux/pipettes/types' +import type { PipetteSettingsFieldsMap } from '@opentrons/api-client' interface PipetteOverflowMenuProps { pipetteSpecs: PipetteModelSpecs | null + pipetteSettings: PipetteSettingsFieldsMap | null mount: Mount handleChangePipette: () => void + handleDropTip: () => void handleCalibrate: () => void handleAboutSlideout: () => void handleSettingsSlideout: () => void @@ -32,11 +37,13 @@ interface PipetteOverflowMenuProps { export const PipetteOverflowMenu = ( props: PipetteOverflowMenuProps ): JSX.Element => { - const { t } = useTranslation('device_details') + const { t, i18n } = useTranslation('device_details') const { mount, pipetteSpecs, + pipetteSettings, handleChangePipette, + handleDropTip, handleCalibrate, handleAboutSlideout, handleSettingsSlideout, @@ -48,7 +55,7 @@ export const PipetteOverflowMenu = ( pipetteSpecs?.name != null ? pipetteSpecs.name : t('empty') const pipetteDisplayName = pipetteSpecs?.displayName != null ? pipetteSpecs.displayName : t('empty') - const isOT3PipetteAttached = isOT3Pipette(pipetteName as PipetteName) + const isFlexPipetteAttached = isFlexPipette(pipetteName as PipetteName) return ( @@ -65,23 +72,17 @@ export const PipetteOverflowMenu = ( > {pipetteDisplayName === 'Empty' ? ( handleChangePipette()} disabled={isRunActive} - data-testid={`pipetteOverflowMenu_attach_pipette_btn_${String( - pipetteDisplayName - )}_${mount}`} > {t('attach_pipette')} ) : ( <> - {isOT3PipetteAttached && ( + {isFlexPipetteAttached ? ( handleCalibrate()} disabled={isRunActive} - data-testid={`pipetteOverflowMenu_calibrate_offset_btn_${pipetteDisplayName}_${mount}`} > {t( isPipetteCalibrated @@ -89,32 +90,24 @@ export const PipetteOverflowMenu = ( : 'calibrate_pipette' )} - )} + ) : null} handleChangePipette()} disabled={isRunActive} - data-testid={`pipetteOverflowMenu_detach_pipette_btn_${String( - pipetteDisplayName - )}_${mount}`} > {t('detach_pipette')} - handleAboutSlideout()} - data-testid={`pipetteOverflowMenu_about_pipette_slideout_btn_${pipetteDisplayName}_${mount}`} - > + handleAboutSlideout()}> {t('about_pipette')} + handleDropTip()} disabled={isRunActive}> + {i18n.format(t('drop_tips'), 'capitalize')} + - {!isOT3PipetteAttached ? ( + {!isFlexPipetteAttached && pipetteSettings != null ? ( handleSettingsSlideout()} - data-testid={`pipetteOverflowMenu_view_settings_btn_${String( - pipetteDisplayName - )}_${mount}`} > {t('view_pipette_setting')} diff --git a/app/src/organisms/Devices/PipetteCard/PipetteRecalibrationWarning.tsx b/app/src/organisms/Devices/PipetteCard/PipetteRecalibrationWarning.tsx new file mode 100644 index 00000000000..0ee79d620ff --- /dev/null +++ b/app/src/organisms/Devices/PipetteCard/PipetteRecalibrationWarning.tsx @@ -0,0 +1,43 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { + Flex, + DIRECTION_COLUMN, + TYPOGRAPHY, + SPACING, + Box, +} from '@opentrons/components' +import { StyledText } from '../../../atoms/text' +import { Banner } from '../../../atoms/Banner' + +export const PipetteRecalibrationWarning = (): JSX.Element | null => { + const { t } = useTranslation('device_details') + const [showBanner, setShowBanner] = React.useState(true) + if (!showBanner) return null + + return ( + + setShowBanner(false)} + > + + + {t('pipette_recalibration_recommended')} + + + + {`${t('pipette_calibrations_differ')}`} + + + + + ) +} diff --git a/app/src/organisms/Devices/PipetteCard/PipetteSettingsSlideout.tsx b/app/src/organisms/Devices/PipetteCard/PipetteSettingsSlideout.tsx index 87a5ada6498..0872255474b 100644 --- a/app/src/organisms/Devices/PipetteCard/PipetteSettingsSlideout.tsx +++ b/app/src/organisms/Devices/PipetteCard/PipetteSettingsSlideout.tsx @@ -1,29 +1,14 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' -import last from 'lodash/last' -import { useDispatch, useSelector } from 'react-redux' -import { Flex, useInterval } from '@opentrons/components' +import { Flex } from '@opentrons/components' import { PipetteModelSpecs } from '@opentrons/shared-data' -import { - fetchPipetteSettings, - updatePipetteSettings, -} from '../../../redux/pipettes' +import { useUpdatePipetteSettingsMutation } from '@opentrons/react-api-client' import { Slideout } from '../../../atoms/Slideout' -import { - getRequestById, - PENDING, - useDispatchApiRequest, -} from '../../../redux/robot-api' import { ConfigFormSubmitButton } from '../../ConfigurePipette/ConfigFormSubmitButton' import { ConfigurePipette } from '../../ConfigurePipette' -import type { - AttachedPipette, - PipetteSettingsFieldsUpdate, -} from '../../../redux/pipettes/types' -import type { Dispatch, State } from '../../../redux/types' - -const FETCH_PIPETTES_INTERVAL_MS = 5000 +import type { AttachedPipette } from '../../../redux/pipettes/types' +import type { PipetteSettingsFieldsMap } from '@opentrons/api-client' interface PipetteSettingsSlideoutProps { robotName: string @@ -31,53 +16,45 @@ interface PipetteSettingsSlideoutProps { onCloseClick: () => void isExpanded: boolean pipetteId: AttachedPipette['id'] + settings: PipetteSettingsFieldsMap } export const PipetteSettingsSlideout = ( props: PipetteSettingsSlideoutProps ): JSX.Element | null => { - const { pipetteName, robotName, isExpanded, pipetteId, onCloseClick } = props + const { + pipetteName, + robotName, + isExpanded, + pipetteId, + onCloseClick, + settings, + } = props const { t } = useTranslation('device_details') - const dispatch = useDispatch() - const [dispatchRequest, requestIds] = useDispatchApiRequest() - const updateSettings = (fields: PipetteSettingsFieldsUpdate): void => { - dispatchRequest(updatePipetteSettings(robotName, pipetteId, fields)) - } - const latestRequestId = last(requestIds) - const updateRequest = useSelector((state: State) => - latestRequestId != null ? getRequestById(state, latestRequestId) : null - ) - const FORM_ID = `configurePipetteForm_${pipetteId}` + const { + updatePipetteSettings, + isLoading, + error, + } = useUpdatePipetteSettingsMutation(pipetteId, { onSuccess: onCloseClick }) - // TODO(bc, 2023-02-10): replace this with the usePipetteSettingsQuery for poll and data access in the child components - useInterval( - () => { - dispatch(fetchPipetteSettings(robotName)) - }, - FETCH_PIPETTES_INTERVAL_MS, - true - ) + const FORM_ID = `configurePipetteForm_${pipetteId}` return ( - } + footer={} > diff --git a/app/src/organisms/Devices/PipetteCard/__tests__/PipetteCard.test.tsx b/app/src/organisms/Devices/PipetteCard/__tests__/PipetteCard.test.tsx index e80ea95cf0c..c3d1d24153d 100644 --- a/app/src/organisms/Devices/PipetteCard/__tests__/PipetteCard.test.tsx +++ b/app/src/organisms/Devices/PipetteCard/__tests__/PipetteCard.test.tsx @@ -1,15 +1,18 @@ import * as React from 'react' import { resetAllWhenMocks, when } from 'jest-when' -import { fireEvent } from '@testing-library/react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { LEFT, RIGHT } from '@opentrons/shared-data' -import { useCurrentSubsystemUpdateQuery } from '@opentrons/react-api-client' +import { + useCurrentSubsystemUpdateQuery, + usePipetteSettingsQuery, +} from '@opentrons/react-api-client' import { i18n } from '../../../../i18n' import { getHasCalibrationBlock } from '../../../../redux/config' import { useDispatchApiRequest } from '../../../../redux/robot-api' import { AskForCalibrationBlockModal } from '../../../CalibrateTipLength' import { useCalibratePipetteOffset } from '../../../CalibratePipetteOffset/useCalibratePipetteOffset' -import { useDeckCalibrationData, useIsOT3 } from '../../hooks' +import { useDeckCalibrationData, useIsFlex } from '../../hooks' import { PipetteOverflowMenu } from '../PipetteOverflowMenu' import { AboutPipetteSlideout } from '../AboutPipetteSlideout' import { PipetteCard } from '..' @@ -30,6 +33,7 @@ jest.mock('../../hooks') jest.mock('../AboutPipetteSlideout') jest.mock('../../../../redux/robot-api') jest.mock('@opentrons/react-api-client') +jest.mock('../../../../redux/pipettes') const mockPipetteOverflowMenu = PipetteOverflowMenu as jest.MockedFunction< typeof PipetteOverflowMenu @@ -52,10 +56,13 @@ const mockAboutPipettesSlideout = AboutPipetteSlideout as jest.MockedFunction< const mockUseDispatchApiRequest = useDispatchApiRequest as jest.MockedFunction< typeof useDispatchApiRequest > -const mockUseIsOT3 = useIsOT3 as jest.MockedFunction +const mockUseIsFlex = useIsFlex as jest.MockedFunction const mockUseCurrentSubsystemUpdateQuery = useCurrentSubsystemUpdateQuery as jest.MockedFunction< typeof useCurrentSubsystemUpdateQuery > +const mockUsePipetteSettingsQuery = usePipetteSettingsQuery as jest.MockedFunction< + typeof usePipetteSettingsQuery +> const render = (props: React.ComponentProps) => { return renderWithProviders(, { @@ -82,8 +89,9 @@ describe('PipetteCard', () => { pipetteIsBad: false, updatePipette: jest.fn(), isRunActive: false, + isEstopNotDisengaged: false, } - when(mockUseIsOT3).calledWith(mockRobotName).mockReturnValue(false) + when(mockUseIsFlex).calledWith(mockRobotName).mockReturnValue(false) when(mockAboutPipettesSlideout).mockReturnValue(
mock about slideout
) @@ -106,6 +114,9 @@ describe('PipetteCard', () => { mockUseCurrentSubsystemUpdateQuery.mockReturnValue({ data: undefined, } as any) + when(mockUsePipetteSettingsQuery) + .calledWith({ refetchInterval: 5000, enabled: true }) + .mockReturnValue({} as any) }) afterEach(() => { jest.resetAllMocks() @@ -123,10 +134,11 @@ describe('PipetteCard', () => { pipetteIsBad: false, updatePipette: jest.fn(), isRunActive: false, + isEstopNotDisengaged: false, } - const { getByText } = render(props) - getByText('left Mount') - getByText('Left Pipette') + render(props) + screen.getByText('left Mount') + screen.getByText('Left Pipette') }) it('renders information for a 96 channel pipette with overflow menu button not disabled', () => { props = { @@ -139,16 +151,40 @@ describe('PipetteCard', () => { pipetteIsBad: false, updatePipette: jest.fn(), isRunActive: false, + isEstopNotDisengaged: false, } - const { getByText, getByRole } = render(props) - getByText('Both Mounts') - const overflowButton = getByRole('button', { + render(props) + screen.getByText('Both Mounts') + const overflowButton = screen.getByRole('button', { name: /overflow/i, }) fireEvent.click(overflowButton) expect(overflowButton).not.toBeDisabled() - getByText('mock pipette overflow menu') + screen.getByText('mock pipette overflow menu') + }) + + it('renders information for a 96 channel pipette with overflow menu button disabled when e-stop is pressed', () => { + props = { + pipetteModelSpecs: mockLeftSpecs, + mount: LEFT, + robotName: mockRobotName, + pipetteId: 'id', + pipetteIs96Channel: true, + isPipetteCalibrated: false, + pipetteIsBad: false, + updatePipette: jest.fn(), + isRunActive: false, + isEstopNotDisengaged: true, + } + render(props) + screen.getByText('Both Mounts') + const overflowButton = screen.getByRole('button', { + name: /overflow/i, + }) + fireEvent.click(overflowButton) + expect(overflowButton).toBeDisabled() }) + it('renders information for a right pipette', () => { props = { pipetteModelSpecs: mockRightSpecs, @@ -160,10 +196,11 @@ describe('PipetteCard', () => { pipetteIsBad: false, updatePipette: jest.fn(), isRunActive: false, + isEstopNotDisengaged: false, } - const { getByText } = render(props) - getByText('right Mount') - getByText('Right Pipette') + render(props) + screen.getByText('right Mount') + screen.getByText('Right Pipette') }) it('renders information for no pipette on right Mount', () => { props = { @@ -175,10 +212,11 @@ describe('PipetteCard', () => { pipetteIsBad: false, updatePipette: jest.fn(), isRunActive: false, + isEstopNotDisengaged: false, } - const { getByText } = render(props) - getByText('right Mount') - getByText('Empty') + render(props) + screen.getByText('right Mount') + screen.getByText('Empty') }) it('renders information for no pipette on left Mount', () => { props = { @@ -190,13 +228,14 @@ describe('PipetteCard', () => { pipetteIsBad: false, updatePipette: jest.fn(), isRunActive: false, + isEstopNotDisengaged: false, } - const { getByText } = render(props) - getByText('left Mount') - getByText('Empty') + render(props) + screen.getByText('left Mount') + screen.getByText('Empty') }) it('does not render banner to calibrate for ot2 pipette if not calibrated', () => { - when(mockUseIsOT3).calledWith(mockRobotName).mockReturnValue(false) + when(mockUseIsFlex).calledWith(mockRobotName).mockReturnValue(false) props = { pipetteModelSpecs: mockLeftSpecs, mount: LEFT, @@ -206,12 +245,13 @@ describe('PipetteCard', () => { pipetteIsBad: false, updatePipette: jest.fn(), isRunActive: false, + isEstopNotDisengaged: false, } - const { queryByText } = render(props) - expect(queryByText('Calibrate now')).toBeNull() + render(props) + expect(screen.queryByText('Calibrate now')).toBeNull() }) it('renders banner to calibrate for ot3 pipette if not calibrated', () => { - when(mockUseIsOT3).calledWith(mockRobotName).mockReturnValue(true) + when(mockUseIsFlex).calledWith(mockRobotName).mockReturnValue(true) props = { pipetteModelSpecs: { ...mockLeftSpecs, name: 'p300_single_flex' }, mount: LEFT, @@ -221,9 +261,10 @@ describe('PipetteCard', () => { pipetteIsBad: false, updatePipette: jest.fn(), isRunActive: false, + isEstopNotDisengaged: false, } - const { getByText } = render(props) - getByText('Calibrate now') + render(props) + screen.getByText('Calibrate now') }) it('renders kebab icon, opens and closes overflow menu on click', () => { props = { @@ -235,18 +276,19 @@ describe('PipetteCard', () => { pipetteIsBad: false, updatePipette: jest.fn(), isRunActive: false, + isEstopNotDisengaged: false, } - const { getByRole, getByText, queryByText } = render(props) + render(props) - const overflowButton = getByRole('button', { + const overflowButton = screen.getByRole('button', { name: /overflow/i, }) fireEvent.click(overflowButton) expect(overflowButton).not.toBeDisabled() - const overflowMenu = getByText('mock pipette overflow menu') - overflowMenu.click() - expect(queryByText('mock pipette overflow menu')).toBeNull() + const overflowMenu = screen.getByText('mock pipette overflow menu') + fireEvent.click(overflowMenu) + expect(screen.queryByText('mock pipette overflow menu')).toBeNull() }) it('renders firmware update needed state if pipette is bad', () => { props = { @@ -258,12 +300,13 @@ describe('PipetteCard', () => { pipetteIsBad: true, updatePipette: jest.fn(), isRunActive: false, + isEstopNotDisengaged: false, } - const { getByText } = render(props) - getByText('Right mount') - getByText('Instrument attached') - getByText('Firmware update available.') - getByText('Update now').click() + render(props) + screen.getByText('Right mount') + screen.getByText('Instrument attached') + screen.getByText('Firmware update available.') + fireEvent.click(screen.getByText('Update now')) expect(props.updatePipette).toHaveBeenCalled() }) it('renders firmware update in progress state if pipette is bad and update in progress', () => { @@ -279,10 +322,19 @@ describe('PipetteCard', () => { pipetteIsBad: true, updatePipette: jest.fn(), isRunActive: false, + isEstopNotDisengaged: false, } - const { getByText } = render(props) - getByText('Right mount') - getByText('Instrument attached') - getByText('Firmware update in progress...') + render(props) + screen.getByText('Right mount') + screen.getByText('Instrument attached') + screen.getByText('Firmware update in progress...') + }) + it('does not render a pipette settings slideout card if the pipette has no settings', () => { + render(props) + expect( + screen.queryByTestId( + `PipetteSettingsSlideout_${mockRobotName}_${props.pipetteId}` + ) + ).not.toBeInTheDocument() }) }) diff --git a/app/src/organisms/Devices/PipetteCard/__tests__/PipetteOverflowMenu.test.tsx b/app/src/organisms/Devices/PipetteCard/__tests__/PipetteOverflowMenu.test.tsx index 92cd4242928..eed9fee233f 100644 --- a/app/src/organisms/Devices/PipetteCard/__tests__/PipetteOverflowMenu.test.tsx +++ b/app/src/organisms/Devices/PipetteCard/__tests__/PipetteOverflowMenu.test.tsx @@ -1,11 +1,14 @@ import * as React from 'react' -import { fireEvent } from '@testing-library/react' +import { fireEvent, screen } from '@testing-library/react' import { resetAllWhenMocks } from 'jest-when' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../../i18n' import { PipetteOverflowMenu } from '../PipetteOverflowMenu' -import { mockLeftProtoPipette } from '../../../../redux/pipettes/__fixtures__' -import { isOT3Pipette } from '@opentrons/shared-data' +import { + mockLeftProtoPipette, + mockPipetteSettingsFieldsMap, +} from '../../../../redux/pipettes/__fixtures__' +import { isFlexPipette } from '@opentrons/shared-data' import type { Mount } from '../../../../redux/pipettes/types' @@ -14,12 +17,12 @@ jest.mock('@opentrons/shared-data', () => { const actualSharedData = jest.requireActual('@opentrons/shared-data') return { ...actualSharedData, - isOT3Pipette: jest.fn(), + isFlexPipette: jest.fn(), } }) -const mockIsOT3Pipette = isOT3Pipette as jest.MockedFunction< - typeof isOT3Pipette +const mockisFlexPipette = isFlexPipette as jest.MockedFunction< + typeof isFlexPipette > const render = (props: React.ComponentProps) => { @@ -35,7 +38,9 @@ describe('PipetteOverflowMenu', () => { beforeEach(() => { props = { pipetteSpecs: mockLeftProtoPipette.modelSpecs, + pipetteSettings: mockPipetteSettingsFieldsMap, mount: LEFT, + handleDropTip: jest.fn(), handleChangePipette: jest.fn(), handleCalibrate: jest.fn(), handleAboutSlideout: jest.fn(), @@ -50,80 +55,67 @@ describe('PipetteOverflowMenu', () => { }) it('renders information with a pipette attached', () => { - const { getByRole } = render(props) - const detach = getByRole('button', { name: 'Detach pipette' }) - const settings = getByRole('button', { name: 'Pipette Settings' }) - const about = getByRole('button', { name: 'About pipette' }) + render(props) + const detach = screen.getByRole('button', { name: 'Detach pipette' }) + const settings = screen.getByRole('button', { name: 'Pipette Settings' }) + const about = screen.getByRole('button', { name: 'About pipette' }) + const dropTip = screen.getByRole('button', { name: 'Drop tips' }) fireEvent.click(detach) expect(props.handleChangePipette).toHaveBeenCalled() fireEvent.click(settings) expect(props.handleSettingsSlideout).toHaveBeenCalled() fireEvent.click(about) expect(props.handleAboutSlideout).toHaveBeenCalled() + fireEvent.click(dropTip) + expect(props.handleDropTip).toHaveBeenCalled() }) it('renders information with no pipette attached', () => { props = { + ...props, pipetteSpecs: null, - mount: LEFT, - handleChangePipette: jest.fn(), - handleCalibrate: jest.fn(), - handleAboutSlideout: jest.fn(), - handleSettingsSlideout: jest.fn(), - isPipetteCalibrated: false, - isRunActive: false, } - const { getByRole } = render(props) - const btn = getByRole('button', { name: 'Attach pipette' }) + render(props) + const btn = screen.getByRole('button', { name: 'Attach pipette' }) fireEvent.click(btn) expect(props.handleChangePipette).toHaveBeenCalled() }) - - it('renders recalibrate pipette text for OT-3 pipette', () => { - mockIsOT3Pipette.mockReturnValue(true) - + it('renders recalibrate pipette text for Flex pipette', () => { + mockisFlexPipette.mockReturnValue(true) props = { - pipetteSpecs: mockLeftProtoPipette.modelSpecs, - mount: LEFT, - handleChangePipette: jest.fn(), - handleCalibrate: jest.fn(), - handleAboutSlideout: jest.fn(), - handleSettingsSlideout: jest.fn(), + ...props, isPipetteCalibrated: true, - isRunActive: false, } - const { getByRole } = render(props) - const recalibrate = getByRole('button', { + render(props) + const recalibrate = screen.getByRole('button', { name: 'Recalibrate pipette', }) fireEvent.click(recalibrate) expect(props.handleCalibrate).toHaveBeenCalled() }) - it('should render recalibrate pipette text for OT-3 pipette', () => { - mockIsOT3Pipette.mockReturnValue(true) + it('should render recalibrate pipette text for Flex pipette', () => { + mockisFlexPipette.mockReturnValue(true) props = { ...props, isPipetteCalibrated: true, } - const { queryByRole } = render(props) - expect( - queryByRole('button', { - name: 'Recalibrate pipette', - }) - ).toBeInTheDocument() + render(props) + screen.getByRole('button', { + name: 'Recalibrate pipette', + }) }) it('renders only the about pipette button if FLEX pipette is attached', () => { - mockIsOT3Pipette.mockReturnValue(true) + mockisFlexPipette.mockReturnValue(true) - const { getByRole, queryByRole } = render(props) + render(props) - const calibrate = getByRole('button', { + const calibrate = screen.getByRole('button', { name: 'Calibrate pipette', }) - const detach = getByRole('button', { name: 'Detach pipette' }) - const settings = queryByRole('button', { name: 'Pipette Settings' }) - const about = getByRole('button', { name: 'About pipette' }) + const detach = screen.getByRole('button', { name: 'Detach pipette' }) + const settings = screen.queryByRole('button', { name: 'Pipette Settings' }) + const about = screen.getByRole('button', { name: 'About pipette' }) fireEvent.click(calibrate) expect(props.handleCalibrate).toHaveBeenCalled() @@ -133,4 +125,40 @@ describe('PipetteOverflowMenu', () => { fireEvent.click(about) expect(props.handleAboutSlideout).toHaveBeenCalled() }) + + it('does not render the pipette settings button if the pipette has no settings', () => { + mockisFlexPipette.mockReturnValue(false) + props = { + ...props, + pipetteSettings: null, + } + render(props) + const settings = screen.queryByRole('button', { name: 'Pipette Settings' }) + + expect(settings).not.toBeInTheDocument() + }) + + it('should disable certain menu items if a run is active', () => { + mockisFlexPipette.mockReturnValue(true) + props = { + ...props, + isRunActive: true, + } + render(props) + expect( + screen.getByRole('button', { + name: 'Calibrate pipette', + }) + ).toBeDisabled() + expect( + screen.getByRole('button', { + name: 'Detach pipette', + }) + ).toBeDisabled() + expect( + screen.getByRole('button', { + name: 'Drop tips', + }) + ).toBeDisabled() + }) }) diff --git a/app/src/organisms/Devices/PipetteCard/__tests__/PipetteSettingsSlideout.test.tsx b/app/src/organisms/Devices/PipetteCard/__tests__/PipetteSettingsSlideout.test.tsx index 104d169ecba..7a846abfa87 100644 --- a/app/src/organisms/Devices/PipetteCard/__tests__/PipetteSettingsSlideout.test.tsx +++ b/app/src/organisms/Devices/PipetteCard/__tests__/PipetteSettingsSlideout.test.tsx @@ -1,15 +1,12 @@ import * as React from 'react' import { resetAllWhenMocks, when } from 'jest-when' -import { waitFor } from '@testing-library/dom' -import { fireEvent } from '@testing-library/react' +import { fireEvent, waitFor } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' -import { i18n } from '../../../../i18n' -import * as RobotApi from '../../../../redux/robot-api' import { - getAttachedPipetteSettingsFieldsById, - updatePipetteSettings, -} from '../../../../redux/pipettes' -import { getConfig } from '../../../../redux/config' + useHost, + useUpdatePipetteSettingsMutation, +} from '@opentrons/react-api-client' +import { i18n } from '../../../../i18n' import { PipetteSettingsSlideout } from '../PipetteSettingsSlideout' import { @@ -17,25 +14,11 @@ import { mockPipetteSettingsFieldsMap, } from '../../../../redux/pipettes/__fixtures__' -import type { DispatchApiRequestType } from '../../../../redux/robot-api' -import type { UpdatePipetteSettingsAction } from '../../../../redux/pipettes/types' - -jest.mock('../../../../redux/robot-api') -jest.mock('../../../../redux/config') -jest.mock('../../../../redux/pipettes') +jest.mock('@opentrons/react-api-client') -const mockGetConfig = getConfig as jest.MockedFunction -const mockUseDispatchApiRequest = RobotApi.useDispatchApiRequest as jest.MockedFunction< - typeof RobotApi.useDispatchApiRequest -> -const mockGetRequestById = RobotApi.getRequestById as jest.MockedFunction< - typeof RobotApi.getRequestById -> -const mockGetAttachedPipetteSettingsFieldsById = getAttachedPipetteSettingsFieldsById as jest.MockedFunction< - typeof getAttachedPipetteSettingsFieldsById -> -const mockUpdatePipetteSettings = updatePipetteSettings as jest.MockedFunction< - typeof updatePipetteSettings +const mockUseHost = useHost as jest.MockedFunction +const mockUseUpdatePipetteSettingsMutation = useUpdatePipetteSettingsMutation as jest.MockedFunction< + typeof useUpdatePipetteSettingsMutation > const render = ( @@ -49,35 +32,31 @@ const render = ( const mockRobotName = 'mockRobotName' describe('PipetteSettingsSlideout', () => { - let dispatchApiRequest: DispatchApiRequestType - let props: React.ComponentProps + let mockUpdatePipetteSettings: jest.Mock beforeEach(() => { props = { pipetteId: 'id', + settings: mockPipetteSettingsFieldsMap, robotName: mockRobotName, pipetteName: mockLeftSpecs.displayName, isExpanded: true, onCloseClick: jest.fn(), } - mockGetRequestById.mockReturnValue({ - status: RobotApi.SUCCESS, - response: { - method: 'POST', - ok: true, - path: '/', - status: 200, - }, - }) - mockGetConfig.mockReturnValue({} as any) - mockGetAttachedPipetteSettingsFieldsById.mockReturnValue( - mockPipetteSettingsFieldsMap - ) - dispatchApiRequest = jest.fn() - when(mockUseDispatchApiRequest) + when(mockUseHost) .calledWith() - .mockReturnValue([dispatchApiRequest, ['id']]) + .mockReturnValue({} as any) + + mockUpdatePipetteSettings = jest.fn() + + when(mockUseUpdatePipetteSettingsMutation) + .calledWith(props.pipetteId, expect.anything()) + .mockReturnValue({ + updatePipetteSettings: mockUpdatePipetteSettings, + isLoading: false, + error: null, + } as any) }) afterEach(() => { jest.resetAllMocks() @@ -104,30 +83,20 @@ describe('PipetteSettingsSlideout', () => { const { getByRole } = render(props) const button = getByRole('button', { name: 'Confirm' }) - when(mockUpdatePipetteSettings) - .calledWith( - mockRobotName, - props.pipetteId, - expect.objectContaining({ - blowout: 2, - bottom: 3, - dropTip: 1, + fireEvent.click(button) + await waitFor(() => { + expect(mockUpdatePipetteSettings).toHaveBeenCalledWith({ + fields: expect.objectContaining({ + blowout: { value: 2 }, + bottom: { value: 3 }, + dropTip: { value: 1 }, dropTipCurrent: null, dropTipSpeed: null, pickUpCurrent: null, pickUpDistance: null, plungerCurrent: null, - top: 4, - }) - ) - .mockReturnValue({ - type: 'pipettes:UPDATE_PIPETTE_SETTINGS', - } as UpdatePipetteSettingsAction) - - fireEvent.click(button) - await waitFor(() => { - expect(dispatchApiRequest).toHaveBeenCalledWith({ - type: 'pipettes:UPDATE_PIPETTE_SETTINGS', + top: { value: 4 }, + }), }) }) }) diff --git a/app/src/organisms/Devices/PipetteCard/index.tsx b/app/src/organisms/Devices/PipetteCard/index.tsx index 0395a02d902..bd285277205 100644 --- a/app/src/organisms/Devices/PipetteCard/index.tsx +++ b/app/src/organisms/Devices/PipetteCard/index.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import { Trans, useTranslation } from 'react-i18next' import { css } from 'styled-components' + import { Box, Flex, @@ -13,13 +14,20 @@ import { useOnClickOutside, InstrumentDiagram, BORDERS, + ALIGN_CENTER, } from '@opentrons/components' import { - isOT3Pipette, + FLEX_ROBOT_TYPE, + isFlexPipette, NINETY_SIX_CHANNEL, + OT2_ROBOT_TYPE, SINGLE_MOUNT_PIPETTES, } from '@opentrons/shared-data' -import { useCurrentSubsystemUpdateQuery } from '@opentrons/react-api-client' +import { + useCurrentSubsystemUpdateQuery, + usePipetteSettingsQuery, +} from '@opentrons/react-api-client' + import { LEFT } from '../../../redux/pipettes' import { OverflowBtn } from '../../../atoms/MenuList/OverflowBtn' import { StyledText } from '../../../atoms/text' @@ -30,20 +38,18 @@ import { ChangePipette } from '../../ChangePipette' import { FLOWS } from '../../PipetteWizardFlows/constants' import { PipetteWizardFlows } from '../../PipetteWizardFlows' import { ChoosePipette } from '../../PipetteWizardFlows/ChoosePipette' -import { useIsOT3 } from '../hooks' +import { useIsFlex } from '../hooks' import { PipetteOverflowMenu } from './PipetteOverflowMenu' import { PipetteSettingsSlideout } from './PipetteSettingsSlideout' import { AboutPipetteSlideout } from './AboutPipetteSlideout' -import type { - PipetteModelSpecs, - PipetteMount, - PipetteName, -} from '@opentrons/shared-data' + +import type { PipetteModelSpecs, PipetteName } from '@opentrons/shared-data' import type { AttachedPipette, Mount } from '../../../redux/pipettes/types' import type { PipetteWizardFlow, SelectablePipettes, } from '../../PipetteWizardFlows/types' +import { DropTipWizard } from '../../DropTipWizard' interface PipetteCardProps { pipetteModelSpecs: PipetteModelSpecs | null @@ -55,13 +61,25 @@ interface PipetteCardProps { pipetteIsBad: boolean updatePipette: () => void isRunActive: boolean + isEstopNotDisengaged: boolean } -const BANNER_LINK_CSS = css` +const BANNER_LINK_STYLE = css` text-decoration: underline; cursor: pointer; margin-left: ${SPACING.spacing8}; ` -const SUBSYSTEM_UPDATE_POLL_MS = 5000 + +const INSTRUMENT_CARD_STYLE = css` + p { + text-transform: lowercase; + } + + p::first-letter { + text-transform: uppercase; + } +` + +const POLL_DURATION_MS = 5000 export const PipetteCard = (props: PipetteCardProps): JSX.Element => { const { t, i18n } = useTranslation(['device_details', 'protocol_setup']) @@ -75,6 +93,7 @@ export const PipetteCard = (props: PipetteCardProps): JSX.Element => { pipetteIsBad, updatePipette, isRunActive, + isEstopNotDisengaged, } = props const { menuOverlay, @@ -82,14 +101,15 @@ export const PipetteCard = (props: PipetteCardProps): JSX.Element => { showOverflowMenu, setShowOverflowMenu, } = useMenuHandleClickOutside() - const isOt3 = useIsOT3(robotName) + const isFlex = useIsFlex(robotName) const pipetteName = pipetteModelSpecs?.name - const isOT3PipetteAttached = isOT3Pipette(pipetteName as PipetteName) + const isFlexPipetteAttached = isFlexPipette(pipetteName as PipetteName) const pipetteDisplayName = pipetteModelSpecs?.displayName const pipetteOverflowWrapperRef = useOnClickOutside({ onClickOutside: () => setShowOverflowMenu(false), }) const [showChangePipette, setChangePipette] = React.useState(false) + const [showDropTipWizard, setShowDropTipWizard] = React.useState(false) const [showSlideout, setShowSlideout] = React.useState(false) const [ pipetteWizardFlow, @@ -98,13 +118,38 @@ export const PipetteCard = (props: PipetteCardProps): JSX.Element => { const [showAttachPipette, setShowAttachPipette] = React.useState(false) const [showAboutSlideout, setShowAboutSlideout] = React.useState(false) const subsystem = mount === LEFT ? 'pipette_left' : 'pipette_right' + const [pollForSubsystemUpdate, setPollForSubsystemUpdate] = React.useState( + false + ) const { data: subsystemUpdateData } = useCurrentSubsystemUpdateQuery( subsystem, { - enabled: isOt3, - refetchInterval: SUBSYSTEM_UPDATE_POLL_MS, + enabled: pollForSubsystemUpdate, + refetchInterval: POLL_DURATION_MS, } ) + // we should poll for a subsystem update from the time a bad instrument is + // detected until the update has been done for 5 seconds + // this gives the instruments endpoint time to start reporting + // a good instrument + React.useEffect(() => { + if (pipetteIsBad && isFlex) { + setPollForSubsystemUpdate(true) + } else if ( + subsystemUpdateData != null && + subsystemUpdateData.data.updateStatus === 'done' + ) { + setTimeout(() => { + setPollForSubsystemUpdate(false) + }, POLL_DURATION_MS) + } + }, [pipetteIsBad, subsystemUpdateData, isFlex]) + + const settings = + usePipetteSettingsQuery({ + refetchInterval: POLL_DURATION_MS, + enabled: pipetteId != null, + })?.data?.[pipetteId ?? '']?.fields ?? null const [ selectedPipette, @@ -112,16 +157,19 @@ export const PipetteCard = (props: PipetteCardProps): JSX.Element => { ] = React.useState(SINGLE_MOUNT_PIPETTES) const handleChangePipette = (): void => { - if (isOT3PipetteAttached && isOt3) { + if (isFlexPipetteAttached && isFlex) { setPipetteWizardFlow(FLOWS.DETACH) - } else if (!isOT3PipetteAttached && isOt3) { + } else if (!isFlexPipetteAttached && isFlex) { setShowAttachPipette(true) } else { setChangePipette(true) } } + const handleDropTip = (): void => { + setShowDropTipWizard(true) + } const handleCalibrate = (): void => { - if (isOT3PipetteAttached) setPipetteWizardFlow(FLOWS.CALIBRATE) + if (isFlexPipetteAttached) setPipetteWizardFlow(FLOWS.CALIBRATE) } const handleAboutSlideout = (): void => { setShowAboutSlideout(true) @@ -136,7 +184,7 @@ export const PipetteCard = (props: PipetteCardProps): JSX.Element => { } return ( { {pipetteWizardFlow != null ? ( { setSelectedPipette(SINGLE_MOUNT_PIPETTES) setPipetteWizardFlow(null) @@ -175,15 +218,27 @@ export const PipetteCard = (props: PipetteCardProps): JSX.Element => { closeModal={() => setChangePipette(false)} /> )} - {showSlideout && pipetteModelSpecs != null && pipetteId != null && ( - setShowSlideout(false)} - isExpanded={true} - pipetteId={pipetteId} + {showDropTipWizard && pipetteModelSpecs != null ? ( + setShowDropTipWizard(false)} /> - )} + ) : null} + {showSlideout && + pipetteModelSpecs != null && + pipetteId != null && + settings != null && ( + setShowSlideout(false)} + isExpanded={true} + pipetteId={pipetteId} + settings={settings} + /> + )} {showAboutSlideout && pipetteModelSpecs != null && pipetteId != null && ( { )} {!pipetteIsBad && subsystemUpdateData == null && ( <> - + - + {pipetteModelSpecs !== null ? ( ) : null} @@ -217,30 +268,36 @@ export const PipetteCard = (props: PipetteCardProps): JSX.Element => { flex="100%" paddingLeft={SPACING.spacing8} > - {isOT3PipetteAttached && !isPipetteCalibrated ? ( + {isFlexPipetteAttached && !isPipetteCalibrated ? ( - - ), - }} - /> + {isEstopNotDisengaged ? ( + + {t('calibration_needed_without_link')} + + ) : ( + + ), + }} + /> + )} ) : null} { pipetteDisplayName )}`} > - + )} - {(pipetteIsBad || subsystemUpdateData != null) && ( + {(pipetteIsBad || + (subsystemUpdateData != null && pollForSubsystemUpdate)) && ( { updateLink: ( ), @@ -306,25 +369,25 @@ export const PipetteCard = (props: PipetteCardProps): JSX.Element => { /> } + isEstopNotDisengaged={isEstopNotDisengaged} /> )} {showOverflowMenu && ( <> setShowOverflowMenu(false)} > diff --git a/app/src/organisms/Devices/ProtocolRun/BackToTopButton.tsx b/app/src/organisms/Devices/ProtocolRun/BackToTopButton.tsx index d06cb18a651..7403f5a53e6 100644 --- a/app/src/organisms/Devices/ProtocolRun/BackToTopButton.tsx +++ b/app/src/organisms/Devices/ProtocolRun/BackToTopButton.tsx @@ -2,18 +2,12 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { Link } from 'react-router-dom' -import { useHoverTooltip, SecondaryButton } from '@opentrons/components' +import { SecondaryButton } from '@opentrons/components' -import { Tooltip } from '../../../atoms/Tooltip' import { useTrackEvent, ANALYTICS_PROTOCOL_PROCEED_TO_RUN, } from '../../../redux/analytics' -import { - useUnmatchedModulesForProtocol, - useRunCalibrationStatus, - useRunHasStarted, -} from '../hooks' interface BackToTopButtonProps { protocolRunHeaderRef: React.RefObject | null @@ -29,34 +23,7 @@ export function BackToTopButton({ sourceLocation, }: BackToTopButtonProps): JSX.Element | null { const { t } = useTranslation('protocol_setup') - const [targetProps, tooltipProps] = useHoverTooltip() - const { missingModuleIds } = useUnmatchedModulesForProtocol(robotName, runId) const trackEvent = useTrackEvent() - const { complete: isCalibrationComplete } = useRunCalibrationStatus( - robotName, - runId - ) - const runHasStarted = useRunHasStarted(runId) - - const calibrationIncomplete = - missingModuleIds.length === 0 && !isCalibrationComplete - const moduleSetupIncomplete = - missingModuleIds.length > 0 && isCalibrationComplete - const moduleAndCalibrationIncomplete = - missingModuleIds.length > 0 && !isCalibrationComplete - - let proceedToRunDisabledReason = null - if (runHasStarted) { - proceedToRunDisabledReason = t('protocol_run_started') - } else if (moduleAndCalibrationIncomplete) { - proceedToRunDisabledReason = t( - 'run_disabled_modules_and_calibration_not_complete' - ) - } else if (calibrationIncomplete) { - proceedToRunDisabledReason = t('run_disabled_calibration_not_complete') - } else if (moduleSetupIncomplete) { - proceedToRunDisabledReason = t('run_disabled_modules_not_connected') - } return ( - + {t('back_to_top')} - {proceedToRunDisabledReason != null && ( - - {proceedToRunDisabledReason} - - )} ) } diff --git a/app/src/organisms/Devices/ProtocolRun/EmptySetupStep.tsx b/app/src/organisms/Devices/ProtocolRun/EmptySetupStep.tsx index 4fcebc7fb44..59e22a5cce0 100644 --- a/app/src/organisms/Devices/ProtocolRun/EmptySetupStep.tsx +++ b/app/src/organisms/Devices/ProtocolRun/EmptySetupStep.tsx @@ -17,7 +17,7 @@ interface EmptySetupStepProps { export function EmptySetupStep(props: EmptySetupStepProps): JSX.Element { const { title, description, label } = props return ( - + {label} diff --git a/app/src/organisms/Devices/ProtocolRun/LabwareInfoOverlay.tsx b/app/src/organisms/Devices/ProtocolRun/LabwareInfoOverlay.tsx index 3f8bd38d635..41fd2d81c55 100644 --- a/app/src/organisms/Devices/ProtocolRun/LabwareInfoOverlay.tsx +++ b/app/src/organisms/Devices/ProtocolRun/LabwareInfoOverlay.tsx @@ -47,7 +47,7 @@ const LabwareInfo = (props: LabwareInfoProps): JSX.Element | null => { return ( - + {t('analysis_failure_on_robot', { protocolName: displayName, robotName, diff --git a/app/src/organisms/Devices/ProtocolRun/ProtocolDropTipBanner.tsx b/app/src/organisms/Devices/ProtocolRun/ProtocolDropTipBanner.tsx new file mode 100644 index 00000000000..ff12d0dcf6c --- /dev/null +++ b/app/src/organisms/Devices/ProtocolRun/ProtocolDropTipBanner.tsx @@ -0,0 +1,56 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' + +import { + Flex, + SPACING, + Btn, + TYPOGRAPHY, + ALIGN_START, + DIRECTION_COLUMN, + DIRECTION_ROW, +} from '@opentrons/components' + +import { Banner } from '../../../atoms/Banner' +import { StyledText } from '../../../atoms/text' + +export function ProtocolDropTipBanner(props: { + onLaunchWizardClick: (setShowWizard: true) => void + onCloseClick: () => void +}): JSX.Element { + const { t } = useTranslation('drop_tip_wizard') + const { onLaunchWizardClick, onCloseClick } = props + + return ( + + + + {t('tips_may_be_attached')} + + + + + {t('remove_the_tips_from_pipette')} + + onLaunchWizardClick(true)} + aria-label="remove-tips" + > + + {t('remove_tips')} + + + + + + ) +} diff --git a/app/src/organisms/Devices/ProtocolRun/ProtocolRunHeader.tsx b/app/src/organisms/Devices/ProtocolRun/ProtocolRunHeader.tsx index 49ec312f1f1..d12da9838cf 100644 --- a/app/src/organisms/Devices/ProtocolRun/ProtocolRunHeader.tsx +++ b/app/src/organisms/Devices/ProtocolRun/ProtocolRunHeader.tsx @@ -17,36 +17,44 @@ import { RunStatus, } from '@opentrons/api-client' import { - useRunQuery, useModulesQuery, useDoorQuery, + useHost, + useInstrumentsQuery, } from '@opentrons/react-api-client' -import { HEATERSHAKER_MODULE_TYPE } from '@opentrons/shared-data' import { + getPipetteModelSpecs, + FLEX_ROBOT_TYPE, + OT2_ROBOT_TYPE, +} from '@opentrons/shared-data' +import { + ALIGN_CENTER, + BORDERS, Box, + COLORS, + DIRECTION_COLUMN, + DISPLAY_FLEX, Flex, Icon, IconName, - useHoverTooltip, - ALIGN_CENTER, - DIRECTION_COLUMN, - DISPLAY_FLEX, JUSTIFY_CENTER, + JUSTIFY_FLEX_END, JUSTIFY_SPACE_BETWEEN, + Link as LinkButton, + PrimaryButton, + SecondaryButton, SIZE_1, - BORDERS, - COLORS, SPACING, TYPOGRAPHY, - PrimaryButton, - SecondaryButton, useConditionalConfirm, - JUSTIFY_FLEX_END, - Link as LinkButton, + useHoverTooltip, } from '@opentrons/components' import { getRobotUpdateDisplayInfo } from '../../../redux/robot-update' +import { getRobotSettings } from '../../../redux/robot-settings' import { ProtocolAnalysisErrorBanner } from './ProtocolAnalysisErrorBanner' +import { ProtocolDropTipBanner } from './ProtocolDropTipBanner' +import { DropTipWizard } from '../../DropTipWizard' import { ProtocolAnalysisErrorModal } from './ProtocolAnalysisErrorModal' import { Banner } from '../../../atoms/Banner' import { @@ -83,17 +91,31 @@ import { useIsRobotViewable, useTrackProtocolRunEvent, useRobotAnalyticsData, + useIsFlex, + useModuleCalibrationStatus, } from '../hooks' +import { getPipettesWithTipAttached } from '../../DropTipWizard/getPipettesWithTipAttached' import { formatTimestamp } from '../utils' import { RunTimer } from './RunTimer' import { EMPTY_TIMESTAMP } from '../constants' import { getHighestPriorityError } from '../../OnDeviceDisplay/RunningProtocol' import { RunFailedModal } from './RunFailedModal' import { RunProgressMeter } from '../../RunProgressMeter' +import { getIsFixtureMismatch } from '../../../resources/deck_configuration/utils' +import { useDeckConfigurationCompatibility } from '../../../resources/deck_configuration/hooks' +import { useMostRecentCompletedAnalysis } from '../../LabwarePositionCheck/useMostRecentCompletedAnalysis' +import { useMostRecentRunId } from '../../ProtocolUpload/hooks/useMostRecentRunId' +import { useNotifyRunQuery } from '../../../resources/runs/useNotifyRunQuery' import type { Run, RunError } from '@opentrons/api-client' import type { State } from '../../../redux/types' import type { HeaterShakerModule } from '../../../redux/modules/types' +import type { PipetteModelSpecs } from '@opentrons/shared-data' + +interface PipettesWithTip { + mount: 'left' | 'right' + specs?: PipetteModelSpecs | null +} const EQUIPMENT_POLL_MS = 5000 const CANCELLABLE_STATUSES = [ @@ -103,6 +125,11 @@ const CANCELLABLE_STATUSES = [ RUN_STATUS_BLOCKED_BY_OPEN_DOOR, RUN_STATUS_IDLE, ] +const RUN_OVER_STATUSES: RunStatus[] = [ + RUN_STATUS_FAILED, + RUN_STATUS_STOPPED, + RUN_STATUS_SUCCEEDED, +] interface ProtocolRunHeaderProps { protocolRunHeaderRef: React.RefObject | null @@ -119,6 +146,7 @@ export function ProtocolRunHeader({ }: ProtocolRunHeaderProps): JSX.Element | null { const { t } = useTranslation(['run_details', 'shared']) const history = useHistory() + const host = useHost() const createdAtTimestamp = useRunCreatedAtTimestamp(runId) const { protocolData, @@ -126,26 +154,89 @@ export function ProtocolRunHeader({ protocolKey, isProtocolAnalyzing, } = useProtocolDetailsForRun(runId) + const { trackProtocolRunEvent } = useTrackProtocolRunEvent(runId) const robotAnalyticsData = useRobotAnalyticsData(robotName) const isRobotViewable = useIsRobotViewable(robotName) const runStatus = useRunStatus(runId) const { analysisErrors } = useProtocolAnalysisErrors(runId) - const isRunCurrent = Boolean(useRunQuery(runId)?.data?.data?.current) + const { data: attachedInstruments } = useInstrumentsQuery() + const isRunCurrent = Boolean(useNotifyRunQuery(runId)?.data?.data?.current) + const mostRecentRunId = useMostRecentRunId() const { closeCurrentRun, isClosingCurrentRun } = useCloseCurrentRun() const { startedAt, stoppedAt, completedAt } = useRunTimestamps(runId) const [showRunFailedModal, setShowRunFailedModal] = React.useState(false) - const { data: runRecord } = useRunQuery(runId, { staleTime: Infinity }) + const [showDropTipWizard, setShowDropTipWizard] = React.useState(false) + const [showDropTipBanner, setShowDropTipBanner] = React.useState(true) + const [pipettesWithTip, setPipettesWithTip] = React.useState< + PipettesWithTip[] + >([]) + const isResetRunLoadingRef = React.useRef(false) + const { data: runRecord } = useNotifyRunQuery(runId, { staleTime: Infinity }) const highestPriorityError = runRecord?.data.errors?.[0] != null ? getHighestPriorityError(runRecord?.data?.errors) : null + + const robotSettings = useSelector((state: State) => + getRobotSettings(state, robotName) + ) + const isFlex = useIsFlex(robotName) + const robotProtocolAnalysis = useMostRecentCompletedAnalysis(runId) + const robotType = isFlex ? FLEX_ROBOT_TYPE : OT2_ROBOT_TYPE + const deckConfigCompatibility = useDeckConfigurationCompatibility( + robotType, + robotProtocolAnalysis + ) + const isFixtureMismatch = getIsFixtureMismatch(deckConfigCompatibility) + + const doorSafetySetting = robotSettings.find( + setting => setting.id === 'enableDoorSafetySwitch' + ) const { data: doorStatus } = useDoorQuery({ refetchInterval: EQUIPMENT_POLL_MS, }) - const isDoorOpen = - doorStatus?.data.status === 'open' && - doorStatus?.data.doorRequiredClosedForProtocol + let isDoorOpen = false + if (isFlex) { + isDoorOpen = doorStatus?.data.status === 'open' + } else if (!isFlex && Boolean(doorSafetySetting?.value)) { + isDoorOpen = doorStatus?.data.status === 'open' + } else { + isDoorOpen = false + } + + React.useEffect(() => { + if (isFlex) { + // Reset drop tip state when a new run occurs. + if (runStatus === RUN_STATUS_IDLE) { + setShowDropTipBanner(true) + setPipettesWithTip([]) + } else if (runStatus != null && RUN_OVER_STATUSES.includes(runStatus)) { + getPipettesWithTipAttached({ + host, + runId, + runRecord, + attachedInstruments, + isFlex, + }) + .then(pipettesWithTipAttached => { + const newPipettesWithTipAttached = pipettesWithTipAttached.map( + pipette => { + const specs = getPipetteModelSpecs(pipette.instrumentModel) + return { + specs, + mount: pipette.mount, + } + } + ) + setPipettesWithTip(() => newPipettesWithTipAttached) + }) + .catch(e => { + console.log(`Error checking pipette tip attachement state: ${e}`) + }) + } + } + }, [runStatus, attachedInstruments, host, runId, runRecord, isFlex]) React.useEffect(() => { if (protocolData != null && !isRobotViewable) { @@ -224,8 +315,7 @@ export function ProtocolRunHeader({ )} - {protocolKey != null ? ( {displayName} @@ -268,10 +357,14 @@ export function ProtocolRunHeader({ {runStatus === RUN_STATUS_STOPPED ? ( {t('run_canceled')} ) : null} - {isDoorOpen ? ( + {/* Note: This banner is for before running a protocol */} + {isDoorOpen && + runStatus !== RUN_STATUS_BLOCKED_BY_OPEN_DOOR && + runStatus != null && + CANCELLABLE_STATUSES.includes(runStatus) ? ( {t('shared:close_robot_door')} ) : null} - {isRunCurrent ? ( + {mostRecentRunId === runId ? ( + ) : null} + {mostRecentRunId === runId && + showDropTipBanner && + pipettesWithTip.length !== 0 ? ( + { + closeCurrentRun() + setShowDropTipBanner(false) + }} /> ) : null} @@ -303,12 +408,14 @@ export function ProtocolRunHeader({ protocolData == null || !!isProtocolAnalyzing } isDoorOpen={isDoorOpen} + isFixtureMismatch={isFixtureMismatch} + isResetRunLoadingRef={isResetRunLoadingRef} /> {runStatus != null ? ( ) : null} + {showDropTipWizard && + pipettesWithTip[0]?.specs != null && + mostRecentRunId === runId ? ( + { + setShowDropTipWizard(false) + setPipettesWithTip(prevPipettesWithTip => { + const pipettesWithTip = prevPipettesWithTip.slice(1) ?? [] + if (pipettesWithTip.length === 0) closeCurrentRun() + return pipettesWithTip + }) + }} + /> + ) : null} ) @@ -361,7 +485,9 @@ interface LabeledValueProps { function LabeledValue(props: LabeledValueProps): JSX.Element { return ( - {props.label} + + {props.label} + {typeof props.value === 'string' ? ( {props.value} ) : ( @@ -382,14 +508,14 @@ function DisplayRunStatus(props: DisplayRunStatusProps): JSX.Element { {props.runStatus === RUN_STATUS_RUNNING ? ( } + function ActionButton(props: ActionButtonProps): JSX.Element { - const { runId, robotName, runStatus, isProtocolAnalyzing, isDoorOpen } = props + const { + runId, + robotName, + runStatus, + isProtocolAnalyzing, + isDoorOpen, + isFixtureMismatch, + isResetRunLoadingRef, + } = props const history = useHistory() const { t } = useTranslation(['run_details', 'shared']) const attachedModules = @@ -453,15 +590,23 @@ function ActionButton(props: ActionButtonProps): JSX.Element { `/devices/${robotName}/protocol-runs/${createRunResponse.data.id}/run-preview` ) ) + isResetRunLoadingRef.current = isResetRunLoading const { missingModuleIds } = useUnmatchedModulesForProtocol(robotName, runId) const { complete: isCalibrationComplete } = useRunCalibrationStatus( robotName, runId ) + const { complete: isModuleCalibrationComplete } = useModuleCalibrationStatus( + robotName, + runId + ) const [showIsShakingModal, setShowIsShakingModal] = React.useState( false ) - const isSetupComplete = isCalibrationComplete && missingModuleIds.length === 0 + const isSetupComplete = + isCalibrationComplete && + isModuleCalibrationComplete && + missingModuleIds.length === 0 const isRobotOnWrongVersionOfSoftware = ['upgrade', 'downgrade'].includes( useSelector((state: State) => { return getRobotUpdateDisplayInfo(state, robotName) @@ -477,9 +622,13 @@ function ActionButton(props: ActionButtonProps): JSX.Element { isResetRunLoading || isOtherRunCurrent || isProtocolAnalyzing || + isFixtureMismatch || (runStatus != null && DISABLED_STATUSES.includes(runStatus)) || isRobotOnWrongVersionOfSoftware || - isDoorOpen + (isDoorOpen && + runStatus !== RUN_STATUS_BLOCKED_BY_OPEN_DOOR && + runStatus != null && + CANCELLABLE_STATUSES.includes(runStatus)) const handleProceedToRunClick = (): void => { trackEvent({ name: ANALYTICS_PROTOCOL_PROCEED_TO_RUN, properties: {} }) play() @@ -500,15 +649,14 @@ function ActionButton(props: ActionButtonProps): JSX.Element { const isHeaterShakerInProtocol = useIsHeaterShakerInProtocol() const activeHeaterShaker = attachedModules.find( (module): module is HeaterShakerModule => - module.moduleType === HEATERSHAKER_MODULE_TYPE && + module.moduleType === 'heaterShakerModuleType' && module?.data != null && module.data.speedStatus !== 'idle' ) const isHeaterShakerShaking = attachedModules - .filter( - (module): module is HeaterShakerModule => - module.moduleType === HEATERSHAKER_MODULE_TYPE - ) + .filter((module): module is HeaterShakerModule => { + return module.moduleType === 'heaterShakerModuleType' + }) .some(module => module?.data != null && module.data.speedStatus !== 'idle') let buttonText: string = '' @@ -516,12 +664,18 @@ function ActionButton(props: ActionButtonProps): JSX.Element { let buttonIconName: IconName | null = null let disableReason = null - if (currentRunId === runId && !isSetupComplete) { + if (currentRunId === runId && (!isSetupComplete || isFixtureMismatch)) { disableReason = t('setup_incomplete') } else if (isOtherRunCurrent) { disableReason = t('shared:robot_is_busy') } else if (isRobotOnWrongVersionOfSoftware) { disableReason = t('shared:a_software_update_is_available') + } else if ( + isDoorOpen && + runStatus != null && + START_RUN_STATUSES.includes(runStatus) + ) { + disableReason = t('close_door') } if (isProtocolAnalyzing) { @@ -604,7 +758,9 @@ function ActionButton(props: ActionButtonProps): JSX.Element { {buttonText} {disableReason != null && ( - {disableReason} + + {disableReason} + )} {showIsShakingModal && activeHeaterShaker != null && @@ -632,6 +788,7 @@ interface TerminalRunProps { handleClearClick: () => void isClosingCurrentRun: boolean setShowRunFailedModal: (showRunFailedModal: boolean) => void + isResetRunLoading: boolean highestPriorityError?: RunError | null } function TerminalRunBanner(props: TerminalRunProps): JSX.Element | null { @@ -641,6 +798,7 @@ function TerminalRunBanner(props: TerminalRunProps): JSX.Element | null { isClosingCurrentRun, setShowRunFailedModal, highestPriorityError, + isResetRunLoading, } = props const { t } = useTranslation('run_details') @@ -649,7 +807,10 @@ function TerminalRunBanner(props: TerminalRunProps): JSX.Element | null { setShowRunFailedModal(true) } - if (runStatus === RUN_STATUS_FAILED || runStatus === RUN_STATUS_SUCCEEDED) { + if ( + isResetRunLoading === false && + (runStatus === RUN_STATUS_FAILED || runStatus === RUN_STATUS_SUCCEEDED) + ) { return ( <> {runStatus === RUN_STATUS_SUCCEEDED ? ( diff --git a/app/src/organisms/Devices/ProtocolRun/ProtocolRunModuleControls.tsx b/app/src/organisms/Devices/ProtocolRun/ProtocolRunModuleControls.tsx index 8e2d67fd238..bf18a5ac5de 100644 --- a/app/src/organisms/Devices/ProtocolRun/ProtocolRunModuleControls.tsx +++ b/app/src/organisms/Devices/ProtocolRun/ProtocolRunModuleControls.tsx @@ -15,6 +15,7 @@ import type { BadPipette, PipetteData } from '@opentrons/api-client' interface PipetteStatus { attachPipetteRequired: boolean + calibratePipetteRequired: boolean updatePipetteFWRequired: boolean } @@ -51,9 +52,16 @@ const usePipetteIsReady = (): PipetteStatus => { const attachPipetteRequired = attachedLeftPipette == null && attachedRightPipette == null + const calibratePipetteRequired = + attachedLeftPipette?.data.calibratedOffset?.last_modified == null && + attachedRightPipette?.data.calibratedOffset?.last_modified == null const updatePipetteFWRequired = leftPipetteRequiresFWUpdate != null || rightPipetteFWRequired != null - return { attachPipetteRequired, updatePipetteFWRequired } + return { + attachPipetteRequired, + calibratePipetteRequired, + updatePipetteFWRequired, + } } interface ProtocolRunModuleControlsProps { @@ -67,10 +75,13 @@ export const ProtocolRunModuleControls = ({ }: ProtocolRunModuleControlsProps): JSX.Element => { const { t } = useTranslation('protocol_details') - const { attachPipetteRequired, updatePipetteFWRequired } = usePipetteIsReady() + const { + attachPipetteRequired, + calibratePipetteRequired, + updatePipetteFWRequired, + } = usePipetteIsReady() const moduleRenderInfoForProtocolById = useModuleRenderInfoForProtocolById( - robotName, runId ) const attachedModules = Object.values(moduleRenderInfoForProtocolById).filter( @@ -86,11 +97,7 @@ export const ProtocolRunModuleControls = ({ return attachedModules.length === 0 ? ( - + {t('connect_modules_to_see_controls')} @@ -116,6 +123,7 @@ export const ProtocolRunModuleControls = ({ slotName={module.slotName} isLoadedInRun={true} attachPipetteRequired={attachPipetteRequired} + calibratePipetteRequired={calibratePipetteRequired} updatePipetteFWRequired={updatePipetteFWRequired} /> ) : null @@ -136,6 +144,7 @@ export const ProtocolRunModuleControls = ({ slotName={module.slotName} isLoadedInRun={true} attachPipetteRequired={attachPipetteRequired} + calibratePipetteRequired={calibratePipetteRequired} updatePipetteFWRequired={updatePipetteFWRequired} /> ) : null diff --git a/app/src/organisms/Devices/ProtocolRun/ProtocolRunSetup.tsx b/app/src/organisms/Devices/ProtocolRun/ProtocolRunSetup.tsx index 36f14a0a7ff..2d53aafb4bf 100644 --- a/app/src/organisms/Devices/ProtocolRun/ProtocolRunSetup.tsx +++ b/app/src/organisms/Devices/ProtocolRun/ProtocolRunSetup.tsx @@ -1,42 +1,53 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' -import { parseAllRequiredModuleModels } from '@opentrons/api-client' import { - Flex, + parseAllRequiredModuleModels, + parseLiquidsInLoadOrder, +} from '@opentrons/api-client' +import { ALIGN_CENTER, COLORS, DIRECTION_COLUMN, - SPACING, - Icon, - SIZE_1, DIRECTION_ROW, - TYPOGRAPHY, + Flex, + Icon, Link, + SPACING, + TYPOGRAPHY, } from '@opentrons/components' +import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE } from '@opentrons/shared-data' import { Line } from '../../../atoms/structure' import { StyledText } from '../../../atoms/text' import { InfoMessage } from '../../../molecules/InfoMessage' import { - useIsOT3, + getIsFixtureMismatch, + getRequiredDeckConfig, +} from '../../../resources/deck_configuration/utils' +import { useDeckConfigurationCompatibility } from '../../../resources/deck_configuration/hooks' +import { + useIsFlex, + useModuleCalibrationStatus, + useProtocolAnalysisErrors, useRobot, useRunCalibrationStatus, useRunHasStarted, - useProtocolAnalysisErrors, useStoredProtocolAnalysis, - ProtocolCalibrationStatus, + useUnmatchedModulesForProtocol, } from '../hooks' import { useMostRecentCompletedAnalysis } from '../../LabwarePositionCheck/useMostRecentCompletedAnalysis' import { SetupLabware } from './SetupLabware' import { SetupLabwarePositionCheck } from './SetupLabwarePositionCheck' import { SetupRobotCalibration } from './SetupRobotCalibration' -import { SetupModules } from './SetupModules' +import { SetupModuleAndDeck } from './SetupModuleAndDeck' import { SetupStep } from './SetupStep' import { SetupLiquids } from './SetupLiquids' import { EmptySetupStep } from './EmptySetupStep' import { HowLPCWorksModal } from './SetupLabwarePositionCheck/HowLPCWorksModal' +import type { ProtocolCalibrationStatus } from '../hooks' + const ROBOT_CALIBRATION_STEP_KEY = 'robot_calibration_step' as const const MODULE_SETUP_KEY = 'module_setup_step' as const const LPC_KEY = 'labware_position_check_step' as const @@ -64,40 +75,92 @@ export function ProtocolRunSetup({ const { t, i18n } = useTranslation('protocol_setup') const robotProtocolAnalysis = useMostRecentCompletedAnalysis(runId) const storedProtocolAnalysis = useStoredProtocolAnalysis(runId) - const protocolData = robotProtocolAnalysis ?? storedProtocolAnalysis - const modules = parseAllRequiredModuleModels(protocolData?.commands ?? []) + const protocolAnalysis = robotProtocolAnalysis ?? storedProtocolAnalysis + const modules = parseAllRequiredModuleModels(protocolAnalysis?.commands ?? []) + const robot = useRobot(robotName) - const calibrationStatus = useRunCalibrationStatus(robotName, runId) - const isOT3 = useIsOT3(robotName) + const calibrationStatusRobot = useRunCalibrationStatus(robotName, runId) + const calibrationStatusModules = useModuleCalibrationStatus(robotName, runId) + const { missingModuleIds } = useUnmatchedModulesForProtocol(robotName, runId) + const isFlex = useIsFlex(robotName) const runHasStarted = useRunHasStarted(runId) const { analysisErrors } = useProtocolAnalysisErrors(runId) const [expandedStepKey, setExpandedStepKey] = React.useState( null ) - const [stepsKeysInOrder, setStepKeysInOrder] = React.useState([ - ROBOT_CALIBRATION_STEP_KEY, - LPC_KEY, - LABWARE_SETUP_KEY, - ]) + const robotType = isFlex ? FLEX_ROBOT_TYPE : OT2_ROBOT_TYPE + const deckConfigCompatibility = useDeckConfigurationCompatibility( + robotType, + protocolAnalysis + ) - React.useEffect(() => { - let nextStepKeysInOrder = stepsKeysInOrder + const isFixtureMismatch = getIsFixtureMismatch(deckConfigCompatibility) + + const isMissingModule = missingModuleIds.length > 0 + + const stepsKeysInOrder = + protocolAnalysis != null + ? [ + ROBOT_CALIBRATION_STEP_KEY, + MODULE_SETUP_KEY, + LPC_KEY, + LABWARE_SETUP_KEY, + LIQUID_SETUP_KEY, + ] + : [ROBOT_CALIBRATION_STEP_KEY, LPC_KEY, LABWARE_SETUP_KEY] + + const targetStepKeyInOrder = stepsKeysInOrder.filter((stepKey: StepKey) => { + if (protocolAnalysis == null) { + return stepKey !== MODULE_SETUP_KEY && stepKey !== LIQUID_SETUP_KEY + } - if (protocolData != null) { - nextStepKeysInOrder = [ - ROBOT_CALIBRATION_STEP_KEY, - MODULE_SETUP_KEY, - LPC_KEY, - LABWARE_SETUP_KEY, - LIQUID_SETUP_KEY, - ] + if ( + protocolAnalysis.modules.length === 0 && + protocolAnalysis.liquids.length === 0 + ) { + return stepKey !== MODULE_SETUP_KEY && stepKey !== LIQUID_SETUP_KEY } - setStepKeysInOrder(nextStepKeysInOrder) - }, [Boolean(protocolData), protocolData?.commands]) + + if (protocolAnalysis.modules.length === 0) { + return stepKey !== MODULE_SETUP_KEY + } + + if (protocolAnalysis.liquids.length === 0) { + return stepKey !== LIQUID_SETUP_KEY + } + return true + }) if (robot == null) return null - const hasLiquids = protocolData != null && protocolData.liquids?.length > 0 - const hasModules = protocolData != null && modules.length > 0 + + const liquids = protocolAnalysis?.liquids ?? [] + + const liquidsInLoadOrder = + protocolAnalysis != null + ? parseLiquidsInLoadOrder(liquids, protocolAnalysis.commands) + : [] + + const hasLiquids = liquidsInLoadOrder.length > 0 + + const hasModules = protocolAnalysis != null && modules.length > 0 + + // need config compatibility (including check for single slot conflicts) + const requiredDeckConfigCompatibility = getRequiredDeckConfig( + deckConfigCompatibility + ) + + const hasFixtures = requiredDeckConfigCompatibility.length > 0 + + let moduleDescription: string = t(`${MODULE_SETUP_KEY}_description`, { + count: modules.length, + }) + if (!hasModules && !isFlex) { + moduleDescription = i18n.format(t('no_modules_specified'), 'capitalize') + } else if (isFlex && (hasModules || hasFixtures)) { + moduleDescription = t('install_modules_and_fixtures') + } else if (isFlex && !hasModules && !hasFixtures) { + moduleDescription = t('no_modules_or_fixtures') + } const StepDetailMap: Record< StepKey, @@ -109,34 +172,32 @@ export function ProtocolRunSetup({ robotName={robotName} runId={runId} nextStep={ - stepsKeysInOrder[ - stepsKeysInOrder.findIndex( + targetStepKeyInOrder[ + targetStepKeyInOrder.findIndex( v => v === ROBOT_CALIBRATION_STEP_KEY ) + 1 ] } expandStep={setExpandedStepKey} - calibrationStatus={calibrationStatus} + calibrationStatus={calibrationStatusRobot} /> ), - // change description for OT-3 - description: isOT3 + // change description for Flex + description: isFlex ? t(`${ROBOT_CALIBRATION_STEP_KEY}_description_pipettes_only`) : t(`${ROBOT_CALIBRATION_STEP_KEY}_description`), }, [MODULE_SETUP_KEY]: { stepInternals: ( - setExpandedStepKey(LPC_KEY)} robotName={robotName} runId={runId} + hasModules={hasModules} + protocolAnalysis={protocolAnalysis} /> ), - description: !hasModules - ? i18n.format(t('no_modules_specified'), 'capitalize') - : t(`${MODULE_SETUP_KEY}_description`, { - count: modules.length, - }), + description: moduleDescription, }, [LPC_KEY]: { stepInternals: ( @@ -154,8 +215,8 @@ export function ProtocolRunSetup({ robotName={robotName} runId={runId} nextStep={ - stepsKeysInOrder.findIndex(v => v === LABWARE_SETUP_KEY) === - stepsKeysInOrder.length - 1 + targetStepKeyInOrder.findIndex(v => v === LABWARE_SETUP_KEY) === + targetStepKeyInOrder.length - 1 ? null : LIQUID_SETUP_KEY } @@ -170,6 +231,7 @@ export function ProtocolRunSetup({ protocolRunHeaderRef={protocolRunHeaderRef} robotName={robotName} runId={runId} + protocolAnalysis={protocolAnalysis} /> ), description: hasLiquids @@ -184,54 +246,74 @@ export function ProtocolRunSetup({ gridGap={SPACING.spacing16} margin={SPACING.spacing16} > - {protocolData != null ? ( + {protocolAnalysis != null ? ( <> {runHasStarted ? ( ) : null} {analysisErrors != null && analysisErrors?.length > 0 ? ( - + {t('protocol_analysis_failed')} ) : ( - stepsKeysInOrder.map((stepKey, index) => ( - - {(stepKey === 'liquid_setup_step' && !hasLiquids) || - (stepKey === 'module_setup_step' && !hasModules) ? ( - - ) : ( - - stepKey === expandedStepKey - ? setExpandedStepKey(null) - : setExpandedStepKey(stepKey) - } - rightElement={ - - } - > - {StepDetailMap[stepKey].stepInternals} - - )} - {index !== stepsKeysInOrder.length - 1 ? ( - - ) : null} - - )) + stepsKeysInOrder.map((stepKey, index) => { + const setupStepTitle = t( + isFlex && stepKey === MODULE_SETUP_KEY + ? `module_and_deck_setup` + : `${stepKey}_title` + ) + const showEmptySetupStep = + (stepKey === 'liquid_setup_step' && !hasLiquids) || + (stepKey === 'module_setup_step' && + ((!isFlex && !hasModules) || + (isFlex && !hasModules && !hasFixtures))) + return ( + + {showEmptySetupStep ? ( + + ) : ( + + stepKey === expandedStepKey + ? setExpandedStepKey(null) + : setExpandedStepKey(stepKey) + } + rightElement={ + + } + > + {StepDetailMap[stepKey].stepInternals} + + )} + {index !== stepsKeysInOrder.length - 1 ? ( + + ) : null} + + ) + }) )} ) : ( - + {t('loading_data')} )} @@ -241,37 +323,66 @@ export function ProtocolRunSetup({ interface StepRightElementProps { stepKey: StepKey - calibrationStatus: ProtocolCalibrationStatus + calibrationStatusRobot: ProtocolCalibrationStatus + calibrationStatusModules?: ProtocolCalibrationStatus runHasStarted: boolean + isFlex: boolean + isMissingModule: boolean + isFixtureMismatch: boolean } function StepRightElement(props: StepRightElementProps): JSX.Element | null { - const { stepKey, calibrationStatus, runHasStarted } = props + const { + stepKey, + runHasStarted, + calibrationStatusRobot, + calibrationStatusModules, + isFlex, + isMissingModule, + isFixtureMismatch, + } = props const { t } = useTranslation('protocol_setup') + const isActionNeeded = isMissingModule || isFixtureMismatch + + if ( + !runHasStarted && + (stepKey === ROBOT_CALIBRATION_STEP_KEY || + (stepKey === MODULE_SETUP_KEY && isFlex)) + ) { + const moduleAndDeckStatus = isActionNeeded + ? { complete: false } + : calibrationStatusModules + const calibrationStatus = + stepKey === ROBOT_CALIBRATION_STEP_KEY + ? calibrationStatusRobot + : moduleAndDeckStatus + + let statusText = t('calibration_ready') + if ( + stepKey === ROBOT_CALIBRATION_STEP_KEY && + !calibrationStatusRobot.complete + ) { + statusText = t('calibration_needed') + } else if (stepKey === MODULE_SETUP_KEY && !calibrationStatus?.complete) { + statusText = isActionNeeded ? t('action_needed') : t('calibration_needed') + } - if (stepKey === ROBOT_CALIBRATION_STEP_KEY && !runHasStarted) { return ( - {calibrationStatus.complete - ? t('calibration_ready') - : t('calibration_needed')} + {statusText} ) diff --git a/app/src/organisms/Devices/ProtocolRun/RunFailedModal.tsx b/app/src/organisms/Devices/ProtocolRun/RunFailedModal.tsx index 8a3416e5e51..c9e422fe001 100644 --- a/app/src/organisms/Devices/ProtocolRun/RunFailedModal.tsx +++ b/app/src/organisms/Devices/ProtocolRun/RunFailedModal.tsx @@ -1,5 +1,7 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' +import { css } from 'styled-components' + import { ALIGN_CENTER, BORDERS, @@ -7,13 +9,14 @@ import { DIRECTION_COLUMN, DIRECTION_ROW, Flex, + Icon, JUSTIFY_SPACE_BETWEEN, Link, OVERFLOW_AUTO, + OVERFLOW_WRAP_ANYWHERE, PrimaryButton, SPACING, TYPOGRAPHY, - Icon, } from '@opentrons/components' import { StyledText } from '../../../atoms/text' @@ -80,17 +83,7 @@ export function RunFailedModal({ errorCode: highestPriorityError.errorCode, })} - + {highestPriorityError.detail} @@ -118,3 +111,18 @@ export function RunFailedModal({ ) } + +const ERROR_MESSAGE_STYLE = css` + max-height: 9.5rem; + overflow-y: ${OVERFLOW_AUTO}; + margin-top: ${SPACING.spacing8}; + margin-bottom: ${SPACING.spacing16}; + padding: ${`${SPACING.spacing8} ${SPACING.spacing12}`}; + background-color: ${COLORS.grey30}; + border-radius: ${BORDERS.borderRadiusSize1}; + overflow-wrap: ${OVERFLOW_WRAP_ANYWHERE}; + + ::-webkit-scrollbar-thumb { + background: ${COLORS.grey40}; + } +` diff --git a/app/src/organisms/Devices/ProtocolRun/SetupCalibrationItem.tsx b/app/src/organisms/Devices/ProtocolRun/SetupCalibrationItem.tsx index 4ec17c7d80c..89f796fe650 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupCalibrationItem.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupCalibrationItem.tsx @@ -54,7 +54,7 @@ export function SetupCalibrationItem({ ) : null return ( @@ -78,7 +74,7 @@ export function SetupCalibrationItem({ {label != null && ( )} {title != null && ( - + {title} )} - + {calibrationDataNotAvailableText ?? subText ?? calibratedText} diff --git a/app/src/organisms/Devices/ProtocolRun/SetupDeckCalibration.tsx b/app/src/organisms/Devices/ProtocolRun/SetupDeckCalibration.tsx index 73d2d2c3ad6..099312f6b4a 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupDeckCalibration.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupDeckCalibration.tsx @@ -47,7 +47,7 @@ export function SetupDeckCalibration({ justifyContent={JUSTIFY_SPACE_BETWEEN} > diff --git a/app/src/organisms/Devices/ProtocolRun/SetupFlexPipetteCalibrationItem.tsx b/app/src/organisms/Devices/ProtocolRun/SetupFlexPipetteCalibrationItem.tsx index 862d65104d5..86bf857246f 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupFlexPipetteCalibrationItem.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupFlexPipetteCalibrationItem.tsx @@ -20,7 +20,7 @@ import { PipetteWizardFlows } from '../../PipetteWizardFlows' import { FLOWS } from '../../PipetteWizardFlows/constants' import { SetupCalibrationItem } from './SetupCalibrationItem' import type { PipetteData } from '@opentrons/api-client' -import type { LoadPipetteRunTimeCommand } from '@opentrons/shared-data/protocol/types/schemaV7/command/setup' +import type { LoadPipetteRunTimeCommand } from '@opentrons/shared-data' import type { Mount } from '../../../redux/pipettes/types' interface SetupInstrumentCalibrationItemProps { @@ -122,7 +122,11 @@ export function SetupFlexPipetteCalibrationItem({ button={button} calibratedDate={pipetteCalDate} subText={subText} - label={t(`devices_landing:${mount}_mount`)} + label={ + requestedPipetteSpecs?.channels === 96 + ? t('devices_landing:ninety_six_mount') + : t(`devices_landing:${mount}_mount`) + } title={requestedPipetteSpecs?.displayName} id={`PipetteCalibration_${mount}MountTitle`} runId={runId} diff --git a/app/src/organisms/Devices/ProtocolRun/SetupInstrumentCalibration.tsx b/app/src/organisms/Devices/ProtocolRun/SetupInstrumentCalibration.tsx index fe6a936ad57..a55256627fc 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupInstrumentCalibration.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupInstrumentCalibration.tsx @@ -8,13 +8,14 @@ import { SPACING, TYPOGRAPHY, } from '@opentrons/components' - import { StyledText } from '../../../atoms/text' import * as PipetteConstants from '../../../redux/pipettes/constants' +import { getShowPipetteCalibrationWarning } from '../utils' +import { PipetteRecalibrationWarning } from '../PipetteCard/PipetteRecalibrationWarning' import { useRunPipetteInfoByMount, useStoredProtocolAnalysis, - useIsOT3, + useIsFlex, } from '../hooks' import { SetupPipetteCalibrationItem } from './SetupPipetteCalibrationItem' import { SetupFlexPipetteCalibrationItem } from './SetupFlexPipetteCalibrationItem' @@ -27,6 +28,7 @@ import type { GripperData } from '@opentrons/api-client' import { i18n } from '../../../i18n' const EQUIPMENT_POLL_MS = 5000 + interface SetupInstrumentCalibrationProps { robotName: string runId: string @@ -38,10 +40,10 @@ export function SetupInstrumentCalibration({ }: SetupInstrumentCalibrationProps): JSX.Element { const { t } = useTranslation('protocol_setup') const runPipetteInfoByMount = useRunPipetteInfoByMount(runId) - const isOT3 = useIsOT3(robotName) + const isFlex = useIsFlex(robotName) const { data: instrumentsQueryData, refetch } = useInstrumentsQuery({ - enabled: isOT3, + enabled: isFlex, refetchInterval: EQUIPMENT_POLL_MS, }) const mostRecentAnalysis = useMostRecentCompletedAnalysis(runId) @@ -51,13 +53,17 @@ export function SetupInstrumentCalibration({ ) const attachedGripperMatch = usesGripper ? (instrumentsQueryData?.data ?? []).find( - (i): i is GripperData => i.instrumentType === 'gripper' + (i): i is GripperData => i.instrumentType === 'gripper' && i.ok ) ?? null : null + return ( + {getShowPipetteCalibrationWarning(instrumentsQueryData) && ( + + )} @@ -65,7 +71,7 @@ export function SetupInstrumentCalibration({ {PipetteConstants.PIPETTE_MOUNTS.map((mount, index) => { const pipetteInfo = runPipetteInfoByMount[mount] - if (pipetteInfo != null && !isOT3) { + if (pipetteInfo != null && !isFlex) { return ( ) - } else if (isOT3) { + } else if (isFlex) { return ( (false) const [isLatchClosed, setIsLatchClosed] = React.useState(false) - let slotInfo: string | null = - initialLocation !== 'offDeck' && 'slotName' in initialLocation - ? initialLocation.slotName - : null + + let slotInfo: string | null = null + + if (initialLocation !== 'offDeck' && 'slotName' in initialLocation) { + slotInfo = initialLocation.slotName + } else if ( + initialLocation !== 'offDeck' && + 'addressableAreaName' in initialLocation + ) { + slotInfo = initialLocation.addressableAreaName + } + let moduleDisplayName: string | null = null let extraAttentionText: JSX.Element | null = null let isCorrectHeaterShakerAttached: boolean = false @@ -142,7 +150,7 @@ export function LabwareListItem( ) let moduleSlotName = moduleLocation.slotName if (moduleType === THERMOCYCLER_MODULE_TYPE) { - moduleSlotName = isOt3 ? TC_MODULE_LOCATION_OT3 : TC_MODULE_LOCATION_OT2 + moduleSlotName = isFlex ? TC_MODULE_LOCATION_OT3 : TC_MODULE_LOCATION_OT2 } slotInfo = moduleSlotName moduleDisplayName = moduleName @@ -153,10 +161,10 @@ export function LabwareListItem( extraAttentionText = ( setSecureLabwareModalType(moduleType)} @@ -182,7 +190,7 @@ export function LabwareListItem( case HEATERSHAKER_MODULE_TYPE: isHeaterShakerInProtocol = true extraAttentionText = ( - + {t('heater_shaker_labware_list_view')} ) @@ -263,7 +271,7 @@ export function LabwareListItem( {labwareDisplayName} - + {nickName} @@ -285,7 +293,7 @@ export function LabwareListItem( {nestedLabwareInfo.nestedLabwareDisplayName} - + {nestedLabwareInfo.nestedLabwareNickName} diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLabware/OffDeckLabwareList.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLabware/OffDeckLabwareList.tsx index 6ef9247cad4..1d55e12c76b 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLabware/OffDeckLabwareList.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLabware/OffDeckLabwareList.tsx @@ -8,13 +8,13 @@ import type { LabwareSetupItem } from '../../../../pages/Protocols/utils' interface OffDeckLabwareListProps { labwareItems: LabwareSetupItem[] - isOt3: boolean + isFlex: boolean commands: RunTimeCommand[] } export function OffDeckLabwareList( props: OffDeckLabwareListProps ): JSX.Element | null { - const { labwareItems, isOt3, commands } = props + const { labwareItems, isFlex, commands } = props const { t } = useTranslation('protocol_setup') if (labwareItems.length < 1) return null return ( @@ -33,7 +33,7 @@ export function OffDeckLabwareList( attachedModuleInfo={{}} extraAttentionModules={[]} {...labwareItem} - isOt3={isOt3} + isFlex={isFlex} commands={commands} nestedLabwareInfo={null} /> diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLabware/SetupLabwareList.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLabware/SetupLabwareList.tsx index ebe6275191c..b45ed5ba84e 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLabware/SetupLabwareList.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLabware/SetupLabwareList.tsx @@ -27,12 +27,12 @@ interface SetupLabwareListProps { attachedModuleInfo: { [moduleId: string]: ModuleRenderInfoForProtocol } commands: RunTimeCommand[] extraAttentionModules: ModuleTypesThatRequireExtraAttention[] - isOt3: boolean + isFlex: boolean } export function SetupLabwareList( props: SetupLabwareListProps ): JSX.Element | null { - const { attachedModuleInfo, commands, extraAttentionModules, isOt3 } = props + const { attachedModuleInfo, commands, extraAttentionModules, isFlex } = props const { t } = useTranslation('protocol_setup') const { offDeckItems, onDeckItems } = getLabwareSetupItemGroups(commands) @@ -67,7 +67,7 @@ export function SetupLabwareList( attachedModuleInfo={attachedModuleInfo} extraAttentionModules={extraAttentionModules} {...labwareItem} - isOt3={isOt3} + isFlex={isFlex} nestedLabwareInfo={getNestedLabwareInfo(labwareItem, commands)} /> ) @@ -75,7 +75,7 @@ export function SetupLabwareList( ) diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLabware/SetupLabwareMap.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLabware/SetupLabwareMap.tsx index 75e5b246d15..0505cf0c921 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLabware/SetupLabwareMap.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLabware/SetupLabwareMap.tsx @@ -1,168 +1,159 @@ import * as React from 'react' import map from 'lodash/map' +import { parseInitialLoadedLabwareByAdapter } from '@opentrons/api-client' import { + BaseDeck, Flex, Box, - LabwareRender, - Module, - RobotWorkSpace, - SlotLabels, DIRECTION_COLUMN, SPACING, } from '@opentrons/components' import { FLEX_ROBOT_TYPE, getDeckDefFromRobotType, - inferModuleOrientationFromXCoordinate, - RunTimeCommand, + getSimplestDeckConfigForProtocol, THERMOCYCLER_MODULE_V1, } from '@opentrons/shared-data' -import { - useLabwareRenderInfoForRunById, - useModuleRenderInfoForProtocolById, - useProtocolDetailsForRun, -} from '../../hooks' + +import { getLabwareSetupItemGroups } from '../../../../pages/Protocols/utils' +import { getAttachedProtocolModuleMatches } from '../../../ProtocolSetupModulesAndDeck/utils' +import { useAttachedModules } from '../../hooks' import { LabwareInfoOverlay } from '../LabwareInfoOverlay' +import { getLabwareRenderInfo } from '../utils/getLabwareRenderInfo' +import { getProtocolModulesInfo } from '../utils/getProtocolModulesInfo' import { getStandardDeckViewLayerBlockList } from '../utils/getStandardDeckViewLayerBlockList' -import { getLabwareSetupItemGroups } from '../../../../pages/Protocols/utils' import { OffDeckLabwareList } from './OffDeckLabwareList' -import { parseInitialLoadedLabwareByAdapter } from '@opentrons/api-client' + +import type { + CompletedProtocolAnalysis, + ProtocolAnalysisOutput, +} from '@opentrons/shared-data' + +const ATTACHED_MODULE_POLL_MS = 5000 interface SetupLabwareMapProps { - robotName: string runId: string - commands: RunTimeCommand[] + protocolAnalysis: CompletedProtocolAnalysis | ProtocolAnalysisOutput | null } export function SetupLabwareMap({ - robotName, runId, - commands, -}: SetupLabwareMapProps): JSX.Element { - const moduleRenderInfoById = useModuleRenderInfoForProtocolById( - robotName, - runId - ) - const { robotType } = useProtocolDetailsForRun(runId) - const labwareRenderInfoById = useLabwareRenderInfoForRunById(runId) + protocolAnalysis, +}: SetupLabwareMapProps): JSX.Element | null { + const attachedModules = + useAttachedModules({ + refetchInterval: ATTACHED_MODULE_POLL_MS, + }) ?? [] + + // early return null if no protocol analysis + if (protocolAnalysis == null) return null + + const commands = protocolAnalysis.commands + + const robotType = protocolAnalysis.robotType ?? FLEX_ROBOT_TYPE const deckDef = getDeckDefFromRobotType(robotType) - const { offDeckItems } = getLabwareSetupItemGroups(commands) + + const protocolModulesInfo = getProtocolModulesInfo(protocolAnalysis, deckDef) + + const attachedProtocolModuleMatches = getAttachedProtocolModuleMatches( + attachedModules, + protocolModulesInfo + ) + const initialLoadedLabwareByAdapter = parseInitialLoadedLabwareByAdapter( commands ) + + const modulesOnDeck = attachedProtocolModuleMatches.map(module => { + const labwareInAdapterInMod = + module.nestedLabwareId != null + ? initialLoadedLabwareByAdapter[module.nestedLabwareId] + : null + // only rendering the labware on top most layer so + // either the adapter or the labware are rendered but not both + const topLabwareDefinition = + labwareInAdapterInMod?.result?.definition ?? module.nestedLabwareDef + const topLabwareId = + labwareInAdapterInMod?.result?.labwareId ?? module.nestedLabwareId + const topLabwareDisplayName = + labwareInAdapterInMod?.params.displayName ?? + module.nestedLabwareDisplayName + + return { + moduleModel: module.moduleDef.model, + moduleLocation: { slotName: module.slotName }, + innerProps: + module.moduleDef.model === THERMOCYCLER_MODULE_V1 + ? { lidMotorState: 'open' } + : {}, + + nestedLabwareDef: topLabwareDefinition, + moduleChildren: ( + <> + {topLabwareDefinition != null && topLabwareId != null ? ( + + ) : null} + + ), + } + }) + + const { offDeckItems } = getLabwareSetupItemGroups(commands) + + const deckConfig = getSimplestDeckConfigForProtocol(protocolAnalysis) + + const labwareRenderInfo = getLabwareRenderInfo(protocolAnalysis, deckDef) + + const labwareOnDeck = map( + labwareRenderInfo, + ({ x, y, labwareDef, displayName, slotName }, labwareId) => { + const labwareInAdapter = initialLoadedLabwareByAdapter[labwareId] + // only rendering the labware on top most layer so + // either the adapter or the labware are rendered but not both + const topLabwareDefinition = + labwareInAdapter?.result?.definition ?? labwareDef + const topLabwareId = labwareInAdapter?.result?.labwareId ?? labwareId + const topLabwareDisplayName = + labwareInAdapter?.params.displayName ?? displayName + + return { + labwareLocation: { slotName }, + definition: topLabwareDefinition, + topLabwareId, + topLabwareDisplayName, + labwareChildren: ( + + ), + } + } + ) + return ( - - {() => ( - <> - {map( - moduleRenderInfoById, - ({ - x, - y, - moduleDef, - nestedLabwareDef, - nestedLabwareId, - nestedLabwareDisplayName, - moduleId, - }) => { - const labwareInAdapterInMod = - nestedLabwareId != null - ? initialLoadedLabwareByAdapter[nestedLabwareId] - : null - // only rendering the labware on top most layer so - // either the adapter or the labware are rendered but not both - const topLabwareDefinition = - labwareInAdapterInMod?.result?.definition ?? - nestedLabwareDef - const topLabwareId = - labwareInAdapterInMod?.result?.labwareId ?? - nestedLabwareId - const topLabwareDisplayName = - labwareInAdapterInMod?.result?.definition.metadata - .displayName ?? nestedLabwareDisplayName - - return ( - - {topLabwareDefinition != null && - topLabwareId != null ? ( - - - - - ) : null} - - ) - } - )} - {map( - labwareRenderInfoById, - ({ x, y, labwareDef, displayName }, labwareId) => { - const labwareInAdapter = - initialLoadedLabwareByAdapter[labwareId] - // only rendering the labware on top most layer so - // either the adapter or the labware are rendered but not both - const topLabwareDefinition = - labwareInAdapter?.result?.definition ?? labwareDef - const topLabwareId = - labwareInAdapter?.result?.labwareId ?? labwareId - const topLabwareDisplayName = - labwareInAdapter?.result?.definition.metadata - .displayName ?? displayName - - return ( - - - - - - - ) - } - )} - - - - )} - + robotType={robotType} + labwareOnDeck={labwareOnDeck} + modulesOnDeck={modulesOnDeck} + /> diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/LabwareListItem.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/LabwareListItem.test.tsx index b95975c0931..7dc7870b07f 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/LabwareListItem.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/LabwareListItem.test.tsx @@ -108,7 +108,7 @@ describe('LabwareListItem', () => { ...mockAttachedModuleInfo, } as any) as ModuleRenderInfoForProtocol, }, - isOt3: false, + isFlex: false, nestedLabwareInfo: null, }) getByText('Mock Labware Definition') @@ -138,7 +138,7 @@ describe('LabwareListItem', () => { ...mockAttachedModuleInfo, } as any) as ModuleRenderInfoForProtocol, }, - isOt3: true, + isFlex: true, nestedLabwareInfo: null, }) getByText('Mock Labware Definition') @@ -169,7 +169,7 @@ describe('LabwareListItem', () => { ...mockAttachedModuleInfo, } as any) as ModuleRenderInfoForProtocol, }, - isOt3: false, + isFlex: false, nestedLabwareInfo: null, }) getByText('Mock Labware Definition') @@ -203,7 +203,7 @@ describe('LabwareListItem', () => { ...mockAttachedModuleInfo, } as any) as ModuleRenderInfoForProtocol, }, - isOt3: false, + isFlex: false, nestedLabwareInfo: null, }) getByText('Mock Labware Definition') @@ -261,7 +261,7 @@ describe('LabwareListItem', () => { ...mockAttachedModuleInfo, } as any) as ModuleRenderInfoForProtocol, }, - isOt3: false, + isFlex: false, nestedLabwareInfo: { nestedLabwareDisplayName: 'mock nested display name', sharedSlotId: '7', @@ -303,7 +303,7 @@ describe('LabwareListItem', () => { moduleLocation: null, extraAttentionModules: [], attachedModuleInfo: {}, - isOt3: false, + isFlex: false, nestedLabwareInfo: { nestedLabwareDisplayName: 'mock nested display name', sharedSlotId: 'A2', @@ -341,7 +341,7 @@ describe('LabwareListItem', () => { ...mockAttachedModuleInfo, } as any) as ModuleRenderInfoForProtocol, }, - isOt3: false, + isFlex: false, nestedLabwareInfo: null, }) getByText('Mock Labware Definition') @@ -373,7 +373,7 @@ describe('LabwareListItem', () => { moduleLocation: null, extraAttentionModules: [], attachedModuleInfo: {}, - isOt3: false, + isFlex: false, nestedLabwareInfo: null, }) getByText('Mock Labware Definition') diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/OffDeckLabwareList.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/OffDeckLabwareList.test.tsx index 6470fde892b..436472fdcee 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/OffDeckLabwareList.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/OffDeckLabwareList.test.tsx @@ -30,7 +30,7 @@ describe('OffDeckLabwareList', () => { it('renders null if labware items is null', () => { const { container } = render({ labwareItems: [], - isOt3: false, + isFlex: false, commands: [], }) expect(container.firstChild).toBeNull() @@ -46,7 +46,7 @@ describe('OffDeckLabwareList', () => { moduleLocation: null, }, ], - isOt3: false, + isFlex: false, commands: [], }) getByText('Additional Off-Deck Labware') diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabware.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabware.test.tsx index 8707dbf854a..7e88284a87b 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabware.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabware.test.tsx @@ -11,7 +11,6 @@ import { getModuleTypesThatRequireExtraAttention } from '../../utils/getModuleTy import { getIsLabwareOffsetCodeSnippetsOn } from '../../../../../redux/config' import { useLPCDisabledReason, - useProtocolDetailsForRun, useRunCalibrationStatus, useRunHasStarted, useUnmatchedModulesForProtocol, @@ -38,9 +37,6 @@ const mockLabwarePostionCheck = LabwarePositionCheck as jest.MockedFunction< const mockUseRunHasStarted = useRunHasStarted as jest.MockedFunction< typeof useRunHasStarted > -const mockUseProtocolDetailsForRun = useProtocolDetailsForRun as jest.MockedFunction< - typeof useProtocolDetailsForRun -> const mockUseUnmatchedModulesForProtocol = useUnmatchedModulesForProtocol as jest.MockedFunction< typeof useUnmatchedModulesForProtocol > @@ -64,28 +60,6 @@ const mockUseLPCDisabledReason = useLPCDisabledReason as jest.MockedFunction< > const ROBOT_NAME = 'otie' const RUN_ID = '1' -const PICKUP_TIP_LABWARE_ID = 'PICKUP_TIP_LABWARE_ID' -const PRIMARY_PIPETTE_ID = 'PRIMARY_PIPETTE_ID' -const PRIMARY_PIPETTE_NAME = 'PRIMARY_PIPETTE_NAME' -const LABWARE_DEF_ID = 'LABWARE_DEF_ID' -const LABWARE_DEF = { - ordering: [['A1', 'A2']], - parameters: { isTiprack: true }, -} -const mockLabwarePositionCheckStepTipRack = { - labwareId: - '1d57fc10-67ad-11ea-9f8b-3b50068bd62d:opentrons/opentrons_96_filtertiprack_200ul/1', - section: '', - commands: [ - { - commandType: 'pickUpTip', - params: { - pipetteId: PRIMARY_PIPETTE_ID, - labwareId: PICKUP_TIP_LABWARE_ID, - }, - }, - ], -} as any const render = () => { return renderWithProviders( @@ -130,34 +104,6 @@ describe('SetupLabware', () => { complete: true, }) when(mockUseRunHasStarted).calledWith(RUN_ID).mockReturnValue(false) - when(mockUseProtocolDetailsForRun) - .calledWith(RUN_ID) - .mockReturnValue({ - protocolData: { - labware: { - [mockLabwarePositionCheckStepTipRack.labwareId]: { - slot: '1', - displayName: 'someDisplayName', - definitionId: LABWARE_DEF_ID, - }, - }, - labwareDefinitions: { - [LABWARE_DEF_ID]: LABWARE_DEF, - }, - pipettes: { - [PRIMARY_PIPETTE_ID]: { - name: PRIMARY_PIPETTE_NAME, - mount: 'left', - }, - }, - commands: [ - { - commandType: 'pickUpTip', - params: { pipetteId: PRIMARY_PIPETTE_ID }, - } as any, - ], - }, - } as any) when(mockGetIsLabwareOffsetCodeSnippetsOn).mockReturnValue(false) when(mockSetupLabwareMap).mockReturnValue(
mock setup labware map
) when(mockSetupLabwareList).mockReturnValue( diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareList.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareList.test.tsx index f16e5836538..32abc2f92eb 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareList.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareList.test.tsx @@ -7,13 +7,13 @@ import { mockDefinition } from '../../../../../redux/custom-labware/__fixtures__ import { SetupLabwareList } from '../SetupLabwareList' import { LabwareListItem } from '../LabwareListItem' import type { - ProtocolAnalysisFile, + CompletedProtocolAnalysis, RunTimeCommand, } from '@opentrons/shared-data' jest.mock('../LabwareListItem') -const protocolWithTC = (_uncastedProtocolWithTC as unknown) as ProtocolAnalysisFile +const protocolWithTC = (_uncastedProtocolWithTC as unknown) as CompletedProtocolAnalysis const mockLabwareListItem = LabwareListItem as jest.MockedFunction< typeof LabwareListItem @@ -178,7 +178,7 @@ describe('SetupLabwareList', () => { attachedModuleMatch: null, moduleId: 'moduleId', } as any, - isOt3: false, + isFlex: false, }) getAllByText('mock labware list item') @@ -197,7 +197,7 @@ describe('SetupLabwareList', () => { attachedModuleMatch: null, moduleId: 'moduleId', } as any, - isOt3: false, + isFlex: false, }) expect(queryByText('Additional Off-Deck Labware')).not.toBeInTheDocument() }) @@ -207,7 +207,7 @@ describe('SetupLabwareList', () => { commands: mockOffDeckCommands, extraAttentionModules: [], attachedModuleInfo: {} as any, - isOt3: false, + isFlex: false, }) getByText('Additional Off-Deck Labware') getAllByText('mock labware list item') diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareMap.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareMap.test.tsx index e6195142f05..e6fabcac8ad 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareMap.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLabware/__tests__/SetupLabwareMap.test.tsx @@ -3,83 +3,63 @@ import { when, resetAllWhenMocks } from 'jest-when' import { StaticRouter } from 'react-router-dom' import { renderWithProviders, - componentPropsMatcher, partialComponentPropsMatcher, LabwareRender, - RobotWorkSpace, Module, } from '@opentrons/components' -import { - inferModuleOrientationFromXCoordinate, - LabwareDefinition2, - ModuleModel, - ModuleType, -} from '@opentrons/shared-data' +import { OT2_ROBOT_TYPE, getModuleDef2 } from '@opentrons/shared-data' import fixture_tiprack_300_ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_300_ul.json' -import standardDeckDef from '@opentrons/shared-data/deck/definitions/3/ot2_standard.json' import { i18n } from '../../../../../i18n' +import { getAttachedProtocolModuleMatches } from '../../../../ProtocolSetupModulesAndDeck/utils' import { LabwareInfoOverlay } from '../../LabwareInfoOverlay' -import { - useLabwareRenderInfoForRunById, - useModuleRenderInfoForProtocolById, - useProtocolDetailsForRun, -} from '../../../hooks' +import { getLabwareRenderInfo } from '../../utils/getLabwareRenderInfo' import { SetupLabwareMap } from '../SetupLabwareMap' -jest.mock('@opentrons/components', () => { - const actualComponents = jest.requireActual('@opentrons/components') - return { - ...actualComponents, - Module: jest.fn(() =>
mock Module
), - RobotWorkSpace: jest.fn(() =>
mock RobotWorkSpace
), - LabwareRender: jest.fn(() =>
mock LabwareRender
), - } -}) +import type { + CompletedProtocolAnalysis, + LabwareDefinition2, + ModuleModel, + ModuleType, +} from '@opentrons/shared-data' + +jest.mock('@opentrons/components/src/hardware-sim/Labware/LabwareRender') +jest.mock('@opentrons/components/src/hardware-sim/Module') jest.mock('@opentrons/shared-data', () => { const actualSharedData = jest.requireActual('@opentrons/shared-data') return { ...actualSharedData, - inferModuleOrientationFromXCoordinate: jest.fn(), + getModuleDef2: jest.fn(), } }) +jest.mock('../../../../ProtocolSetupModulesAndDeck/utils') jest.mock('../../LabwareInfoOverlay') +jest.mock('../../utils/getLabwareRenderInfo') jest.mock('../../utils/getModuleTypesThatRequireExtraAttention') jest.mock('../../../../RunTimeControl/hooks') jest.mock('../../../hooks') +const mockGetAttachedProtocolModuleMatches = getAttachedProtocolModuleMatches as jest.MockedFunction< + typeof getAttachedProtocolModuleMatches +> +const mockGetLabwareRenderInfo = getLabwareRenderInfo as jest.MockedFunction< + typeof getLabwareRenderInfo +> const mockLabwareInfoOverlay = LabwareInfoOverlay as jest.MockedFunction< typeof LabwareInfoOverlay > const mockModule = Module as jest.MockedFunction -const mockInferModuleOrientationFromXCoordinate = inferModuleOrientationFromXCoordinate as jest.MockedFunction< - typeof inferModuleOrientationFromXCoordinate -> -const mockRobotWorkSpace = RobotWorkSpace as jest.MockedFunction< - typeof RobotWorkSpace -> const mockLabwareRender = LabwareRender as jest.MockedFunction< typeof LabwareRender > -const mockUseProtocolDetailsForRun = useProtocolDetailsForRun as jest.MockedFunction< - typeof useProtocolDetailsForRun -> -const mockUseLabwareRenderInfoForRunById = useLabwareRenderInfoForRunById as jest.MockedFunction< - typeof useLabwareRenderInfoForRunById -> -const mockUseModuleRenderInfoForProtocolById = useModuleRenderInfoForProtocolById as jest.MockedFunction< - typeof useModuleRenderInfoForProtocolById + +const mockGetModuleDef2 = getModuleDef2 as jest.MockedFunction< + typeof getModuleDef2 > -const deckSlotsById = standardDeckDef.locations.orderedSlots.reduce( - (acc, deckSlot) => ({ ...acc, [deckSlot.id]: deckSlot }), - {} -) -const ROBOT_NAME = 'otie' const RUN_ID = '1' -const STUBBED_ORIENTATION_VALUE = 'left' const MOCK_300_UL_TIPRACK_ID = '300_ul_tiprack_id' const MOCK_MAGNETIC_MODULE_COORDS = [10, 20, 0] const MOCK_TC_COORDS = [20, 30, 0] @@ -125,14 +105,12 @@ const render = (props: React.ComponentProps) => { describe('SetupLabwareMap', () => { beforeEach(() => { - when(mockInferModuleOrientationFromXCoordinate) - .calledWith(expect.anything()) - .mockReturnValue(STUBBED_ORIENTATION_VALUE) - + when(mockGetAttachedProtocolModuleMatches).mockReturnValue([]) + when(mockGetLabwareRenderInfo).mockReturnValue({}) when(mockLabwareRender) .mockReturnValue(
) // this (default) empty div will be returned when LabwareRender isn't called with expected labware definition .calledWith( - componentPropsMatcher({ + partialComponentPropsMatcher({ definition: fixture_tiprack_300_ul, }) ) @@ -142,10 +120,6 @@ describe('SetupLabwareMap', () => { ) - when(mockUseProtocolDetailsForRun) - .calledWith(RUN_ID) - .mockReturnValue({ protocolData: {} } as any) - when(mockLabwareInfoOverlay) .mockReturnValue(
) // this (default) empty div will be returned when LabwareInfoOverlay isn't called with expected props .calledWith( @@ -157,24 +131,6 @@ describe('SetupLabwareMap', () => { {fixture_tiprack_300_ul.metadata.displayName} ) - - when(mockRobotWorkSpace) - .mockReturnValue(
) // this (default) empty div will be returned when RobotWorkSpace isn't called with expected props - .calledWith( - partialComponentPropsMatcher({ - deckDef: standardDeckDef, - children: expect.anything(), - }) - ) - .mockImplementation(({ children }) => ( - - {/* @ts-expect-error children won't be null since we checked for expect.anything() above */} - {children({ - deckSlotsById, - getRobotCoordsFromDOMCoords: {} as any, - })} - - )) }) afterEach(() => { @@ -182,38 +138,29 @@ describe('SetupLabwareMap', () => { }) it('should render a deck WITHOUT labware and WITHOUT modules', () => { - when(mockUseLabwareRenderInfoForRunById) - .calledWith(RUN_ID) - .mockReturnValue({}) - when(mockUseModuleRenderInfoForProtocolById) - .calledWith(ROBOT_NAME, RUN_ID) - .mockReturnValue({}) - expect(mockModule).not.toHaveBeenCalled() expect(mockLabwareRender).not.toHaveBeenCalled() expect(mockLabwareInfoOverlay).not.toHaveBeenCalled() }) it('should render a deck WITH labware and WITHOUT modules', () => { - when(mockUseLabwareRenderInfoForRunById) - .calledWith(RUN_ID) - .mockReturnValue({ - '300_ul_tiprack_id': { - labwareDef: fixture_tiprack_300_ul as LabwareDefinition2, - displayName: 'fresh tips', - x: MOCK_300_UL_TIPRACK_COORDS[0], - y: MOCK_300_UL_TIPRACK_COORDS[1], - z: MOCK_300_UL_TIPRACK_COORDS[2], - }, - }) - - when(mockUseModuleRenderInfoForProtocolById) - .calledWith(ROBOT_NAME, RUN_ID) - .mockReturnValue({}) + when(mockGetLabwareRenderInfo).mockReturnValue({ + '300_ul_tiprack_id': { + labwareDef: fixture_tiprack_300_ul as LabwareDefinition2, + displayName: 'fresh tips', + x: MOCK_300_UL_TIPRACK_COORDS[0], + y: MOCK_300_UL_TIPRACK_COORDS[1], + z: MOCK_300_UL_TIPRACK_COORDS[2], + slotName: '1', + }, + }) const { getByText } = render({ - robotName: ROBOT_NAME, runId: RUN_ID, - commands: [], + protocolAnalysis: ({ + commands: [], + labware: [], + robotType: OT2_ROBOT_TYPE, + } as unknown) as CompletedProtocolAnalysis, }) expect(mockModule).not.toHaveBeenCalled() @@ -224,51 +171,55 @@ describe('SetupLabwareMap', () => { }) it('should render a deck WITH labware and WITH modules', () => { - when(mockUseLabwareRenderInfoForRunById) - .calledWith(RUN_ID) - .mockReturnValue({ - [MOCK_300_UL_TIPRACK_ID]: { - labwareDef: fixture_tiprack_300_ul as LabwareDefinition2, - displayName: 'fresh tips', - x: MOCK_300_UL_TIPRACK_COORDS[0], - y: MOCK_300_UL_TIPRACK_COORDS[1], - z: MOCK_300_UL_TIPRACK_COORDS[2], - }, - }) + when(mockGetLabwareRenderInfo).mockReturnValue({ + [MOCK_300_UL_TIPRACK_ID]: { + labwareDef: fixture_tiprack_300_ul as LabwareDefinition2, + displayName: 'fresh tips', + x: MOCK_300_UL_TIPRACK_COORDS[0], + y: MOCK_300_UL_TIPRACK_COORDS[1], + z: MOCK_300_UL_TIPRACK_COORDS[2], + slotName: '1', + }, + }) - when(mockUseModuleRenderInfoForProtocolById) - .calledWith(ROBOT_NAME, RUN_ID) - .mockReturnValue({ - [mockMagneticModule.moduleId]: { - moduleId: mockMagneticModule.moduleId, - x: MOCK_MAGNETIC_MODULE_COORDS[0], - y: MOCK_MAGNETIC_MODULE_COORDS[1], - z: MOCK_MAGNETIC_MODULE_COORDS[2], - moduleDef: mockMagneticModule as any, - nestedLabwareDef: null, - nestedLabwareId: null, - protocolLoadOrder: 0, - attachedModuleMatch: null, - }, - [mockTCModule.moduleId]: { - moduleId: mockTCModule.moduleId, - x: MOCK_TC_COORDS[0], - y: MOCK_TC_COORDS[1], - z: MOCK_TC_COORDS[2], - moduleDef: mockTCModule, - nestedLabwareDef: null, - nestedLabwareId: null, - protocolLoadOrder: 1, - attachedModuleMatch: null, - }, - } as any) + when(mockGetAttachedProtocolModuleMatches).mockReturnValue([ + { + moduleId: mockMagneticModule.moduleId, + x: MOCK_MAGNETIC_MODULE_COORDS[0], + y: MOCK_MAGNETIC_MODULE_COORDS[1], + z: MOCK_MAGNETIC_MODULE_COORDS[2], + moduleDef: mockMagneticModule as any, + nestedLabwareDef: null, + nestedLabwareId: null, + protocolLoadOrder: 0, + attachedModuleMatch: null, + slotName: '4', + } as any, + { + moduleId: mockTCModule.moduleId, + x: MOCK_TC_COORDS[0], + y: MOCK_TC_COORDS[1], + z: MOCK_TC_COORDS[2], + moduleDef: mockTCModule, + nestedLabwareDef: null, + nestedLabwareId: null, + protocolLoadOrder: 1, + attachedModuleMatch: null, + slotName: '5', + }, + ]) + + when(mockGetModuleDef2) + .calledWith(mockMagneticModule.model) + .mockReturnValue(mockMagneticModule as any) + when(mockGetModuleDef2) + .calledWith(mockTCModule.model) + .mockReturnValue(mockTCModule as any) when(mockModule) .calledWith( partialComponentPropsMatcher({ def: mockMagneticModule, - x: MOCK_MAGNETIC_MODULE_COORDS[0], - y: MOCK_MAGNETIC_MODULE_COORDS[1], }) ) .mockReturnValue(
mock module viz {mockMagneticModule.type}
) @@ -277,16 +228,17 @@ describe('SetupLabwareMap', () => { .calledWith( partialComponentPropsMatcher({ def: mockTCModule, - x: MOCK_TC_COORDS[0], - y: MOCK_TC_COORDS[1], }) ) .mockReturnValue(
mock module viz {mockTCModule.type}
) const { getByText } = render({ - robotName: ROBOT_NAME, runId: RUN_ID, - commands: [], + protocolAnalysis: ({ + commands: [], + labware: [], + robotType: OT2_ROBOT_TYPE, + } as unknown) as CompletedProtocolAnalysis, }) getByText('mock module viz magneticModuleType') diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLabware/index.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLabware/index.tsx index f6dd9bbeccc..82dba6c6cc6 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLabware/index.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLabware/index.tsx @@ -12,7 +12,7 @@ import { useToggleGroup } from '../../../../molecules/ToggleGroup/useToggleGroup import { getModuleTypesThatRequireExtraAttention } from '../utils/getModuleTypesThatRequireExtraAttention' import { useMostRecentCompletedAnalysis } from '../../../LabwarePositionCheck/useMostRecentCompletedAnalysis' import { - useIsOT3, + useIsFlex, useModuleRenderInfoForProtocolById, useStoredProtocolAnalysis, } from '../../hooks' @@ -35,17 +35,14 @@ export function SetupLabware(props: SetupLabwareProps): JSX.Element { const { t } = useTranslation('protocol_setup') const robotProtocolAnalysis = useMostRecentCompletedAnalysis(runId) const storedProtocolAnalysis = useStoredProtocolAnalysis(runId) - const protocolData = robotProtocolAnalysis ?? storedProtocolAnalysis + const protocolAnalysis = robotProtocolAnalysis ?? storedProtocolAnalysis const [selectedValue, toggleGroup] = useToggleGroup( t('list_view'), t('map_view') ) - const isOt3 = useIsOT3(robotName) + const isFlex = useIsFlex(robotName) - const moduleRenderInfoById = useModuleRenderInfoForProtocolById( - robotName, - runId - ) + const moduleRenderInfoById = useModuleRenderInfoForProtocolById(runId) const moduleModels = map( moduleRenderInfoById, ({ moduleDef }) => moduleDef.model @@ -65,16 +62,12 @@ export function SetupLabware(props: SetupLabwareProps): JSX.Element { {selectedValue === t('list_view') ? ( ) : ( - + )}
diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLabwarePositionCheck/CurrentOffsetsTable.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLabwarePositionCheck/CurrentOffsetsTable.tsx index c622b0ce252..bf638d5ee10 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLabwarePositionCheck/CurrentOffsetsTable.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLabwarePositionCheck/CurrentOffsetsTable.tsx @@ -22,7 +22,6 @@ import { StyledText } from '../../../../atoms/text' import { LabwareOffsetTabs } from '../../../LabwareOffsetTabs' import { OffsetVector } from '../../../../molecules/OffsetVector' import { PythonLabwareOffsetSnippet } from '../../../../molecules/PythonLabwareOffsetSnippet' -import { getLatestCurrentOffsets } from './utils' import type { LabwareOffset } from '@opentrons/api-client' import type { RunTimeCommand, @@ -46,7 +45,7 @@ const OffsetTableHeader = styled('th')` padding: ${SPACING.spacing4}; ` const OffsetTableRow = styled('tr')` - background-color: ${COLORS.fundamentalsBackground}; + background-color: ${COLORS.grey10}; padding: ${SPACING.spacing8}; ` @@ -71,7 +70,6 @@ export function CurrentOffsetsTable( const isLabwareOffsetCodeSnippetsOn = useSelector( getIsLabwareOffsetCodeSnippetsOn ) - const latestCurrentOffsets = getLatestCurrentOffsets(currentOffsets) const TableComponent = ( @@ -83,7 +81,7 @@ export function CurrentOffsetsTable( - {latestCurrentOffsets.map(offset => { + {currentOffsets.map(offset => { const labwareDisplayName = offset.definitionUri in defsByURI ? getLabwareDisplayName(defsByURI[offset.definitionUri]) @@ -112,7 +110,7 @@ export function CurrentOffsetsTable( const JupyterSnippet = ( + labwareOffsets={currentOffsets.map(o => pick(o, ['definitionUri', 'location', 'vector']) )} commands={commands ?? []} @@ -123,7 +121,7 @@ export function CurrentOffsetsTable( const CommandLineSnippet = ( + labwareOffsets={currentOffsets.map(o => pick(o, ['definitionUri', 'location', 'vector']) )} commands={commands ?? []} @@ -137,7 +135,9 @@ export function CurrentOffsetsTable( justifyContent={JUSTIFY_SPACE_BETWEEN} padding={SPACING.spacing16} > - {t('applied_offset_data')} + + {i18n.format(t('applied_offset_data'), 'upperCase')} + {isLabwareOffsetCodeSnippetsOn ? ( ) => { i18nInstance: i18n, })[0] } -const protocolWithTC = (_uncastedProtocolWithTC as unknown) as ProtocolAnalysisFile +const protocolWithTC = (_uncastedProtocolWithTC as unknown) as CompletedProtocolAnalysis const mockCurrentOffsets: LabwareOffset[] = [ { createdAt: '2022-12-20T14:06:23.562082+00:00', @@ -60,13 +60,6 @@ const mockCurrentOffsets: LabwareOffset[] = [ location: { slotName: '1', moduleModel: 'heaterShakerModuleV1' }, vector: { x: 0, y: 0, z: 0 }, }, - { - createdAt: '2022-12-20T14:09:08.688756+00:00', - definitionUri: 'opentrons/opentrons_96_tiprack_10ul/1', - id: '494ec3d1-224f-4f9a-a83b-3dd3060ea332', - location: { slotName: '2' }, - vector: { x: 0, y: -0.09999999999999432, z: -0.09999999999999432 }, - }, { createdAt: '2022-12-20T14:09:08.689813+00:00', definitionUri: @@ -141,7 +134,7 @@ describe('CurrentOffsetsTable', () => { }) it('renders the correct text', () => { const { getByText } = render(props) - getByText('Applied Labware Offset data') + getByText('APPLIED LABWARE OFFSET DATA') getByText('location') getByText('labware') getByText('labware offset data') diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLabwarePositionCheck/__tests__/SetupLabwarePositionCheck.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLabwarePositionCheck/__tests__/SetupLabwarePositionCheck.test.tsx index c851f51ae44..d805e561250 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLabwarePositionCheck/__tests__/SetupLabwarePositionCheck.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLabwarePositionCheck/__tests__/SetupLabwarePositionCheck.test.tsx @@ -1,22 +1,28 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' import { StaticRouter } from 'react-router-dom' -import { fireEvent } from '@testing-library/react' +import { screen, fireEvent } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../../../i18n' +import { + useProtocolQuery, + useProtocolAnalysisAsDocumentQuery, +} from '@opentrons/react-api-client' import { useLPCSuccessToast } from '../../../hooks/useLPCSuccessToast' import { getModuleTypesThatRequireExtraAttention } from '../../utils/getModuleTypesThatRequireExtraAttention' import { useLaunchLPC } from '../../../../LabwarePositionCheck/useLaunchLPC' import { getIsLabwareOffsetCodeSnippetsOn } from '../../../../../redux/config' import { useLPCDisabledReason, - useProtocolDetailsForRun, useRunCalibrationStatus, useRunHasStarted, useUnmatchedModulesForProtocol, + useRobotType, } from '../../../hooks' import { SetupLabwarePositionCheck } from '..' +import { FLEX_ROBOT_TYPE } from '@opentrons/shared-data' +import { useNotifyRunQuery } from '../../../../../resources/runs/useNotifyRunQuery' jest.mock('../../../../LabwarePositionCheck/useLaunchLPC') jest.mock('../../utils/getModuleTypesThatRequireExtraAttention') @@ -24,6 +30,8 @@ jest.mock('../../../../RunTimeControl/hooks') jest.mock('../../../../../redux/config') jest.mock('../../../hooks') jest.mock('../../../hooks/useLPCSuccessToast') +jest.mock('@opentrons/react-api-client') +jest.mock('../../../../../resources/runs/useNotifyRunQuery') const mockGetModuleTypesThatRequireExtraAttention = getModuleTypesThatRequireExtraAttention as jest.MockedFunction< typeof getModuleTypesThatRequireExtraAttention @@ -31,9 +39,6 @@ const mockGetModuleTypesThatRequireExtraAttention = getModuleTypesThatRequireExt const mockUseRunHasStarted = useRunHasStarted as jest.MockedFunction< typeof useRunHasStarted > -const mockUseProtocolDetailsForRun = useProtocolDetailsForRun as jest.MockedFunction< - typeof useProtocolDetailsForRun -> const mockUseUnmatchedModulesForProtocol = useUnmatchedModulesForProtocol as jest.MockedFunction< typeof useUnmatchedModulesForProtocol > @@ -52,31 +57,21 @@ const mockUseLPCDisabledReason = useLPCDisabledReason as jest.MockedFunction< const mockUseLaunchLPC = useLaunchLPC as jest.MockedFunction< typeof useLaunchLPC > +const mockUseRobotType = useRobotType as jest.MockedFunction< + typeof useRobotType +> +const mockUseNotifyRunQuery = useNotifyRunQuery as jest.MockedFunction< + typeof useNotifyRunQuery +> +const mockUseProtocolQuery = useProtocolQuery as jest.MockedFunction< + typeof useProtocolQuery +> +const mockUseProtocolAnalysisAsDocumentQuery = useProtocolAnalysisAsDocumentQuery as jest.MockedFunction< + typeof useProtocolAnalysisAsDocumentQuery +> const DISABLED_REASON = 'MOCK_DISABLED_REASON' const ROBOT_NAME = 'otie' const RUN_ID = '1' -const PICKUP_TIP_LABWARE_ID = 'PICKUP_TIP_LABWARE_ID' -const PRIMARY_PIPETTE_ID = 'PRIMARY_PIPETTE_ID' -const PRIMARY_PIPETTE_NAME = 'PRIMARY_PIPETTE_NAME' -const LABWARE_DEF_ID = 'LABWARE_DEF_ID' -const LABWARE_DEF = { - ordering: [['A1', 'A2']], - parameters: { isTiprack: true }, -} -const mockLabwarePositionCheckStepTipRack = { - labwareId: - '1d57fc10-67ad-11ea-9f8b-3b50068bd62d:opentrons/opentrons_96_filtertiprack_200ul/1', - section: '', - commands: [ - { - commandType: 'pickUpTip', - params: { - pipetteId: PRIMARY_PIPETTE_ID, - labwareId: PICKUP_TIP_LABWARE_ID, - }, - }, - ], -} as any const render = () => { return renderWithProviders( @@ -93,7 +88,7 @@ const render = () => { )[0] } -describe('SetupLabware', () => { +describe('SetupLabwarePositionCheck', () => { let mockLaunchLPC: jest.Mock beforeEach(() => { @@ -119,42 +114,28 @@ describe('SetupLabware', () => { complete: true, }) when(mockUseRunHasStarted).calledWith(RUN_ID).mockReturnValue(false) - when(mockUseProtocolDetailsForRun) - .calledWith(RUN_ID) - .mockReturnValue({ - protocolData: { - labware: { - [mockLabwarePositionCheckStepTipRack.labwareId]: { - slot: '1', - displayName: 'someDisplayName', - definitionId: LABWARE_DEF_ID, - }, - }, - labwareDefinitions: { - [LABWARE_DEF_ID]: LABWARE_DEF, - }, - pipettes: { - [PRIMARY_PIPETTE_ID]: { - name: PRIMARY_PIPETTE_NAME, - mount: 'left', - }, - }, - commands: [ - { - commandType: 'pickUpTip', - params: { pipetteId: PRIMARY_PIPETTE_ID }, - } as any, - ], - }, - } as any) when(mockGetIsLabwareOffsetCodeSnippetsOn).mockReturnValue(false) when(mockUseLPCDisabledReason).mockReturnValue(null) + when(mockUseRobotType) + .calledWith(ROBOT_NAME) + .mockReturnValue(FLEX_ROBOT_TYPE) when(mockUseLaunchLPC) - .calledWith(RUN_ID) + .calledWith(RUN_ID, FLEX_ROBOT_TYPE, 'test protocol') .mockReturnValue({ launchLPC: mockLaunchLPC, LPCWizard:
mock LPC Wizard
, }) + when(mockUseNotifyRunQuery).mockReturnValue({ + data: { + data: { protocolId: 'fakeProtocolId' }, + }, + } as any) + when(mockUseProtocolQuery).mockReturnValue({ + data: { data: { metadata: { protocolName: 'test protocol' } } }, + } as any) + when(mockUseProtocolAnalysisAsDocumentQuery).mockReturnValue({ + data: null, + } as any) }) afterEach(() => { @@ -162,22 +143,24 @@ describe('SetupLabware', () => { }) it('should render LPC button and clicking should launch modal', () => { - const { getByRole } = render() - getByRole('button', { - name: 'run labware position check', - }).click() + render() + fireEvent.click( + screen.getByRole('button', { + name: 'run labware position check', + }) + ) expect(mockLaunchLPC).toHaveBeenCalled() }) - it('should render a disabled LPC button when a run has started', () => { + it('should render a disabled LPC button when disabled LPC reason exists', () => { when(mockUseRunHasStarted).calledWith(RUN_ID).mockReturnValue(true) when(mockUseLPCDisabledReason).mockReturnValue(DISABLED_REASON) - const { getByRole, queryByText } = render() - const button = getByRole('button', { + render() + const button = screen.getByRole('button', { name: 'run labware position check', }) expect(button).toBeDisabled() fireEvent.click(button) - expect(queryByText('mock Labware Position Check')).toBeNull() + expect(screen.queryByText('mock Labware Position Check')).toBeNull() }) it('should close Labware Offset Success toast when LPC is launched', () => { @@ -185,144 +168,11 @@ describe('SetupLabware', () => { when(mockUseLPCSuccessToast).calledWith().mockReturnValue({ setIsShowingLPCSuccessToast: mockSetIsShowingLPCSuccessToast, }) - const { getByRole } = render() - const button = getByRole('button', { + render() + const button = screen.getByRole('button', { name: 'run labware position check', }) fireEvent.click(button) expect(mockSetIsShowingLPCSuccessToast).toHaveBeenCalledWith(false) }) - it('should render a disabled LPC button when a robot-side protocol analysis is not complete', () => { - when(mockUseProtocolDetailsForRun) - .calledWith(RUN_ID) - .mockReturnValue({ - protocolData: null, - } as any) - when(mockUseLPCDisabledReason).mockReturnValue(DISABLED_REASON) - const { getByRole } = render() - const button = getByRole('button', { - name: 'run labware position check', - }) - expect(button).toBeDisabled() - }) - it('should render a disabled LPC button when a protocol without a pipette AND without a labware is uploaded', () => { - when(mockUseProtocolDetailsForRun) - .calledWith(RUN_ID) - .mockReturnValue({ - protocolData: { labware: {}, pipettes: {} }, - } as any) - when(mockUseLPCDisabledReason).mockReturnValue(DISABLED_REASON) - const { getByRole } = render() - const button = getByRole('button', { - name: 'run labware position check', - }) - expect(button).toBeDisabled() - }) - it('should render a disabled LPC button when robot calibration is incomplete', () => { - when(mockUseRunCalibrationStatus) - .calledWith(ROBOT_NAME, RUN_ID) - .mockReturnValue({ - complete: false, - }) - when(mockUseLPCDisabledReason).mockReturnValue(DISABLED_REASON) - const { getByRole } = render() - const button = getByRole('button', { - name: 'run labware position check', - }) - expect(button).toBeDisabled() - }) - it('should render a disabled LPC button when modules are not connected', () => { - when(mockUseUnmatchedModulesForProtocol) - .calledWith(ROBOT_NAME, RUN_ID) - .mockReturnValue({ - missingModuleIds: ['temperatureModuleV1'], - remainingAttachedModules: [], - }) - when(mockUseLPCDisabledReason).mockReturnValue(DISABLED_REASON) - const { getByRole } = render() - const button = getByRole('button', { - name: 'run labware position check', - }) - expect(button).toBeDisabled() - }) - it('should render a disabled LPC button when modules are not connected and robot calibration is incomplete', () => { - when(mockUseRunCalibrationStatus) - .calledWith(ROBOT_NAME, RUN_ID) - .mockReturnValue({ - complete: false, - }) - when(mockUseUnmatchedModulesForProtocol) - .calledWith(ROBOT_NAME, RUN_ID) - .mockReturnValue({ - missingModuleIds: ['temperatureModuleV1'], - remainingAttachedModules: [], - }) - when(mockUseLPCDisabledReason).mockReturnValue(DISABLED_REASON) - const { getByRole } = render() - const button = getByRole('button', { - name: 'run labware position check', - }) - expect(button).toBeDisabled() - }) - it('should render a disabled LPC button when a protocol does not load a tip rack', () => { - when(mockUseProtocolDetailsForRun) - .calledWith(RUN_ID) - .mockReturnValue({ - protocolData: { - labware: { - 'labware-0': { - slot: '1', - displayName: 'someDisplayName', - definitionId: LABWARE_DEF_ID, - }, - }, - labwareDefinitions: { - [LABWARE_DEF_ID]: { parameters: { isTiprack: false } }, - }, - pipettes: { - [PRIMARY_PIPETTE_ID]: { - name: PRIMARY_PIPETTE_NAME, - mount: 'left', - }, - }, - }, - } as any) - when(mockUseLPCDisabledReason).mockReturnValue(DISABLED_REASON) - const { getByRole } = render() - const button = getByRole('button', { - name: 'run labware position check', - }) - expect(button).toBeDisabled() - }) - it('should render a disabled LPC button when a protocol does not include a pickUpTip', () => { - when(mockUseProtocolDetailsForRun) - .calledWith(RUN_ID) - .mockReturnValue({ - protocolData: { - labware: { - [mockLabwarePositionCheckStepTipRack.labwareId]: { - slot: '1', - displayName: 'someDisplayName', - definitionId: LABWARE_DEF_ID, - }, - }, - labwareDefinitions: { - [LABWARE_DEF_ID]: LABWARE_DEF, - }, - pipettes: { - [PRIMARY_PIPETTE_ID]: { - name: PRIMARY_PIPETTE_NAME, - mount: 'left', - }, - }, - commands: [], - }, - } as any) - when(mockUseLPCDisabledReason).mockReturnValue(DISABLED_REASON) - const { getByRole } = render() - const button = getByRole('button', { - name: 'run labware position check', - }) - expect(button).toBeDisabled() - }) }) diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLabwarePositionCheck/index.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLabwarePositionCheck/index.tsx index c25a88f7202..383aa273588 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLabwarePositionCheck/index.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLabwarePositionCheck/index.tsx @@ -13,14 +13,21 @@ import { PrimaryButton, COLORS, } from '@opentrons/components' -import { useRunQuery } from '@opentrons/react-api-client' +import { useProtocolQuery } from '@opentrons/react-api-client' import { useMostRecentCompletedAnalysis } from '../../../LabwarePositionCheck/useMostRecentCompletedAnalysis' import { useLPCSuccessToast } from '../../hooks/useLPCSuccessToast' import { Tooltip } from '../../../../atoms/Tooltip' -import { useLPCDisabledReason, useStoredProtocolAnalysis } from '../../hooks' +import { + useRobotType, + useLPCDisabledReason, + useStoredProtocolAnalysis, +} from '../../hooks' import { CurrentOffsetsTable } from './CurrentOffsetsTable' import { useLaunchLPC } from '../../../LabwarePositionCheck/useLaunchLPC' import { StyledText } from '../../../../atoms/text' +import { getLatestCurrentOffsets } from './utils' +import { useNotifyRunQuery } from '../../../../resources/runs/useNotifyRunQuery' + import type { LabwareOffset } from '@opentrons/api-client' interface SetupLabwarePositionCheckProps { @@ -35,7 +42,18 @@ export function SetupLabwarePositionCheck( const { robotName, runId, expandLabwareStep } = props const { t, i18n } = useTranslation('protocol_setup') - const { data: runRecord } = useRunQuery(runId, { staleTime: Infinity }) + const robotType = useRobotType(robotName) + const { data: runRecord } = useNotifyRunQuery(runId, { staleTime: Infinity }) + const { data: protocolRecord } = useProtocolQuery( + runRecord?.data.protocolId ?? null, + { + staleTime: Infinity, + } + ) + const protocolName = + protocolRecord?.data.metadata.protocolName ?? + protocolRecord?.data.files[0].name ?? + '' const currentOffsets = runRecord?.data?.labwareOffsets ?? [] const sortedOffsets: LabwareOffset[] = currentOffsets.length > 0 @@ -62,7 +80,9 @@ export function SetupLabwarePositionCheck( const { setIsShowingLPCSuccessToast } = useLPCSuccessToast() - const { launchLPC, LPCWizard } = useLaunchLPC(runId) + const { launchLPC, LPCWizard } = useLaunchLPC(runId, robotType, protocolName) + + const nonIdentityOffsets = getLatestCurrentOffsets(sortedOffsets) return ( - {sortedOffsets.length > 0 ? ( + {nonIdentityOffsets.length > 0 ? ( diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/LiquidDetailCard.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/LiquidDetailCard.tsx index 30ead6fc1aa..1359c827565 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/LiquidDetailCard.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/LiquidDetailCard.tsx @@ -30,13 +30,14 @@ import { getWellRangeForLiquidLabwarePair } from './utils' const LIQUID_CARD_STYLE = css` ${BORDERS.cardOutlineBorder} &:hover { - border: 1px solid ${COLORS.medGreyHover}; + border: 1px solid ${COLORS.grey60}; + border-radius: ${BORDERS.borderRadiusSize1}; cursor: pointer; } ` const LIQUID_CARD_ODD_STYLE = css` - border-color: ${COLORS.medGreyEnabled}; - border: ${SPACING.spacing4} solid ${COLORS.medGreyEnabled}; + border-color: ${COLORS.grey30}; + border: ${SPACING.spacing4} solid ${COLORS.grey30}; border-radius: ${BORDERS.borderRadiusSize3}; ` interface LiquidDetailCardProps { @@ -66,9 +67,11 @@ export function LiquidDetailCard(props: LiquidDetailCardProps): JSX.Element { const { t } = useTranslation('protocol_setup') const ACTIVE_STYLE = css` - background-color: ${isOnDevice ? COLORS.medBlue : COLORS.lightBlue}; - border: ${isOnDevice ? SPACING.spacing4 : `1px`} solid ${COLORS.blueEnabled}; - border-radius: ${isOnDevice ? BORDERS.borderRadiusSize3 : 0}; + background-color: ${isOnDevice ? COLORS.blue30 : COLORS.blue10}; + border: ${isOnDevice ? SPACING.spacing4 : `1px`} solid ${COLORS.blue50}; + border-radius: ${isOnDevice + ? BORDERS.borderRadiusSize3 + : BORDERS.borderRadiusSize1}; ` const volumePerWellRange = getWellRangeForLiquidLabwarePair( volumeByWell, @@ -116,12 +119,12 @@ export function LiquidDetailCard(props: LiquidDetailCardProps): JSX.Element { {description != null ? description : null} - <> + {Object.values(volumeByWell).reduce((prev, curr) => prev + curr, 0)}{' '} {MICRO_LITERS} {t('total_vol')} - + {selectedValue === liquidId ? ( <> - + {well.wellName}
{well.volume} {MICRO_LITERS} @@ -207,12 +213,12 @@ export function LiquidDetailCard(props: LiquidDetailCardProps): JSX.Element { > {displayName}
- + {description != null ? description : null} - + {Object.values(volumeByWell).reduce((prev, curr) => prev + curr, 0)}{' '} - {MICRO_LITERS} + {MICRO_LITERS} {t('total_vol')}
{selectedValue === liquidId ? ( <> - + {volumePerWellRange.map((well, index) => { return ( @@ -193,14 +193,14 @@ export const LiquidsLabwareDetailsModal = ( {t('slot_number')} {slotName} @@ -212,14 +212,14 @@ export const LiquidsLabwareDetailsModal = ( {t('labware_name')} {labwareName} diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/SetupLiquidsList.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/SetupLiquidsList.tsx index 8538ec7ae10..c93e3727352 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/SetupLiquidsList.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/SetupLiquidsList.tsx @@ -52,7 +52,7 @@ const HIDE_SCROLLBAR = css` const LIQUID_BORDER_STYLE = css` border-style: ${BORDERS.styleSolid}; border-width: 1px; - border-color: ${COLORS.medGreyEnabled}; + border-color: ${COLORS.grey30}; border-radius: ${BORDERS.radiusSoftCorners}; ` @@ -113,7 +113,7 @@ export function LiquidsListItem(props: LiquidsListItemProps): JSX.Element { &:hover { cursor: pointer; - border: 1px solid ${COLORS.medGreyHover}; + border: 1px solid ${COLORS.grey60}; } ` const LIQUID_CARD_ITEM_STYLE = css` @@ -132,7 +132,7 @@ export function LiquidsListItem(props: LiquidsListItemProps): JSX.Element { css={LIQUID_CARD_STYLE} padding={SPACING.spacing16} onClick={handleSetOpenItem} - backgroundColor={openItem ? COLORS.fundamentalsBackground : COLORS.white} + backgroundColor={openItem ? COLORS.grey10 : COLORS.white} data-testid="LiquidsListItem_Row" > {moduleModel != null ? t('on_adapter_in_mod', { @@ -311,14 +311,14 @@ export const LiquidsListItemDetails = ( {description != null ? description : null} { - switch (robotType) { - case 'OT-2 Standard': - return OT2_VIEWBOX - case 'OT-3 Standard': - return OT3_VIEWBOX - default: - return null - } -} interface SetupLiquidsMapProps { runId: string - robotName: string + protocolAnalysis: CompletedProtocolAnalysis | ProtocolAnalysisOutput | null } -export function SetupLiquidsMap(props: SetupLiquidsMapProps): JSX.Element { - const { runId, robotName } = props +export function SetupLiquidsMap( + props: SetupLiquidsMapProps +): JSX.Element | null { + const { runId, protocolAnalysis } = props const [hoverLabwareId, setHoverLabwareId] = React.useState('') + const [liquidDetailsLabwareId, setLiquidDetailsLabwareId] = React.useState< + string | null + >(null) + const attachedModules = + useAttachedModules({ + refetchInterval: ATTACHED_MODULE_POLL_MS, + }) ?? [] + + if (protocolAnalysis == null) return null - const moduleRenderInfoById = useModuleRenderInfoForProtocolById( - robotName, - runId - ) - const labwareRenderInfoById = useLabwareRenderInfoForRunById(runId) - const { robotType } = useProtocolDetailsForRun(runId) - const protocolData = useMostRecentCompletedAnalysis(runId) const liquids = parseLiquidsInLoadOrder( - protocolData?.liquids != null ? protocolData?.liquids : [], - protocolData?.commands ?? [] + protocolAnalysis.liquids != null ? protocolAnalysis.liquids : [], + protocolAnalysis.commands ?? [] ) const initialLoadedLabwareByAdapter = parseInitialLoadedLabwareByAdapter( - protocolData?.commands ?? [] + protocolAnalysis.commands ?? [] ) + const robotType = protocolAnalysis.robotType ?? FLEX_ROBOT_TYPE const deckDef = getDeckDefFromRobotType(robotType) + const labwareRenderInfo = getLabwareRenderInfo(protocolAnalysis, deckDef) const labwareByLiquidId = parseLabwareInfoByLiquidId( - protocolData?.commands ?? [] + protocolAnalysis.commands ?? [] ) - const [liquidDetailsLabwareId, setLiquidDetailsLabwareId] = React.useState< - string | null - >(null) + const deckConfig = getSimplestDeckConfigForProtocol(protocolAnalysis) + const deckLayerBlocklist = getStandardDeckViewLayerBlockList(robotType) + const protocolModulesInfo = getProtocolModulesInfo(protocolAnalysis, deckDef) + + const attachedProtocolModuleMatches = getAttachedProtocolModuleMatches( + attachedModules, + protocolModulesInfo + ) + + const modulesOnDeck = attachedProtocolModuleMatches.map(module => { + const labwareInAdapterInMod = + module.nestedLabwareId != null + ? initialLoadedLabwareByAdapter[module.nestedLabwareId] + : null + // only rendering the labware on top most layer so + // either the adapter or the labware are rendered but not both + const topLabwareDefinition = + labwareInAdapterInMod?.result?.definition ?? module.nestedLabwareDef + const topLabwareId = + labwareInAdapterInMod?.result?.labwareId ?? module.nestedLabwareId + const topLabwareDisplayName = + labwareInAdapterInMod?.params.displayName ?? + module.nestedLabwareDisplayName + const nestedLabwareWellFill = getWellFillFromLabwareId( + module.nestedLabwareId ?? '', + liquids, + labwareByLiquidId + ) + const labwareHasLiquid = !isEmpty(nestedLabwareWellFill) + + return { + moduleModel: module.moduleDef.model, + moduleLocation: { slotName: module.slotName }, + innerProps: + module.moduleDef.model === THERMOCYCLER_MODULE_V1 + ? { lidMotorState: 'open' } + : {}, + + nestedLabwareDef: topLabwareDefinition, + nestedLabwareWellFill, + moduleChildren: + topLabwareDefinition != null && topLabwareId != null ? ( + setHoverLabwareId(topLabwareId)} + onMouseLeave={() => setHoverLabwareId('')} + onClick={() => + labwareHasLiquid ? setLiquidDetailsLabwareId(topLabwareId) : null + } + cursor={labwareHasLiquid ? 'pointer' : ''} + > + + + ) : null, + } + }) return ( - - {() => ( - <> - {map( - moduleRenderInfoById, - ({ - x, - y, - moduleDef, - nestedLabwareDef, - nestedLabwareId, - nestedLabwareDisplayName, - moduleId, - }) => { - const labwareInAdapterInMod = - nestedLabwareId != null - ? initialLoadedLabwareByAdapter[nestedLabwareId] - : null - // only rendering the labware on top most layer so - // either the adapter or the labware are rendered but not both - const topLabwareDefinition = - labwareInAdapterInMod?.result?.definition ?? nestedLabwareDef - const topLabwareId = - labwareInAdapterInMod?.result?.labwareId ?? nestedLabwareId - const topLabwareDisplayName = - labwareInAdapterInMod?.result?.definition.metadata - .displayName ?? nestedLabwareDisplayName - - const wellFill = getWellFillFromLabwareId( - topLabwareId ?? '', - liquids, - labwareByLiquidId - ) - const labwareHasLiquid = !isEmpty(wellFill) - - return ( - - {topLabwareDefinition != null && - topLabwareDisplayName != null && - topLabwareId != null ? ( - - setHoverLabwareId(topLabwareId)} - onMouseLeave={() => setHoverLabwareId('')} - onClick={() => - labwareHasLiquid - ? setLiquidDetailsLabwareId(topLabwareId) - : null - } - cursor={labwareHasLiquid ? 'pointer' : ''} - > - - - - - ) : null} - - ) - } - )} - {map( - labwareRenderInfoById, - ({ x, y, labwareDef, displayName }, labwareId) => { - const labwareInAdapter = - initialLoadedLabwareByAdapter[labwareId] - // only rendering the labware on top most layer so - // either the adapter or the labware are rendered but not both - const topLabwareDefinition = - labwareInAdapter?.result?.definition ?? labwareDef - const topLabwareId = - labwareInAdapter?.result?.labwareId ?? labwareId - const topLabwareDisplayName = - labwareInAdapter?.result?.definition.metadata.displayName ?? - displayName - const wellFill = getWellFillFromLabwareId( - topLabwareId ?? '', - liquids, - labwareByLiquidId - ) - const labwareHasLiquid = !isEmpty(wellFill) - return ( - - setHoverLabwareId(topLabwareId)} - onMouseLeave={() => setHoverLabwareId('')} - onClick={() => - labwareHasLiquid - ? setLiquidDetailsLabwareId(topLabwareId) - : null - } - cursor={labwareHasLiquid ? 'pointer' : ''} - > - - - - - ) - } - )} - - + {map( + labwareRenderInfo, + ({ x, y, labwareDef, displayName }, labwareId) => { + const labwareInAdapter = initialLoadedLabwareByAdapter[labwareId] + // only rendering the labware on top most layer so + // either the adapter or the labware are rendered but not both + const topLabwareDefinition = + labwareInAdapter?.result?.definition ?? labwareDef + const topLabwareId = + labwareInAdapter?.result?.labwareId ?? labwareId + const topLabwareDisplayName = + labwareInAdapter?.params.displayName ?? displayName + const wellFill = getWellFillFromLabwareId( + topLabwareId ?? '', + liquids, + labwareByLiquidId + ) + const labwareHasLiquid = !isEmpty(wellFill) + return ( + + setHoverLabwareId(topLabwareId)} + onMouseLeave={() => setHoverLabwareId('')} + onClick={() => + labwareHasLiquid + ? setLiquidDetailsLabwareId(topLabwareId) + : null + } + cursor={labwareHasLiquid ? 'pointer' : ''} + > + + + + + ) + } )} - + {liquidDetailsLabwareId != null && ( { getAllByText(nestedTextMatcher('100 µL')) getAllByText(nestedTextMatcher('total volume')) expect(getByLabelText('liquidBox_odd')).toHaveStyle( - `border: ${SPACING.spacing4} solid ${COLORS.medGreyEnabled}` + `border: ${SPACING.spacing4} solid ${COLORS.grey30}` ) }) }) diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/LiquidsLabwareDetailsModal.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/LiquidsLabwareDetailsModal.test.tsx index 77a1500f575..fe87a2a6f59 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/LiquidsLabwareDetailsModal.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/LiquidsLabwareDetailsModal.test.tsx @@ -9,7 +9,6 @@ import { } from '@opentrons/components' import { parseLiquidsInLoadOrder } from '@opentrons/api-client' import { getIsOnDevice } from '../../../../../redux/config' -import { useLabwareRenderInfoForRunById } from '../../../../Devices/hooks' import { useMostRecentCompletedAnalysis } from '../../../../LabwarePositionCheck/useMostRecentCompletedAnalysis' import { mockDefinition } from '../../../../../redux/custom-labware/__fixtures__' import { getLocationInfoNames } from '../../utils/getLocationInfoNames' @@ -57,9 +56,6 @@ const mockLabwareRender = LabwareRender as jest.MockedFunction< const mockGetWellFillFromLabwareId = getWellFillFromLabwareId as jest.MockedFunction< typeof getWellFillFromLabwareId > -const mockUseLabwareRenderInfoForRunById = useLabwareRenderInfoForRunById as jest.MockedFunction< - typeof useLabwareRenderInfoForRunById -> const mockUseMostRecentCompletedAnalysis = useMostRecentCompletedAnalysis as jest.MockedFunction< typeof useMostRecentCompletedAnalysis > @@ -116,11 +112,6 @@ describe('LiquidsLabwareDetailsModal', () => { ]) mockLiquidDetailCard.mockReturnValue(
) mockGetWellFillFromLabwareId.mockReturnValue({}) - mockUseLabwareRenderInfoForRunById.mockReturnValue({ - '123': { - labwareDef: {}, - }, - } as any) mockUseMostRecentCompletedAnalysis.mockReturnValue( {} as CompletedProtocolAnalysis ) diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquids.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquids.test.tsx index 9a81fd6e78f..9387d27e2e7 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquids.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquids.test.tsx @@ -23,7 +23,12 @@ const mockBackToTopButton = BackToTopButton as jest.MockedFunction< const render = (props: React.ComponentProps) => { return renderWithProviders( - , + , { i18nInstance: i18n, } diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquidsMap.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquidsMap.test.tsx index 7ce0c8aa8e2..55c604feb99 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquidsMap.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/SetupLiquidsMap.test.tsx @@ -2,88 +2,104 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' import { i18n } from '../../../../../i18n' import { + BaseDeck, renderWithProviders, partialComponentPropsMatcher, - RobotWorkSpace, LabwareRender, - Module, } from '@opentrons/components' + +import fixture_tiprack_300_ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_300_ul.json' import { - inferModuleOrientationFromXCoordinate, - LabwareDefinition2, - ModuleModel, - ModuleType, + FLEX_ROBOT_TYPE, + FLEX_SIMPLEST_DECK_CONFIG_PROTOCOL_SPEC, + getDeckDefFromRobotType, + getSimplestDeckConfigForProtocol, + OT2_ROBOT_TYPE, } from '@opentrons/shared-data' -import fixture_tiprack_300_ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_300_ul.json' -import standardDeckDef from '@opentrons/shared-data/deck/definitions/3/ot2_standard.json' import { - useLabwareRenderInfoForRunById, - useModuleRenderInfoForProtocolById, - useProtocolDetailsForRun, -} from '../../../hooks' -import { getWellFillFromLabwareId } from '../utils' -import { SetupLiquidsMap } from '../SetupLiquidsMap' + parseInitialLoadedLabwareByAdapter, + parseLabwareInfoByLiquidId, + parseLiquidsInLoadOrder, + simpleAnalysisFileFixture, +} from '@opentrons/api-client' +import ot2StandardDeckDef from '@opentrons/shared-data/deck/definitions/4/ot2_standard.json' +import ot3StandardDeckDef from '@opentrons/shared-data/deck/definitions/4/ot3_standard.json' + +import { useAttachedModules } from '../../../hooks' import { LabwareInfoOverlay } from '../../LabwareInfoOverlay' +import { getLabwareRenderInfo } from '../../utils/getLabwareRenderInfo' +import { getStandardDeckViewLayerBlockList } from '../../utils/getStandardDeckViewLayerBlockList' +import { getAttachedProtocolModuleMatches } from '../../../../ProtocolSetupModulesAndDeck/utils' +import { getProtocolModulesInfo } from '../../utils/getProtocolModulesInfo' +import { mockProtocolModuleInfo } from '../../../../ProtocolSetupLabware/__fixtures__' +import { mockFetchModulesSuccessActionPayloadModules } from '../../../../../redux/modules/__fixtures__' + +import { SetupLiquidsMap } from '../SetupLiquidsMap' + +import type { + ModuleModel, + ModuleType, + LabwareDefinition2, +} from '@opentrons/shared-data' jest.mock('@opentrons/components', () => { const actualComponents = jest.requireActual('@opentrons/components') return { ...actualComponents, - Module: jest.fn(() =>
mock Module
), - RobotWorkSpace: jest.fn(() =>
mock RobotWorkSpace
), LabwareRender: jest.fn(() =>
mock LabwareRender
), } }) -jest.mock('@opentrons/shared-data', () => { - const actualSharedData = jest.requireActual('@opentrons/shared-data') - return { - ...actualSharedData, - inferModuleOrientationFromXCoordinate: jest.fn(), - } -}) + +jest.mock('@opentrons/components/src/hardware-sim/BaseDeck') +jest.mock('@opentrons/api-client') +jest.mock('@opentrons/shared-data/js/helpers') jest.mock('../../LabwareInfoOverlay') jest.mock('../../../hooks') jest.mock('../utils') +jest.mock('../../utils/getLabwareRenderInfo') +jest.mock('../../../../ProtocolSetupModulesAndDeck/utils') +jest.mock('../../utils/getProtocolModulesInfo') +jest.mock('../../../../../resources/deck_configuration/utils') -const mockUseProtocolDetailsForRun = useProtocolDetailsForRun as jest.MockedFunction< - typeof useProtocolDetailsForRun +const mockUseAttachedModules = useAttachedModules as jest.MockedFunction< + typeof useAttachedModules > const mockLabwareInfoOverlay = LabwareInfoOverlay as jest.MockedFunction< typeof LabwareInfoOverlay > -const mockModule = Module as jest.MockedFunction -const mockInferModuleOrientationFromXCoordinate = inferModuleOrientationFromXCoordinate as jest.MockedFunction< - typeof inferModuleOrientationFromXCoordinate -> -const mockRobotWorkSpace = RobotWorkSpace as jest.MockedFunction< - typeof RobotWorkSpace -> const mockLabwareRender = LabwareRender as jest.MockedFunction< typeof LabwareRender > -const mockUseLabwareRenderInfoForRunById = useLabwareRenderInfoForRunById as jest.MockedFunction< - typeof useLabwareRenderInfoForRunById +const mockBaseDeck = BaseDeck as jest.MockedFunction +const mockGetDeckDefFromRobotType = getDeckDefFromRobotType as jest.MockedFunction< + typeof getDeckDefFromRobotType > -const mockUseModuleRenderInfoForProtocolById = useModuleRenderInfoForProtocolById as jest.MockedFunction< - typeof useModuleRenderInfoForProtocolById +const mockParseInitialLoadedLabwareByAdapter = parseInitialLoadedLabwareByAdapter as jest.MockedFunction< + typeof parseInitialLoadedLabwareByAdapter > -const mockGetWellFillFromLabwareId = getWellFillFromLabwareId as jest.MockedFunction< - typeof getWellFillFromLabwareId +const mockParseLabwareInfoByLiquidId = parseLabwareInfoByLiquidId as jest.MockedFunction< + typeof parseLabwareInfoByLiquidId +> +const mockParseLiquidsInLoadOrder = parseLiquidsInLoadOrder as jest.MockedFunction< + typeof parseLiquidsInLoadOrder +> +const mockGetLabwareRenderInfo = getLabwareRenderInfo as jest.MockedFunction< + typeof getLabwareRenderInfo +> +const mockGetAttachedProtocolModuleMatches = getAttachedProtocolModuleMatches as jest.MockedFunction< + typeof getAttachedProtocolModuleMatches +> +const mockGetProtocolModulesInfo = getProtocolModulesInfo as jest.MockedFunction< + typeof getProtocolModulesInfo +> +const mockGetSimplestDeckConfigForProtocol = getSimplestDeckConfigForProtocol as jest.MockedFunction< + typeof getSimplestDeckConfigForProtocol > -const MOCK_WELL_FILL = { C1: '#ff4888', C2: '#ff4888' } - -const deckSlotsById = standardDeckDef.locations.orderedSlots.reduce( - (acc, deckSlot) => ({ ...acc, [deckSlot.id]: deckSlot }), - {} -) - -const ROBOT_NAME = 'otie' const RUN_ID = '1' -const STUBBED_ORIENTATION_VALUE = 'left' const MOCK_300_UL_TIPRACK_ID = '300_ul_tiprack_id' const MOCK_MAGNETIC_MODULE_COORDS = [10, 20, 0] -const MOCK_TC_COORDS = [20, 30, 0] +const MOCK_SECOND_MAGNETIC_MODULE_COORDS = [100, 200, 0] const MOCK_300_UL_TIPRACK_COORDS = [30, 40, 0] const mockMagneticModule = { @@ -106,26 +122,23 @@ const mockMagneticModule = { quirks: [], } -const mockTCModule = { - labwareOffset: { x: 3, y: 3, z: 3 }, - moduleId: 'TCModuleId', - model: 'thermocyclerModuleV1' as ModuleModel, - type: 'thermocyclerModuleType' as ModuleType, -} - const render = (props: React.ComponentProps) => { return renderWithProviders(, { i18nInstance: i18n, }) } +const mockProtocolAnalysis = { + ...simpleAnalysisFileFixture, + robotType: OT2_ROBOT_TYPE, +} as any describe('SetupLiquidsMap', () => { let props: React.ComponentProps beforeEach(() => { - props = { runId: RUN_ID, robotName: ROBOT_NAME } - when(mockInferModuleOrientationFromXCoordinate) - .calledWith(expect.anything()) - .mockReturnValue(STUBBED_ORIENTATION_VALUE) + props = { + runId: RUN_ID, + protocolAnalysis: mockProtocolAnalysis, + } when(mockLabwareRender) .mockReturnValue(
) // this (default) empty div will be returned when LabwareRender isn't called with expected labware definition .calledWith( @@ -145,14 +158,27 @@ describe('SetupLiquidsMap', () => { }) ) .mockReturnValue(
mock labware render with well fill
) - + when(mockUseAttachedModules).calledWith().mockReturnValue([]) + when(mockGetAttachedProtocolModuleMatches).mockReturnValue([]) + when(mockGetLabwareRenderInfo) + .calledWith(mockProtocolAnalysis, ot2StandardDeckDef as any) + .mockReturnValue({}) + when(mockGetSimplestDeckConfigForProtocol) + .calledWith(mockProtocolAnalysis) + .mockReturnValue(FLEX_SIMPLEST_DECK_CONFIG_PROTOCOL_SPEC) + when(mockParseLiquidsInLoadOrder) + .calledWith( + mockProtocolAnalysis.liquids as any, + mockProtocolAnalysis.commands as any + ) + .mockReturnValue([]) + when(mockParseInitialLoadedLabwareByAdapter) + .calledWith(mockProtocolAnalysis.commands as any) + .mockReturnValue({}) when(mockLabwareInfoOverlay) .mockReturnValue(
) // this (default) empty div will be returned when LabwareInfoOverlay isn't called with expected props .calledWith( - partialComponentPropsMatcher({ - definition: fixture_tiprack_300_ul, - labwareHasLiquid: false, - }) + partialComponentPropsMatcher({ definition: fixture_tiprack_300_ul }) ) .mockReturnValue(
@@ -160,93 +186,101 @@ describe('SetupLiquidsMap', () => { {fixture_tiprack_300_ul.metadata.displayName}
) - .calledWith(partialComponentPropsMatcher({ labwareHasLiquid: true })) - .mockReturnValue(
mock labware overlay with liquid
) + }) - when(mockRobotWorkSpace) - .mockReturnValue(
) // this (default) empty div will be returned when RobotWorkSpace isn't called with expected props - .calledWith( - partialComponentPropsMatcher({ - deckDef: standardDeckDef, - children: expect.anything(), - }) - ) - .mockImplementation(({ children }) => ( - - {/* @ts-expect-error children won't be null since we checked for expect.anything() above */} - {children({ - deckSlotsById, - getRobotCoordsFromDOMCoords: {} as any, - })} - - )) - when(mockUseProtocolDetailsForRun) - .calledWith(RUN_ID) - .mockReturnValue({ - protocolData: { - pipettes: {}, - labware: {}, - modules: { - heatershaker_id: { - model: 'heaterShakerModuleV1', - }, - }, - liquids: [ - { - id: '1', - displayName: 'mock liquid', - description: '', - displayColor: '#FFFFFF', - }, - ], - labwareDefinitions: {}, - commands: [], - }, - } as any) + afterEach(() => { + jest.clearAllMocks() + resetAllWhenMocks() }) - afterEach(() => resetAllWhenMocks()) it('should render a deck WITHOUT labware and WITHOUT modules', () => { - when(mockUseLabwareRenderInfoForRunById) - .calledWith(RUN_ID) - .mockReturnValue({}) - when(mockUseModuleRenderInfoForProtocolById) - .calledWith(ROBOT_NAME, RUN_ID) - .mockReturnValue({}) - + props = { + ...props, + protocolAnalysis: null, + } render(props) - expect(mockModule).not.toHaveBeenCalled() expect(mockLabwareRender).not.toHaveBeenCalled() expect(mockLabwareInfoOverlay).not.toHaveBeenCalled() }) - it('should render a deck WITH labware and WITHOUT modules', () => { - when(mockUseLabwareRenderInfoForRunById) - .calledWith(RUN_ID) - .mockReturnValue({ - '300_ul_tiprack_id': { - labwareDef: fixture_tiprack_300_ul as LabwareDefinition2, - displayName: 'fresh tips', - x: MOCK_300_UL_TIPRACK_COORDS[0], - y: MOCK_300_UL_TIPRACK_COORDS[1], - z: MOCK_300_UL_TIPRACK_COORDS[2], - }, - }) - when(mockUseModuleRenderInfoForProtocolById) - .calledWith(ROBOT_NAME, RUN_ID) + it('should render base deck - robot type is OT-2', () => { + when(mockGetDeckDefFromRobotType) + .calledWith(OT2_ROBOT_TYPE) + .mockReturnValue(ot2StandardDeckDef as any) + when(mockParseLabwareInfoByLiquidId) + .calledWith(mockProtocolAnalysis.commands as any) .mockReturnValue({}) + mockUseAttachedModules.mockReturnValue( + mockFetchModulesSuccessActionPayloadModules + ) + when(mockGetLabwareRenderInfo).mockReturnValue({}) + when(mockGetProtocolModulesInfo) + .calledWith(mockProtocolAnalysis, ot2StandardDeckDef as any) + .mockReturnValue(mockProtocolModuleInfo) + when(mockGetAttachedProtocolModuleMatches) + .calledWith( + mockFetchModulesSuccessActionPayloadModules, + mockProtocolModuleInfo + ) + .mockReturnValue([ + { + moduleId: mockMagneticModule.moduleId, + x: MOCK_MAGNETIC_MODULE_COORDS[0], + y: MOCK_MAGNETIC_MODULE_COORDS[1], + z: MOCK_MAGNETIC_MODULE_COORDS[2], + moduleDef: mockMagneticModule as any, + nestedLabwareDef: null, + nestedLabwareDisplayName: null, + nestedLabwareId: null, + slotName: '1', + protocolLoadOrder: 1, + attachedModuleMatch: null, + }, + { + moduleId: mockMagneticModule.moduleId, + x: MOCK_SECOND_MAGNETIC_MODULE_COORDS[0], + y: MOCK_SECOND_MAGNETIC_MODULE_COORDS[1], + z: MOCK_SECOND_MAGNETIC_MODULE_COORDS[2], + moduleDef: mockMagneticModule as any, + nestedLabwareDef: null, + nestedLabwareDisplayName: null, + nestedLabwareId: null, + slotName: '2', + protocolLoadOrder: 0, + attachedModuleMatch: null, + }, + ]) + when(mockBaseDeck) + .calledWith( + partialComponentPropsMatcher({ + robotType: OT2_ROBOT_TYPE, + deckLayerBlocklist: getStandardDeckViewLayerBlockList(OT2_ROBOT_TYPE), + }) + ) + .mockReturnValue(
mock BaseDeck
) const [{ getByText }] = render(props) - expect(mockModule).not.toHaveBeenCalled() - expect(mockLabwareRender).toHaveBeenCalled() - expect(mockLabwareInfoOverlay).toHaveBeenCalled() - getByText('mock labware render of 300ul Tiprack FIXTURE') - getByText('mock labware info overlay of 300ul Tiprack FIXTURE') + getByText('mock BaseDeck') }) - it('should render a deck WITH labware and WITH modules', () => { - when(mockUseLabwareRenderInfoForRunById) - .calledWith(RUN_ID) + it('should render base deck - robot type is Flex', () => { + const mockFlexAnalysis = { + ...mockProtocolAnalysis, + robotType: FLEX_ROBOT_TYPE, + } + props = { + ...props, + protocolAnalysis: { + ...mockProtocolAnalysis, + robotType: FLEX_ROBOT_TYPE, + }, + } + when(mockGetDeckDefFromRobotType) + .calledWith(FLEX_ROBOT_TYPE) + .mockReturnValue(ot3StandardDeckDef as any) + + when(mockGetLabwareRenderInfo) + .calledWith(mockFlexAnalysis, ot3StandardDeckDef as any) .mockReturnValue({ [MOCK_300_UL_TIPRACK_ID]: { labwareDef: fixture_tiprack_300_ul as LabwareDefinition2, @@ -254,77 +288,73 @@ describe('SetupLiquidsMap', () => { x: MOCK_300_UL_TIPRACK_COORDS[0], y: MOCK_300_UL_TIPRACK_COORDS[1], z: MOCK_300_UL_TIPRACK_COORDS[2], + slotName: 'C1', }, }) - when(mockUseModuleRenderInfoForProtocolById) - .calledWith(ROBOT_NAME, RUN_ID) - .mockReturnValue({ - [mockMagneticModule.moduleId]: { + when(mockParseLabwareInfoByLiquidId) + .calledWith(mockFlexAnalysis.commands as any) + .mockReturnValue({}) + mockUseAttachedModules.mockReturnValue( + mockFetchModulesSuccessActionPayloadModules + ) + + when(mockGetProtocolModulesInfo) + .calledWith(mockFlexAnalysis, ot3StandardDeckDef as any) + .mockReturnValue(mockProtocolModuleInfo) + when(mockGetAttachedProtocolModuleMatches) + .calledWith( + mockFetchModulesSuccessActionPayloadModules, + mockProtocolModuleInfo + ) + .mockReturnValue([ + { moduleId: mockMagneticModule.moduleId, x: MOCK_MAGNETIC_MODULE_COORDS[0], y: MOCK_MAGNETIC_MODULE_COORDS[1], z: MOCK_MAGNETIC_MODULE_COORDS[2], moduleDef: mockMagneticModule as any, nestedLabwareDef: null, + nestedLabwareDisplayName: null, nestedLabwareId: null, - protocolLoadOrder: 0, + slotName: 'C1', + protocolLoadOrder: 1, attachedModuleMatch: null, }, - [mockTCModule.moduleId]: { - moduleId: mockTCModule.moduleId, - x: MOCK_TC_COORDS[0], - y: MOCK_TC_COORDS[1], - z: MOCK_TC_COORDS[2], - moduleDef: mockTCModule, + { + moduleId: mockMagneticModule.moduleId, + x: MOCK_SECOND_MAGNETIC_MODULE_COORDS[0], + y: MOCK_SECOND_MAGNETIC_MODULE_COORDS[1], + z: MOCK_SECOND_MAGNETIC_MODULE_COORDS[2], + moduleDef: mockMagneticModule as any, nestedLabwareDef: null, + nestedLabwareDisplayName: null, nestedLabwareId: null, - protocolLoadOrder: 1, + slotName: 'B1', + protocolLoadOrder: 0, attachedModuleMatch: null, }, - } as any) - - when(mockModule) + ]) + when(mockBaseDeck) .calledWith( partialComponentPropsMatcher({ - def: mockMagneticModule, - x: MOCK_MAGNETIC_MODULE_COORDS[0], - y: MOCK_MAGNETIC_MODULE_COORDS[1], + deckLayerBlocklist: getStandardDeckViewLayerBlockList( + FLEX_ROBOT_TYPE + ), + robotType: FLEX_ROBOT_TYPE, + // // ToDo (kk:11/03/2023) Update the following part later + labwareOnDeck: expect.anything(), + modulesOnDeck: expect.anything(), }) ) - .mockReturnValue(
mock module viz {mockMagneticModule.type}
) - - when(mockModule) - .calledWith( - partialComponentPropsMatcher({ - def: mockTCModule, - x: MOCK_TC_COORDS[0], - y: MOCK_TC_COORDS[1], - }) - ) - .mockReturnValue(
mock module viz {mockTCModule.type}
) - + .mockReturnValue(
mock BaseDeck
) const [{ getByText }] = render(props) - getByText('mock module viz magneticModuleType') - getByText('mock module viz thermocyclerModuleType') - getByText('mock labware render of 300ul Tiprack FIXTURE') - getByText('mock labware info overlay of 300ul Tiprack FIXTURE') - }) - it('should render labware overlay and labware render with liquids', () => { - when(mockUseLabwareRenderInfoForRunById) - .calledWith(RUN_ID) - .mockReturnValue({ - '300_ul_tiprack_id': { - labwareDef: fixture_tiprack_300_ul as LabwareDefinition2, - displayName: 'fresh tips', - x: MOCK_300_UL_TIPRACK_COORDS[0], - y: MOCK_300_UL_TIPRACK_COORDS[1], - z: MOCK_300_UL_TIPRACK_COORDS[2], - }, - }) - mockGetWellFillFromLabwareId.mockReturnValue(MOCK_WELL_FILL) - const [{ getByText }] = render({ ...props }) - getByText('mock labware overlay with liquid') - getByText('mock labware render with well fill') + getByText('mock BaseDeck') }) + + // ToDo (kk:11/03/2023) + // The current component implementation is tough to test everything. + // I will do refactoring later and add tests to cover more cases. + // Probably I will replace BaseDeck's children with a new component and write test for that. + it.todo('should render labware overlay and labware render with liquids') }) diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/index.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/index.tsx index 85e2e2761fb..bb4de2d50ea 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/index.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/index.tsx @@ -13,13 +13,24 @@ import { BackToTopButton } from '../BackToTopButton' import { SetupLiquidsList } from './SetupLiquidsList' import { SetupLiquidsMap } from './SetupLiquidsMap' +import type { + CompletedProtocolAnalysis, + ProtocolAnalysisOutput, +} from '@opentrons/shared-data' + interface SetupLiquidsProps { protocolRunHeaderRef: React.RefObject | null robotName: string runId: string + protocolAnalysis: CompletedProtocolAnalysis | ProtocolAnalysisOutput | null } -export function SetupLiquids(props: SetupLiquidsProps): JSX.Element { +export function SetupLiquids({ + protocolRunHeaderRef, + robotName, + runId, + protocolAnalysis, +}: SetupLiquidsProps): JSX.Element { const { t } = useTranslation('protocol_setup') const [selectedValue, toggleGroup] = useToggleGroup( t('list_view'), @@ -35,15 +46,15 @@ export function SetupLiquids(props: SetupLiquidsProps): JSX.Element { > {toggleGroup} {selectedValue === t('list_view') ? ( - + ) : ( - + )} diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/utils.ts b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/utils.ts index 90c49865bbb..63902fef5ee 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/utils.ts +++ b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/utils.ts @@ -1,6 +1,6 @@ import { WellGroup } from '@opentrons/components' -import type { LabwareByLiquidId } from '@opentrons/api-client' +import type { LabwareByLiquidId } from '@opentrons/components/src/hardware-sim/ProtocolDeck/types' import type { Liquid } from '@opentrons/shared-data' export function getWellFillFromLabwareId( diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/LocationConflictModal.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/LocationConflictModal.tsx new file mode 100644 index 00000000000..8cf4a21175c --- /dev/null +++ b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/LocationConflictModal.tsx @@ -0,0 +1,340 @@ +import * as React from 'react' +import { Trans, useTranslation } from 'react-i18next' +import { + useDeckConfigurationQuery, + useUpdateDeckConfigurationMutation, +} from '@opentrons/react-api-client/src/deck_configuration' +import { + Flex, + DIRECTION_COLUMN, + TYPOGRAPHY, + SPACING, + PrimaryButton, + SecondaryButton, + Icon, + DIRECTION_ROW, + COLORS, + JUSTIFY_END, + ALIGN_CENTER, + Box, + JUSTIFY_SPACE_BETWEEN, + BORDERS, +} from '@opentrons/components' +import { + getCutoutDisplayName, + getFixtureDisplayName, + getModuleDisplayName, + SINGLE_RIGHT_CUTOUTS, + SINGLE_LEFT_SLOT_FIXTURE, + SINGLE_RIGHT_SLOT_FIXTURE, + THERMOCYCLER_MODULE_V1, + THERMOCYCLER_MODULE_V2, +} from '@opentrons/shared-data' +import { Portal } from '../../../../App/portal' +import { LegacyModal } from '../../../../molecules/LegacyModal' +import { StyledText } from '../../../../atoms/text' +import { Modal } from '../../../../molecules/Modal' +import { SmallButton } from '../../../../atoms/buttons/SmallButton' + +import type { + CutoutConfig, + CutoutId, + CutoutFixtureId, + ModuleModel, +} from '@opentrons/shared-data' + +interface LocationConflictModalProps { + onCloseClick: () => void + cutoutId: CutoutId + missingLabwareDisplayName?: string | null + requiredFixtureId?: CutoutFixtureId + requiredModule?: ModuleModel + isOnDevice?: boolean +} + +export const LocationConflictModal = ( + props: LocationConflictModalProps +): JSX.Element => { + const { + onCloseClick, + cutoutId, + missingLabwareDisplayName, + requiredFixtureId, + requiredModule, + isOnDevice = false, + } = props + const { t, i18n } = useTranslation(['protocol_setup', 'shared']) + const deckConfig = useDeckConfigurationQuery().data ?? [] + const { updateDeckConfiguration } = useUpdateDeckConfigurationMutation() + const deckConfigurationAtLocationFixtureId = deckConfig.find( + (deckFixture: CutoutConfig) => deckFixture.cutoutId === cutoutId + )?.cutoutFixtureId + + const isThermocycler = + requiredModule === THERMOCYCLER_MODULE_V1 || + requiredModule === THERMOCYCLER_MODULE_V2 + + const currentFixtureDisplayName = + deckConfigurationAtLocationFixtureId != null + ? getFixtureDisplayName(deckConfigurationAtLocationFixtureId) + : '' + + // get fixture display name at A1 for themocycler if B1 is slot + const deckConfigurationAtA1 = deckConfig.find( + (deckFixture: CutoutConfig) => deckFixture.cutoutId === 'cutoutA1' + )?.cutoutFixtureId + + const currentThermocyclerFixtureDisplayName = + currentFixtureDisplayName === 'Slot' && deckConfigurationAtA1 != null + ? getFixtureDisplayName(deckConfigurationAtA1) + : currentFixtureDisplayName + + const handleUpdateDeck = (): void => { + if (requiredFixtureId != null) { + const newRequiredFixtureDeckConfig = deckConfig.map(fixture => + fixture.cutoutId === cutoutId + ? { ...fixture, cutoutFixtureId: requiredFixtureId } + : fixture + ) + + updateDeckConfiguration(newRequiredFixtureDeckConfig) + } else { + const isRightCutout = SINGLE_RIGHT_CUTOUTS.includes(cutoutId) + const singleSlotFixture = isRightCutout + ? SINGLE_RIGHT_SLOT_FIXTURE + : SINGLE_LEFT_SLOT_FIXTURE + + const newSingleSlotDeckConfig = deckConfig.map(fixture => + fixture.cutoutId === cutoutId + ? { ...fixture, cutoutFixtureId: singleSlotFixture } + : fixture + ) + + // add A1 and B1 single slot config for thermocycler + const newThermocyclerDeckConfig = isThermocycler + ? newSingleSlotDeckConfig.map(fixture => + fixture.cutoutId === 'cutoutA1' || fixture.cutoutId === 'cutoutB1' + ? { ...fixture, cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE } + : fixture + ) + : newSingleSlotDeckConfig + + updateDeckConfiguration(newThermocyclerDeckConfig) + } + onCloseClick() + } + + let protocolSpecifiesDisplayName = '' + if (missingLabwareDisplayName != null) { + protocolSpecifiesDisplayName = missingLabwareDisplayName + } else if (requiredFixtureId != null) { + protocolSpecifiesDisplayName = getFixtureDisplayName(requiredFixtureId) + } else if (requiredModule != null) { + protocolSpecifiesDisplayName = getModuleDisplayName(requiredModule) + } + + return ( + + {isOnDevice ? ( + + + , + strong: , + }} + /> + + + {t('slot_location', { + slotName: isThermocycler + ? 'A1 + B1' + : getCutoutDisplayName(cutoutId), + })} + + + + + {t('protocol_specifies')} + + + + {protocolSpecifiesDisplayName} + + + + + {t('currently_configured')} + + + + {currentFixtureDisplayName} + + + + + + + + + + + ) : ( + + + + {t('deck_conflict')} + +
+ } + onClose={onCloseClick} + width="27.75rem" + > + + , + strong: , + }} + /> + + + {t('slot_location', { + slotName: isThermocycler + ? 'A1 + B1' + : getCutoutDisplayName(cutoutId), + })} + + + + + + {t('protocol_specifies')} + + + + {protocolSpecifiesDisplayName} + + + + + + {t('currently_configured')} + + + + {isThermocycler + ? currentThermocyclerFixtureDisplayName + : currentFixtureDisplayName} + + + + + + + + {i18n.format(t('shared:cancel'), 'capitalize')} + + + {t('update_deck')} + + + + + )} + + ) +} diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModules/MultipleModulesModal.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/MultipleModulesModal.tsx similarity index 100% rename from app/src/organisms/Devices/ProtocolRun/SetupModules/MultipleModulesModal.tsx rename to app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/MultipleModulesModal.tsx diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/NotConfiguredModal.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/NotConfiguredModal.tsx new file mode 100644 index 00000000000..16c7d9e1df9 --- /dev/null +++ b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/NotConfiguredModal.tsx @@ -0,0 +1,81 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { + useDeckConfigurationQuery, + useUpdateDeckConfigurationMutation, +} from '@opentrons/react-api-client/src/deck_configuration' +import { + Flex, + DIRECTION_COLUMN, + TYPOGRAPHY, + SPACING, + JUSTIFY_SPACE_BETWEEN, + COLORS, + BORDERS, + ALIGN_CENTER, +} from '@opentrons/components' +import { getFixtureDisplayName } from '@opentrons/shared-data' +import { TertiaryButton } from '../../../../atoms/buttons/TertiaryButton' +import { Portal } from '../../../../App/portal' +import { LegacyModal } from '../../../../molecules/LegacyModal' +import { StyledText } from '../../../../atoms/text' + +import type { CutoutFixtureId, CutoutId } from '@opentrons/shared-data' + +interface NotConfiguredModalProps { + onCloseClick: () => void + requiredFixtureId: CutoutFixtureId + cutoutId: CutoutId +} + +export const NotConfiguredModal = ( + props: NotConfiguredModalProps +): JSX.Element => { + const { onCloseClick, cutoutId, requiredFixtureId } = props + const { t, i18n } = useTranslation(['protocol_setup', 'shared']) + const { updateDeckConfiguration } = useUpdateDeckConfigurationMutation() + const deckConfig = useDeckConfigurationQuery()?.data ?? [] + + const handleUpdateDeck = (): void => { + const newDeckConfig = deckConfig.map(fixture => + fixture.cutoutId === cutoutId + ? { ...fixture, cutoutFixtureId: requiredFixtureId } + : fixture + ) + + updateDeckConfiguration(newDeckConfig) + onCloseClick() + } + + return ( + + + + {t('add_fixture_to_deck')} + + + + {getFixtureDisplayName(requiredFixtureId)} + + + {i18n.format(t('shared:add'), 'capitalize')} + + + + + + + ) +} diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/SetupFixtureList.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/SetupFixtureList.tsx new file mode 100644 index 00000000000..adf3a9575b1 --- /dev/null +++ b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/SetupFixtureList.tsx @@ -0,0 +1,248 @@ +import * as React from 'react' +import { css } from 'styled-components' +import { useTranslation } from 'react-i18next' +import { + BORDERS, + Box, + Btn, + COLORS, + DIRECTION_COLUMN, + DIRECTION_ROW, + Flex, + JUSTIFY_CENTER, + JUSTIFY_SPACE_BETWEEN, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' +import { + SINGLE_SLOT_FIXTURES, + getCutoutDisplayName, + getFixtureDisplayName, +} from '@opentrons/shared-data' +import { StyledText } from '../../../../atoms/text' +import { StatusLabel } from '../../../../atoms/StatusLabel' +import { TertiaryButton } from '../../../../atoms/buttons/TertiaryButton' +import { LocationConflictModal } from './LocationConflictModal' +import { NotConfiguredModal } from './NotConfiguredModal' +import { getFixtureImage } from './utils' +import { DeckFixtureSetupInstructionsModal } from '../../../DeviceDetailsDeckConfiguration/DeckFixtureSetupInstructionsModal' + +import type { CutoutConfigAndCompatibility } from '../../../../resources/deck_configuration/hooks' + +interface SetupFixtureListProps { + deckConfigCompatibility: CutoutConfigAndCompatibility[] +} + +export const SetupFixtureList = (props: SetupFixtureListProps): JSX.Element => { + const { deckConfigCompatibility } = props + const { t, i18n } = useTranslation('protocol_setup') + return ( + <> + + + {i18n.format(t('fixture_name'), 'capitalize')} + + + {t('location')} + + + {t('status')} + + + + {deckConfigCompatibility.map(cutoutConfigAndCompatibility => { + return ( + + ) + })} + + + ) +} + +interface FixtureListItemProps extends CutoutConfigAndCompatibility {} + +export function FixtureListItem({ + cutoutId, + cutoutFixtureId, + compatibleCutoutFixtureIds, + missingLabwareDisplayName, +}: FixtureListItemProps): JSX.Element { + const { t } = useTranslation('protocol_setup') + + const isCurrentFixtureCompatible = + cutoutFixtureId != null && + compatibleCutoutFixtureIds.includes(cutoutFixtureId) + const isRequiredSingleSlotMissing = missingLabwareDisplayName != null + const isConflictingFixtureConfigured = + cutoutFixtureId != null && !SINGLE_SLOT_FIXTURES.includes(cutoutFixtureId) + let statusLabel + if (!isCurrentFixtureCompatible) { + statusLabel = ( + + ) + } else { + statusLabel = ( + + ) + } + + const [ + showLocationConflictModal, + setShowLocationConflictModal, + ] = React.useState(false) + const [ + showNotConfiguredModal, + setShowNotConfiguredModal, + ] = React.useState(false) + + const [ + showSetupInstructionsModal, + setShowSetupInstructionsModal, + ] = React.useState(false) + + return ( + <> + {showNotConfiguredModal ? ( + setShowNotConfiguredModal(false)} + cutoutId={cutoutId} + requiredFixtureId={compatibleCutoutFixtureIds[0]} + /> + ) : null} + {showLocationConflictModal ? ( + setShowLocationConflictModal(false)} + cutoutId={cutoutId} + missingLabwareDisplayName={missingLabwareDisplayName} + requiredFixtureId={compatibleCutoutFixtureIds[0]} + /> + ) : null} + {showSetupInstructionsModal ? ( + + ) : null} + + + + {cutoutFixtureId != null ? ( + + ) : null} + + + {isCurrentFixtureCompatible || isRequiredSingleSlotMissing + ? getFixtureDisplayName(cutoutFixtureId) + : getFixtureDisplayName(compatibleCutoutFixtureIds?.[0])} + + setShowSetupInstructionsModal(true)} + > + + {t('view_setup_instructions')} + + + + + + {getCutoutDisplayName(cutoutId)} + + + {statusLabel} + {!isCurrentFixtureCompatible ? ( + + isConflictingFixtureConfigured + ? setShowLocationConflictModal(true) + : setShowNotConfiguredModal(true) + } + > + + {t('resolve')} + + + ) : null} + + + + + ) +} diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModules/SetupModulesList.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/SetupModulesList.tsx similarity index 71% rename from app/src/organisms/Devices/ProtocolRun/SetupModules/SetupModulesList.tsx rename to app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/SetupModulesList.tsx index 79b77e8aba8..d08531f8b5f 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupModules/SetupModulesList.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/SetupModulesList.tsx @@ -2,6 +2,7 @@ import * as React from 'react' import map from 'lodash/map' import { css } from 'styled-components' import { useTranslation } from 'react-i18next' + import { BORDERS, Box, @@ -19,6 +20,9 @@ import { TOOLTIP_LEFT, } from '@opentrons/components' import { + FLEX_ROBOT_TYPE, + getCutoutIdForSlotName, + getDeckDefFromRobotType, getModuleType, HEATERSHAKER_MODULE_TYPE, HEATERSHAKER_MODULE_V1, @@ -26,28 +30,35 @@ import { TC_MODULE_LOCATION_OT2, TC_MODULE_LOCATION_OT3, } from '@opentrons/shared-data' + import { Banner } from '../../../../atoms/Banner' -import { StyledText } from '../../../../atoms/text' -import { useChainLiveCommands } from '../../../../resources/runs/hooks' -import { StatusLabel } from '../../../../atoms/StatusLabel' import { TertiaryButton } from '../../../../atoms/buttons' +import { StatusLabel } from '../../../../atoms/StatusLabel' +import { StyledText } from '../../../../atoms/text' import { Tooltip } from '../../../../atoms/Tooltip' +import { useChainLiveCommands } from '../../../../resources/runs/hooks' +import { ModuleSetupModal } from '../../../ModuleCard/ModuleSetupModal' +import { ModuleWizardFlows } from '../../../ModuleWizardFlows' import { getModulePrepCommands } from '../../getModulePrepCommands' import { getModuleTooHot } from '../../getModuleTooHot' -import { UnMatchedModuleWarning } from './UnMatchedModuleWarning' -import { MultipleModulesModal } from './MultipleModulesModal' import { ModuleRenderInfoForProtocol, - useIsOT3, + useIsFlex, useModuleRenderInfoForProtocolById, + useRobot, useUnmatchedModulesForProtocol, useRunCalibrationStatus, } from '../../hooks' -import { ModuleSetupModal } from '../../../ModuleCard/ModuleSetupModal' -import { ModuleWizardFlows } from '../../../ModuleWizardFlows' +import { LocationConflictModal } from './LocationConflictModal' +import { MultipleModulesModal } from './MultipleModulesModal' +import { UnMatchedModuleWarning } from './UnMatchedModuleWarning' import { getModuleImage } from './utils' -import type { ModuleModel } from '@opentrons/shared-data' +import type { + CutoutConfig, + DeckDefinition, + ModuleModel, +} from '@opentrons/shared-data' import type { AttachedModule } from '../../../../redux/modules/types' import type { ProtocolCalibrationStatus } from '../../hooks' @@ -60,7 +71,6 @@ export const SetupModulesList = (props: SetupModulesListProps): JSX.Element => { const { robotName, runId } = props const { t } = useTranslation('protocol_setup') const moduleRenderInfoForProtocolById = useModuleRenderInfoForProtocolById( - robotName, runId ) const { @@ -68,7 +78,9 @@ export const SetupModulesList = (props: SetupModulesListProps): JSX.Element => { remainingAttachedModules, } = useUnmatchedModulesForProtocol(robotName, runId) - const isOt3 = useIsOT3(robotName) + const isFlex = useIsFlex(robotName) + const { robotModel } = useRobot(robotName) ?? {} + const deckDef = getDeckDefFromRobotType(robotModel ?? FLEX_ROBOT_TYPE) const calibrationStatus = useRunCalibrationStatus(robotName, runId) @@ -160,7 +172,13 @@ export const SetupModulesList = (props: SetupModulesListProps): JSX.Element => { > {map( moduleRenderInfoForProtocolById, - ({ moduleDef, attachedModuleMatch, slotName, moduleId }) => { + ({ + moduleDef, + attachedModuleMatch, + slotName, + moduleId, + conflictedFixture, + }) => { return ( { ? moduleRenderInfoForProtocolById[moduleId] : null } - isOt3={isOt3} + isFlex={isFlex} calibrationStatus={calibrationStatus} + conflictedFixture={conflictedFixture} + deckDef={deckDef} /> ) } @@ -193,8 +213,10 @@ interface ModulesListItemProps { slotName: string attachedModuleMatch: AttachedModule | null heaterShakerModuleFromProtocol: ModuleRenderInfoForProtocol | null - isOt3: boolean + isFlex: boolean calibrationStatus: ProtocolCalibrationStatus + deckDef: DeckDefinition + conflictedFixture: CutoutConfig | null } export function ModulesListItem({ @@ -203,8 +225,10 @@ export function ModulesListItem({ slotName, attachedModuleMatch, heaterShakerModuleFromProtocol, - isOt3, + isFlex, calibrationStatus, + conflictedFixture, + deckDef, }: ModulesListItemProps): JSX.Element { const { t } = useTranslation(['protocol_setup', 'module_wizard_flows']) const moduleConnectionStatus = @@ -215,6 +239,11 @@ export function ModulesListItem({ showModuleSetupModal, setShowModuleSetupModal, ] = React.useState(false) + const [ + showLocationConflictModal, + setShowLocationConflictModal, + ] = React.useState(false) + const [showModuleWizard, setShowModuleWizard] = React.useState(false) const { chainLiveCommands, isCommandMutationLoading } = useChainLiveCommands() const [ @@ -244,10 +273,10 @@ export function ModulesListItem({ - - {t('view_module_setup_instructions')} + + {t('view_setup_instructions')}
) } else if (moduleModel === MAGNETIC_BLOCK_V1) { subText = ( - + {t('no_usb_connection_required')} ) @@ -292,43 +313,59 @@ export function ModulesListItem({ } let renderModuleStatus: JSX.Element = ( - <> - - {t('calibrate_now')} - - {(!calibrationStatus?.complete && calibrationStatus?.reason != null) || - isModuleTooHot ? ( - {calibrateDisabledReason} - ) : null} - + ) - if (attachedModuleMatch == null) { + if ( + isFlex && + attachedModuleMatch != null && + attachedModuleMatch.moduleOffset?.last_modified == null + ) { renderModuleStatus = ( - + <> + + {t('calibrate_now')} + + {(!calibrationStatus?.complete && calibrationStatus?.reason != null) || + isModuleTooHot ? ( + + {calibrateDisabledReason} + + ) : null} + ) - } else if (attachedModuleMatch.moduleOffset?.last_modified != null) { + } else if (attachedModuleMatch == null) { renderModuleStatus = ( ) } + // convert slot name to cutout id + const cutoutIdForSlotName = getCutoutIdForSlotName(slotName, deckDef) + return ( <> + {showLocationConflictModal && cutoutIdForSlotName != null ? ( + setShowLocationConflictModal(false)} + cutoutId={cutoutIdForSlotName} + requiredModule={moduleModel} + /> + ) : null} {showModuleWizard && attachedModuleMatch != null ? (
- {t('slot_location', { - slotName: - getModuleType(moduleModel) === 'thermocyclerModuleType' - ? isOt3 - ? TC_MODULE_LOCATION_OT3 - : TC_MODULE_LOCATION_OT2 - : slotName, - })} + {getModuleType(moduleModel) === 'thermocyclerModuleType' + ? isFlex + ? TC_MODULE_LOCATION_OT3 + : TC_MODULE_LOCATION_OT2 + : slotName} - - {moduleModel === MAGNETIC_BLOCK_V1 ? ( - {t('n_a')} + + {conflictedFixture != null && isFlex ? ( + + + setShowLocationConflictModal(true)} + > + + {t('resolve')} + + + + ) : moduleModel === MAGNETIC_BLOCK_V1 ? ( + ) : ( renderModuleStatus )} diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/SetupModulesMap.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/SetupModulesMap.tsx new file mode 100644 index 00000000000..a5c6ab1ecbd --- /dev/null +++ b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/SetupModulesMap.tsx @@ -0,0 +1,90 @@ +import * as React from 'react' + +import { + BaseDeck, + Box, + Flex, + DIRECTION_COLUMN, + SPACING, +} from '@opentrons/components' +import { + FLEX_ROBOT_TYPE, + getDeckDefFromRobotType, + getSimplestDeckConfigForProtocol, +} from '@opentrons/shared-data' + +import { useMostRecentCompletedAnalysis } from '../../../LabwarePositionCheck/useMostRecentCompletedAnalysis' +import { getAttachedProtocolModuleMatches } from '../../../ProtocolSetupModulesAndDeck/utils' +import { ModuleInfo } from '../../ModuleInfo' +import { useAttachedModules, useStoredProtocolAnalysis } from '../../hooks' +import { getProtocolModulesInfo } from '../utils/getProtocolModulesInfo' +import { getStandardDeckViewLayerBlockList } from '../utils/getStandardDeckViewLayerBlockList' + +const ATTACHED_MODULE_POLL_MS = 5000 + +interface SetupModulesMapProps { + runId: string +} + +export const SetupModulesMap = ({ + runId, +}: SetupModulesMapProps): JSX.Element | null => { + // similar data pattern to ODD ProtocolSetupModules, with addition of stored analysis + const robotProtocolAnalysis = useMostRecentCompletedAnalysis(runId) + const storedProtocolAnalysis = useStoredProtocolAnalysis(runId) + const protocolAnalysis = robotProtocolAnalysis ?? storedProtocolAnalysis + + const attachedModules = + useAttachedModules({ + refetchInterval: ATTACHED_MODULE_POLL_MS, + }) ?? [] + + // early return null if no protocol analysis + if (protocolAnalysis == null) return null + + const robotType = protocolAnalysis.robotType ?? FLEX_ROBOT_TYPE + const deckDef = getDeckDefFromRobotType(robotType) + const protocolModulesInfo = getProtocolModulesInfo(protocolAnalysis, deckDef) + + const attachedProtocolModuleMatches = getAttachedProtocolModuleMatches( + attachedModules, + protocolModulesInfo + ) + + const modulesOnDeck = attachedProtocolModuleMatches.map(module => ({ + moduleModel: module.moduleDef.model, + moduleLocation: { slotName: module.slotName }, + moduleChildren: ( + + ), + })) + + const deckConfig = getSimplestDeckConfigForProtocol(protocolAnalysis) + + return ( + + + ({ + cutoutId, + cutoutFixtureId, + }))} + deckLayerBlocklist={getStandardDeckViewLayerBlockList(robotType)} + robotType={robotType} + labwareOnDeck={[]} + modulesOnDeck={modulesOnDeck} + /> + + + ) +} diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModules/UnMatchedModuleWarning.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/UnMatchedModuleWarning.tsx similarity index 100% rename from app/src/organisms/Devices/ProtocolRun/SetupModules/UnMatchedModuleWarning.tsx rename to app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/UnMatchedModuleWarning.tsx diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/LocationConflictModal.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/LocationConflictModal.test.tsx new file mode 100644 index 00000000000..f24340ada44 --- /dev/null +++ b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/LocationConflictModal.test.tsx @@ -0,0 +1,130 @@ +import * as React from 'react' +import { UseQueryResult } from 'react-query' +import { screen, fireEvent } from '@testing-library/react' +import { renderWithProviders } from '@opentrons/components' +import { + SINGLE_RIGHT_SLOT_FIXTURE, + STAGING_AREA_RIGHT_SLOT_FIXTURE, + TRASH_BIN_ADAPTER_FIXTURE, +} from '@opentrons/shared-data' +import { + useDeckConfigurationQuery, + useUpdateDeckConfigurationMutation, +} from '@opentrons/react-api-client/src/deck_configuration' +import { i18n } from '../../../../../i18n' +import { LocationConflictModal } from '../LocationConflictModal' + +import type { DeckConfiguration } from '@opentrons/shared-data' + +jest.mock('@opentrons/react-api-client/src/deck_configuration') + +const mockUseDeckConfigurationQuery = useDeckConfigurationQuery as jest.MockedFunction< + typeof useDeckConfigurationQuery +> +const mockUseUpdateDeckConfigurationMutation = useUpdateDeckConfigurationMutation as jest.MockedFunction< + typeof useUpdateDeckConfigurationMutation +> + +const mockFixture = { + cutoutId: 'cutoutB3', + cutoutFixtureId: STAGING_AREA_RIGHT_SLOT_FIXTURE, +} + +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + })[0] +} + +describe('LocationConflictModal', () => { + let props: React.ComponentProps + const mockUpdate = jest.fn() + beforeEach(() => { + props = { + onCloseClick: jest.fn(), + cutoutId: 'cutoutB3', + requiredFixtureId: TRASH_BIN_ADAPTER_FIXTURE, + } + mockUseDeckConfigurationQuery.mockReturnValue({ + data: [mockFixture], + } as UseQueryResult) + mockUseUpdateDeckConfigurationMutation.mockReturnValue({ + updateDeckConfiguration: mockUpdate, + } as any) + }) + afterEach(() => { + jest.resetAllMocks() + }) + it('should render the modal information for a fixture conflict', () => { + render(props) + screen.getByText('Deck location conflict') + screen.getByText('Slot B3') + screen.getByText('Protocol specifies') + screen.getByText('Currently configured') + screen.getAllByText('Staging area slot') + screen.getByText('Trash bin') + fireEvent.click(screen.getByRole('button', { name: 'Cancel' })) + expect(props.onCloseClick).toHaveBeenCalled() + fireEvent.click(screen.getByRole('button', { name: 'Update deck' })) + expect(mockUpdate).toHaveBeenCalled() + }) + it('should render the modal information for a module fixture conflict', () => { + props = { + onCloseClick: jest.fn(), + cutoutId: 'cutoutB3', + requiredModule: 'heaterShakerModuleV1', + } + render(props) + screen.getByText('Protocol specifies') + screen.getByText('Currently configured') + screen.getByText('Heater-Shaker Module GEN1') + fireEvent.click(screen.getByRole('button', { name: 'Cancel' })) + expect(props.onCloseClick).toHaveBeenCalled() + fireEvent.click(screen.getByRole('button', { name: 'Update deck' })) + expect(mockUpdate).toHaveBeenCalled() + }) + it('should render the modal information for a single slot fixture conflict', () => { + mockUseDeckConfigurationQuery.mockReturnValue({ + data: [ + { + cutoutId: 'cutoutB1', + cutoutFixtureId: TRASH_BIN_ADAPTER_FIXTURE, + }, + ], + } as UseQueryResult) + props = { + onCloseClick: jest.fn(), + cutoutId: 'cutoutB1', + requiredFixtureId: SINGLE_RIGHT_SLOT_FIXTURE, + missingLabwareDisplayName: 'a tiprack', + } + const { getByText, getAllByText, getByRole } = render(props) + getByText('Deck location conflict') + getByText('Slot B1') + getByText('Protocol specifies') + getByText('Currently configured') + getAllByText('Trash bin') + getByText('a tiprack') + fireEvent.click(getByRole('button', { name: 'Cancel' })) + expect(props.onCloseClick).toHaveBeenCalled() + fireEvent.click(getByRole('button', { name: 'Update deck' })) + expect(mockUpdate).toHaveBeenCalled() + }) + it('should render correct info for a odd', () => { + props = { + ...props, + isOnDevice: true, + } + render(props) + screen.getByText('Deck location conflict') + screen.getByText('Slot B3') + screen.getByText('Protocol specifies') + screen.getByText('Currently configured') + screen.getAllByText('Staging area slot') + screen.getByText('Trash bin') + fireEvent.click(screen.getByText('Cancel')) + expect(props.onCloseClick).toHaveBeenCalled() + fireEvent.click(screen.getByText('Update deck')) + expect(mockUpdate).toHaveBeenCalled() + }) +}) diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/MultipleModuleModal.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/MultipleModuleModal.test.tsx similarity index 100% rename from app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/MultipleModuleModal.test.tsx rename to app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/MultipleModuleModal.test.tsx diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/NotConfiguredModal.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/NotConfiguredModal.test.tsx new file mode 100644 index 00000000000..20561f63c41 --- /dev/null +++ b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/NotConfiguredModal.test.tsx @@ -0,0 +1,56 @@ +import * as React from 'react' +import { fireEvent } from '@testing-library/react' +import { renderWithProviders } from '@opentrons/components' +import { TRASH_BIN_ADAPTER_FIXTURE } from '@opentrons/shared-data' +import { + useDeckConfigurationQuery, + useUpdateDeckConfigurationMutation, +} from '@opentrons/react-api-client/src/deck_configuration' +import { i18n } from '../../../../../i18n' +import { NotConfiguredModal } from '../NotConfiguredModal' + +import type { UseQueryResult } from 'react-query' +import type { DeckConfiguration } from '@opentrons/shared-data' + +jest.mock('@opentrons/react-api-client/src/deck_configuration') + +const mockUseUpdateDeckConfigurationMutation = useUpdateDeckConfigurationMutation as jest.MockedFunction< + typeof useUpdateDeckConfigurationMutation +> +const mockUseDeckConfigurationQuery = useDeckConfigurationQuery as jest.MockedFunction< + typeof useDeckConfigurationQuery +> + +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + })[0] +} + +describe('NotConfiguredModal', () => { + let props: React.ComponentProps + const mockUpdate = jest.fn() + beforeEach(() => { + props = { + onCloseClick: jest.fn(), + cutoutId: 'cutoutB3', + requiredFixtureId: TRASH_BIN_ADAPTER_FIXTURE, + } + mockUseUpdateDeckConfigurationMutation.mockReturnValue({ + updateDeckConfiguration: mockUpdate, + } as any) + mockUseDeckConfigurationQuery.mockReturnValue(({ + data: [], + } as unknown) as UseQueryResult) + }) + it('renders the correct text and button works as expected', () => { + const { getByText, getByRole } = render(props) + getByText('Add Trash bin to deck configuration') + getByText( + 'Add this fixture to your deck configuration. It will be referenced during protocol analysis.' + ) + getByText('Trash bin') + fireEvent.click(getByRole('button', { name: 'Add' })) + expect(mockUpdate).toHaveBeenCalled() + }) +}) diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupFixtureList.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupFixtureList.test.tsx new file mode 100644 index 00000000000..2653aff9316 --- /dev/null +++ b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupFixtureList.test.tsx @@ -0,0 +1,129 @@ +import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' +import { renderWithProviders } from '@opentrons/components' +import { + SINGLE_RIGHT_SLOT_FIXTURE, + STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, + TRASH_BIN_ADAPTER_FIXTURE, +} from '@opentrons/shared-data' +import { i18n } from '../../../../../i18n' +import { SetupFixtureList } from '../SetupFixtureList' +import { NotConfiguredModal } from '../NotConfiguredModal' +import { LocationConflictModal } from '../LocationConflictModal' +import { DeckFixtureSetupInstructionsModal } from '../../../../DeviceDetailsDeckConfiguration/DeckFixtureSetupInstructionsModal' + +import type { CutoutConfigAndCompatibility } from '../../../../../resources/deck_configuration/hooks' + +jest.mock('../../../../../resources/deck_configuration/hooks') +jest.mock('../LocationConflictModal') +jest.mock('../NotConfiguredModal') +jest.mock( + '../../../../DeviceDetailsDeckConfiguration/DeckFixtureSetupInstructionsModal' +) + +const mockLocationConflictModal = LocationConflictModal as jest.MockedFunction< + typeof LocationConflictModal +> +const mockNotConfiguredModal = NotConfiguredModal as jest.MockedFunction< + typeof NotConfiguredModal +> +const mockDeckFixtureSetupInstructionsModal = DeckFixtureSetupInstructionsModal as jest.MockedFunction< + typeof DeckFixtureSetupInstructionsModal +> + +const mockDeckConfigCompatibility: CutoutConfigAndCompatibility[] = [ + { + cutoutId: 'cutoutD3', + cutoutFixtureId: STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, + requiredAddressableAreas: ['D4'], + compatibleCutoutFixtureIds: [ + STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, + ], + missingLabwareDisplayName: null, + }, +] + +const mockNotConfiguredDeckConfigCompatibility: CutoutConfigAndCompatibility[] = [ + { + cutoutId: 'cutoutD3', + cutoutFixtureId: SINGLE_RIGHT_SLOT_FIXTURE, + requiredAddressableAreas: ['D4'], + compatibleCutoutFixtureIds: [ + STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, + ], + missingLabwareDisplayName: null, + }, +] + +const mockConflictDeckConfigCompatibility: CutoutConfigAndCompatibility[] = [ + { + cutoutId: 'cutoutD3', + cutoutFixtureId: TRASH_BIN_ADAPTER_FIXTURE, + requiredAddressableAreas: ['D4'], + compatibleCutoutFixtureIds: [ + STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, + ], + missingLabwareDisplayName: null, + }, +] + +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + }) +} + +describe('SetupFixtureList', () => { + let props: React.ComponentProps + beforeEach(() => { + props = { + deckConfigCompatibility: mockDeckConfigCompatibility, + } + mockLocationConflictModal.mockReturnValue( +
mock location conflict modal
+ ) + mockNotConfiguredModal.mockReturnValue(
mock not configured modal
) + mockDeckFixtureSetupInstructionsModal.mockReturnValue( +
mock DeckFixtureSetupInstructionsModal
+ ) + }) + + it('should render the headers and a fixture with configured status', () => { + render(props) + screen.getByText('Fixture') + screen.getByText('Location') + screen.getByText('Status') + screen.getByText('Waste chute with staging area slot') + screen.getByRole('button', { name: 'View setup instructions' }) + screen.getByText('D3') + screen.getByText('Configured') + }) + + it('should render the mock setup instructions modal, when clicking view setup instructions', () => { + render(props) + fireEvent.click( + screen.getByRole('button', { name: 'View setup instructions' }) + ) + screen.getByText('mock DeckFixtureSetupInstructionsModal') + }) + + it('should render the headers and a fixture with conflicted status', () => { + props = { + deckConfigCompatibility: mockConflictDeckConfigCompatibility, + } + render(props) + screen.getByText('Location conflict') + fireEvent.click(screen.getByRole('button', { name: 'Resolve' })) + screen.getByText('mock location conflict modal') + }) + + it('should render the headers and a fixture with not configured status and button', () => { + props = { + deckConfigCompatibility: mockNotConfiguredDeckConfigCompatibility, + } + render(props) + screen.getByText('Not configured') + fireEvent.click(screen.getByRole('button', { name: 'Resolve' })) + screen.getByText('mock not configured modal') + }) +}) diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesAndDeck.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesAndDeck.test.tsx new file mode 100644 index 00000000000..96b7a907a22 --- /dev/null +++ b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesAndDeck.test.tsx @@ -0,0 +1,179 @@ +import * as React from 'react' +import { fireEvent } from '@testing-library/react' +import { when } from 'jest-when' +import { renderWithProviders } from '@opentrons/components' +import { i18n } from '../../../../../i18n' +import { mockTemperatureModule } from '../../../../../redux/modules/__fixtures__' +import { + getIsFixtureMismatch, + getRequiredDeckConfig, +} from '../../../../../resources/deck_configuration/utils' +import { + useIsFlex, + useRunHasStarted, + useUnmatchedModulesForProtocol, + useModuleCalibrationStatus, +} from '../../../hooks' +import { SetupModuleAndDeck } from '../index' +import { SetupModulesList } from '../SetupModulesList' +import { SetupModulesMap } from '../SetupModulesMap' +import { SetupFixtureList } from '../SetupFixtureList' + +jest.mock('../../../hooks') +jest.mock('../SetupModulesList') +jest.mock('../SetupModulesMap') +jest.mock('../SetupFixtureList') +jest.mock('../../../../../redux/config') +jest.mock('../../../../../resources/deck_configuration/utils') + +const mockUseIsFlex = useIsFlex as jest.MockedFunction +const mockUseRunHasStarted = useRunHasStarted as jest.MockedFunction< + typeof useRunHasStarted +> +const mockUseUnmatchedModulesForProtocol = useUnmatchedModulesForProtocol as jest.MockedFunction< + typeof useUnmatchedModulesForProtocol +> +const mockUseModuleCalibrationStatus = useModuleCalibrationStatus as jest.MockedFunction< + typeof useModuleCalibrationStatus +> +const mockSetupModulesList = SetupModulesList as jest.MockedFunction< + typeof SetupModulesList +> +const mockSetupFixtureList = SetupFixtureList as jest.MockedFunction< + typeof SetupFixtureList +> +const mockSetupModulesMap = SetupModulesMap as jest.MockedFunction< + typeof SetupModulesMap +> +const mockGetRequiredDeckConfig = getRequiredDeckConfig as jest.MockedFunction< + typeof getRequiredDeckConfig +> +const mockGetIsFixtureMismatch = getIsFixtureMismatch as jest.MockedFunction< + typeof getIsFixtureMismatch +> +const MOCK_ROBOT_NAME = 'otie' +const MOCK_RUN_ID = '1' + +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + })[0] +} + +describe('SetupModuleAndDeck', () => { + let props: React.ComponentProps + beforeEach(() => { + props = { + robotName: MOCK_ROBOT_NAME, + runId: MOCK_RUN_ID, + expandLabwarePositionCheckStep: () => jest.fn(), + hasModules: true, + protocolAnalysis: null, + } + mockSetupFixtureList.mockReturnValue(
Mock setup fixture list
) + mockSetupModulesList.mockReturnValue(
Mock setup modules list
) + mockSetupModulesMap.mockReturnValue(
Mock setup modules map
) + when(mockUseRunHasStarted).calledWith(MOCK_RUN_ID).mockReturnValue(false) + when(mockUseUnmatchedModulesForProtocol) + .calledWith(MOCK_ROBOT_NAME, MOCK_RUN_ID) + .mockReturnValue({ + missingModuleIds: [], + remainingAttachedModules: [], + }) + when(mockUseModuleCalibrationStatus) + .calledWith(MOCK_ROBOT_NAME, MOCK_RUN_ID) + .mockReturnValue({ complete: true }) + when(mockUseIsFlex).calledWith(MOCK_ROBOT_NAME).mockReturnValue(false) + when(mockGetRequiredDeckConfig).mockReturnValue([]) + when(mockGetIsFixtureMismatch).mockReturnValue(false) + }) + + it('renders the list and map view buttons', () => { + const { getByRole } = render(props) + getByRole('button', { name: 'List View' }) + getByRole('button', { name: 'Map View' }) + }) + + it('should render Proceed to labware setup CTA that is enabled', () => { + const { getByRole } = render(props) + const button = getByRole('button', { + name: 'Proceed to labware position check', + }) + expect(button).toBeEnabled() + }) + + it('should render a disabled Proceed to labware setup CTA if the protocol requests modules and they are not all attached to the robot', () => { + when(mockUseUnmatchedModulesForProtocol) + .calledWith(MOCK_ROBOT_NAME, MOCK_RUN_ID) + .mockReturnValue({ + missingModuleIds: ['foo'], + remainingAttachedModules: [mockTemperatureModule], + }) + const { getByRole } = render(props) + const button = getByRole('button', { + name: 'Proceed to labware position check', + }) + expect(button).toBeDisabled() + }) + + it('should render a disabled Proceed to labware setup CTA if the protocol requests modules they are not all calibrated', () => { + when(mockUseModuleCalibrationStatus) + .calledWith(MOCK_ROBOT_NAME, MOCK_RUN_ID) + .mockReturnValue({ complete: false }) + const { getByRole } = render(props) + const button = getByRole('button', { + name: 'Proceed to labware position check', + }) + expect(button).toBeDisabled() + }) + + it('should render the SetupModulesList component when clicking List View', () => { + const { getByRole, getByText } = render(props) + const button = getByRole('button', { name: 'List View' }) + fireEvent.click(button) + getByText('Mock setup modules list') + }) + + it('should render the SetupModulesList and SetupFixtureList component when clicking List View for Flex', () => { + when(mockUseIsFlex).calledWith(MOCK_ROBOT_NAME).mockReturnValue(true) + when(mockGetRequiredDeckConfig).mockReturnValue([ + { + cutoutId: 'cutoutA1', + cutoutFixtureId: 'trashBinAdapter', + requiredAddressableAreas: ['movableTrashA1'], + compatibleCutoutFixtureIds: ['trashBinAdapter'], + missingLabwareDisplayName: null, + }, + ]) + const { getByRole, getByText } = render(props) + const button = getByRole('button', { name: 'List View' }) + fireEvent.click(button) + getByText('Mock setup modules list') + getByText('Mock setup fixture list') + }) + + it('should not render the SetupFixtureList component when there are no required fixtures', () => { + when(mockUseIsFlex).calledWith(MOCK_ROBOT_NAME).mockReturnValue(true) + const { getByRole, getByText, queryByText } = render(props) + const button = getByRole('button', { name: 'List View' }) + fireEvent.click(button) + getByText('Mock setup modules list') + expect(queryByText('Mock setup fixture list')).toBeNull() + }) + + it('should render the SetupModulesMap component when clicking Map View', () => { + const { getByRole, getByText } = render(props) + const button = getByRole('button', { name: 'Map View' }) + fireEvent.click(button) + getByText('Mock setup modules map') + }) + + it('should render disabled button when deck config is not configured or there is a conflict', () => { + when(mockGetIsFixtureMismatch).mockReturnValue(true) + const { getByRole } = render(props) + const button = getByRole('button', { + name: 'Proceed to labware position check', + }) + expect(button).toBeDisabled() + }) +}) diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/SetupModulesList.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesList.test.tsx similarity index 83% rename from app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/SetupModulesList.test.tsx rename to app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesList.test.tsx index de99d48b823..ff457d17f7e 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/SetupModulesList.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesList.test.tsx @@ -1,7 +1,8 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' -import { fireEvent, waitFor } from '@testing-library/react' +import { fireEvent, screen, waitFor } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' +import { STAGING_AREA_RIGHT_SLOT_FIXTURE } from '@opentrons/shared-data' import { i18n } from '../../../../../i18n' import { mockMagneticModule as mockMagneticModuleFixture, @@ -13,29 +14,33 @@ import { mockThermocycler, } from '../../../../../redux/modules/__fixtures__' import { useChainLiveCommands } from '../../../../../resources/runs/hooks' -import { MultipleModulesModal } from '../MultipleModulesModal' -import { UnMatchedModuleWarning } from '../UnMatchedModuleWarning' +import { ModuleSetupModal } from '../../../../ModuleCard/ModuleSetupModal' +import { ModuleWizardFlows } from '../../../../ModuleWizardFlows' import { - useIsOT3, + useIsFlex, useModuleRenderInfoForProtocolById, useRunHasStarted, useUnmatchedModulesForProtocol, useRunCalibrationStatus, } from '../../../hooks' -import { ModuleSetupModal } from '../../../../ModuleCard/ModuleSetupModal' -import { ModuleWizardFlows } from '../../../../ModuleWizardFlows' +import { MultipleModulesModal } from '../MultipleModulesModal' +import { UnMatchedModuleWarning } from '../UnMatchedModuleWarning' import { SetupModulesList } from '../SetupModulesList' +import { LocationConflictModal } from '../LocationConflictModal' import type { ModuleModel, ModuleType } from '@opentrons/shared-data' jest.mock('@opentrons/react-api-client') jest.mock('../../../hooks') +jest.mock('../LocationConflictModal') jest.mock('../UnMatchedModuleWarning') jest.mock('../../../../ModuleCard/ModuleSetupModal') jest.mock('../../../../ModuleWizardFlows') jest.mock('../MultipleModulesModal') jest.mock('../../../../../resources/runs/hooks') -const mockUseIsOt3 = useIsOT3 as jest.MockedFunction +jest.mock('../../../../../redux/config') + +const mockUseIsFlex = useIsFlex as jest.MockedFunction const mockUseModuleRenderInfoForProtocolById = useModuleRenderInfoForProtocolById as jest.MockedFunction< typeof useModuleRenderInfoForProtocolById > @@ -63,6 +68,10 @@ const mockUseRunCalibrationStatus = useRunCalibrationStatus as jest.MockedFuncti const mockUseChainLiveCommands = useChainLiveCommands as jest.MockedFunction< typeof useChainLiveCommands > +const mockLocationConflictModal = LocationConflictModal as jest.MockedFunction< + typeof LocationConflictModal +> + const ROBOT_NAME = 'otie' const RUN_ID = '1' const MOCK_MAGNETIC_MODULE_COORDS = [10, 20, 0] @@ -135,18 +144,21 @@ describe('SetupModulesList', () => { mockUseChainLiveCommands.mockReturnValue({ chainLiveCommands: mockChainLiveCommands, } as any) + mockLocationConflictModal.mockReturnValue( +
mock location conflict modal
+ ) }) afterEach(() => resetAllWhenMocks()) it('should render the list view headers', () => { when(mockUseRunHasStarted).calledWith(RUN_ID).mockReturnValue(false) when(mockUseModuleRenderInfoForProtocolById) - .calledWith(ROBOT_NAME, RUN_ID) + .calledWith(RUN_ID) .mockReturnValue({}) - const { getByText } = render(props) - getByText('Module Name') - getByText('Location') - getByText('Status') + render(props) + screen.getByText('Module') + screen.getByText('Location') + screen.getByText('Status') }) it('should render a magnetic module that is connected', () => { @@ -168,10 +180,10 @@ describe('SetupModulesList', () => { }, } as any) - const { getByText } = render(props) - getByText('Magnetic Module') - getByText('Slot 1') - getByText('Connected') + render(props) + screen.getByText('Magnetic Module') + screen.getByText('1') + screen.getByText('Connected') }) it('should render a magnetic module that is NOT connected', () => { @@ -190,10 +202,10 @@ describe('SetupModulesList', () => { }, } as any) - const { getByText } = render(props) - getByText('Magnetic Module') - getByText('Slot 1') - getByText('Not connected') + render(props) + screen.getByText('Magnetic Module') + screen.getByText('1') + screen.getByText('Not connected') }) it('should render a thermocycler module that is connected, OT2', () => { @@ -220,12 +232,12 @@ describe('SetupModulesList', () => { }, }, } as any) - mockUseIsOt3.mockReturnValue(false) + mockUseIsFlex.mockReturnValue(false) - const { getByText } = render(props) - getByText('Thermocycler Module') - getByText('Slot 7,8,10,11') - getByText('Connected') + render(props) + screen.getByText('Thermocycler Module') + screen.getByText('7,8,10,11') + screen.getByText('Connected') }) it('should render a thermocycler module that is connected but not calibrated, OT3', async () => { @@ -249,14 +261,14 @@ describe('SetupModulesList', () => { attachedModuleMatch: mockThermocycler, }, } as any) - mockUseIsOt3.mockReturnValue(true) + mockUseIsFlex.mockReturnValue(true) - const { getByText, getByRole } = render(props) - getByText('Thermocycler Module') - getByText('Slot A1+B1') - getByRole('button', { name: 'Calibrate now' }).click() + render(props) + screen.getByText('Thermocycler Module') + screen.getByText('A1+B1') + fireEvent.click(screen.getByRole('button', { name: 'Calibrate now' })) await waitFor(() => { - getByText('mock ModuleWizardFlows') + screen.getByText('mock ModuleWizardFlows') }) }) @@ -287,10 +299,10 @@ describe('SetupModulesList', () => { attachedModuleMatch: mockThermocycler, }, } as any) - mockUseIsOt3.mockReturnValue(true) + mockUseIsFlex.mockReturnValue(true) - const { getByRole } = render(props) - expect(getByRole('button', { name: 'Calibrate now' })).toBeDisabled() + render(props) + expect(screen.getByRole('button', { name: 'Calibrate now' })).toBeDisabled() }) it('should render a thermocycler module that is connected, OT3', () => { @@ -317,12 +329,12 @@ describe('SetupModulesList', () => { }, }, } as any) - mockUseIsOt3.mockReturnValue(true) + mockUseIsFlex.mockReturnValue(true) - const { getByText } = render(props) - getByText('Thermocycler Module') - getByText('Slot A1+B1') - getByText('Connected') + render(props) + screen.getByText('Thermocycler Module') + screen.getByText('A1+B1') + screen.getByText('Connected') }) it('should render the MoaM component when Moam is attached', () => { @@ -337,7 +349,7 @@ describe('SetupModulesList', () => { const dupModPort = 10 const dupModHub = 2 when(mockUseModuleRenderInfoForProtocolById) - .calledWith(ROBOT_NAME, RUN_ID) + .calledWith(RUN_ID) .mockReturnValue({ [mockMagneticModule.moduleId]: { moduleId: mockMagneticModule.moduleId, @@ -354,6 +366,7 @@ describe('SetupModulesList', () => { model: mockMagneticModule.model, } as any, slotName: '1', + conflictedFixture: null, }, [dupModId]: { moduleId: dupModId, @@ -374,12 +387,13 @@ describe('SetupModulesList', () => { }, } as any, slotName: '3', + conflictedFixture: null, }, }) - const { getByText, getByTestId } = render(props) - const help = getByTestId('Banner_close-button') + render(props) + const help = screen.getByTestId('Banner_close-button') fireEvent.click(help) - getByText('mock Moam modal') + screen.getByText('mock Moam modal') }) it('should render the module unmatching banner', () => { when(mockUseUnmatchedModulesForProtocol) @@ -388,8 +402,8 @@ describe('SetupModulesList', () => { missingModuleIds: ['moduleId'], remainingAttachedModules: [mockHeaterShaker], }) - const { getByText } = render(props) - getByText('mock unmatched module Banner') + render(props) + screen.getByText('mock unmatched module Banner') }) it('should render the heater shaker text when hs is attached', () => { mockUseModuleRenderInfoForProtocolById.mockReturnValue({ @@ -426,12 +440,13 @@ describe('SetupModulesList', () => { attachedModuleMatch: null, }, } as any) - const { getByText } = render(props) - const moduleSetup = getByText('View module setup instructions') + render(props) + const moduleSetup = screen.getByText('View setup instructions') fireEvent.click(moduleSetup) - getByText('mockModuleSetupModal') + screen.getByText('mockModuleSetupModal') }) - it('shoulde render a magnetic block', () => { + it('should render a magnetic block with a conflicted fixture', () => { + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(true) mockUseModuleRenderInfoForProtocolById.mockReturnValue({ [mockMagneticBlock.id]: { moduleId: mockMagneticBlock.id, @@ -447,13 +462,19 @@ describe('SetupModulesList', () => { nestedLabwareDef: null, nestedLabwareId: null, protocolLoadOrder: 0, - slotName: '1', + slotName: 'B3', attachedModuleMatch: null, + conflictedFixture: { + cutoutId: 'cutoutB3', + cutoutFixtureId: STAGING_AREA_RIGHT_SLOT_FIXTURE, + }, }, } as any) - const { getByText } = render(props) - getByText('No USB connection required') - getByText('N/A') - getByText('Magnetic Block GEN1') + render(props) + screen.getByText('No USB connection required') + screen.getByText('Location conflict') + screen.getByText('Magnetic Block GEN1') + fireEvent.click(screen.getByRole('button', { name: 'Resolve' })) + screen.getByText('mock location conflict modal') }) }) diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesMap.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesMap.test.tsx new file mode 100644 index 00000000000..42f3070c775 --- /dev/null +++ b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesMap.test.tsx @@ -0,0 +1,312 @@ +import * as React from 'react' +import { when, resetAllWhenMocks } from 'jest-when' +import { StaticRouter } from 'react-router-dom' +import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' + +import { + renderWithProviders, + partialComponentPropsMatcher, + componentPropsMatcher, +} from '@opentrons/components' + +import { i18n } from '../../../../../i18n' +import { + mockThermocycler as mockThermocyclerFixture, + mockMagneticModule as mockMagneticModuleFixture, +} from '../../../../../redux/modules/__fixtures__/index' +import { useMostRecentCompletedAnalysis } from '../../../../LabwarePositionCheck/useMostRecentCompletedAnalysis' +import { getAttachedProtocolModuleMatches } from '../../../../ProtocolSetupModulesAndDeck/utils' +import { ModuleInfo } from '../../../ModuleInfo' +import { SetupModulesMap } from '../SetupModulesMap' + +import type { + CompletedProtocolAnalysis, + ModuleModel, + ModuleType, +} from '@opentrons/shared-data' + +jest.mock('@opentrons/components', () => { + const actualComponents = jest.requireActual('@opentrons/components') + return { + ...actualComponents, + RobotWorkSpace: jest.fn(() =>
mock RobotWorkSpace
), + } +}) +jest.mock('@opentrons/shared-data', () => { + const actualSharedData = jest.requireActual('@opentrons/shared-data') + return { + ...actualSharedData, + inferModuleOrientationFromXCoordinate: jest.fn(), + } +}) +jest.mock('../../../../LabwarePositionCheck/useMostRecentCompletedAnalysis') +jest.mock('../../../../ProtocolSetupModulesAndDeck/utils') +jest.mock('../../../ModuleInfo') +jest.mock('../../../hooks') + +const mockUseMostRecentCompletedAnalysis = useMostRecentCompletedAnalysis as jest.MockedFunction< + typeof useMostRecentCompletedAnalysis +> +const mockGetAttachedProtocolModuleMatches = getAttachedProtocolModuleMatches as jest.MockedFunction< + typeof getAttachedProtocolModuleMatches +> +const mockModuleInfo = ModuleInfo as jest.MockedFunction + +const render = (props: React.ComponentProps) => { + return renderWithProviders( + + + , + { + i18nInstance: i18n, + } + )[0] +} + +const MOCK_MAGNETIC_MODULE_COORDS = [10, 20, 0] +const MOCK_SECOND_MAGNETIC_MODULE_COORDS = [100, 200, 0] +const MOCK_TC_COORDS = [20, 30, 0] +const MOCK_RUN_ID = '1' + +const mockMagneticModule = { + moduleId: 'someMagneticModule', + model: 'magneticModuleV2' as ModuleModel, + type: 'magneticModuleType' as ModuleType, + labwareOffset: { x: 5, y: 5, z: 5 }, + cornerOffsetFromSlot: { x: 1, y: 1, z: 1 }, + dimensions: { + xDimension: 100, + yDimension: 100, + footprintXDimension: 50, + footprintYDimension: 50, + labwareInterfaceXDimension: 80, + labwareInterfaceYDimension: 120, + }, + twoDimensionalRendering: { children: [] }, +} + +const mockTCModule = { + moduleId: 'TCModuleId', + model: 'thermocyclerModuleV1' as ModuleModel, + type: 'thermocyclerModuleType' as ModuleType, + labwareOffset: { x: 3, y: 3, z: 3 }, + cornerOffsetFromSlot: { x: 1, y: 1, z: 1 }, + dimensions: { + xDimension: 100, + yDimension: 100, + footprintXDimension: 50, + footprintYDimension: 50, + labwareInterfaceXDimension: 80, + labwareInterfaceYDimension: 120, + }, + twoDimensionalRendering: { children: [] }, +} + +describe('SetupModulesMap', () => { + let props: React.ComponentProps + beforeEach(() => { + props = { + runId: MOCK_RUN_ID, + } + when(mockUseMostRecentCompletedAnalysis) + .calledWith(MOCK_RUN_ID) + .mockReturnValue(({ + commands: [], + labware: [], + robotType: OT2_ROBOT_TYPE, + } as unknown) as CompletedProtocolAnalysis) + when(mockGetAttachedProtocolModuleMatches).mockReturnValue([]) + }) + + afterEach(() => { + resetAllWhenMocks() + }) + + it('should render a deck WITHOUT modules if none passed (component will never be rendered in this circumstance)', () => { + render(props) + expect(mockModuleInfo).not.toHaveBeenCalled() + }) + it('should render a deck WITH MoaM', () => { + when(mockGetAttachedProtocolModuleMatches).mockReturnValue([ + { + moduleId: mockMagneticModule.moduleId, + x: MOCK_MAGNETIC_MODULE_COORDS[0], + y: MOCK_MAGNETIC_MODULE_COORDS[1], + z: MOCK_MAGNETIC_MODULE_COORDS[2], + moduleDef: mockMagneticModule as any, + nestedLabwareDef: null, + nestedLabwareDisplayName: null, + nestedLabwareId: null, + slotName: '1', + protocolLoadOrder: 1, + attachedModuleMatch: null, + }, + { + moduleId: mockMagneticModule.moduleId, + x: MOCK_SECOND_MAGNETIC_MODULE_COORDS[0], + y: MOCK_SECOND_MAGNETIC_MODULE_COORDS[1], + z: MOCK_SECOND_MAGNETIC_MODULE_COORDS[2], + moduleDef: mockMagneticModule as any, + nestedLabwareDef: null, + nestedLabwareDisplayName: null, + nestedLabwareId: null, + slotName: '2', + protocolLoadOrder: 0, + attachedModuleMatch: null, + }, + ]) + + when(mockModuleInfo) + .calledWith( + partialComponentPropsMatcher({ + moduleModel: mockMagneticModule.model, + isAttached: false, + physicalPort: null, + runId: MOCK_RUN_ID, + }) + ) + .mockReturnValue(
mock module info {mockMagneticModule.model}
) + + const { getAllByText } = render(props) + expect(getAllByText('mock module info magneticModuleV2')).toHaveLength(2) + }) + + it('should render a deck WITH modules', () => { + when(mockGetAttachedProtocolModuleMatches).mockReturnValue([ + { + moduleId: mockMagneticModule.moduleId, + x: MOCK_MAGNETIC_MODULE_COORDS[0], + y: MOCK_MAGNETIC_MODULE_COORDS[1], + z: MOCK_MAGNETIC_MODULE_COORDS[2], + moduleDef: mockMagneticModule as any, + nestedLabwareDef: null, + nestedLabwareDisplayName: null, + nestedLabwareId: null, + slotName: '1', + protocolLoadOrder: 1, + attachedModuleMatch: { + ...mockMagneticModuleFixture, + model: mockMagneticModule.model, + } as any, + }, + { + moduleId: mockTCModule.moduleId, + x: MOCK_TC_COORDS[0], + y: MOCK_TC_COORDS[1], + z: MOCK_TC_COORDS[2], + moduleDef: mockTCModule as any, + nestedLabwareDef: null, + nestedLabwareId: null, + nestedLabwareDisplayName: null, + protocolLoadOrder: 0, + attachedModuleMatch: { + ...mockThermocyclerFixture, + model: mockTCModule.model, + } as any, + slotName: '7', + }, + ]) + + when(mockModuleInfo) + .calledWith( + componentPropsMatcher({ + moduleModel: mockMagneticModule.model, + isAttached: true, + physicalPort: mockMagneticModuleFixture.usbPort, + runId: MOCK_RUN_ID, + }) + ) + .mockReturnValue(
mock module info {mockMagneticModule.model}
) + + when(mockModuleInfo) + .calledWith( + componentPropsMatcher({ + moduleModel: mockTCModule.model, + isAttached: true, + physicalPort: mockThermocyclerFixture.usbPort, + runId: MOCK_RUN_ID, + }) + ) + .mockReturnValue(
mock module info {mockTCModule.model}
) + + const { getByText } = render(props) + getByText('mock module info magneticModuleV2') + getByText('mock module info thermocyclerModuleV1') + }) + + it('renders Moam with the correct module in the correct slot', () => { + const dupModId = `${mockMagneticModule.moduleId}duplicate` + const dupModPort = 10 + + when(mockGetAttachedProtocolModuleMatches).mockReturnValue([ + { + moduleId: mockMagneticModule.moduleId, + x: MOCK_MAGNETIC_MODULE_COORDS[0], + y: MOCK_MAGNETIC_MODULE_COORDS[1], + z: MOCK_MAGNETIC_MODULE_COORDS[2], + moduleDef: mockMagneticModule as any, + nestedLabwareDef: null, + nestedLabwareId: null, + nestedLabwareDisplayName: null, + protocolLoadOrder: 1, + attachedModuleMatch: { + ...mockMagneticModuleFixture, + model: mockMagneticModule.model, + } as any, + slotName: '1', + }, + { + moduleId: dupModId, + x: MOCK_SECOND_MAGNETIC_MODULE_COORDS[0], + y: MOCK_SECOND_MAGNETIC_MODULE_COORDS[1], + z: MOCK_SECOND_MAGNETIC_MODULE_COORDS[2], + moduleDef: mockMagneticModule as any, + nestedLabwareDef: null, + nestedLabwareId: null, + nestedLabwareDisplayName: null, + protocolLoadOrder: 0, + attachedModuleMatch: { + ...mockMagneticModuleFixture, + model: mockMagneticModule.model, + usbPort: { + port: dupModPort, + hub: false, + portGroup: 'unknown', + path: '', + }, + } as any, + slotName: '3', + }, + ]) + + when(mockModuleInfo) + .calledWith( + componentPropsMatcher({ + moduleModel: mockMagneticModule.model, + isAttached: true, + physicalPort: mockMagneticModuleFixture.usbPort, + runId: MOCK_RUN_ID, + }) + ) + .mockReturnValue(
mock module info {mockMagneticModule.model}
) + + when(mockModuleInfo) + .calledWith( + componentPropsMatcher({ + moduleModel: mockMagneticModule.model, + isAttached: true, + physicalPort: { + port: dupModPort, + hub: false, + portGroup: 'unknown', + path: '', + }, + runId: MOCK_RUN_ID, + }) + ) + .mockReturnValue(
mock module info {mockTCModule.model}
) + + const { getByText } = render(props) + getByText('mock module info magneticModuleV2') + }) +}) diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/UnMatchedModuleWarning.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/UnMatchedModuleWarning.test.tsx similarity index 100% rename from app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/UnMatchedModuleWarning.test.tsx rename to app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/UnMatchedModuleWarning.test.tsx diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/utils.test.ts b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/utils.test.ts similarity index 69% rename from app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/utils.test.ts rename to app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/utils.test.ts index 4c1283df9eb..cfd9178347e 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/utils.test.ts +++ b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/utils.test.ts @@ -1,4 +1,4 @@ -import { getModuleImage } from '../utils' +import { getFixtureImage, getModuleImage } from '../utils' describe('getModuleImage', () => { it('should render the magnetic module image when the model is a magnetic module gen 1', () => { @@ -41,3 +41,24 @@ describe('getModuleImage', () => { expect(result).toEqual('magnetic_block_gen_1.png') }) }) + +describe('getFixtureImage', () => { + it('should render the staging area image', () => { + const result = getFixtureImage('stagingAreaRightSlot') + expect(result).toEqual('staging_area_slot.png') + }) + it('should render the waste chute image', () => { + const result = getFixtureImage('wasteChuteRightAdapterNoCover') + expect(result).toEqual('waste_chute.png') + }) + it('should render the waste chute staging area image', () => { + const result = getFixtureImage( + 'stagingAreaSlotWithWasteChuteRightAdapterCovered' + ) + expect(result).toEqual('waste_chute_with_staging_area.png') + }) + it('should render the trash bin image', () => { + const result = getFixtureImage('trashBinAdapter') + expect(result).toEqual('flex_trash_bin.png') + }) +}) diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/index.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/index.tsx new file mode 100644 index 00000000000..4e9afd58604 --- /dev/null +++ b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/index.tsx @@ -0,0 +1,120 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { + DIRECTION_COLUMN, + Flex, + JUSTIFY_CENTER, + SPACING, + useHoverTooltip, + PrimaryButton, +} from '@opentrons/components' + +import { useToggleGroup } from '../../../../molecules/ToggleGroup/useToggleGroup' +import { useDeckConfigurationCompatibility } from '../../../../resources/deck_configuration/hooks' +import { + getIsFixtureMismatch, + getRequiredDeckConfig, +} from '../../../../resources/deck_configuration/utils' +import { Tooltip } from '../../../../atoms/Tooltip' +import { + useRunHasStarted, + useUnmatchedModulesForProtocol, + useModuleCalibrationStatus, + useRobotType, +} from '../../hooks' +import { SetupModulesMap } from './SetupModulesMap' +import { SetupModulesList } from './SetupModulesList' +import { SetupFixtureList } from './SetupFixtureList' + +import type { + CompletedProtocolAnalysis, + ProtocolAnalysisOutput, +} from '@opentrons/shared-data' + +interface SetupModuleAndDeckProps { + expandLabwarePositionCheckStep: () => void + robotName: string + runId: string + hasModules: boolean + protocolAnalysis: CompletedProtocolAnalysis | ProtocolAnalysisOutput | null +} + +export const SetupModuleAndDeck = ({ + expandLabwarePositionCheckStep, + robotName, + runId, + hasModules, + protocolAnalysis, +}: SetupModuleAndDeckProps): JSX.Element => { + const { t } = useTranslation('protocol_setup') + const [selectedValue, toggleGroup] = useToggleGroup( + t('list_view'), + t('map_view') + ) + + const robotType = useRobotType(robotName) + const { missingModuleIds } = useUnmatchedModulesForProtocol(robotName, runId) + const runHasStarted = useRunHasStarted(runId) + const [targetProps, tooltipProps] = useHoverTooltip() + + const moduleCalibrationStatus = useModuleCalibrationStatus(robotName, runId) + const deckConfigCompatibility = useDeckConfigurationCompatibility( + robotType, + protocolAnalysis + ) + + const isFixtureMismatch = getIsFixtureMismatch(deckConfigCompatibility) + + const requiredDeckConfigCompatibility = getRequiredDeckConfig( + deckConfigCompatibility + ) + + return ( + <> + + {toggleGroup} + {selectedValue === t('list_view') ? ( + <> + {hasModules ? ( + + ) : null} + {requiredDeckConfigCompatibility.length > 0 ? ( + + ) : null} + + ) : ( + + )} + + + 0 || + isFixtureMismatch || + runHasStarted || + !moduleCalibrationStatus.complete + } + onClick={expandLabwarePositionCheckStep} + id="ModuleSetup_proceedToLabwarePositionCheck" + padding={`${SPACING.spacing8} ${SPACING.spacing16}`} + {...targetProps} + > + {t('proceed_to_labware_position_check')} + + + {missingModuleIds.length > 0 || + runHasStarted || + !moduleCalibrationStatus.complete ? ( + + {runHasStarted + ? t('protocol_run_started') + : missingModuleIds.length > 0 + ? t('plug_in_required_module', { count: missingModuleIds.length }) + : t('calibrate_module_failure_reason')} + + ) : null} + + ) +} diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModules/utils.ts b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/utils.ts similarity index 51% rename from app/src/organisms/Devices/ProtocolRun/SetupModules/utils.ts rename to app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/utils.ts index 3936733de83..10bf9b5148d 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupModules/utils.ts +++ b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/utils.ts @@ -1,10 +1,22 @@ +import { + STAGING_AREA_RIGHT_SLOT_FIXTURE, + TRASH_BIN_ADAPTER_FIXTURE, + WASTE_CHUTE_ONLY_FIXTURES, + WASTE_CHUTE_STAGING_AREA_FIXTURES, +} from '@opentrons/shared-data' + import magneticModule from '../../../../assets/images/magnetic_module_gen_2_transparent.png' import temperatureModule from '../../../../assets/images/temp_deck_gen_2_transparent.png' import thermoModuleGen1 from '../../../../assets/images/thermocycler_closed.png' import heaterShakerModule from '../../../../assets/images/heater_shaker_module_transparent.png' import thermoModuleGen2 from '../../../../assets/images/thermocycler_gen_2_closed.png' import magneticBlockGen1 from '../../../../assets/images/magnetic_block_gen_1.png' -import type { ModuleModel } from '@opentrons/shared-data' +import trashBin from '../../../../assets/images/flex_trash_bin.png' +import stagingArea from '../../../../assets/images/staging_area_slot.png' +import wasteChute from '../../../../assets/images/waste_chute.png' +import wasteChuteStagingArea from '../../../../assets/images/waste_chute_with_staging_area.png' + +import type { CutoutFixtureId, ModuleModel } from '@opentrons/shared-data' export function getModuleImage(model: ModuleModel): string { switch (model) { @@ -26,3 +38,17 @@ export function getModuleImage(model: ModuleModel): string { return 'Error: unknown module model' } } + +export function getFixtureImage(cutoutFixtureId: CutoutFixtureId): string { + if (cutoutFixtureId === STAGING_AREA_RIGHT_SLOT_FIXTURE) { + return stagingArea + } else if (WASTE_CHUTE_ONLY_FIXTURES.includes(cutoutFixtureId)) { + return wasteChute + } else if (WASTE_CHUTE_STAGING_AREA_FIXTURES.includes(cutoutFixtureId)) { + return wasteChuteStagingArea + } else if (cutoutFixtureId === TRASH_BIN_ADAPTER_FIXTURE) { + return trashBin + } else { + return 'Error: unknown fixture' + } +} diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModules/SetupModulesMap.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModules/SetupModulesMap.tsx deleted file mode 100644 index d001dbe32ec..00000000000 --- a/app/src/organisms/Devices/ProtocolRun/SetupModules/SetupModulesMap.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import * as React from 'react' -import map from 'lodash/map' - -import { - Flex, - Box, - Module, - RobotWorkSpace, - SlotLabels, - DIRECTION_COLUMN, - SPACING, -} from '@opentrons/components' -import { - getDeckDefFromRobotType, - inferModuleOrientationFromXCoordinate, -} from '@opentrons/shared-data' - -import { ModuleInfo } from '../../ModuleInfo' -import { - useModuleRenderInfoForProtocolById, - useProtocolDetailsForRun, -} from '../../hooks' -import { getStandardDeckViewBox } from '../utils/getStandardDeckViewBox' -import { getStandardDeckViewLayerBlockList } from '../utils/getStandardDeckViewLayerBlockList' - -interface SetupModulesMapProps { - robotName: string - runId: string -} - -export const SetupModulesMap = ({ - robotName, - runId, -}: SetupModulesMapProps): JSX.Element => { - const moduleRenderInfoForProtocolById = useModuleRenderInfoForProtocolById( - robotName, - runId - ) - const { robotType } = useProtocolDetailsForRun(runId) - - const deckDef = getDeckDefFromRobotType(robotType) - return ( - - - - {() => ( - <> - {map( - moduleRenderInfoForProtocolById, - ({ x, y, moduleDef, attachedModuleMatch, moduleId }) => { - const { model } = moduleDef - return ( - - - - - - ) - } - )} - - - )} - - - - ) -} diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/SetupModules.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/SetupModules.test.tsx deleted file mode 100644 index 60e17d5153d..00000000000 --- a/app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/SetupModules.test.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import * as React from 'react' -import { fireEvent } from '@testing-library/react' -import { when } from 'jest-when' -import { i18n } from '../../../../../i18n' -import { renderWithProviders } from '@opentrons/components' -import { SetupModules } from '../index' -import { SetupModulesList } from '../SetupModulesList' -import { SetupModulesMap } from '../SetupModulesMap' -import { - useRunHasStarted, - useUnmatchedModulesForProtocol, -} from '../../../hooks' -import { mockTemperatureModule } from '../../../../../redux/modules/__fixtures__' - -jest.mock('../../../hooks') -jest.mock('../SetupModulesList') -jest.mock('../SetupModulesMap') - -const mockUseRunHasStarted = useRunHasStarted as jest.MockedFunction< - typeof useRunHasStarted -> -const mockUseUnmatchedModulesForProtocol = useUnmatchedModulesForProtocol as jest.MockedFunction< - typeof useUnmatchedModulesForProtocol -> -const mockSetupModulesList = SetupModulesList as jest.MockedFunction< - typeof SetupModulesList -> -const mockSetupModulesMap = SetupModulesMap as jest.MockedFunction< - typeof SetupModulesMap -> - -const MOCK_ROBOT_NAME = 'otie' -const MOCK_RUN_ID = '1' - -const render = (props: React.ComponentProps) => { - return renderWithProviders( - jest.fn()} - />, - { i18nInstance: i18n } - )[0] -} - -describe('SetupModules', () => { - let props: React.ComponentProps - beforeEach(() => { - mockSetupModulesList.mockReturnValue(
Mock setup modules list
) - mockSetupModulesMap.mockReturnValue(
Mock setup modules map
) - when(mockUseRunHasStarted).calledWith(MOCK_RUN_ID).mockReturnValue(false) - when(mockUseUnmatchedModulesForProtocol) - .calledWith(MOCK_ROBOT_NAME, MOCK_RUN_ID) - .mockReturnValue({ - missingModuleIds: [], - remainingAttachedModules: [], - }) - }) - - it('renders the list and map view buttons', () => { - const { getByRole } = render(props) - getByRole('button', { name: 'List View' }) - getByRole('button', { name: 'Map View' }) - }) - - it('should render Proceed to labware setup CTA that is enabled', () => { - const { getByRole } = render(props) - const button = getByRole('button', { - name: 'Proceed to labware position check', - }) - expect(button).toBeEnabled() - }) - - it('should render a disabled Proceed to labware setup CTA if the protocol requests modules and they are not all attached to the robot', () => { - when(mockUseUnmatchedModulesForProtocol) - .calledWith(MOCK_ROBOT_NAME, MOCK_RUN_ID) - .mockReturnValue({ - missingModuleIds: ['foo'], - remainingAttachedModules: [mockTemperatureModule], - }) - const { getByRole } = render(props) - const button = getByRole('button', { - name: 'Proceed to labware position check', - }) - expect(button).toBeDisabled() - }) - - it('should render the SetupModulesList component when clicking List View', () => { - const { getByRole, getByText } = render(props) - const button = getByRole('button', { name: 'List View' }) - fireEvent.click(button) - getByText('Mock setup modules list') - }) - - it('should render the SetupModulesMap component when clicking Map View', () => { - const { getByRole, getByText } = render(props) - const button = getByRole('button', { name: 'Map View' }) - fireEvent.click(button) - getByText('Mock setup modules map') - }) -}) diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/SetupModulesMap.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/SetupModulesMap.test.tsx deleted file mode 100644 index 35b2661aec3..00000000000 --- a/app/src/organisms/Devices/ProtocolRun/SetupModules/__tests__/SetupModulesMap.test.tsx +++ /dev/null @@ -1,346 +0,0 @@ -import * as React from 'react' -import '@testing-library/jest-dom' -import { when, resetAllWhenMocks } from 'jest-when' -import { StaticRouter } from 'react-router-dom' - -import { - renderWithProviders, - partialComponentPropsMatcher, - componentPropsMatcher, - RobotWorkSpace, -} from '@opentrons/components' -import { - inferModuleOrientationFromXCoordinate, - ModuleModel, - ModuleType, -} from '@opentrons/shared-data' -import standardDeckDef from '@opentrons/shared-data/deck/definitions/3/ot2_standard.json' - -import { i18n } from '../../../../../i18n' -import { - mockThermocycler as mockThermocyclerFixture, - mockMagneticModule as mockMagneticModuleFixture, -} from '../../../../../redux/modules/__fixtures__/index' -import { - useModuleRenderInfoForProtocolById, - useProtocolDetailsForRun, -} from '../../../hooks' -import { ModuleInfo } from '../../../ModuleInfo' -import { SetupModulesMap } from '../SetupModulesMap' - -jest.mock('@opentrons/components', () => { - const actualComponents = jest.requireActual('@opentrons/components') - return { - ...actualComponents, - RobotWorkSpace: jest.fn(() =>
mock RobotWorkSpace
), - } -}) -jest.mock('@opentrons/shared-data', () => { - const actualSharedData = jest.requireActual('@opentrons/shared-data') - return { - ...actualSharedData, - inferModuleOrientationFromXCoordinate: jest.fn(), - } -}) -jest.mock('../../../ModuleInfo') -jest.mock('../../../hooks') - -const mockUseModuleRenderInfoForProtocolById = useModuleRenderInfoForProtocolById as jest.MockedFunction< - typeof useModuleRenderInfoForProtocolById -> -const mockUseProtocolDetailsForRun = useProtocolDetailsForRun as jest.MockedFunction< - typeof useProtocolDetailsForRun -> -const mockModuleInfo = ModuleInfo as jest.MockedFunction -const mockInferModuleOrientationFromXCoordinate = inferModuleOrientationFromXCoordinate as jest.MockedFunction< - typeof inferModuleOrientationFromXCoordinate -> -const mockRobotWorkSpace = RobotWorkSpace as jest.MockedFunction< - typeof RobotWorkSpace -> -const deckSlotsById = standardDeckDef.locations.orderedSlots.reduce( - (acc, deckSlot) => ({ ...acc, [deckSlot.id]: deckSlot }), - {} -) - -const render = (props: React.ComponentProps) => { - return renderWithProviders( - - - , - { - i18nInstance: i18n, - } - )[0] -} - -const STUBBED_ORIENTATION_VALUE = 'left' -const MOCK_MAGNETIC_MODULE_COORDS = [10, 20, 0] -const MOCK_SECOND_MAGNETIC_MODULE_COORDS = [100, 200, 0] -const MOCK_TC_COORDS = [20, 30, 0] -const MOCK_ROBOT_NAME = 'otie' -const MOCK_RUN_ID = '1' - -const mockMagneticModule = { - moduleId: 'someMagneticModule', - model: 'magneticModuleV2' as ModuleModel, - type: 'magneticModuleType' as ModuleType, - labwareOffset: { x: 5, y: 5, z: 5 }, - cornerOffsetFromSlot: { x: 1, y: 1, z: 1 }, - dimensions: { - xDimension: 100, - yDimension: 100, - footprintXDimension: 50, - footprintYDimension: 50, - labwareInterfaceXDimension: 80, - labwareInterfaceYDimension: 120, - }, - twoDimensionalRendering: { children: [] }, -} - -const mockTCModule = { - moduleId: 'TCModuleId', - model: 'thermocyclerModuleV1' as ModuleModel, - type: 'thermocyclerModuleType' as ModuleType, - labwareOffset: { x: 3, y: 3, z: 3 }, - cornerOffsetFromSlot: { x: 1, y: 1, z: 1 }, - dimensions: { - xDimension: 100, - yDimension: 100, - footprintXDimension: 50, - footprintYDimension: 50, - labwareInterfaceXDimension: 80, - labwareInterfaceYDimension: 120, - }, - twoDimensionalRendering: { children: [] }, -} - -describe('SetupModulesMap', () => { - let props: React.ComponentProps - beforeEach(() => { - props = { - robotName: MOCK_ROBOT_NAME, - runId: MOCK_RUN_ID, - } - when(mockUseProtocolDetailsForRun) - .calledWith(MOCK_RUN_ID) - .mockReturnValue({ protocolData: {} } as any) - when(mockInferModuleOrientationFromXCoordinate) - .calledWith(expect.anything()) - .mockReturnValue(STUBBED_ORIENTATION_VALUE) - - when(mockRobotWorkSpace) - .mockReturnValue(
) // this (default) empty div will be returned when RobotWorkSpace isn't called with expected props - .calledWith( - partialComponentPropsMatcher({ - deckDef: standardDeckDef, - children: expect.anything(), - }) - ) - .mockImplementation(({ children }) => ( -
- {/* @ts-expect-error children won't be null since we checked for expect.anything() above */} - {children({ - deckSlotsById, - getRobotCoordsFromDOMCoords: {} as any, - })} -
- )) - }) - - afterEach(() => { - resetAllWhenMocks() - }) - - it('should render a deck WITHOUT modules if none passed (component will never be rendered in this circumstance)', () => { - when(mockUseModuleRenderInfoForProtocolById) - .calledWith(MOCK_ROBOT_NAME, MOCK_RUN_ID) - .mockReturnValue({}) - - render(props) - expect(mockModuleInfo).not.toHaveBeenCalled() - }) - it('should render a deck WITH MoaM', () => { - when(mockUseModuleRenderInfoForProtocolById) - .calledWith(MOCK_ROBOT_NAME, MOCK_RUN_ID) - .mockReturnValue({ - [mockMagneticModule.moduleId]: { - moduleId: mockMagneticModule.moduleId, - x: MOCK_MAGNETIC_MODULE_COORDS[0], - y: MOCK_MAGNETIC_MODULE_COORDS[1], - z: MOCK_MAGNETIC_MODULE_COORDS[2], - moduleDef: mockMagneticModule as any, - nestedLabwareDef: null, - nestedLabwareId: null, - protocolLoadOrder: 1, - attachedModuleMatch: null, - }, - [mockMagneticModule.moduleId]: { - moduleId: mockMagneticModule.moduleId, - x: MOCK_MAGNETIC_MODULE_COORDS[0], - y: MOCK_MAGNETIC_MODULE_COORDS[1], - z: MOCK_MAGNETIC_MODULE_COORDS[2], - moduleDef: mockMagneticModule as any, - nestedLabwareDef: null, - nestedLabwareId: null, - protocolLoadOrder: 0, - attachedModuleMatch: null, - }, - } as any) - - when(mockModuleInfo) - .calledWith( - partialComponentPropsMatcher({ - moduleModel: mockMagneticModule.model, - isAttached: false, - physicalPort: null, - runId: MOCK_RUN_ID, - }) - ) - .mockReturnValue(
mock module info {mockMagneticModule.model}
) - - const { getByText } = render(props) - getByText('mock module info magneticModuleV2') - }) - - it('should render a deck WITH modules', () => { - when(mockUseModuleRenderInfoForProtocolById) - .calledWith(MOCK_ROBOT_NAME, MOCK_RUN_ID) - .mockReturnValue({ - [mockMagneticModule.moduleId]: { - moduleId: mockMagneticModule.moduleId, - x: MOCK_MAGNETIC_MODULE_COORDS[0], - y: MOCK_MAGNETIC_MODULE_COORDS[1], - z: MOCK_MAGNETIC_MODULE_COORDS[2], - moduleDef: mockMagneticModule as any, - nestedLabwareDef: null, - nestedLabwareId: null, - nestedLabwareDisplayName: null, - protocolLoadOrder: 1, - attachedModuleMatch: { - ...mockMagneticModuleFixture, - model: mockMagneticModule.model, - } as any, - slotName: '1', - }, - [mockTCModule.moduleId]: { - moduleId: mockTCModule.moduleId, - x: MOCK_TC_COORDS[0], - y: MOCK_TC_COORDS[1], - z: MOCK_TC_COORDS[2], - moduleDef: mockTCModule, - nestedLabwareDef: null, - nestedLabwareId: null, - nestedLabwareDisplayName: null, - protocolLoadOrder: 0, - attachedModuleMatch: { - ...mockThermocyclerFixture, - model: mockTCModule.model, - } as any, - slotName: '7', - }, - }) - - when(mockModuleInfo) - .calledWith( - componentPropsMatcher({ - moduleModel: mockMagneticModule.model, - isAttached: true, - physicalPort: mockMagneticModuleFixture.usbPort, - runId: MOCK_RUN_ID, - }) - ) - .mockReturnValue(
mock module info {mockMagneticModule.model}
) - - when(mockModuleInfo) - .calledWith( - componentPropsMatcher({ - moduleModel: mockTCModule.model, - isAttached: true, - physicalPort: mockThermocyclerFixture.usbPort, - runId: MOCK_RUN_ID, - }) - ) - .mockReturnValue(
mock module info {mockTCModule.model}
) - - const { getByText } = render(props) - getByText('mock module info magneticModuleV2') - }) - - it('renders Moam with the correct module in the correct slot', () => { - const dupModId = `${mockMagneticModule.moduleId}duplicate` - const dupModPort = 10 - when(mockUseModuleRenderInfoForProtocolById) - .calledWith(MOCK_ROBOT_NAME, MOCK_RUN_ID) - .mockReturnValue({ - [mockMagneticModule.moduleId]: { - moduleId: mockMagneticModule.moduleId, - x: MOCK_MAGNETIC_MODULE_COORDS[0], - y: MOCK_MAGNETIC_MODULE_COORDS[1], - z: MOCK_MAGNETIC_MODULE_COORDS[2], - moduleDef: mockMagneticModule as any, - nestedLabwareDef: null, - nestedLabwareId: null, - nestedLabwareDisplayName: null, - protocolLoadOrder: 1, - attachedModuleMatch: { - ...mockMagneticModuleFixture, - model: mockMagneticModule.model, - } as any, - slotName: '1', - }, - [dupModId]: { - moduleId: dupModId, - x: MOCK_SECOND_MAGNETIC_MODULE_COORDS[0], - y: MOCK_SECOND_MAGNETIC_MODULE_COORDS[1], - z: MOCK_SECOND_MAGNETIC_MODULE_COORDS[2], - moduleDef: mockMagneticModule as any, - nestedLabwareDef: null, - nestedLabwareId: null, - nestedLabwareDisplayName: null, - protocolLoadOrder: 0, - attachedModuleMatch: { - ...mockMagneticModuleFixture, - model: mockMagneticModule.model, - usbPort: { - port: dupModPort, - hub: false, - portGroup: 'unknown', - path: '', - }, - } as any, - slotName: '3', - }, - }) - - when(mockModuleInfo) - .calledWith( - componentPropsMatcher({ - moduleModel: mockMagneticModule.model, - isAttached: true, - physicalPort: mockMagneticModuleFixture.usbPort, - runId: MOCK_RUN_ID, - }) - ) - .mockReturnValue(
mock module info {mockMagneticModule.model}
) - - when(mockModuleInfo) - .calledWith( - componentPropsMatcher({ - moduleModel: mockMagneticModule.model, - isAttached: true, - physicalPort: { - port: dupModPort, - hub: false, - portGroup: 'unknown', - path: '', - }, - runId: MOCK_RUN_ID, - }) - ) - .mockReturnValue(
mock module info {mockTCModule.model}
) - - const { getByText } = render(props) - getByText('mock module info magneticModuleV2') - }) -}) diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModules/index.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModules/index.tsx deleted file mode 100644 index 63500b87608..00000000000 --- a/app/src/organisms/Devices/ProtocolRun/SetupModules/index.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import * as React from 'react' -import { useTranslation } from 'react-i18next' -import { - DIRECTION_COLUMN, - Flex, - JUSTIFY_CENTER, - SPACING, - useHoverTooltip, - PrimaryButton, -} from '@opentrons/components' -import { useRunHasStarted, useUnmatchedModulesForProtocol } from '../../hooks' -import { useToggleGroup } from '../../../../molecules/ToggleGroup/useToggleGroup' -import { Tooltip } from '../../../../atoms/Tooltip' -import { SetupModulesMap } from './SetupModulesMap' -import { SetupModulesList } from './SetupModulesList' - -interface SetupModulesProps { - expandLabwarePositionCheckStep: () => void - robotName: string - runId: string -} - -export const SetupModules = ({ - expandLabwarePositionCheckStep, - robotName, - runId, -}: SetupModulesProps): JSX.Element => { - const { t } = useTranslation('protocol_setup') - const [selectedValue, toggleGroup] = useToggleGroup( - t('list_view'), - t('map_view') - ) - const { missingModuleIds } = useUnmatchedModulesForProtocol(robotName, runId) - const runHasStarted = useRunHasStarted(runId) - const [targetProps, tooltipProps] = useHoverTooltip() - return ( - <> - - {toggleGroup} - {selectedValue === t('list_view') ? ( - - ) : ( - - )} - - - 0 || runHasStarted} - onClick={expandLabwarePositionCheckStep} - id="ModuleSetup_proceedToLabwarePositionCheck" - padding={`${SPACING.spacing8} ${SPACING.spacing16}`} - {...targetProps} - > - {t('proceed_to_labware_position_check')} - - - {missingModuleIds.length > 0 || runHasStarted ? ( - - {runHasStarted - ? t('protocol_run_started') - : t('plug_in_required_module', { count: missingModuleIds.length })} - - ) : null} - - ) -} diff --git a/app/src/organisms/Devices/ProtocolRun/SetupPipetteCalibrationItem.tsx b/app/src/organisms/Devices/ProtocolRun/SetupPipetteCalibrationItem.tsx index aa9a9383029..96804e17604 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupPipetteCalibrationItem.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupPipetteCalibrationItem.tsx @@ -70,7 +70,7 @@ export function SetupPipetteCalibrationItem({ {t('pipette_mismatch')} - {!isOT3 ? ( + {!isFlex ? ( ) : null} - {!isOT3 ? ( + {!isFlex ? ( ) : null}
diff --git a/app/src/organisms/Devices/ProtocolRun/SetupStep.tsx b/app/src/organisms/Devices/ProtocolRun/SetupStep.tsx index dbf0d910c36..a2d9cee0353 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupStep.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupStep.tsx @@ -49,10 +49,10 @@ const COLLAPSED_STYLE = css` const ACCORDION_STYLE = css` border-radius: 50%; &:hover { - background: ${COLORS.lightGreyHover}; + background: ${COLORS.grey30}; } &:active { - background: ${COLORS.lightGreyPressed}; + background: ${COLORS.grey35}; } ` export function SetupStep({ @@ -79,7 +79,7 @@ export function SetupStep({ > {description} @@ -105,7 +105,7 @@ export function SetupStep({ {rightElement} diff --git a/app/src/organisms/Devices/ProtocolRun/SetupTipLengthCalibrationButton.tsx b/app/src/organisms/Devices/ProtocolRun/SetupTipLengthCalibrationButton.tsx index 765456d9c5f..66a36bb8752 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupTipLengthCalibrationButton.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupTipLengthCalibrationButton.tsx @@ -89,7 +89,7 @@ export function SetupTipLengthCalibrationButton({ const recalibrateLink = disableRecalibrate ? ( <> diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/BackToTopButton.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/BackToTopButton.test.tsx index 0e9023ebf3b..999cfeda8bc 100644 --- a/app/src/organisms/Devices/ProtocolRun/__tests__/BackToTopButton.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/BackToTopButton.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent } from '@testing-library/react' import { when, resetAllWhenMocks } from 'jest-when' import { StaticRouter } from 'react-router-dom' @@ -9,11 +10,6 @@ import { useTrackEvent, ANALYTICS_PROTOCOL_PROCEED_TO_RUN, } from '../../../../redux/analytics' -import { - useRunCalibrationStatus, - useRunHasStarted, - useUnmatchedModulesForProtocol, -} from '../../hooks' import { BackToTopButton } from '../BackToTopButton' jest.mock('@opentrons/components', () => { @@ -24,17 +20,7 @@ jest.mock('@opentrons/components', () => { } }) jest.mock('../../../../redux/analytics') -jest.mock('../../hooks') -const mockUseUnmatchedModulesForProtocol = useUnmatchedModulesForProtocol as jest.MockedFunction< - typeof useUnmatchedModulesForProtocol -> -const mockUseRunCalibrationStatus = useRunCalibrationStatus as jest.MockedFunction< - typeof useRunCalibrationStatus -> -const mockUseRunHasStarted = useRunHasStarted as jest.MockedFunction< - typeof useRunHasStarted -> const mockUseTrackEvent = useTrackEvent as jest.MockedFunction< typeof useTrackEvent > @@ -62,20 +48,6 @@ let mockTrackEvent: jest.Mock describe('BackToTopButton', () => { beforeEach(() => { - when(mockUseUnmatchedModulesForProtocol) - .calledWith(ROBOT_NAME, RUN_ID) - .mockReturnValue({ - missingModuleIds: [], - remainingAttachedModules: [], - }) - - when(mockUseRunCalibrationStatus) - .calledWith(ROBOT_NAME, RUN_ID) - .mockReturnValue({ - complete: true, - }) - when(mockUseRunHasStarted).calledWith(RUN_ID).mockReturnValue(false) - mockTrackEvent = jest.fn() when(mockUseTrackEvent).calledWith().mockReturnValue(mockTrackEvent) }) @@ -95,63 +67,16 @@ describe('BackToTopButton', () => { it('should track a mixpanel event when clicked', () => { const { getByRole } = render() const button = getByRole('link', { name: 'Back to top' }) - button.click() + fireEvent.click(button) expect(mockTrackEvent).toHaveBeenCalledWith({ name: ANALYTICS_PROTOCOL_PROCEED_TO_RUN, properties: { sourceLocation: 'test run button' }, }) }) - it('should be disabled with modules not connected tooltip when there are missing moduleIds', () => { - when(mockUseUnmatchedModulesForProtocol) - .calledWith(ROBOT_NAME, RUN_ID) - .mockReturnValue({ - missingModuleIds: ['temperatureModuleV1'], - remainingAttachedModules: [], - }) - const { getByRole, getByText } = render() - const button = getByRole('button', { name: 'Back to top' }) - expect(button).toBeDisabled() - getByText('Make sure all modules are connected before proceeding to run') - }) - it('should be disabled with modules not connected and calibration not completed tooltip if missing cal and moduleIds', async () => { - when(mockUseUnmatchedModulesForProtocol) - .calledWith(ROBOT_NAME, RUN_ID) - .mockReturnValue({ - missingModuleIds: ['temperatureModuleV1'], - remainingAttachedModules: [], - }) - when(mockUseRunCalibrationStatus) - .calledWith(ROBOT_NAME, RUN_ID) - .mockReturnValue({ - complete: false, - }) - const { getByRole, getByText } = render() - const button = getByRole('button', { name: 'Back to top' }) - expect(button).toBeDisabled() - getByText( - 'Make sure robot calibration is complete and all modules are connected before proceeding to run' - ) - }) - it('should be disabled with calibration not complete tooltip when calibration not complete', async () => { - when(mockUseRunCalibrationStatus) - .calledWith(ROBOT_NAME, RUN_ID) - .mockReturnValue({ - complete: false, - }) - const { getByRole, getByText } = render() - const button = getByRole('button', { name: 'Back to top' }) - expect(button).toBeDisabled() - getByText( - 'Make sure robot calibration is complete before proceeding to run' - ) - }) - it('should be disabled with protocol run started tooltip when run has started', async () => { - when(mockUseRunHasStarted).calledWith(RUN_ID).mockReturnValue(true) - - const { getByRole, getByText } = render() + it('should always be enabled', () => { + const { getByRole } = render() const button = getByRole('button', { name: 'Back to top' }) - expect(button).toBeDisabled() - getByText('Protocol run started.') + expect(button).not.toBeDisabled() }) }) diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolDropTipBanner.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolDropTipBanner.test.tsx new file mode 100644 index 00000000000..ebc0bf5d38b --- /dev/null +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolDropTipBanner.test.tsx @@ -0,0 +1,45 @@ +import * as React from 'react' +import { fireEvent } from '@testing-library/react' + +import { renderWithProviders } from '@opentrons/components' + +import { ProtocolDropTipBanner } from '../ProtocolDropTipBanner' +import { i18n } from '../../../../i18n' + +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + })[0] +} + +describe('Module Update Banner', () => { + let props: React.ComponentProps + + beforeEach(() => { + props = { + onCloseClick: jest.fn(), + onLaunchWizardClick: jest.fn(), + } + }) + + it('displays appropriate banner text', () => { + const { getByText, queryByText } = render(props) + getByText('Tips may be attached.') + queryByText('You may want to remove tips') + getByText('Remove tips') + }) + + it('launches the drop tip wizard when clicking on the appropriate banner text', () => { + const { getByText } = render(props) + expect(props.onLaunchWizardClick).not.toHaveBeenCalled() + fireEvent.click(getByText('Remove tips')) + expect(props.onLaunchWizardClick).toHaveBeenCalled() + }) + + it('closes the banner when clicking the appropriate button', () => { + const { getByTestId } = render(props) + expect(props.onCloseClick).not.toHaveBeenCalled() + fireEvent.click(getByTestId('Banner_close-button')) + expect(props.onCloseClick).toHaveBeenCalled() + }) +}) diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunHeader.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunHeader.test.tsx index 31fa9c930ad..5453af0efd9 100644 --- a/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunHeader.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunHeader.test.tsx @@ -1,7 +1,6 @@ import * as React from 'react' import { BrowserRouter } from 'react-router-dom' -import '@testing-library/jest-dom' -import { fireEvent, waitFor } from '@testing-library/react' +import { fireEvent, screen, waitFor } from '@testing-library/react' import { when, resetAllWhenMocks } from 'jest-when' import { RUN_STATUS_IDLE, @@ -13,17 +12,25 @@ import { RUN_STATUS_FAILED, RUN_STATUS_SUCCEEDED, RUN_STATUS_BLOCKED_BY_OPEN_DOOR, + instrumentsResponseLeftPipetteFixture, + instrumentsResponseRightPipetteFixture, } from '@opentrons/api-client' import { renderWithProviders } from '@opentrons/components' import { - useRunQuery, + useHost, useModulesQuery, usePipettesQuery, useDismissCurrentRunMutation, useEstopQuery, useDoorQuery, + useInstrumentsQuery, } from '@opentrons/react-api-client' +import { + getPipetteModelSpecs, + STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, +} from '@opentrons/shared-data' import _uncastedSimpleV6Protocol from '@opentrons/shared-data/protocol/fixtures/6/simpleV6.json' +import noModulesProtocol from '@opentrons/shared-data/protocol/fixtures/4/simpleV4.json' import { i18n } from '../../../../i18n' import { @@ -58,6 +65,7 @@ import { } from '../../../../redux/analytics' import { getRobotUpdateDisplayInfo } from '../../../../redux/robot-update' import { getIsHeaterShakerAttached } from '../../../../redux/config' +import { getRobotSettings } from '../../../../redux/robot-settings' import { useProtocolDetailsForRun, @@ -65,9 +73,10 @@ import { useTrackProtocolRunEvent, useRunCalibrationStatus, useRunCreatedAtTimestamp, + useModuleCalibrationStatus, useUnmatchedModulesForProtocol, useIsRobotViewable, - useIsOT3, + useIsFlex, } from '../../hooks' import { useIsHeaterShakerInProtocol } from '../../../ModuleCard/hooks' import { ConfirmAttachmentModal } from '../../../ModuleCard/ConfirmAttachmentModal' @@ -77,6 +86,12 @@ import { ProtocolRunHeader } from '../ProtocolRunHeader' import { HeaterShakerIsRunningModal } from '../../HeaterShakerIsRunningModal' import { RunFailedModal } from '../RunFailedModal' import { DISENGAGED, NOT_PRESENT } from '../../../EmergencyStop' +import { getPipettesWithTipAttached } from '../../../DropTipWizard/getPipettesWithTipAttached' +import { getIsFixtureMismatch } from '../../../../resources/deck_configuration/utils' +import { useDeckConfigurationCompatibility } from '../../../../resources/deck_configuration/hooks' +import { useMostRecentCompletedAnalysis } from '../../../LabwarePositionCheck/useMostRecentCompletedAnalysis' +import { useMostRecentRunId } from '../../../ProtocolUpload/hooks/useMostRecentRunId' +import { useNotifyRunQuery } from '../../../../resources/runs/useNotifyRunQuery' import type { UseQueryResult } from 'react-query' import type { Run } from '@opentrons/api-client' @@ -99,6 +114,15 @@ jest.mock('@opentrons/components', () => { } }) jest.mock('@opentrons/react-api-client') +jest.mock('@opentrons/shared-data', () => ({ + getAllPipetteNames: jest.fn( + jest.requireActual('@opentrons/shared-data').getAllPipetteNames + ), + getPipetteNameSpecs: jest.fn( + jest.requireActual('@opentrons/shared-data').getPipetteNameSpecs + ), + getPipetteModelSpecs: jest.fn(), +})) jest.mock('../../../../organisms/ProtocolUpload/hooks') jest.mock('../../../../organisms/RunDetails/ConfirmCancelModal') jest.mock('../../../../organisms/RunTimeControl/hooks') @@ -111,6 +135,13 @@ jest.mock('../../../../redux/analytics') jest.mock('../../../../redux/config') jest.mock('../RunFailedModal') jest.mock('../../../../redux/robot-update/selectors') +jest.mock('../../../../redux/robot-settings/selectors') +jest.mock('../../../DropTipWizard/getPipettesWithTipAttached') +jest.mock('../../../../resources/deck_configuration/utils') +jest.mock('../../../../resources/deck_configuration/hooks') +jest.mock('../../../LabwarePositionCheck/useMostRecentCompletedAnalysis') +jest.mock('../../../ProtocolUpload/hooks/useMostRecentRunId') +jest.mock('../../../../resources/runs/useNotifyRunQuery') const mockGetIsHeaterShakerAttached = getIsHeaterShakerAttached as jest.MockedFunction< typeof getIsHeaterShakerAttached @@ -139,13 +170,18 @@ const mockUseTrackProtocolRunEvent = useTrackProtocolRunEvent as jest.MockedFunc const mockUseProtocolAnalysisErrors = useProtocolAnalysisErrors as jest.MockedFunction< typeof useProtocolAnalysisErrors > -const mockUseRunQuery = useRunQuery as jest.MockedFunction +const mockUseNotifyRunQuery = useNotifyRunQuery as jest.MockedFunction< + typeof useNotifyRunQuery +> const mockUseUnmatchedModulesForProtocol = useUnmatchedModulesForProtocol as jest.MockedFunction< typeof useUnmatchedModulesForProtocol > const mockUseRunCalibrationStatus = useRunCalibrationStatus as jest.MockedFunction< typeof useRunCalibrationStatus > +const mockUseModuleCalibrationStatus = useModuleCalibrationStatus as jest.MockedFunction< + typeof useModuleCalibrationStatus +> const mockUseRunCreatedAtTimestamp = useRunCreatedAtTimestamp as jest.MockedFunction< typeof useRunCreatedAtTimestamp > @@ -155,12 +191,12 @@ const mockUseModulesQuery = useModulesQuery as jest.MockedFunction< const mockUsePipettesQuery = usePipettesQuery as jest.MockedFunction< typeof usePipettesQuery > -const mockUseDismissCurrentRunMutation = useDismissCurrentRunMutation as jest.MockedFunction< - typeof useDismissCurrentRunMutation -> const mockConfirmCancelModal = ConfirmCancelModal as jest.MockedFunction< typeof ConfirmCancelModal > +const mockUseDismissCurrentRunMutation = useDismissCurrentRunMutation as jest.MockedFunction< + typeof useDismissCurrentRunMutation +> const mockHeaterShakerIsRunningModal = HeaterShakerIsRunningModal as jest.MockedFunction< typeof HeaterShakerIsRunningModal > @@ -188,10 +224,35 @@ const mockRunFailedModal = RunFailedModal as jest.MockedFunction< const mockUseEstopQuery = useEstopQuery as jest.MockedFunction< typeof useEstopQuery > -const mockUseIsOT3 = useIsOT3 as jest.MockedFunction +const mockUseIsFlex = useIsFlex as jest.MockedFunction const mockUseDoorQuery = useDoorQuery as jest.MockedFunction< typeof useDoorQuery > +const mockGetRobotSettings = getRobotSettings as jest.MockedFunction< + typeof getRobotSettings +> +const mockUseInstrumentsQuery = useInstrumentsQuery as jest.MockedFunction< + typeof useInstrumentsQuery +> +const mockUseHost = useHost as jest.MockedFunction +const mockGetPipettesWithTipAttached = getPipettesWithTipAttached as jest.MockedFunction< + typeof getPipettesWithTipAttached +> +const mockGetPipetteModelSpecs = getPipetteModelSpecs as jest.MockedFunction< + typeof getPipetteModelSpecs +> +const mockGetIsFixtureMismatch = getIsFixtureMismatch as jest.MockedFunction< + typeof getIsFixtureMismatch +> +const mockUseDeckConfigurationCompatibility = useDeckConfigurationCompatibility as jest.MockedFunction< + typeof useDeckConfigurationCompatibility +> +const mockUseMostRecentCompletedAnalysis = useMostRecentCompletedAnalysis as jest.MockedFunction< + typeof useMostRecentCompletedAnalysis +> +const mockUseMostRecentRunId = useMostRecentRunId as jest.MockedFunction< + typeof useMostRecentRunId +> const ROBOT_NAME = 'otie' const RUN_ID = '95e67900-bc9f-4fbf-92c6-cc4d7226a51b' @@ -199,6 +260,14 @@ const CREATED_AT = '03/03/2022 19:08:49' const STARTED_AT = '2022-03-03T19:09:40.620530+00:00' const COMPLETED_AT = '2022-03-03T19:39:53.620530+00:00' const PROTOCOL_NAME = 'A Protocol for Otie' +const mockSettings = { + id: 'enableDoorSafetySwitch', + title: 'Enable Door Safety Switch', + description: '', + value: true, + restart_required: false, +} +const MOCK_ROTOCOL_LIQUID_KEY = { liquids: [] } const simpleV6Protocol = (_uncastedSimpleV6Protocol as unknown) as CompletedProtocolAnalysis @@ -329,32 +398,54 @@ describe('ProtocolRunHeader', () => { when(mockUseRunCreatedAtTimestamp) .calledWith(RUN_ID) .mockReturnValue(CREATED_AT) - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID, { staleTime: Infinity }) .mockReturnValue({ data: { data: mockIdleUnstartedRun }, } as UseQueryResult) - when(mockUseDismissCurrentRunMutation) - .calledWith() - .mockReturnValue({ - dismissCurrentRun: jest.fn(), - } as any) when(mockUseProtocolDetailsForRun) .calledWith(RUN_ID) .mockReturnValue(PROTOCOL_DETAILS) when(mockUseTrackProtocolRunEvent).calledWith(RUN_ID).mockReturnValue({ trackProtocolRunEvent: mockTrackProtocolRunEvent, }) + when(mockUseDismissCurrentRunMutation) + .calledWith() + .mockReturnValue({ + dismissCurrentRun: jest.fn(), + } as any) when(mockUseUnmatchedModulesForProtocol) .calledWith(ROBOT_NAME, RUN_ID) .mockReturnValue({ missingModuleIds: [], remainingAttachedModules: [] }) when(mockUseRunCalibrationStatus) .calledWith(ROBOT_NAME, RUN_ID) .mockReturnValue({ complete: true }) - mockUseIsOT3.mockReturnValue(true) + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(true) + when(mockUseModuleCalibrationStatus) + .calledWith(ROBOT_NAME, RUN_ID) + .mockReturnValue({ complete: true }) mockRunFailedModal.mockReturnValue(
mock RunFailedModal
) mockUseEstopQuery.mockReturnValue({ data: mockEstopStatus } as any) mockUseDoorQuery.mockReturnValue({ data: mockDoorStatus } as any) + mockGetRobotSettings.mockReturnValue([mockSettings]) + mockUseInstrumentsQuery.mockReturnValue({ data: {} } as any) + mockUseHost.mockReturnValue({} as any) + mockGetPipettesWithTipAttached.mockReturnValue( + Promise.resolve([ + instrumentsResponseLeftPipetteFixture, + instrumentsResponseRightPipetteFixture, + ]) as any + ) + mockGetPipetteModelSpecs.mockReturnValue('p10_single_v1' as any) + when(mockUseMostRecentCompletedAnalysis) + .calledWith(RUN_ID) + .mockReturnValue({ + ...noModulesProtocol, + ...MOCK_ROTOCOL_LIQUID_KEY, + } as any) + mockUseDeckConfigurationCompatibility.mockReturnValue([]) + when(mockGetIsFixtureMismatch).mockReturnValue(false) + when(mockUseMostRecentRunId).mockReturnValue(RUN_ID) }) afterEach(() => { @@ -363,20 +454,22 @@ describe('ProtocolRunHeader', () => { }) it('renders a protocol name, run record id, status, and run time', () => { - const [{ getByText }] = render() + render() - getByText('A Protocol for Otie') - getByText('Run') - getByText('03/03/2022 19:08:49') - getByText('Status') - getByText('Not started') - getByText('Run Time') + screen.getByText('A Protocol for Otie') + screen.getByText('Run') + screen.getByText('03/03/2022 19:08:49') + screen.getByText('Status') + screen.getByText('Not started') + screen.getByText('Run Time') }) it('links to a protocol details page', () => { - const [{ getByRole }] = render() + render() - const protocolNameLink = getByRole('link', { name: 'A Protocol for Otie' }) + const protocolNameLink = screen.getByRole('link', { + name: 'A Protocol for Otie', + }) expect(protocolNameLink.getAttribute('href')).toBe( `/protocols/${PROTOCOL_DETAILS.protocolKey}` ) @@ -386,9 +479,11 @@ describe('ProtocolRunHeader', () => { when(mockUseProtocolDetailsForRun) .calledWith(RUN_ID) .mockReturnValue({ ...PROTOCOL_DETAILS, protocolKey: null }) - const [{ queryByRole }] = render() + render() - expect(queryByRole('link', { name: 'A Protocol for Otie' })).toBeNull() + expect( + screen.queryByRole('link', { name: 'A Protocol for Otie' }) + ).toBeNull() }) it('renders a disabled "Analyzing on robot" button if robot-side analysis is not complete', () => { @@ -400,28 +495,28 @@ describe('ProtocolRunHeader', () => { robotType: 'OT-2 Standard', }) - const [{ getByRole }] = render() + render() - const button = getByRole('button', { name: 'Analyzing on robot' }) + const button = screen.getByRole('button', { name: 'Analyzing on robot' }) expect(button).toBeDisabled() }) it('renders a start run button and cancel run button when run is ready to start', () => { - const [{ getByRole, queryByText, getByText }] = render() + render() - getByRole('button', { name: 'Start run' }) - queryByText(formatTimestamp(STARTED_AT)) - queryByText('Protocol start') - queryByText('Protocol end') - getByRole('button', { name: 'Cancel run' }).click() - getByText('Mock ConfirmCancelModal') - getByText('Mock RunProgressMeter') + screen.getByRole('button', { name: 'Start run' }) + screen.queryByText(formatTimestamp(STARTED_AT)) + screen.queryByText('Protocol start') + screen.queryByText('Protocol end') + fireEvent.click(screen.getByRole('button', { name: 'Cancel run' })) + screen.getByText('Mock ConfirmCancelModal') + screen.getByText('Mock RunProgressMeter') }) it('calls trackProtocolRunEvent when start run button clicked', () => { - const [{ getByRole }] = render() + render() - const button = getByRole('button', { name: 'Start run' }) + const button = screen.getByRole('button', { name: 'Start run' }) fireEvent.click(button) expect(mockTrackProtocolRunEvent).toBeCalledTimes(1) expect(mockTrackProtocolRunEvent).toBeCalledWith({ @@ -434,7 +529,7 @@ describe('ProtocolRunHeader', () => { when(mockUseRunStatus) .calledWith(RUN_ID) .mockReturnValue(RUN_STATUS_STOPPED) - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID) .mockReturnValue({ data: { data: { ...mockIdleUnstartedRun, current: true } }, @@ -453,11 +548,11 @@ describe('ProtocolRunHeader', () => { .calledWith(ROBOT_NAME, RUN_ID) .mockReturnValue({ complete: false }) - const [{ getByRole, getByText }] = render() + render() - const button = getByRole('button', { name: 'Start run' }) + const button = screen.getByRole('button', { name: 'Start run' }) expect(button).toBeDisabled() - getByText('Complete required steps in Setup tab') + screen.getByText('Complete required steps in Setup tab') }) it('disables the Start Run button with tooltip if a module is missing', () => { @@ -468,10 +563,10 @@ describe('ProtocolRunHeader', () => { remainingAttachedModules: [], }) - const [{ getByRole, getByText }] = render() - const button = getByRole('button', { name: 'Start run' }) + render() + const button = screen.getByRole('button', { name: 'Start run' }) expect(button).toBeDisabled() - getByText('Complete required steps in Setup tab') + screen.getByText('Complete required steps in Setup tab') }) it('disables the Start Run button with tooltip if robot software update is available', () => { @@ -481,16 +576,34 @@ describe('ProtocolRunHeader', () => { updateFromFileDisabledReason: null, }) - const [{ getByRole, getByText }] = render() - const button = getByRole('button', { name: 'Start run' }) + render() + const button = screen.getByRole('button', { name: 'Start run' }) expect(button).toBeDisabled() - getByText( + screen.getByText( 'A software update is available for this robot. Update to run protocols.' ) }) + it('disables the Start Run button when a fixture is not configured or conflicted', () => { + mockUseDeckConfigurationCompatibility.mockReturnValue([ + { + cutoutId: 'cutoutA1', + cutoutFixtureId: STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, + requiredAddressableAreas: ['D4'], + compatibleCutoutFixtureIds: [ + STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, + ], + missingLabwareDisplayName: null, + }, + ]) + when(mockGetIsFixtureMismatch).mockReturnValue(true) + render() + const button = screen.getByRole('button', { name: 'Start run' }) + expect(button).toBeDisabled() + }) + it('renders a pause run button, start time, and end time when run is running, and calls trackProtocolRunEvent when button clicked', () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID) .mockReturnValue({ data: { data: mockRunningRun }, @@ -498,12 +611,12 @@ describe('ProtocolRunHeader', () => { when(mockUseRunStatus) .calledWith(RUN_ID) .mockReturnValue(RUN_STATUS_RUNNING) - const [{ getByRole, getByText }] = render() + render() - const button = getByRole('button', { name: 'Pause run' }) - getByText(formatTimestamp(STARTED_AT)) - getByText('Protocol start') - getByText('Protocol end') + const button = screen.getByRole('button', { name: 'Pause run' }) + screen.getByText(formatTimestamp(STARTED_AT)) + screen.getByText('Protocol start') + screen.getByText('Protocol end') fireEvent.click(button) expect(mockTrackProtocolRunEvent).toBeCalledWith({ name: ANALYTICS_PROTOCOL_RUN_PAUSE, @@ -511,7 +624,7 @@ describe('ProtocolRunHeader', () => { }) it('renders a cancel run button when running and shows a confirm cancel modal when clicked', () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID) .mockReturnValue({ data: { data: mockRunningRun }, @@ -519,27 +632,27 @@ describe('ProtocolRunHeader', () => { when(mockUseRunStatus) .calledWith(RUN_ID) .mockReturnValue(RUN_STATUS_RUNNING) - const [{ getByText, queryByText }] = render() + render() - expect(queryByText('Mock ConfirmCancelModal')).toBeFalsy() - const cancelButton = getByText('Cancel run') - cancelButton.click() - getByText('Mock ConfirmCancelModal') + expect(screen.queryByText('Mock ConfirmCancelModal')).toBeFalsy() + const cancelButton = screen.getByText('Cancel run') + fireEvent.click(cancelButton) + screen.getByText('Mock ConfirmCancelModal') }) it('renders a Resume Run button and Cancel Run button when paused and call trackProtocolRunEvent when resume button clicked', () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID) .mockReturnValue({ data: { data: mockPausedRun }, } as UseQueryResult) when(mockUseRunStatus).calledWith(RUN_ID).mockReturnValue(RUN_STATUS_PAUSED) - const [{ getByRole, getByText }] = render() + render() - const button = getByRole('button', { name: 'Resume run' }) - getByRole('button', { name: 'Cancel run' }) - getByText('Paused') + const button = screen.getByRole('button', { name: 'Resume run' }) + screen.getByRole('button', { name: 'Cancel run' }) + screen.getByText('Paused') fireEvent.click(button) expect(mockTrackProtocolRunEvent).toBeCalledWith({ name: ANALYTICS_PROTOCOL_RUN_RESUME, @@ -548,7 +661,7 @@ describe('ProtocolRunHeader', () => { }) it('renders a disabled Resume Run button and when pause requested', () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID) .mockReturnValue({ data: { data: mockPauseRequestedRun }, @@ -557,16 +670,16 @@ describe('ProtocolRunHeader', () => { .calledWith(RUN_ID) .mockReturnValue(RUN_STATUS_PAUSE_REQUESTED) - const [{ getByRole, getByText }] = render() + render() - const button = getByRole('button', { name: 'Resume run' }) + const button = screen.getByRole('button', { name: 'Resume run' }) expect(button).toBeDisabled() - getByRole('button', { name: 'Cancel run' }) - getByText('Pause requested') + screen.getByRole('button', { name: 'Cancel run' }) + screen.getByText('Pause requested') }) it('renders a disabled Canceling Run button and when stop requested', () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID) .mockReturnValue({ data: { data: mockStopRequestedRun }, @@ -575,15 +688,37 @@ describe('ProtocolRunHeader', () => { .calledWith(RUN_ID) .mockReturnValue(RUN_STATUS_STOP_REQUESTED) - const [{ getByRole, getByText }] = render() + render() + + const button = screen.getByRole('button', { name: 'Canceling Run' }) + expect(button).toBeDisabled() + screen.getByText('Stop requested') + }) + + it('renders a disabled button and when the robot door is open', () => { + when(mockUseNotifyRunQuery) + .calledWith(RUN_ID) + .mockReturnValue({ + data: { data: mockRunningRun }, + } as UseQueryResult) + when(mockUseRunStatus) + .calledWith(RUN_ID) + .mockReturnValue(RUN_STATUS_BLOCKED_BY_OPEN_DOOR) - const button = getByRole('button', { name: 'Canceling Run' }) + const mockOpenDoorStatus = { + data: { status: 'open', doorRequiredClosedForProtocol: true }, + } + mockUseDoorQuery.mockReturnValue({ data: mockOpenDoorStatus } as any) + + render() + + const button = screen.getByRole('button', { name: 'Resume run' }) expect(button).toBeDisabled() - getByText('Stop requested') + screen.getByText('Close robot door') }) it('renders a Run Again button and end time when run has stopped and calls trackProtocolRunEvent when run again button clicked', () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID) .mockReturnValue({ data: { data: mockStoppedRun }, @@ -598,11 +733,11 @@ describe('ProtocolRunHeader', () => { completedAt: COMPLETED_AT, }) - const [{ getByText }] = render() + render() - const button = getByText('Run again') - getByText('Canceled') - getByText(formatTimestamp(COMPLETED_AT)) + const button = screen.getByText('Run again') + screen.getByText('Canceled') + screen.getByText(formatTimestamp(COMPLETED_AT)) fireEvent.click(button) expect(mockTrackProtocolRunEvent).toBeCalledWith({ name: ANALYTICS_PROTOCOL_RUN_AGAIN, @@ -610,7 +745,7 @@ describe('ProtocolRunHeader', () => { }) it('renders a Run Again button and end time when run has failed and calls trackProtocolRunEvent when run again button clicked', () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID) .mockReturnValue({ data: { data: mockFailedRun }, @@ -623,11 +758,11 @@ describe('ProtocolRunHeader', () => { completedAt: COMPLETED_AT, }) - const [{ getByText }] = render() + render() - const button = getByText('Run again') - getByText('Failed') - getByText(formatTimestamp(COMPLETED_AT)) + const button = screen.getByText('Run again') + screen.getByText('Failed') + screen.getByText(formatTimestamp(COMPLETED_AT)) fireEvent.click(button) expect(mockTrackProtocolRunEvent).toBeCalledWith({ name: ANALYTICS_PROTOCOL_RUN_AGAIN, @@ -635,7 +770,7 @@ describe('ProtocolRunHeader', () => { }) it('renders a Run Again button and end time when run has succeeded and calls trackProtocolRunEvent when run again button clicked', () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID) .mockReturnValue({ data: { data: mockSucceededRun }, @@ -650,11 +785,11 @@ describe('ProtocolRunHeader', () => { completedAt: COMPLETED_AT, }) - const [{ getByText }] = render() + render() - const button = getByText('Run again') - getByText('Completed') - getByText(formatTimestamp(COMPLETED_AT)) + const button = screen.getByText('Run again') + screen.getByText('Completed') + screen.getByText(formatTimestamp(COMPLETED_AT)) fireEvent.click(button) expect(mockTrackEvent).toBeCalledWith({ name: ANALYTICS_PROTOCOL_PROCEED_TO_RUN, @@ -666,7 +801,7 @@ describe('ProtocolRunHeader', () => { }) it('disables the Run Again button with tooltip for a completed run if the robot is busy', () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID) .mockReturnValue({ data: { data: mockSucceededRun }, @@ -682,48 +817,72 @@ describe('ProtocolRunHeader', () => { }) when(mockUseCurrentRunId).calledWith().mockReturnValue('some other run id') - const [{ getByRole, getByText }] = render() + render() - const button = getByRole('button', { name: 'Run again' }) + const button = screen.getByRole('button', { name: 'Run again' }) expect(button).toBeDisabled() - getByText('Robot is busy') + screen.getByText('Robot is busy') }) it('renders an alert when the robot door is open', () => { when(mockUseRunStatus) .calledWith(RUN_ID) .mockReturnValue(RUN_STATUS_BLOCKED_BY_OPEN_DOOR) - const [{ getByText }] = render() + render() - getByText('Close robot door to resume run') + screen.getByText('Close robot door to resume run') }) it('renders a error detail link banner when run has failed', () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID) .mockReturnValue({ data: { data: mockFailedRun }, } as UseQueryResult) when(mockUseRunStatus).calledWith(RUN_ID).mockReturnValue(RUN_STATUS_FAILED) - const [{ getByText }] = render() + render() - getByText('View error').click() + fireEvent.click(screen.getByText('View error')) expect(mockCloseCurrentRun).toBeCalled() - getByText('mock RunFailedModal') + screen.getByText('mock RunFailedModal') + }) + + it('does not render banners when a run is resetting', () => { + when(mockUseNotifyRunQuery) + .calledWith(RUN_ID) + .mockReturnValue({ + data: { data: mockFailedRun }, + } as UseQueryResult) + when(mockUseRunStatus).calledWith(RUN_ID).mockReturnValue(RUN_STATUS_FAILED) + when(mockUseRunControls) + .calledWith(RUN_ID, expect.anything()) + .mockReturnValue({ + play: () => {}, + pause: () => {}, + stop: () => {}, + reset: () => {}, + isPlayRunActionLoading: false, + isPauseRunActionLoading: false, + isStopRunActionLoading: false, + isResetRunLoading: true, + }) + render() + + expect(screen.queryByText('mock RunFailedModal')).not.toBeInTheDocument() }) it('renders a clear protocol banner when run has been canceled', () => { when(mockUseRunStatus) .calledWith(RUN_ID) .mockReturnValue(RUN_STATUS_STOPPED) - const [{ queryByTestId, getByText }] = render() + render() - getByText('Run canceled.') - expect(queryByTestId('Banner_close-button')).not.toBeInTheDocument() + screen.getByText('Run canceled.') + expect(screen.queryByTestId('Banner_close-button')).not.toBeInTheDocument() }) it('renders a clear protocol banner when run has succeeded', () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID) .mockReturnValue({ data: { data: mockSucceededRun }, @@ -731,23 +890,25 @@ describe('ProtocolRunHeader', () => { when(mockUseRunStatus) .calledWith(RUN_ID) .mockReturnValue(RUN_STATUS_SUCCEEDED) - const [{ getByTestId, getByText }] = render() + render() - getByText('Run completed.') - getByTestId('Banner_close-button').click() + screen.getByText('Run completed.') + fireEvent.click(screen.getByTestId('Banner_close-button')) expect(mockCloseCurrentRun).toBeCalled() }) - it('if a heater shaker is shaking, clicking on start run should render HeaterShakerIsRunningModal', () => { + it('if a heater shaker is shaking, clicking on start run should render HeaterShakerIsRunningModal', async () => { when(mockUseRunStatus).calledWith(RUN_ID).mockReturnValue(RUN_STATUS_IDLE) mockUseIsHeaterShakerInProtocol.mockReturnValue(true) mockUseModulesQuery.mockReturnValue({ data: { data: [mockMovingHeaterShaker] }, } as any) - const [{ getByRole, getByText }] = render() - const button = getByRole('button', { name: 'Start run' }) + render() + const button = screen.getByRole('button', { name: 'Start run' }) fireEvent.click(button) - getByText('Mock HeaterShakerIsRunningModal') + await waitFor(() => { + screen.getByText('Mock HeaterShakerIsRunningModal') + }) }) it('does not render the confirm attachment modal when there is a heater shaker in the protocol and run is idle', () => { @@ -755,11 +916,11 @@ describe('ProtocolRunHeader', () => { data: { data: [mockHeaterShaker] }, } as any) mockUseIsHeaterShakerInProtocol.mockReturnValue(true) - const [{ getByText, getByRole }] = render() + render() - const button = getByRole('button', { name: 'Start run' }) + const button = screen.getByRole('button', { name: 'Start run' }) fireEvent.click(button) - getByText('mock confirm attachment modal') + screen.getByText('mock confirm attachment modal') expect(mockTrackProtocolRunEvent).toBeCalledTimes(0) }) @@ -770,11 +931,11 @@ describe('ProtocolRunHeader', () => { data: { data: [mockHeaterShaker] }, } as any) mockUseIsHeaterShakerInProtocol.mockReturnValue(true) - const [{ queryByText, getByRole }] = render() + render() - const button = getByRole('button', { name: 'Resume run' }) + const button = screen.getByRole('button', { name: 'Resume run' }) fireEvent.click(button) - expect(queryByText('mock confirm attachment modal')).toBeFalsy() + expect(screen.queryByText('mock confirm attachment modal')).toBeFalsy() expect(mockTrackProtocolRunEvent).toBeCalledTimes(1) }) @@ -784,8 +945,8 @@ describe('ProtocolRunHeader', () => { data: { data: [mockHeaterShaker] }, } as any) mockUseIsHeaterShakerInProtocol.mockReturnValue(true) - const [{ getByRole }] = render() - const button = getByRole('button', { name: 'Start run' }) + render() + const button = screen.getByRole('button', { name: 'Start run' }) fireEvent.click(button) expect(mockUseRunControls).toHaveBeenCalled() }) @@ -803,8 +964,8 @@ describe('ProtocolRunHeader', () => { }, ], }) - const [{ getByText }] = render() - getByText('protocol analysis error') + render() + screen.getByText('protocol analysis error') }) it('renders analysis error banner if there is an analysis error', () => { @@ -820,19 +981,20 @@ describe('ProtocolRunHeader', () => { }, ], }) - const [{ getByText }] = render() - getByText('Protocol analysis failed.') + render() + screen.getByText('Protocol analysis failed.') }) it('renders the devices page when robot is not viewable but protocol is loaded', async () => { mockUseIsRobotViewable.mockReturnValue(false) - waitFor(() => { + render() + await waitFor(() => { expect(mockPush).toHaveBeenCalledWith('/devices') }) }) it('renders banner with spinner if currently closing current run', async () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID) .mockReturnValue({ data: { data: mockSucceededRun }, @@ -844,17 +1006,85 @@ describe('ProtocolRunHeader', () => { isClosingCurrentRun: true, closeCurrentRun: mockCloseCurrentRun, }) - const [{ getByText, getByLabelText }] = render() - getByText('Run completed.') - getByLabelText('ot-spinner') + render() + screen.getByText('Run completed.') + screen.getByLabelText('ot-spinner') }) - it('renders banner when the robot door is open', () => { + it('renders door close banner when the robot door is open', () => { const mockOpenDoorStatus = { data: { status: 'open', doorRequiredClosedForProtocol: true }, } mockUseDoorQuery.mockReturnValue({ data: mockOpenDoorStatus } as any) - const [{ getByText }] = render() - getByText('Close the robot door before starting the run.') + render() + screen.getByText('Close the robot door before starting the run.') + }) + + it('should render door close banner when door is open and enabled safety door switch is on - OT-2', () => { + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(false) + const mockOpenDoorStatus = { + data: { status: 'open', doorRequiredClosedForProtocol: true }, + } + mockUseDoorQuery.mockReturnValue({ data: mockOpenDoorStatus } as any) + render() + screen.getByText('Close the robot door before starting the run.') + }) + + it('should not render door close banner when door is open and enabled safety door switch is off - OT-2', () => { + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(false) + const mockOffSettings = { ...mockSettings, value: false } + mockGetRobotSettings.mockReturnValue([mockOffSettings]) + const mockOpenDoorStatus = { + data: { status: 'open', doorRequiredClosedForProtocol: true }, + } + mockUseDoorQuery.mockReturnValue({ data: mockOpenDoorStatus } as any) + render() + expect( + screen.queryByText('Close the robot door before starting the run.') + ).not.toBeInTheDocument() + }) + + it('renders the drop tip banner when the run is over and a pipette has a tip attached and is a flex', async () => { + when(mockUseNotifyRunQuery) + .calledWith(RUN_ID) + .mockReturnValue({ + data: { + data: { + ...mockIdleUnstartedRun, + current: true, + status: RUN_STATUS_SUCCEEDED, + }, + }, + } as UseQueryResult) + when(mockUseRunStatus) + .calledWith(RUN_ID) + .mockReturnValue(RUN_STATUS_SUCCEEDED) + + render() + await waitFor(() => { + screen.getByText('Tips may be attached.') + }) + }) + + it('does not render the drop tip banner when the run is not over', async () => { + when(mockUseNotifyRunQuery) + .calledWith(RUN_ID) + .mockReturnValue({ + data: { + data: { + ...mockIdleUnstartedRun, + current: true, + status: RUN_STATUS_IDLE, + }, + }, + } as UseQueryResult) + when(mockUseRunStatus).calledWith(RUN_ID).mockReturnValue(RUN_STATUS_IDLE) + + render() + await waitFor(() => { + expect( + screen.queryByText('Tips may be attached.') + ).not.toBeInTheDocument() + }) }) }) diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunModuleControls.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunModuleControls.test.tsx index b4d2be4862f..28bcd5617ce 100644 --- a/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunModuleControls.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunModuleControls.test.tsx @@ -2,25 +2,17 @@ import * as React from 'react' import { resetAllWhenMocks, when } from 'jest-when' import { i18n } from '../../../../i18n' import { renderWithProviders } from '@opentrons/components' -import { - CompletedProtocolAnalysis, - ModuleModel, - ModuleType, -} from '@opentrons/shared-data' +import { ModuleModel, ModuleType } from '@opentrons/shared-data' import { useInstrumentsQuery } from '@opentrons/react-api-client' import { ProtocolRunModuleControls } from '../ProtocolRunModuleControls' import { ModuleCard } from '../../../ModuleCard' -import { - useModuleRenderInfoForProtocolById, - useProtocolDetailsForRun, -} from '../../hooks' +import { useModuleRenderInfoForProtocolById } from '../../hooks' import { mockMagneticModuleGen2, mockTemperatureModuleGen2, mockThermocycler, mockHeaterShaker, } from '../../../../redux/modules/__fixtures__' -import fixtureAnalysis from '../../../../organisms/RunDetails/__fixtures__/analysis.json' jest.mock('@opentrons/react-api-client') jest.mock('../../../ModuleCard') @@ -30,16 +22,10 @@ const mockModuleCard = ModuleCard as jest.MockedFunction const mockUseModuleRenderInfoForProtocolById = useModuleRenderInfoForProtocolById as jest.MockedFunction< typeof useModuleRenderInfoForProtocolById > -const mockUseProtocolDetailsForRun = useProtocolDetailsForRun as jest.MockedFunction< - typeof useProtocolDetailsForRun -> const mockUseInstrumentsQuery = useInstrumentsQuery as jest.MockedFunction< typeof useInstrumentsQuery > -const _fixtureAnalysis = (fixtureAnalysis as unknown) as CompletedProtocolAnalysis - -const ROBOT_NAME = 'otie' const RUN_ID = 'test123' const mockTempMod = { @@ -79,12 +65,6 @@ const render = ( describe('ProtocolRunModuleControls', () => { beforeEach(() => { - when(mockUseProtocolDetailsForRun).calledWith(RUN_ID).mockReturnValue({ - protocolData: _fixtureAnalysis, - displayName: 'mock display name', - protocolKey: 'fakeProtocolKey', - robotType: 'OT-2 Standard', - }) when(mockUseInstrumentsQuery).mockReturnValue({ data: { data: [] }, } as any) @@ -97,7 +77,7 @@ describe('ProtocolRunModuleControls', () => { it('renders a magnetic module card', () => { when(mockUseModuleRenderInfoForProtocolById) - .calledWith(ROBOT_NAME, RUN_ID) + .calledWith(RUN_ID) .mockReturnValue({ [mockMagMod.moduleId]: { moduleId: 'magModModuleId', @@ -122,7 +102,7 @@ describe('ProtocolRunModuleControls', () => { it('renders a temperature module card', () => { when(mockUseModuleRenderInfoForProtocolById) - .calledWith(ROBOT_NAME, RUN_ID) + .calledWith(RUN_ID) .mockReturnValue({ [mockTempMod.moduleId]: { moduleId: 'temperatureModuleId', @@ -149,7 +129,7 @@ describe('ProtocolRunModuleControls', () => { it('renders a thermocycler module card', () => { when(mockUseModuleRenderInfoForProtocolById) - .calledWith(ROBOT_NAME, RUN_ID) + .calledWith(RUN_ID) .mockReturnValue({ [mockTCModule.moduleId]: { moduleId: mockTCModule.moduleId, @@ -178,7 +158,7 @@ describe('ProtocolRunModuleControls', () => { it('renders a heater-shaker module card', () => { when(mockUseModuleRenderInfoForProtocolById) - .calledWith(ROBOT_NAME, RUN_ID) + .calledWith(RUN_ID) .mockReturnValue({ [mockHeaterShakerDef.moduleId]: { moduleId: 'heaterShakerModuleId', @@ -206,7 +186,7 @@ describe('ProtocolRunModuleControls', () => { it('renders correct text when module is not attached but required for protocol', () => { when(mockUseModuleRenderInfoForProtocolById) - .calledWith(ROBOT_NAME, RUN_ID) + .calledWith(RUN_ID) .mockReturnValue({ [mockHeaterShakerDef.moduleId]: { moduleId: 'heaterShakerModuleId', diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunSetup.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunSetup.test.tsx index 2f5dd0b115c..3bd3670677e 100644 --- a/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunSetup.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunSetup.test.tsx @@ -1,47 +1,63 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' +import { fireEvent, screen } from '@testing-library/react' -import { parseAllRequiredModuleModels } from '@opentrons/api-client' +import { + parseAllRequiredModuleModels, + parseLiquidsInLoadOrder, +} from '@opentrons/api-client' import { partialComponentPropsMatcher, renderWithProviders, } from '@opentrons/components' import { + getSimplestDeckConfigForProtocol, ProtocolAnalysisOutput, - protocolHasLiquids, + STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, } from '@opentrons/shared-data' import noModulesProtocol from '@opentrons/shared-data/protocol/fixtures/4/simpleV4.json' import withModulesProtocol from '@opentrons/shared-data/protocol/fixtures/4/testModulesProtocol.json' import { i18n } from '../../../../i18n' import { mockConnectedRobot } from '../../../../redux/discovery/__fixtures__' +import { + getIsFixtureMismatch, + getRequiredDeckConfig, +} from '../../../../resources/deck_configuration/utils' import { useMostRecentCompletedAnalysis } from '../../../LabwarePositionCheck/useMostRecentCompletedAnalysis' +import { useDeckConfigurationCompatibility } from '../../../../resources/deck_configuration/hooks' import { - useIsOT3, + useIsFlex, + useModuleCalibrationStatus, + useProtocolAnalysisErrors, useRobot, useRunCalibrationStatus, useRunHasStarted, - useProtocolAnalysisErrors, useStoredProtocolAnalysis, + useUnmatchedModulesForProtocol, } from '../../hooks' import { SetupLabware } from '../SetupLabware' import { SetupRobotCalibration } from '../SetupRobotCalibration' import { SetupLiquids } from '../SetupLiquids' -import { ProtocolRunSetup } from '../ProtocolRunSetup' -import { SetupModules } from '../SetupModules' +import { SetupModuleAndDeck } from '../SetupModuleAndDeck' import { EmptySetupStep } from '../EmptySetupStep' +import { ProtocolRunSetup } from '../ProtocolRunSetup' jest.mock('@opentrons/api-client') jest.mock('../../hooks') jest.mock('../SetupLabware') jest.mock('../SetupRobotCalibration') -jest.mock('../SetupModules') +jest.mock('../SetupModuleAndDeck') jest.mock('../SetupLiquids') jest.mock('../EmptySetupStep') jest.mock('../../../LabwarePositionCheck/useMostRecentCompletedAnalysis') jest.mock('@opentrons/shared-data/js/helpers/parseProtocolData') +jest.mock('@opentrons/shared-data/js/helpers/getSimplestFlexDeckConfig') +jest.mock('../../../../redux/config') +jest.mock('../../../../resources/deck_configuration/utils') +jest.mock('../../../../resources/deck_configuration/hooks') -const mockUseIsOT3 = useIsOT3 as jest.MockedFunction +const mockUseIsFlex = useIsFlex as jest.MockedFunction const mockUseMostRecentCompletedAnalysis = useMostRecentCompletedAnalysis as jest.MockedFunction< typeof useMostRecentCompletedAnalysis > @@ -52,6 +68,9 @@ const mockUseRobot = useRobot as jest.MockedFunction const mockUseRunCalibrationStatus = useRunCalibrationStatus as jest.MockedFunction< typeof useRunCalibrationStatus > +const mockUseModuleCalibrationStatus = useModuleCalibrationStatus as jest.MockedFunction< + typeof useModuleCalibrationStatus +> const mockUseRunHasStarted = useRunHasStarted as jest.MockedFunction< typeof useRunHasStarted > @@ -61,24 +80,39 @@ const mockUseStoredProtocolAnalysis = useStoredProtocolAnalysis as jest.MockedFu const mockParseAllRequiredModuleModels = parseAllRequiredModuleModels as jest.MockedFunction< typeof parseAllRequiredModuleModels > +const mockParseLiquidsInLoadOrder = parseLiquidsInLoadOrder as jest.MockedFunction< + typeof parseLiquidsInLoadOrder +> const mockSetupLabware = SetupLabware as jest.MockedFunction< typeof SetupLabware > const mockSetupRobotCalibration = SetupRobotCalibration as jest.MockedFunction< typeof SetupRobotCalibration > -const mockSetupModules = SetupModules as jest.MockedFunction< - typeof SetupModules +const mockSetupModuleAndDeck = SetupModuleAndDeck as jest.MockedFunction< + typeof SetupModuleAndDeck > const mockSetupLiquids = SetupLiquids as jest.MockedFunction< typeof SetupLiquids > -const mockProtocolHasLiquids = protocolHasLiquids as jest.MockedFunction< - typeof protocolHasLiquids -> const mockEmptySetupStep = EmptySetupStep as jest.MockedFunction< typeof EmptySetupStep > +const mockGetSimplestDeckConfigForProtocol = getSimplestDeckConfigForProtocol as jest.MockedFunction< + typeof getSimplestDeckConfigForProtocol +> +const mockGetRequiredDeckConfig = getRequiredDeckConfig as jest.MockedFunction< + typeof getRequiredDeckConfig +> +const mockUseUnmatchedModulesForProtocol = useUnmatchedModulesForProtocol as jest.MockedFunction< + typeof useUnmatchedModulesForProtocol +> +const mockUseDeckConfigurationCompatibility = useDeckConfigurationCompatibility as jest.MockedFunction< + typeof useDeckConfigurationCompatibility +> +const mockGetIsFixtureMismatch = getIsFixtureMismatch as jest.MockedFunction< + typeof getIsFixtureMismatch +> const ROBOT_NAME = 'otie' const RUN_ID = '1' @@ -98,7 +132,7 @@ const render = () => { describe('ProtocolRunSetup', () => { beforeEach(() => { - when(mockUseIsOT3).calledWith(ROBOT_NAME).mockReturnValue(false) + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(false) when(mockUseMostRecentCompletedAnalysis) .calledWith(RUN_ID) .mockReturnValue({ @@ -115,6 +149,7 @@ describe('ProtocolRunSetup', () => { ...MOCK_ROTOCOL_LIQUID_KEY, } as unknown) as ProtocolAnalysisOutput) when(mockParseAllRequiredModuleModels).mockReturnValue([]) + when(mockParseLiquidsInLoadOrder).mockReturnValue([]) when(mockUseRobot) .calledWith(ROBOT_NAME) .mockReturnValue(mockConnectedRobot) @@ -139,9 +174,16 @@ describe('ProtocolRunSetup', () => { }) ) .mockReturnValue(Mock SetupLabware) - when(mockSetupModules).mockReturnValue(
Mock SetupModules
) + when(mockSetupModuleAndDeck).mockReturnValue(
Mock SetupModules
) when(mockSetupLiquids).mockReturnValue(
Mock SetupLiquids
) when(mockEmptySetupStep).mockReturnValue(
Mock EmptySetupStep
) + when(mockGetSimplestDeckConfigForProtocol).mockReturnValue([]) + when(mockUseDeckConfigurationCompatibility).mockReturnValue([]) + when(mockGetRequiredDeckConfig).mockReturnValue([]) + when(mockUseUnmatchedModulesForProtocol) + .calledWith(ROBOT_NAME, RUN_ID) + .mockReturnValue({ missingModuleIds: [], remainingAttachedModules: [] }) + when(mockGetIsFixtureMismatch).mockReturnValue(false) }) afterEach(() => { resetAllWhenMocks() @@ -150,7 +192,7 @@ describe('ProtocolRunSetup', () => { it('renders null if robot is null', () => { when(mockUseRobot).calledWith(ROBOT_NAME).mockReturnValue(null) const { container } = render() - expect(container.firstChild).toBeNull() + expect(container).toBeEmptyDOMElement() }) it('renders loading data message if robot-analyzed and app-analyzed protocol data is null', () => { @@ -158,98 +200,80 @@ describe('ProtocolRunSetup', () => { .calledWith(RUN_ID) .mockReturnValue(null) when(mockUseStoredProtocolAnalysis).calledWith(RUN_ID).mockReturnValue(null) - const { getByText } = render() - getByText('Loading data...') + render() + screen.getByText('Loading data...') }) it('renders calibration ready when robot calibration complete', () => { - const { getByText } = render() - getByText('Calibration ready') + render() + screen.getByText('Calibration ready') }) it('renders calibration needed when robot calibration not complete', () => { when(mockUseRunCalibrationStatus) .calledWith(ROBOT_NAME, RUN_ID) .mockReturnValue({ complete: false }) - const { getByText } = render() - getByText('Calibration needed') + render() + screen.getByText('Calibration needed') }) it('does not render calibration status when run has started', () => { when(mockUseRunHasStarted).calledWith(RUN_ID).mockReturnValue(true) - const { queryByText } = render() - expect(queryByText('Calibration needed')).toBeNull() - expect(queryByText('Calibration ready')).toBeNull() + render() + expect(screen.queryByText('Calibration needed')).toBeNull() + expect(screen.queryByText('Calibration ready')).toBeNull() }) describe('when no modules are in the protocol', () => { it('renders robot calibration setup for OT-2', () => { - const { getByText } = render() + render() - getByText( + screen.getByText( 'Review required pipettes and tip length calibrations for this protocol.' ) - const robotCalibrationSetup = getByText('Instruments') - robotCalibrationSetup.click() - expect(getByText('Mock SetupRobotCalibration')).toBeVisible() + const robotCalibrationSetup = screen.getByText('Instruments') + fireEvent.click(robotCalibrationSetup) + expect(screen.getByText('Mock SetupRobotCalibration')).toBeVisible() }) - it('renders robot calibration setup for OT-3', () => { - when(mockUseIsOT3).calledWith(ROBOT_NAME).mockReturnValue(true) - const { getByText } = render() + it('renders robot calibration setup for Flex', () => { + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(true) + render() - getByText( + screen.getByText( 'Review required instruments and calibrations for this protocol.' ) - const robotCalibrationSetup = getByText('Instruments') - robotCalibrationSetup.click() - expect(getByText('Mock SetupRobotCalibration')).toBeVisible() + const robotCalibrationSetup = screen.getByText('Instruments') + fireEvent.click(robotCalibrationSetup) + expect(screen.getByText('Mock SetupRobotCalibration')).toBeVisible() }) it('renders labware setup', () => { - const { getByText } = render() + render() - getByText( + screen.getByText( 'Gather the following labware and full tip racks. To run your protocol without Labware Position Check, place and secure labware in their initial locations.' ) - const labwareSetup = getByText('Labware') - labwareSetup.click() - expect(getByText('Mock SetupLabware')).toBeVisible() + const labwareSetup = screen.getByText('Labware') + fireEvent.click(labwareSetup) + expect(screen.getByText('Mock SetupLabware')).toBeVisible() }) it('renders the empty states for modules and liquids when no modules in protocol', () => { - const { getAllByText } = render() - getAllByText('Mock EmptySetupStep') + render() + screen.getAllByText('Mock EmptySetupStep') }) it('defaults to no step expanded', () => { - const { getByText } = render() - expect(getByText('Mock SetupLabware')).not.toBeVisible() + render() + expect(screen.getByText('Mock SetupLabware')).not.toBeVisible() }) it('renders view-only info message if run has started', async () => { when(mockUseRunHasStarted).calledWith(RUN_ID).mockReturnValue(true) - const { getByText } = render() + render() await new Promise(resolve => setTimeout(resolve, 1000)) - expect(getByText('Mock SetupRobotCalibration')).not.toBeVisible() - expect(getByText('Mock SetupLabware')).not.toBeVisible() - getByText('Setup is view-only once run has started') - }) - }) - - describe('when liquids are in the protocol', () => { - it('renders correct text for liquids', () => { - when(mockUseMostRecentCompletedAnalysis) - .calledWith(RUN_ID) - .mockReturnValue({ - ...noModulesProtocol, - liquids: [{ displayName: 'water', description: 'liquid H2O' }], - } as any) - mockProtocolHasLiquids.mockReturnValue(true) - - const { getByText } = render() - getByText('STEP 5') - getByText('Liquids') - getByText('View liquid starting locations and volumes') - getByText('Mock SetupLiquids') + expect(screen.getByText('Mock SetupRobotCalibration')).not.toBeVisible() + expect(screen.getByText('Mock SetupLabware')).not.toBeVisible() + screen.getByText('Setup is view-only once run has started') }) }) @@ -266,34 +290,118 @@ describe('ProtocolRunSetup', () => { ...MOCK_ROTOCOL_LIQUID_KEY, } as any) when(mockUseRunHasStarted).calledWith(RUN_ID).mockReturnValue(false) + when(mockUseModuleCalibrationStatus) + .calledWith(ROBOT_NAME, RUN_ID) + .mockReturnValue({ complete: true }) }) afterEach(() => { resetAllWhenMocks() }) + it('renders calibration ready if robot is Flex and modules are calibrated', () => { + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(true) + when(mockUseModuleCalibrationStatus) + .calledWith(ROBOT_NAME, RUN_ID) + .mockReturnValue({ complete: true }) + + render() + expect(screen.getAllByText('Calibration ready').length).toEqual(2) + }) + + it('renders calibration needed if robot is Flex and modules are not calibrated', () => { + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(true) + when(mockUseModuleCalibrationStatus) + .calledWith(ROBOT_NAME, RUN_ID) + .mockReturnValue({ complete: false }) + + render() + screen.getByText('STEP 2') + screen.getByText('Modules & deck') + screen.getByText('Calibration needed') + }) + + it('does not render calibration element if robot is OT-2', () => { + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(false) + + render() + expect(screen.getAllByText('Calibration ready').length).toEqual(1) + }) + + it('renders action needed if robot is Flex and modules are not connected', () => { + when(mockUseUnmatchedModulesForProtocol) + .calledWith(ROBOT_NAME, RUN_ID) + .mockReturnValue({ + missingModuleIds: ['temperatureModuleV1'], + remainingAttachedModules: [], + }) + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(true) + when(mockUseModuleCalibrationStatus) + .calledWith(ROBOT_NAME, RUN_ID) + .mockReturnValue({ complete: false }) + + render() + screen.getByText('STEP 2') + screen.getByText('Modules & deck') + screen.getByText('Action needed') + }) + + it('renders action needed if robot is Flex and deck config is not configured', () => { + mockUseDeckConfigurationCompatibility.mockReturnValue([ + { + cutoutId: 'cutoutA1', + cutoutFixtureId: STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, + requiredAddressableAreas: ['D4'], + compatibleCutoutFixtureIds: [ + STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, + ], + missingLabwareDisplayName: null, + }, + ]) + when(mockGetRequiredDeckConfig).mockReturnValue([ + { + cutoutId: 'cutoutA1', + cutoutFixtureId: STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, + requiredAddressableAreas: ['D4'], + compatibleCutoutFixtureIds: [ + STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, + ], + }, + ] as any) + when(mockGetIsFixtureMismatch).mockReturnValue(true) + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(true) + when(mockUseModuleCalibrationStatus) + .calledWith(ROBOT_NAME, RUN_ID) + .mockReturnValue({ complete: false }) + + render() + screen.getByText('STEP 2') + screen.getByText('Modules & deck') + screen.getByText('Action needed') + }) + it('renders module setup and allows the user to proceed to labware setup', () => { - const { getByText } = render() - const moduleSetup = getByText('Modules') - moduleSetup.click() - getByText('Mock SetupModules') + render() + const moduleSetup = screen.getByText('Modules') + fireEvent.click(moduleSetup) + screen.getByText('Mock SetupModules') }) it('renders correct text contents for multiple modules', () => { - const { getByText } = render() + render() - getByText('STEP 1') - getByText('Instruments') - getByText( + screen.getByText('STEP 1') + screen.getByText('Instruments') + screen.getByText( 'Review required pipettes and tip length calibrations for this protocol.' ) - getByText('STEP 2') - getByText('Modules') + screen.getByText('STEP 2') + screen.getByText('Modules') - getByText('Install the required modules and power them on.') - getByText('STEP 3') - getByText('Labware') + screen.getByText('Install the required modules and power them on.') + screen.getByText('STEP 3') + screen.getByText('Labware') - getByText( + screen.getByText( 'Gather the following labware and full tip racks. To run your protocol without Labware Position Check, place and secure labware in their initial locations.' ) }) @@ -315,32 +423,60 @@ describe('ProtocolRunSetup', () => { when(mockParseAllRequiredModuleModels).mockReturnValue([ 'magneticModuleV1', ]) - const { getByText } = render() + render() - getByText('STEP 1') - getByText('Instruments') - getByText( + screen.getByText('STEP 1') + screen.getByText('Instruments') + screen.getByText( 'Review required pipettes and tip length calibrations for this protocol.' ) - getByText('STEP 2') - getByText('Modules') + screen.getByText('STEP 2') + screen.getByText('Modules') - getByText('Install the required modules and power them on.') - getByText('STEP 3') - getByText('Labware') - getByText( + screen.getByText('Install the required modules and power them on.') + screen.getByText('STEP 3') + screen.getByText('Labware') + screen.getByText( 'Gather the following labware and full tip racks. To run your protocol without Labware Position Check, place and secure labware in their initial locations.' ) }) + + it('renders correct text contents for modules and fixtures', () => { + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(true) + when(mockUseMostRecentCompletedAnalysis) + .calledWith(RUN_ID) + .mockReturnValue({ + ...withModulesProtocol, + ...MOCK_ROTOCOL_LIQUID_KEY, + modules: [ + { + id: '1d57adf0-67ad-11ea-9f8b-3b50068bd62d:magneticModuleType', + location: { slot: '1' }, + model: 'magneticModuleV1', + }, + ], + } as any) + when(mockParseAllRequiredModuleModels).mockReturnValue([ + 'magneticModuleV1', + ]) + render() + + screen.getByText('STEP 2') + screen.getByText('Modules & deck') + screen.getByText( + 'Install the required modules and power them on. Install the required fixtures and review the deck configuration.' + ) + }) + it('renders view-only info message if run has started', async () => { when(mockUseRunHasStarted).calledWith(RUN_ID).mockReturnValue(true) - const { getByText } = render() + render() await new Promise(resolve => setTimeout(resolve, 1000)) - expect(getByText('Mock SetupRobotCalibration')).not.toBeVisible() - expect(getByText('Mock SetupModules')).not.toBeVisible() - expect(getByText('Mock SetupLabware')).not.toBeVisible() - getByText('Setup is view-only once run has started') + expect(screen.getByText('Mock SetupRobotCalibration')).not.toBeVisible() + expect(screen.getByText('Mock SetupModules')).not.toBeVisible() + expect(screen.getByText('Mock SetupLabware')).not.toBeVisible() + screen.getByText('Setup is view-only once run has started') }) it('renders analysis error message if there is an analysis error', async () => { @@ -356,8 +492,8 @@ describe('ProtocolRunSetup', () => { }, ], }) - const { getByText } = render() - getByText('Protocol analysis failed') + render() + screen.getByText('Protocol analysis failed') }) }) }) diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/RunFailedModal.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/RunFailedModal.test.tsx index b8cd04943e1..9264c54eba2 100644 --- a/app/src/organisms/Devices/ProtocolRun/__tests__/RunFailedModal.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/RunFailedModal.test.tsx @@ -7,6 +7,7 @@ import { useDownloadRunLog } from '../../hooks' import { RunFailedModal } from '../RunFailedModal' import type { RunError } from '@opentrons/api-client' +import { fireEvent, screen } from '@testing-library/react' jest.mock('../../hooks') @@ -53,32 +54,32 @@ describe('RunFailedModal - DesktopApp', () => { }) it('should render text, link and button', () => { - const [{ getByText, getByRole }] = render(props) - getByText('Run failed') - getByText('Error 4000: ModuleNotAttachedError') - getByText('No available thermocyclerModuleV2 found.') - getByText( + render(props) + screen.getByText('Run failed') + screen.getByText('Error 4000: ModuleNotAttachedError') + screen.getByText('No available thermocyclerModuleV2 found.') + screen.getByText( 'Download the run log and send it to support@opentrons.com for assistance.' ) - getByText('Download Run Log') - getByRole('button', { name: 'Close' }) + screen.getByText('Download Run Log') + screen.getByRole('button', { name: 'Close' }) }) it('should call a mock function when clicking close button', () => { - const [{ getByRole }] = render(props) - getByRole('button', { name: 'Close' }).click() + render(props) + fireEvent.click(screen.getByRole('button', { name: 'Close' })) expect(props.setShowRunFailedModal).toHaveBeenCalled() }) it('should close the modal when clicking close icon', () => { - const [{ getByRole }] = render(props) - getByRole('button', { name: '' }).click() + render(props) + fireEvent.click(screen.getByRole('button', { name: '' })) expect(props.setShowRunFailedModal).toHaveBeenCalled() }) it('should call a mock function when clicking download run log button', () => { - const [{ getByText }] = render(props) - getByText('Download Run Log').click() + render(props) + fireEvent.click(screen.getByText('Download Run Log')) expect(mockUseDownloadRunLog).toHaveBeenCalled() }) }) diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/SetupCalibrationItem.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/SetupCalibrationItem.test.tsx index 78e2e6eae00..338f03ff82e 100644 --- a/app/src/organisms/Devices/ProtocolRun/__tests__/SetupCalibrationItem.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/SetupCalibrationItem.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import '@testing-library/jest-dom' +import { screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../../i18n' @@ -45,27 +45,27 @@ describe('SetupCalibrationItem', () => { }) it('renders all nodes with prop contents', () => { - const { getByRole, getByText } = render({ subText: 'stub subtext' }) - getByText('stub title') - getByText('stub subtext') - getByRole('button', { name: 'stub button' }) + render({ subText: 'stub subtext' }) + screen.getByText('stub title') + screen.getByText('stub subtext') + screen.getByRole('button', { name: 'stub button' }) }) it('renders calibrated date if there is no subtext', () => { when(mockFormatTimestamp) .calledWith('Thursday, September 9, 2021') .mockReturnValue('09/09/2021 00:00:00') - const { getByText } = render({ + render({ calibratedDate: 'Thursday, September 9, 2021', }) - getByText('Last calibrated: 09/09/2021 00:00:00') + screen.getByText('Last calibrated: 09/09/2021 00:00:00') }) it('renders not calibrated if there is no subtext or cal date', () => { - const { getByText } = render() - getByText('Not calibrated yet') + render() + screen.getByText('Not calibrated yet') }) it('renders calibration data not available if run has started', () => { when(mockUseRunHasStarted).calledWith(RUN_ID).mockReturnValue(true) - const { getByText } = render() - getByText('Calibration data not available once run has started') + render() + screen.getByText('Calibration data not available once run has started') }) }) diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/SetupFlexPipetteCalibrationItem.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/SetupFlexPipetteCalibrationItem.test.tsx index a59e8622b74..e7f439e2f3b 100644 --- a/app/src/organisms/Devices/ProtocolRun/__tests__/SetupFlexPipetteCalibrationItem.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/SetupFlexPipetteCalibrationItem.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { resetAllWhenMocks } from 'jest-when' import { MemoryRouter } from 'react-router-dom' -import { fireEvent } from '@testing-library/dom' +import { fireEvent } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { useInstrumentsQuery } from '@opentrons/react-api-client' diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/SetupRobotCalibration.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/SetupRobotCalibration.test.tsx index 910aa4bdfd4..d2fa47c9973 100644 --- a/app/src/organisms/Devices/ProtocolRun/__tests__/SetupRobotCalibration.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/SetupRobotCalibration.test.tsx @@ -10,7 +10,11 @@ import { ANALYTICS_PROCEED_TO_MODULE_SETUP_STEP, } from '../../../../redux/analytics' import { mockDeckCalData } from '../../../../redux/calibration/__fixtures__' -import { useDeckCalibrationData, useIsOT3, useRunHasStarted } from '../../hooks' +import { + useDeckCalibrationData, + useIsFlex, + useRunHasStarted, +} from '../../hooks' import { SetupDeckCalibration } from '../SetupDeckCalibration' import { SetupInstrumentCalibration } from '../SetupInstrumentCalibration' import { SetupTipLengthCalibration } from '../SetupTipLengthCalibration' @@ -40,7 +44,7 @@ const mockUseDeckCalibrationData = useDeckCalibrationData as jest.MockedFunction const mockUseRunHasStarted = useRunHasStarted as jest.MockedFunction< typeof useRunHasStarted > -const mockUseIsOT3 = useIsOT3 as jest.MockedFunction +const mockUseIsFlex = useIsFlex as jest.MockedFunction const ROBOT_NAME = 'otie' const RUN_ID = '1' @@ -86,7 +90,7 @@ describe('SetupRobotCalibration', () => { isDeckCalibrated: true, }) when(mockUseRunHasStarted).calledWith(RUN_ID).mockReturnValue(false) - when(mockUseIsOT3).calledWith(ROBOT_NAME).mockReturnValue(false) + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(false) }) afterEach(() => { jest.resetAllMocks() @@ -101,8 +105,8 @@ describe('SetupRobotCalibration', () => { getByText('Mock SetupTipLengthCalibration') }) - it('renders only pipette calibration component for OT-3', () => { - when(mockUseIsOT3).calledWith(ROBOT_NAME).mockReturnValue(true) + it('renders only pipette calibration component for Flex', () => { + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(true) const { getByText, queryByText } = render()[0] expect(queryByText('Mock SetupDeckCalibration')).toBeNull() diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/SetupTipLengthCalibrationButton.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/SetupTipLengthCalibrationButton.test.tsx index 66f5db97821..ef61645c0c1 100644 --- a/app/src/organisms/Devices/ProtocolRun/__tests__/SetupTipLengthCalibrationButton.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/SetupTipLengthCalibrationButton.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' - +import { screen, fireEvent } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import fixture_tiprack_300_ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_300_ul.json' @@ -81,34 +81,34 @@ describe('SetupTipLengthCalibrationButton', () => { }) it('renders the calibrate now button if tip length not calibrated', () => { - const { getByRole } = render() - expect(getByRole('button', { name: 'Calibrate now' })).toBeTruthy() + render() + expect(screen.getByRole('button', { name: 'Calibrate now' })).toBeTruthy() }) it('renders the recalibrate link if tip length calibrated and run unstarted', () => { - const { getByText } = render({ hasCalibrated: true }) - expect(getByText('Recalibrate')).toBeTruthy() + render({ hasCalibrated: true }) + expect(screen.getByText('Recalibrate')).toBeTruthy() }) it('button launches the tip length calibration wizard when clicked - no calibration', () => { - const { getByText } = render() - const calibrateBtn = getByText('Calibrate now') - calibrateBtn.click() + render() + const calibrateBtn = screen.getByText('Calibrate now') + fireEvent.click(calibrateBtn) expect(mockTipLengthCalLauncher).toHaveBeenCalled() }) it('button launches the tip length calibration wizard when clicked - recalibration', () => { const { getByText } = render({ hasCalibrated: true }) const recalibrateBtn = getByText('Recalibrate') - recalibrateBtn.click() + fireEvent.click(recalibrateBtn) expect(mockTipLengthCalLauncher).toHaveBeenCalled() }) it('disables the recalibrate link if tip length calibrated and run started', () => { when(mockUseRunHasStarted).calledWith(RUN_ID).mockReturnValue(true) - const { getByText } = render({ hasCalibrated: true }) - const recalibrate = getByText('Recalibrate') - recalibrate.click() + render({ hasCalibrated: true }) + const recalibrate = screen.getByText('Recalibrate') + fireEvent.click(recalibrate) expect(mockTipLengthCalLauncher).not.toBeCalled() }) }) diff --git a/app/src/organisms/Devices/ProtocolRun/useLabwareOffsetForLabware.ts b/app/src/organisms/Devices/ProtocolRun/useLabwareOffsetForLabware.ts index 262a0376093..07d4c838b85 100644 --- a/app/src/organisms/Devices/ProtocolRun/useLabwareOffsetForLabware.ts +++ b/app/src/organisms/Devices/ProtocolRun/useLabwareOffsetForLabware.ts @@ -1,9 +1,9 @@ -import { useRunQuery } from '@opentrons/react-api-client' import { getLoadedLabwareDefinitionsByUri } from '@opentrons/shared-data' import { getCurrentOffsetForLabwareInLocation } from '../../Devices/ProtocolRun/utils/getCurrentOffsetForLabwareInLocation' import { getLabwareDefinitionUri } from '../../Devices/ProtocolRun/utils/getLabwareDefinitionUri' import { getLabwareOffsetLocation } from '../../Devices/ProtocolRun/utils/getLabwareOffsetLocation' +import { useNotifyRunQuery } from '../../../resources/runs/useNotifyRunQuery' import type { LabwareOffset } from '@opentrons/api-client' import { useMostRecentCompletedAnalysis } from '../../LabwarePositionCheck/useMostRecentCompletedAnalysis' @@ -13,7 +13,7 @@ export function useLabwareOffsetForLabware( labwareId: string ): LabwareOffset | null { const mostRecentAnalysis = useMostRecentCompletedAnalysis(runId) - const { data: runRecord } = useRunQuery(runId) + const { data: runRecord } = useNotifyRunQuery(runId) if (mostRecentAnalysis == null) return null const labwareDefinitionsByUri = getLoadedLabwareDefinitionsByUri( diff --git a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLabwareOffsetLocation.test.tsx b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLabwareOffsetLocation.test.tsx index ded213efeb0..6c8b4157b80 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLabwareOffsetLocation.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLabwareOffsetLocation.test.tsx @@ -1,5 +1,8 @@ import { when, resetAllWhenMocks } from 'jest-when' -import { getLabwareDefURI } from '@opentrons/shared-data' +import { + CompletedProtocolAnalysis, + getLabwareDefURI, +} from '@opentrons/shared-data' import _uncastedProtocolWithTC from '@opentrons/shared-data/protocol/fixtures/6/multipleTipracksWithTC.json' import fixture_adapter from '@opentrons/shared-data/labware/definitions/2/opentrons_96_pcr_adapter/1.json' import { getLabwareOffsetLocation } from '../getLabwareOffsetLocation' @@ -8,14 +11,13 @@ import { getModuleInitialLoadInfo } from '../getModuleInitialLoadInfo' import type { LoadedLabware, LoadedModule, - ProtocolAnalysisFile, LabwareDefinition2, } from '@opentrons/shared-data' jest.mock('../getLabwareLocation') jest.mock('../getModuleInitialLoadInfo') -const protocolWithTC = (_uncastedProtocolWithTC as unknown) as ProtocolAnalysisFile +const protocolWithTC = (_uncastedProtocolWithTC as unknown) as CompletedProtocolAnalysis const mockAdapterDef = fixture_adapter as LabwareDefinition2 const mockAdapterId = 'mockAdapterId' const TCModelInProtocol = 'thermocyclerModuleV1' @@ -32,7 +34,7 @@ const mockGetModuleInitialLoadInfo = getModuleInitialLoadInfo as jest.MockedFunc describe('getLabwareOffsetLocation', () => { let MOCK_LABWARE_ID: string - let MOCK_COMMANDS: ProtocolAnalysisFile['commands'] + let MOCK_COMMANDS: CompletedProtocolAnalysis['commands'] let MOCK_MODULES: LoadedModule[] let MOCK_LABWARE: LoadedLabware[] beforeEach(() => { diff --git a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLabwareRenderInfo.test.ts b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLabwareRenderInfo.test.ts index cd47beb4efc..359e4faad3f 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLabwareRenderInfo.test.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLabwareRenderInfo.test.ts @@ -1,10 +1,12 @@ import _protocolWithMagTempTC from '@opentrons/shared-data/protocol/fixtures/6/transferSettings.json' -import _standardDeckDef from '@opentrons/shared-data/deck/definitions/3/ot2_standard.json' +import _standardDeckDef from '@opentrons/shared-data/deck/definitions/4/ot2_standard.json' import { getLabwareRenderInfo } from '../getLabwareRenderInfo' -import type { ProtocolAnalysisFile } from '@opentrons/shared-data' -import type { LoadLabwareRunTimeCommand } from '@opentrons/shared-data/protocol/types/schemaV7/command/setup' +import type { + CompletedProtocolAnalysis, + LoadLabwareRunTimeCommand, +} from '@opentrons/shared-data' -const protocolWithMagTempTC = (_protocolWithMagTempTC as unknown) as ProtocolAnalysisFile +const protocolWithMagTempTC = (_protocolWithMagTempTC as unknown) as CompletedProtocolAnalysis const standardDeckDef = _standardDeckDef as any describe('getLabwareRenderInfo', () => { @@ -50,6 +52,7 @@ describe('getLabwareRenderInfo', () => { x: SLOT_2_COORDS[0], y: SLOT_2_COORDS[1], z: SLOT_2_COORDS[2], + slotName: '2', }, // slot 3 has temp mod // slot 4 @@ -59,6 +62,7 @@ describe('getLabwareRenderInfo', () => { x: SLOT_4_COORDS[0], y: SLOT_4_COORDS[1], z: SLOT_4_COORDS[2], + slotName: '4', }, // slot 5 [CORNING_24_WELLPLATE_2_ID]: { @@ -67,6 +71,7 @@ describe('getLabwareRenderInfo', () => { x: SLOT_5_COORDS[0], y: SLOT_5_COORDS[1], z: SLOT_5_COORDS[2], + slotName: '5', }, // slot 6 [CORNING_24_WELLPLATE_1_ID]: { @@ -75,6 +80,7 @@ describe('getLabwareRenderInfo', () => { x: SLOT_6_COORDS[0], y: SLOT_6_COORDS[1], z: SLOT_6_COORDS[2], + slotName: '6', }, // slot 7 has TC // slot 9 @@ -84,6 +90,7 @@ describe('getLabwareRenderInfo', () => { x: SLOT_9_COORDS[0], y: SLOT_9_COORDS[1], z: SLOT_9_COORDS[2], + slotName: '9', }, // slot 10 abc123: { @@ -92,6 +99,7 @@ describe('getLabwareRenderInfo', () => { x: SLOT_10_COORDS[0], y: SLOT_10_COORDS[1], z: SLOT_10_COORDS[2], + slotName: '10', }, } diff --git a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getModuleInitialLoadInfo.test.ts b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getModuleInitialLoadInfo.test.ts index 231780a3999..811d7a18e69 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getModuleInitialLoadInfo.test.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getModuleInitialLoadInfo.test.ts @@ -1,9 +1,9 @@ import _protocolWithMagTempTC from '@opentrons/shared-data/protocol/fixtures/6/transferSettings.json' import { getModuleInitialLoadInfo } from '../getModuleInitialLoadInfo' -import { ProtocolAnalysisFile } from '@opentrons/shared-data' -import type { LoadModuleRunTimeCommand } from '@opentrons/shared-data/protocol/types/schemaV7/command/setup' +import { CompletedProtocolAnalysis } from '@opentrons/shared-data' +import type { LoadModuleRunTimeCommand } from '@opentrons/shared-data' -const protocolWithMagTempTC = (_protocolWithMagTempTC as unknown) as ProtocolAnalysisFile +const protocolWithMagTempTC = (_protocolWithMagTempTC as unknown) as CompletedProtocolAnalysis describe('getModuleInitialLoadInfo', () => { it('should gather protocol module info for tc if id in params', () => { diff --git a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getProtocolModulesInfo.test.ts b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getProtocolModulesInfo.test.ts index 7b7c2362eb0..f23a369d359 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getProtocolModulesInfo.test.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getProtocolModulesInfo.test.ts @@ -1,6 +1,6 @@ import _protocolWithMagTempTC from '@opentrons/shared-data/protocol/fixtures/6/transferSettings.json' import _protocolWithMultipleTemps from '@opentrons/shared-data/protocol/fixtures/6/multipleTempModules.json' -import _standardDeckDef from '@opentrons/shared-data/deck/definitions/3/ot2_standard.json' +import _standardDeckDef from '@opentrons/shared-data/deck/definitions/4/ot2_standard.json' import { getProtocolModulesInfo } from '../getProtocolModulesInfo' import { getModuleDef2, diff --git a/app/src/organisms/Devices/ProtocolRun/utils/getInitialLabwareLocation.ts b/app/src/organisms/Devices/ProtocolRun/utils/getInitialLabwareLocation.ts index 7ee6cce04bc..ba0e5a694ea 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/getInitialLabwareLocation.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/getInitialLabwareLocation.ts @@ -1,9 +1,9 @@ import { FIXED_TRASH_ID } from '@opentrons/shared-data/js' -import type { RunTimeCommand } from '@opentrons/shared-data' import type { LoadLabwareRunTimeCommand, LabwareLocation, -} from '@opentrons/shared-data/protocol/types/schemaV7/command/setup' + RunTimeCommand, +} from '@opentrons/shared-data' export const getInitialLabwareLocation = ( labwareId: string, diff --git a/app/src/organisms/Devices/ProtocolRun/utils/getLabwareLocation.ts b/app/src/organisms/Devices/ProtocolRun/utils/getLabwareLocation.ts index cbe1ff380b5..09def7cf201 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/getLabwareLocation.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/getLabwareLocation.ts @@ -1,8 +1,8 @@ -import type { RunTimeCommand } from '@opentrons/shared-data' import type { LoadLabwareRunTimeCommand, LabwareLocation, -} from '@opentrons/shared-data/protocol/types/schemaV7/command/setup' + RunTimeCommand, +} from '@opentrons/shared-data' const TRASH_ID = 'fixedTrash' diff --git a/app/src/organisms/Devices/ProtocolRun/utils/getLabwareOffsetLocation.ts b/app/src/organisms/Devices/ProtocolRun/utils/getLabwareOffsetLocation.ts index e831be067d9..287c5ef1338 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/getLabwareOffsetLocation.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/getLabwareOffsetLocation.ts @@ -39,6 +39,11 @@ export const getLabwareOffsetLocation = ( slotName: adapter.location.slotName, definitionUri: adapter.definitionUri, } + } else if ('addressableAreaName' in adapter.location) { + return { + slotName: adapter.location.addressableAreaName, + definitionUri: adapter.definitionUri, + } } else if ('moduleId' in adapter.location) { const moduleIdUnderAdapter = adapter.location.moduleId const moduleModel = modules.find( @@ -52,7 +57,12 @@ export const getLabwareOffsetLocation = ( return { slotName, moduleModel, definitionUri: adapter.definitionUri } } } else { - return { slotName: labwareLocation.slotName } + return { + slotName: + 'addressableAreaName' in labwareLocation + ? labwareLocation.addressableAreaName + : labwareLocation.slotName, + } } return null } diff --git a/app/src/organisms/Devices/ProtocolRun/utils/getLabwareRenderInfo.ts b/app/src/organisms/Devices/ProtocolRun/utils/getLabwareRenderInfo.ts index cfe6a55dfe9..dc57ed379e6 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/getLabwareRenderInfo.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/getLabwareRenderInfo.ts @@ -1,38 +1,11 @@ -import { +import { getPositionFromSlotId } from '@opentrons/shared-data' +import type { CompletedProtocolAnalysis, DeckDefinition, - getSlotHasMatingSurfaceUnitVector, LabwareDefinition2, - ProtocolAnalysisFile, + LoadLabwareRunTimeCommand, ProtocolAnalysisOutput, } from '@opentrons/shared-data' -import type { LoadLabwareRunTimeCommand } from '@opentrons/shared-data/protocol/types/schemaV7/command/setup' - -const getSlotPosition = ( - deckDef: DeckDefinition, - slotName: string -): [number, number, number] => { - let x = 0 - let y = 0 - let z = 0 - const slotPosition = deckDef.locations.orderedSlots.find( - orderedSlot => orderedSlot.id === slotName - )?.position - - if (slotPosition == null) { - console.error( - `expected to find a slot position for slot ${slotName} in ${String( - deckDef.metadata.displayName - )}, but could not` - ) - } else { - x = slotPosition[0] - y = slotPosition[1] - z = slotPosition[2] - } - - return [x, y, z] -} export interface LabwareRenderInfoById { [labwareId: string]: { @@ -41,14 +14,12 @@ export interface LabwareRenderInfoById { z: number labwareDef: LabwareDefinition2 displayName: string | null + slotName: string } } export const getLabwareRenderInfo = ( - protocolData: - | ProtocolAnalysisFile<{}> - | CompletedProtocolAnalysis - | ProtocolAnalysisOutput, + protocolData: CompletedProtocolAnalysis | ProtocolAnalysisOutput, deckDef: DeckDefinition ): LabwareRenderInfoById => protocolData.commands @@ -77,15 +48,26 @@ export const getLabwareRenderInfo = ( )} but could not` ) } - const slotName = location.slotName.toString() - const slotPosition = getSlotPosition(deckDef, slotName) - const slotHasMatingSurfaceVector = getSlotHasMatingSurfaceUnitVector( - deckDef, - slotName + const slotName = + 'addressableAreaName' in location + ? location.addressableAreaName + : location.slotName + const slotPosition = getPositionFromSlotId(slotName, deckDef) + + if (slotPosition == null) { + console.warn( + `expected to find a position for slot ${slotName} in the standard deck definition, but could not` + ) + return acc + } + const isSlot = deckDef.locations.addressableAreas.some( + aa => + aa.id === slotName && + (aa.areaType === 'slot' || aa.areaType === 'stagingSlot') ) - return slotHasMatingSurfaceVector + return isSlot ? { ...acc, [labwareId]: { @@ -94,7 +76,8 @@ export const getLabwareRenderInfo = ( z: slotPosition[2], labwareDef, displayName, + slotName, }, } - : { ...acc } + : acc }, {}) diff --git a/app/src/organisms/Devices/ProtocolRun/utils/getLocationInfoNames.ts b/app/src/organisms/Devices/ProtocolRun/utils/getLocationInfoNames.ts index ee49db3573e..594d5d37f97 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/getLocationInfoNames.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/getLocationInfoNames.ts @@ -46,6 +46,8 @@ export function getLocationInfoNames( return { slotName: 'Off deck', labwareName } } else if ('slotName' in labwareLocation) { return { slotName: labwareLocation.slotName, labwareName } + } else if ('addressableAreaName' in labwareLocation) { + return { slotName: labwareLocation.addressableAreaName, labwareName } } else if ('moduleId' in labwareLocation) { const loadModuleCommandUnderLabware = loadModuleCommands?.find( command => command.result?.moduleId === labwareLocation.moduleId diff --git a/app/src/organisms/Devices/ProtocolRun/utils/getModuleInitialLoadInfo.ts b/app/src/organisms/Devices/ProtocolRun/utils/getModuleInitialLoadInfo.ts index 066c0e5a872..d92b35fc88e 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/getModuleInitialLoadInfo.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/getModuleInitialLoadInfo.ts @@ -1,8 +1,8 @@ -import type { RunTimeCommand } from '@opentrons/shared-data' import type { LoadModuleRunTimeCommand, ModuleLocation, -} from '@opentrons/shared-data/protocol/types/schemaV7/command/setup' + RunTimeCommand, +} from '@opentrons/shared-data' interface ModuleInitialLoadInfo { location: ModuleLocation diff --git a/app/src/organisms/Devices/ProtocolRun/utils/getPickUpTipCommandsWithPipette.ts b/app/src/organisms/Devices/ProtocolRun/utils/getPickUpTipCommandsWithPipette.ts index 781f70180d4..4c739830852 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/getPickUpTipCommandsWithPipette.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/getPickUpTipCommandsWithPipette.ts @@ -1,5 +1,7 @@ -import type { PickUpTipRunTimeCommand } from '@opentrons/shared-data/protocol/types/schemaV7/command/pipetting' -import type { RunTimeCommand } from '@opentrons/shared-data/protocol/types/schemaV7' +import type { + PickUpTipRunTimeCommand, + RunTimeCommand, +} from '@opentrons/shared-data' export const getPickUpTipCommandsWithPipette = ( commands: RunTimeCommand[], diff --git a/app/src/organisms/Devices/ProtocolRun/utils/getPipetteMount.ts b/app/src/organisms/Devices/ProtocolRun/utils/getPipetteMount.ts index 20aa5189bb5..77eb93c0ade 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/getPipetteMount.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/getPipetteMount.ts @@ -1,5 +1,7 @@ -import type { RunTimeCommand } from '@opentrons/shared-data' -import type { LoadPipetteRunTimeCommand } from '@opentrons/shared-data/protocol/types/schemaV7/command/setup' +import type { + LoadPipetteRunTimeCommand, + RunTimeCommand, +} from '@opentrons/shared-data' export const getPipetteMount = ( pipetteId: string, diff --git a/app/src/organisms/Devices/ProtocolRun/utils/getProtocolModulesInfo.ts b/app/src/organisms/Devices/ProtocolRun/utils/getProtocolModulesInfo.ts index b7451a356cf..37a5ca93a26 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/getProtocolModulesInfo.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/getProtocolModulesInfo.ts @@ -2,15 +2,16 @@ import { SPAN7_8_10_11_SLOT, getModuleDef2, getLoadedLabwareDefinitionsByUri, + getPositionFromSlotId, } from '@opentrons/shared-data' import { getModuleInitialLoadInfo } from './getModuleInitialLoadInfo' -import type { LoadLabwareRunTimeCommand } from '@opentrons/shared-data/protocol/types/schemaV7/command/setup' import type { + CompletedProtocolAnalysis, DeckDefinition, LabwareDefinition2, + LoadLabwareRunTimeCommand, ModuleDefinition, ProtocolAnalysisOutput, - CompletedProtocolAnalysis, } from '@opentrons/shared-data' export interface ProtocolModuleInfo { @@ -68,13 +69,14 @@ export const getProtocolModulesInfo = ( if (slotName === SPAN7_8_10_11_SLOT) { slotName = '7' } - const slotPosition = - deckDef.locations.orderedSlots.find(slot => slot.id === slotName) - ?.position ?? [] - if (slotPosition.length === 0) { + + const slotPosition = getPositionFromSlotId(slotName, deckDef) + + if (slotPosition == null) { console.warn( - `expected to find a slot position for slot ${slotName} in the standard OT-2 deck definition, but could not` + `expected to find a position for slot ${slotName} in the standard deck definition, but could not` ) + return acc } return [ ...acc, diff --git a/app/src/organisms/Devices/ProtocolRun/utils/getStandardDeckViewBox.ts b/app/src/organisms/Devices/ProtocolRun/utils/getStandardDeckViewBox.ts deleted file mode 100644 index 9ef012e4e48..00000000000 --- a/app/src/organisms/Devices/ProtocolRun/utils/getStandardDeckViewBox.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { RobotType } from '@opentrons/shared-data' - -const OT2_VIEWBOX = '-75 -20 586 480' -const OT3_VIEWBOX = '-144.31 -76.59 750 681.74' - -export const getStandardDeckViewBox = (robotType: RobotType): string | null => { - switch (robotType) { - case 'OT-2 Standard': - return OT2_VIEWBOX - case 'OT-3 Standard': - return OT3_VIEWBOX - default: - return null - } -} diff --git a/app/src/organisms/Devices/ProtocolRun/utils/getTipracksVisited.ts b/app/src/organisms/Devices/ProtocolRun/utils/getTipracksVisited.ts index dec809dc89a..5f0882e6958 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/getTipracksVisited.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/getTipracksVisited.ts @@ -1,4 +1,4 @@ -import type { PickUpTipRunTimeCommand } from '@opentrons/shared-data/protocol/types/schemaV7/command/pipetting' +import type { PickUpTipRunTimeCommand } from '@opentrons/shared-data' export const getTipracksVisited = ( pickupTipCommands: PickUpTipRunTimeCommand[] diff --git a/app/src/organisms/Devices/RecentProtocolRuns.tsx b/app/src/organisms/Devices/RecentProtocolRuns.tsx index b2bbfafc71c..4b07081e48d 100644 --- a/app/src/organisms/Devices/RecentProtocolRuns.tsx +++ b/app/src/organisms/Devices/RecentProtocolRuns.tsx @@ -1,9 +1,6 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' -import { - useAllRunsQuery, - useAllProtocolsQuery, -} from '@opentrons/react-api-client' +import { useAllProtocolsQuery } from '@opentrons/react-api-client' import { Flex, ALIGN_CENTER, @@ -22,6 +19,7 @@ import { StyledText } from '../../atoms/text' import { useCurrentRunId } from '../ProtocolUpload/hooks' import { HistoricalProtocolRun } from './HistoricalProtocolRun' import { useIsRobotViewable, useRunStatuses } from './hooks' +import { useNotifyAllRunsQuery } from '../../resources/runs/useNotifyAllRunsQuery' interface RecentProtocolRunsProps { robotName: string @@ -32,7 +30,7 @@ export function RecentProtocolRuns({ }: RecentProtocolRunsProps): JSX.Element | null { const { t } = useTranslation(['device_details', 'shared']) const isRobotViewable = useIsRobotViewable(robotName) - const runsQueryResponse = useAllRunsQuery() + const runsQueryResponse = useNotifyAllRunsQuery() const runs = runsQueryResponse?.data?.data const protocols = useAllProtocolsQuery() const currentRunId = useCurrentRunId() @@ -43,7 +41,6 @@ export function RecentProtocolRuns({ history.push(`/devices/${robotName}`)} - css={BORDERS.cardOutlineBorder} > {t('modules')}
@@ -153,7 +151,7 @@ function AttachedModules(props: { robotName: string }): JSX.Element | null { function AttachedInstruments(props: { robotName: string }): JSX.Element { const { t } = useTranslation('devices_landing') - const isOT3 = useIsOT3(props.robotName) + const isFlex = useIsFlex(props.robotName) const { data: pipettesData, isLoading: isPipetteQueryLoading, @@ -162,7 +160,7 @@ function AttachedInstruments(props: { robotName: string }): JSX.Element { const { data: attachedInstruments, isLoading: isInstrumentsQueryLoading, - } = useInstrumentsQuery({ enabled: isOT3 }) + } = useInstrumentsQuery({ enabled: isFlex }) const attachedGripper = (attachedInstruments?.data ?? []).find( (i): i is GripperData => i.instrumentType === 'gripper' && i.ok @@ -185,7 +183,7 @@ function AttachedInstruments(props: { robotName: string }): JSX.Element { gridGap={SPACING.spacing4} minWidth="24rem" > - + {t('shared:instruments')} diff --git a/app/src/organisms/Devices/RobotOverview.tsx b/app/src/organisms/Devices/RobotOverview.tsx index 87fd54f3021..868d9e4ecbe 100644 --- a/app/src/organisms/Devices/RobotOverview.tsx +++ b/app/src/organisms/Devices/RobotOverview.tsx @@ -112,12 +112,7 @@ export function RobotOverview({ - {robot != null ? ( - - ) : null} + {t('lights')} @@ -175,7 +166,7 @@ export function RobotOverview({
- {robotModel === 'OT-2' && !isRobotBusy ? ( + {robotModel === 'OT-2' && !isRobotBusy && isRobotViewable ? ( ) : null} () @@ -65,10 +67,6 @@ export const RobotOverviewOverflowMenu = ( dispatch(home(robot.name, ROBOT)) } - const [ - showSoftwareUpdateModal, - setShowSoftwareUpdateModal, - ] = React.useState(false) const [ showChooseProtocolSlideout, setShowChooseProtocolSlideout, @@ -87,10 +85,6 @@ export const RobotOverviewOverflowMenu = ( dispatch(checkShellUpdate()) }) - const handleClickUpdateBuildroot: React.MouseEventHandler = () => { - setShowSoftwareUpdateModal(true) - } - const handleClickRun: React.MouseEventHandler = () => { setShowChooseProtocolSlideout(true) } @@ -105,14 +99,6 @@ export const RobotOverviewOverflowMenu = ( return ( - {showSoftwareUpdateModal && - robot != null && - robot.status !== UNREACHABLE ? ( - setShowSoftwareUpdateModal(false)} - /> - ) : null} {showDisconnectModal ? ( setShowDisconnectModal(false)} @@ -138,9 +124,11 @@ export const RobotOverviewOverflowMenu = ( setShowOverflowMenu(false) }} > - {isRobotOnWrongVersionOfSoftware && !isRobotUnavailable ? ( + {isRobotOnWrongVersionOfSoftware && + !isRobotUnavailable && + !isEstopNotDisengaged ? ( handleUpdateBuildroot(robot)} data-testid={`RobotOverviewOverflowMenu_updateSoftware_${String( robot.name )}`} @@ -153,7 +141,11 @@ export const RobotOverviewOverflowMenu = ( {t('run_a_protocol')} @@ -166,7 +158,7 @@ export const RobotOverviewOverflowMenu = ( ) : null} {robot.status === CONNECTABLE ? ( {t('disconnect_from_network')} diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/DeviceResetModal.tsx b/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/DeviceResetModal.tsx index 45e3d96abbf..4b3841d7eb4 100644 --- a/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/DeviceResetModal.tsx +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/DeviceResetModal.tsx @@ -27,7 +27,7 @@ import { getResetConfigOptions, resetConfig, } from '../../../../../redux/robot-admin' -import { useIsOT3 } from '../../../hooks' +import { useIsFlex } from '../../../hooks' import type { State } from '../../../../../redux/types' import type { ResetConfigRequest } from '../../../../../redux/robot-admin/types' @@ -48,7 +48,7 @@ export function DeviceResetModal({ const { t } = useTranslation(['device_settings', 'shared']) const history = useHistory() const [dispatchRequest, requestIds] = useDispatchApiRequest() - const isOT3 = useIsOT3(robotName) + const isFlex = useIsFlex(robotName) const resetRequestStatus = useSelector((state: State) => { const lastId = last(requestIds) return lastId != null ? getRequestById(state, lastId) : null @@ -60,7 +60,7 @@ export function DeviceResetModal({ const triggerReset = (): void => { if (resetOptions != null) { - if (isOT3) { + if (isFlex) { const totalOptionsSelected = Object.values(resetOptions).filter( selected => selected === true ).length diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/DeviceResetSlideout.tsx b/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/DeviceResetSlideout.tsx index 0e7b3b24194..9973123e4c4 100644 --- a/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/DeviceResetSlideout.tsx +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/DeviceResetSlideout.tsx @@ -19,7 +19,6 @@ import { SPACING, TYPOGRAPHY, } from '@opentrons/components' -import { useAllRunsQuery } from '@opentrons/react-api-client' import { Slideout } from '../../../../../atoms/Slideout' import { StyledText } from '../../../../../atoms/text' @@ -35,11 +34,12 @@ import { } from '../../../../../redux/analytics' import { useDeckCalibrationData, - useIsOT3, + useIsFlex, usePipetteOffsetCalibrations, useTipLengthCalibrations, useRobot, } from '../../../hooks' +import { useNotifyAllRunsQuery } from '../../../../../resources/runs/useNotifyAllRunsQuery' import type { State, Dispatch } from '../../../../../redux/types' import type { ResetConfigRequest } from '../../../../../redux/robot-admin/types' @@ -63,8 +63,8 @@ export function DeviceResetSlideout({ const robot = useRobot(robotName) const dispatch = useDispatch() const [resetOptions, setResetOptions] = React.useState({}) - const runsQueryResponse = useAllRunsQuery() - const isOT3 = useIsOT3(robotName) + const runsQueryResponse = useNotifyAllRunsQuery() + const isFlex = useIsFlex(robotName) // Calibration data const deckCalibrationData = useDeckCalibrationData(robotName) @@ -86,7 +86,7 @@ export function DeviceResetSlideout({ ) : [] - const calibrationOptions = isOT3 + const calibrationOptions = isFlex ? flexCalibrationOptions : ot2CalibrationOptions @@ -94,6 +94,10 @@ export function DeviceResetSlideout({ options != null ? options.filter(opt => opt.id.includes('bootScript')) : [] const runHistoryOption = options != null ? options.filter(opt => opt.id.includes('runsHistory')) : [] + const sshKeyOption = + options != null + ? options.filter(opt => opt.id.includes('authorizedKeys')) + : [] React.useEffect(() => { dispatch(fetchResetConfigOptions(robotName)) @@ -138,7 +142,8 @@ export function DeviceResetSlideout({ ).length // filtering out ODD setting because this gets implicitly cleared if all settings are selected - const allOptionsWithoutODD = options.filter(o => o.id !== 'onDeviceDisplay') + const allOptionsWithoutODD = + options != null ? options.filter(o => o.id !== 'onDeviceDisplay') : [] const isEveryOptionSelected = totalOptionsSelected > 0 && @@ -163,21 +168,21 @@ export function DeviceResetSlideout({ {t('resets_cannot_be_undone')} - {isOT3 ? ( + {isFlex ? ( <> @@ -248,7 +253,7 @@ export function DeviceResetSlideout({ {calibrationOptions.map(opt => { let calibrationName = '' if (opt.id === 'pipetteOffsetCalibrations') { - calibrationName = isOT3 + calibrationName = isFlex ? t('clear_option_pipette_calibrations') : t(`clear_option_${snakeCase(opt.id)}`) } else { @@ -325,6 +330,28 @@ export function DeviceResetSlideout({ /> ))} + + + {t('ssh_public_keys')} + + {sshKeyOption.map(opt => ( + + setResetOptions({ + ...resetOptions, + [opt.id]: !(resetOptions[opt.id] ?? false), + }) + } + value={resetOptions[opt.id]} + label={t(`clear_option_${snakeCase(opt.id)}`)} + /> + ))} + diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/RenameRobotSlideout.tsx b/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/RenameRobotSlideout.tsx index ae0c25a76bd..504f2eee46e 100644 --- a/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/RenameRobotSlideout.tsx +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/RenameRobotSlideout.tsx @@ -26,7 +26,7 @@ import { Slideout } from '../../../../../atoms/Slideout' import { StyledText } from '../../../../../atoms/text' import { InputField } from '../../../../../atoms/InputField' import { Banner } from '../../../../../atoms/Banner' -import { useIsOT3 } from '../../../hooks' +import { useIsFlex } from '../../../hooks' import type { UpdatedRobotName } from '@opentrons/api-client' import type { State, Dispatch } from '../../../../../redux/types' @@ -56,7 +56,7 @@ export function RenameRobotSlideout({ const [previousRobotName, setPreviousRobotName] = React.useState( robotName ) - const isOt3 = useIsOT3(robotName) + const isFlex = useIsFlex(robotName) const trackEvent = useTrackEvent() const history = useHistory() const dispatch = useDispatch() @@ -146,7 +146,7 @@ export function RenameRobotSlideout({ } > - {isOt3 ? null : ( + {isFlex ? null : ( {t('rename_robot_prefer_usb_connection')} @@ -170,13 +170,13 @@ export function RenameRobotSlideout({ value={formik.values.newRobotName} error={formik.errors.newRobotName && ' '} /> - + {t('characters_max')} {formik.errors.newRobotName && ( {formik.errors.newRobotName} diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/__tests__/DeviceResetSlideout.test.tsx b/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/__tests__/DeviceResetSlideout.test.tsx index 45b1129c7cc..e375d03a0cd 100644 --- a/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/__tests__/DeviceResetSlideout.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/__tests__/DeviceResetSlideout.test.tsx @@ -4,7 +4,7 @@ import { fireEvent } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../../../../i18n' import { getResetConfigOptions } from '../../../../../../redux/robot-admin' -import { useIsOT3 } from '../../../../hooks' +import { useIsFlex } from '../../../../hooks' import { DeviceResetSlideout } from '../DeviceResetSlideout' jest.mock('../../../../../../redux/config') @@ -19,7 +19,7 @@ const mockUpdateResetStatus = jest.fn() const mockGetResetConfigOptions = getResetConfigOptions as jest.MockedFunction< typeof getResetConfigOptions > -const mockUseIsOT3 = useIsOT3 as jest.MockedFunction +const mockUseIsFlex = useIsFlex as jest.MockedFunction const mockResetConfigOptions = [ { @@ -57,6 +57,11 @@ const mockResetConfigOptions = [ name: 'module calibration FooBar', description: 'moduleCalibration fooBar description', }, + { + id: 'authorizedKeys', + name: 'SSH Keys Foo', + description: 'SSH Keys foo description', + }, ] const render = () => { @@ -76,7 +81,7 @@ const render = () => { describe('RobotSettings DeviceResetSlideout', () => { beforeEach(() => { mockGetResetConfigOptions.mockReturnValue(mockResetConfigOptions) - mockUseIsOT3.mockReturnValue(false) + mockUseIsFlex.mockReturnValue(false) }) afterEach(() => { @@ -97,6 +102,7 @@ describe('RobotSettings DeviceResetSlideout', () => { getByText('Clear protocol run history') getByText('Boot scripts') getByText('Clear custom boot scripts') + getByText('Clear SSH public keys') const downloads = getAllByText('Download') expect(downloads.length).toBe(2) getByRole('checkbox', { name: 'Clear deck calibration' }) @@ -104,16 +110,17 @@ describe('RobotSettings DeviceResetSlideout', () => { getByRole('checkbox', { name: 'Clear tip length calibrations' }) getByRole('checkbox', { name: 'Clear protocol run history' }) getByRole('checkbox', { name: 'Clear custom boot scripts' }) + getByRole('checkbox', { name: 'Clear SSH public keys' }) getByRole('button', { name: 'Clear data and restart robot' }) getByTestId('Slideout_icon_close_Device Reset') }) it('should change some options and text for Flex', () => { - mockUseIsOT3.mockReturnValue(true) + mockUseIsFlex.mockReturnValue(true) const [{ getByText, getByRole, queryByRole, queryByText }] = render() getByText('Clear all data') getByText( - 'Resets all settings. You’ll have to redo initial setup before using the robot again.' + 'Clears calibrations, protocols, and all settings except robot name and network settings.' ) expect(queryByText('Clear deck calibration')).toBeNull() getByText('Clear pipette calibration') diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/__tests__/RenameRobotSlideout.test.tsx b/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/__tests__/RenameRobotSlideout.test.tsx index ba28cd99d18..8895964a62e 100644 --- a/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/__tests__/RenameRobotSlideout.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/AdvancedTabSlideouts/__tests__/RenameRobotSlideout.test.tsx @@ -17,7 +17,7 @@ import { } from '../../../../../../redux/discovery/__fixtures__' import { RenameRobotSlideout } from '../RenameRobotSlideout' -import { useIsOT3 } from '../../../../hooks' +import { useIsFlex } from '../../../../hooks' jest.mock('../../../../../../redux/discovery/selectors') jest.mock('../../../../../../redux/analytics') @@ -32,7 +32,7 @@ const mockGetReachableRobots = getReachableRobots as jest.MockedFunction< const mockUseTrackEvent = useTrackEvent as jest.MockedFunction< typeof useTrackEvent > -const mockUseIsOT3 = useIsOT3 as jest.MockedFunction +const mockUseIsFlex = useIsFlex as jest.MockedFunction const mockOnCloseClick = jest.fn() let mockTrackEvent: jest.Mock @@ -58,7 +58,7 @@ describe('RobotSettings RenameRobotSlideout', () => { mockReachableRobot.name = 'reachableOtie' mockGetConnectableRobots.mockReturnValue([mockConnectableRobot]) mockGetReachableRobots.mockReturnValue([mockReachableRobot]) - mockUseIsOT3.mockReturnValue(false) + mockUseIsFlex.mockReturnValue(false) }) afterEach(() => { @@ -84,7 +84,7 @@ describe('RobotSettings RenameRobotSlideout', () => { }) it('should render title, description, label, input, and button for flex', () => { - mockUseIsOT3.mockReturnValue(true) + mockUseIsFlex.mockReturnValue(true) const [{ getByText, getByRole, queryByText }] = render() getByText('Rename Robot') expect( @@ -110,9 +110,13 @@ describe('RobotSettings RenameRobotSlideout', () => { await waitFor(() => { expect(input).toHaveValue('mockInput') - const renameButton = getByRole('button', { name: 'Rename robot' }) + }) + const renameButton = getByRole('button', { name: 'Rename robot' }) + await waitFor(() => { expect(renameButton).not.toBeDisabled() - fireEvent.click(renameButton) + }) + fireEvent.click(renameButton) + await waitFor(() => { expect(mockTrackEvent).toHaveBeenCalledWith({ name: ANALYTICS_RENAME_ROBOT, properties: { newRobotName: 'mockInput', previousRobotName: 'otie' }, @@ -127,10 +131,12 @@ describe('RobotSettings RenameRobotSlideout', () => { expect(input).toHaveValue('mockInput@@@') const renameButton = getByRole('button', { name: 'Rename robot' }) const error = await findByText( - 'Oops! Robot name must follow the character count and limitations' + 'Oops! Robot name must follow the character count and limitations.' ) await waitFor(() => { expect(renameButton).toBeDisabled() + }) + await waitFor(() => { expect(error).toBeInTheDocument() }) }) @@ -144,10 +150,12 @@ describe('RobotSettings RenameRobotSlideout', () => { expect(input).toHaveValue('aaaaaaaaaaaaaaaaaa') const renameButton = getByRole('button', { name: 'Rename robot' }) const error = await findByText( - 'Oops! Robot name must follow the character count and limitations' + 'Oops! Robot name must follow the character count and limitations.' ) await waitFor(() => { expect(renameButton).toBeDisabled() + }) + await waitFor(() => { expect(error).toBeInTheDocument() }) }) @@ -161,10 +169,12 @@ describe('RobotSettings RenameRobotSlideout', () => { expect(input).toHaveValue('Hello world123') const renameButton = getByRole('button', { name: 'Rename robot' }) const error = await findByText( - 'Oops! Robot name must follow the character count and limitations' + 'Oops! Robot name must follow the character count and limitations.' ) await waitFor(() => { expect(renameButton).toBeDisabled() + }) + await waitFor(() => { expect(error).toBeInTheDocument() }) }) @@ -178,10 +188,12 @@ describe('RobotSettings RenameRobotSlideout', () => { expect(input).toHaveValue(' ') const renameButton = getByRole('button', { name: 'Rename robot' }) const error = await findByText( - 'Oops! Robot name must follow the character count and limitations' + 'Oops! Robot name must follow the character count and limitations.' ) await waitFor(() => { expect(renameButton).toBeDisabled() + }) + await waitFor(() => { expect(error).toBeInTheDocument() }) }) @@ -199,6 +211,8 @@ describe('RobotSettings RenameRobotSlideout', () => { ) await waitFor(() => { expect(renameButton).toBeDisabled() + }) + await waitFor(() => { expect(error).toBeInTheDocument() }) }) @@ -215,6 +229,8 @@ describe('RobotSettings RenameRobotSlideout', () => { ) await waitFor(() => { expect(renameButton).toBeDisabled() + }) + await waitFor(() => { expect(error).toBeInTheDocument() }) }) diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/DisplayRobotName.tsx b/app/src/organisms/Devices/RobotSettings/AdvancedTab/DisplayRobotName.tsx index c254407690d..d93d0dbc338 100644 --- a/app/src/organisms/Devices/RobotSettings/AdvancedTab/DisplayRobotName.tsx +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/DisplayRobotName.tsx @@ -54,7 +54,7 @@ export function DisplayRobotName({ > {t('robot_name')} - + {robotName} diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/EnableStatusLight.tsx b/app/src/organisms/Devices/RobotSettings/AdvancedTab/EnableStatusLight.tsx new file mode 100644 index 00000000000..6a3d26f2af8 --- /dev/null +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/EnableStatusLight.tsx @@ -0,0 +1,55 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' + +import { + ALIGN_CENTER, + Box, + DIRECTION_COLUMN, + Flex, + JUSTIFY_SPACE_BETWEEN, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' +import { StyledText } from '../../../../atoms/text' +import { ToggleButton } from '../../../../atoms/buttons' +import { useLEDLights } from '../../hooks' + +interface EnableStatusLightProps { + robotName: string + isEstopNotDisengaged: boolean +} +export function EnableStatusLight({ + robotName, + isEstopNotDisengaged, +}: EnableStatusLightProps): JSX.Element { + const { t } = useTranslation('device_settings') + const { lightsEnabled, toggleLights } = useLEDLights(robotName) + + return ( + + + + + {t('enable_status_light')} + + {t('enable_status_light_description')} + + + + + ) +} diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/OpenJupyterControl.tsx b/app/src/organisms/Devices/RobotSettings/AdvancedTab/OpenJupyterControl.tsx index 5097900fd8c..5b98b2af9a9 100644 --- a/app/src/organisms/Devices/RobotSettings/AdvancedTab/OpenJupyterControl.tsx +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/OpenJupyterControl.tsx @@ -1,12 +1,11 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { - Link, - Flex, ALIGN_CENTER, + Box, + Flex, JUSTIFY_SPACE_BETWEEN, SPACING, - Box, TYPOGRAPHY, } from '@opentrons/components' import { @@ -24,15 +23,22 @@ const JUPYTER_NOTEBOOK_LINK = export interface OpenJupyterControlProps { robotIp: string + isEstopNotDisengaged: boolean } export function OpenJupyterControl({ robotIp, + isEstopNotDisengaged, }: OpenJupyterControlProps): JSX.Element { const { t } = useTranslation('device_settings') - const href = `http://${robotIp}:48888` + const targetURL = `http://${robotIp}:48888` const trackEvent = useTrackEvent() + const handleClick = (): void => { + trackEvent(EVENT_JUPYTER_OPEN) + window.open(targetURL, '_blank') + } + return ( @@ -51,11 +57,9 @@ export function OpenJupyterControl({ trackEvent(EVENT_JUPYTER_OPEN)} - as={Link} - href={href} + disabled={isEstopNotDisengaged} + onClick={handleClick} marginLeft={SPACING.spacing32} - external > {t('launch_jupyter_notebook')} diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/RobotServerVersion.tsx b/app/src/organisms/Devices/RobotSettings/AdvancedTab/RobotServerVersion.tsx index 111a73d60c4..800185b6117 100644 --- a/app/src/organisms/Devices/RobotSettings/AdvancedTab/RobotServerVersion.tsx +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/RobotServerVersion.tsx @@ -13,13 +13,12 @@ import { JUSTIFY_FLEX_END, } from '@opentrons/components' import { StyledText } from '../../../../atoms/text' -import { Portal } from '../../../../App/portal' import { TertiaryButton } from '../../../../atoms/buttons' -import { getRobotApiVersion, UNREACHABLE } from '../../../../redux/discovery' +import { getRobotApiVersion } from '../../../../redux/discovery' import { getRobotUpdateDisplayInfo } from '../../../../redux/robot-update' import { UpdateRobotBanner } from '../../../UpdateRobotBanner' -import { useIsOT3, useRobot } from '../../hooks' -import { UpdateBuildroot } from '../UpdateBuildroot' +import { useIsFlex, useRobot } from '../../hooks' +import { handleUpdateBuildroot } from '../UpdateBuildroot' import type { State } from '../../../../redux/types' @@ -35,8 +34,7 @@ export function RobotServerVersion({ }: RobotServerVersionProps): JSX.Element { const { t } = useTranslation(['device_settings', 'shared']) const robot = useRobot(robotName) - const isOT3 = useIsOT3(robotName) - const [showVersionInfoModal, setShowVersionInfoModal] = React.useState(false) + const isFlex = useIsFlex(robotName) const { autoUpdateAction } = useSelector((state: State) => { return getRobotUpdateDisplayInfo(state, robotName) }) @@ -46,14 +44,6 @@ export function RobotServerVersion({ return ( <> - {showVersionInfoModal && robot != null && robot.status !== UNREACHABLE ? ( - - setShowVersionInfoModal(false)} - /> - - ) : null} {autoUpdateAction !== 'reinstall' && robot != null ? ( @@ -73,7 +63,7 @@ export function RobotServerVersion({ ? `v${robotServerVersion}` : t('robot_settings_advanced_unknown')} - {isOT3 ? ( + {isFlex ? ( {t('robot_server_version_ot3_description')} @@ -92,13 +82,13 @@ export function RobotServerVersion({ {t('up_to_date')} setShowVersionInfoModal(true)} + onClick={() => handleUpdateBuildroot(robot)} textTransform={TYPOGRAPHY.textTransformCapitalize} > {t('reinstall')} diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/SoftwareUpdateModal.tsx b/app/src/organisms/Devices/RobotSettings/AdvancedTab/SoftwareUpdateModal.tsx index 5f61f63025e..d8d8b0b548b 100644 --- a/app/src/organisms/Devices/RobotSettings/AdvancedTab/SoftwareUpdateModal.tsx +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/SoftwareUpdateModal.tsx @@ -21,7 +21,7 @@ import { LegacyModal } from '../../../../molecules/LegacyModal' import { CONNECTABLE, REACHABLE } from '../../../../redux/discovery' import { Divider } from '../../../../atoms/structure' import { useRobot } from '../../hooks' -import { UpdateBuildroot } from '../UpdateBuildroot' +import { handleUpdateBuildroot } from '../UpdateBuildroot' const TECHNICAL_CHANGE_LOG_URL = 'https://github.com/Opentrons/opentrons/blob/edge/CHANGELOG.md' @@ -50,22 +50,9 @@ export function SoftwareUpdateModal({ const [showUpdateModal, setShowUpdateModal] = React.useState(false) const robot = useRobot(robotName) - const handleCloseModal = (): void => { - setShowUpdateModal(false) - closeModal() - } - - const handleLaunchUpdateModal: React.MouseEventHandler = e => { - e.preventDefault() - e.stopPropagation() - setShowUpdateModal(true) - } - if (robot?.status !== CONNECTABLE && robot?.status !== REACHABLE) return null - return showUpdateModal ? ( - - ) : ( + return !showUpdateModal ? ( {t('requires_restarting_the_robot')} @@ -119,7 +106,10 @@ export function SoftwareUpdateModal({ {t('remind_me_later')} { + setShowUpdateModal(true) + handleUpdateBuildroot(robot) + }} disabled={currentRunId != null} > {t('update_robot_now')} @@ -127,5 +117,5 @@ export function SoftwareUpdateModal({ - ) + ) : null } diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/Troubleshooting.tsx b/app/src/organisms/Devices/RobotSettings/AdvancedTab/Troubleshooting.tsx index 526c6e30624..c5476583d90 100644 --- a/app/src/organisms/Devices/RobotSettings/AdvancedTab/Troubleshooting.tsx +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/Troubleshooting.tsx @@ -27,10 +27,12 @@ import type { IconProps } from '@opentrons/components' interface TroubleshootingProps { robotName: string + isEstopNotDisengaged: boolean } export function Troubleshooting({ robotName, + isEstopNotDisengaged, }: TroubleshootingProps): JSX.Element { const { t } = useTranslation('device_settings') const robot = useRobot(robotName) @@ -125,7 +127,10 @@ export function Troubleshooting({ () const { updateFromFileDisabledReason } = useSelector((state: State) => { return getRobotUpdateDisplayInfo(state, robotName) }) const updateDisabled = updateFromFileDisabledReason !== null const [updateButtonProps, updateButtonTooltipProps] = useHoverTooltip() const inputRef = React.useRef(null) + const dispatchStartRobotUpdate = useDispatchStartRobotUpdate() const handleChange: React.ChangeEventHandler = event => { const { files } = event.target if (files?.length === 1 && !updateDisabled) { - dispatch(startRobotUpdate(robotName, files[0].path)) + dispatchStartRobotUpdate(robotName, files[0].path) onUpdateStart() } + // this is to reset the state of the file picker so users can reselect the same + // system image if the upload fails + if (inputRef.current?.value != null) { + inputRef.current.value = '' + } } const handleClick: React.MouseEventHandler = () => { diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/__tests__/EnableStatusLight.test.tsx b/app/src/organisms/Devices/RobotSettings/AdvancedTab/__tests__/EnableStatusLight.test.tsx new file mode 100644 index 00000000000..a91adc64782 --- /dev/null +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/__tests__/EnableStatusLight.test.tsx @@ -0,0 +1,61 @@ +import * as React from 'react' +import { fireEvent } from '@testing-library/react' + +import { renderWithProviders } from '@opentrons/components' + +import { i18n } from '../../../../../i18n' +import { useLEDLights } from '../../../hooks' +import { EnableStatusLight } from '../EnableStatusLight' + +jest.mock('../../../hooks') + +const mockUseLEDLights = useLEDLights as jest.MockedFunction< + typeof useLEDLights +> + +const ROBOT_NAME = 'otie' +const mockToggleLights = jest.fn() +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + }) +} + +describe('EnableStatusLight', () => { + let props: React.ComponentProps + + beforeEach(() => { + props = { + robotName: ROBOT_NAME, + isEstopNotDisengaged: false, + } + mockUseLEDLights.mockReturnValue({ + lightsEnabled: false, + toggleLights: mockToggleLights, + }) + }) + + it('should render text and toggle button', () => { + const [{ getByText, getByLabelText }] = render(props) + getByText('Enable status light') + getByText( + 'Turn on or off the strip of color LEDs on the front of the robot.' + ) + expect(getByLabelText('enable_status_light')).toBeInTheDocument() + }) + + it('should call a mock function when clicking toggle button', () => { + const [{ getByLabelText }] = render(props) + fireEvent.click(getByLabelText('enable_status_light')) + expect(mockToggleLights).toHaveBeenCalled() + }) + + it('shoud make toggle button disabled when e-stop is pressed', () => { + props = { + ...props, + isEstopNotDisengaged: true, + } + const [{ getByLabelText }] = render(props) + expect(getByLabelText('enable_status_light')).toBeDisabled() + }) +}) diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/__tests__/OpenJupyterControl.test.tsx b/app/src/organisms/Devices/RobotSettings/AdvancedTab/__tests__/OpenJupyterControl.test.tsx index 64d7b5a1ddd..a675437a07d 100644 --- a/app/src/organisms/Devices/RobotSettings/AdvancedTab/__tests__/OpenJupyterControl.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/__tests__/OpenJupyterControl.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { MemoryRouter } from 'react-router-dom' -import { fireEvent } from '@testing-library/react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../../../i18n' import { @@ -17,17 +17,26 @@ const mockIpAddress = '1.1.1.1' const mockLink = `http://${mockIpAddress}:48888` const trackEvent = jest.fn() -const render = () => { +global.window = Object.create(window) +Object.defineProperty(window, 'open', { writable: true, configurable: true }) +window.open = jest.fn() + +const render = (props: React.ComponentProps) => { return renderWithProviders( - + , { i18nInstance: i18n } ) } describe('RobotSettings OpenJupyterControl', () => { + let props: React.ComponentProps beforeEach(() => { + props = { + robotIp: mockIpAddress, + isEstopNotDisengaged: false, + } mockUseTrackEvent.mockReturnValue(trackEvent) }) @@ -36,33 +45,41 @@ describe('RobotSettings OpenJupyterControl', () => { }) it('should render title, description and button', () => { - const [{ getByText, getByRole }] = render() - getByText('Jupyter Notebook') - getByText( + render(props) + screen.getByText('Jupyter Notebook') + screen.getByText( 'Open the Jupyter Notebook running on this robot in the web browser. This is an experimental feature.' ) - getByText('Learn more about using Jupyter notebook') - getByText('Launch Jupyter Notebook') + screen.getByText('Learn more about using Jupyter notebook') + screen.getByText('Launch Jupyter Notebook') expect( - getByRole('link', { name: 'Launch Jupyter Notebook' }) + screen.getByRole('button', { name: 'Launch Jupyter Notebook' }) ).toBeInTheDocument() }) - it('should render jupyter notebook link', () => { - const [{ getByText }] = render() - const link = getByText('Launch Jupyter Notebook') - expect(link.closest('a')).toHaveAttribute('href', mockLink) - expect(link.closest('a')).toHaveAttribute('target', '_blank') - expect(link.closest('a')).toHaveAttribute('rel', 'noopener noreferrer') + it('should render jupyter notebook button', () => { + render(props) + const button = screen.getByRole('button', { + name: 'Launch Jupyter Notebook', + }) + fireEvent.click(button) + expect(window.open).toHaveBeenCalledWith(mockLink, '_blank') }) - it('should send and analytics event on link click', () => { - const [{ getByRole }] = render() - const button = getByRole('link', { name: 'Launch Jupyter Notebook' }) + it('should send and analytics event on button click', () => { + const [{ getByRole }] = render(props) + const button = getByRole('button', { name: 'Launch Jupyter Notebook' }) fireEvent.click(button) expect(trackEvent).toHaveBeenCalledWith({ name: ANALYTICS_JUPYTER_OPEN, properties: {}, }) }) + + it('should render disabled button when e-stop button is pressed', () => { + props = { ...props, isEstopNotDisengaged: true } + const [{ getByRole }] = render(props) + const button = getByRole('button', { name: 'Launch Jupyter Notebook' }) + expect(button).toBeDisabled() + }) }) diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/__tests__/RobotServerVersion.test.tsx b/app/src/organisms/Devices/RobotSettings/AdvancedTab/__tests__/RobotServerVersion.test.tsx index 63b15534638..c9e6fbed7af 100644 --- a/app/src/organisms/Devices/RobotSettings/AdvancedTab/__tests__/RobotServerVersion.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/__tests__/RobotServerVersion.test.tsx @@ -7,7 +7,7 @@ import { getRobotApiVersion } from '../../../../../redux/discovery' import { getRobotUpdateDisplayInfo } from '../../../../../redux/robot-update' import { mockConnectableRobot } from '../../../../../redux/discovery/__fixtures__' import { useRobot } from '../../../hooks' -import { UpdateBuildroot } from '../../UpdateBuildroot' +import { handleUpdateBuildroot } from '../../UpdateBuildroot' import { RobotServerVersion } from '../RobotServerVersion' jest.mock('../../../hooks') @@ -24,8 +24,8 @@ const mockGetBuildrootUpdateDisplayInfo = getRobotUpdateDisplayInfo as jest.Mock const mockUseRobot = useRobot as jest.MockedFunction -const mockUpdateBuildroot = UpdateBuildroot as jest.MockedFunction< - typeof UpdateBuildroot +const mockUpdateBuildroot = handleUpdateBuildroot as jest.MockedFunction< + typeof handleUpdateBuildroot > const MOCK_ROBOT_VERSION = '7.7.7' @@ -40,7 +40,6 @@ const render = () => { describe('RobotSettings RobotServerVersion', () => { beforeEach(() => { - mockUpdateBuildroot.mockReturnValue(
mock update buildroot
) mockUseRobot.mockReturnValue(mockConnectableRobot) mockGetBuildrootUpdateDisplayInfo.mockReturnValue({ autoUpdateAction: 'reinstall', @@ -66,7 +65,7 @@ describe('RobotSettings RobotServerVersion', () => { getByText('up to date') const reinstall = getByRole('button', { name: 'reinstall' }) fireEvent.click(reinstall) - getByText('mock update buildroot') + expect(mockUpdateBuildroot).toHaveBeenCalled() }) it('should render the warning message if the robot server version needs to upgrade', () => { @@ -81,7 +80,7 @@ describe('RobotSettings RobotServerVersion', () => { ) const btn = getByText('View update') fireEvent.click(btn) - getByText('mock update buildroot') + expect(mockUpdateBuildroot).toHaveBeenCalled() }) it('should render the warning message if the robot server version needs to downgrade', () => { @@ -96,7 +95,7 @@ describe('RobotSettings RobotServerVersion', () => { ) const btn = getByText('View update') fireEvent.click(btn) - getByText('mock update buildroot') + expect(mockUpdateBuildroot).toHaveBeenCalled() }) it('the link should have the correct href', () => { diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/__tests__/Troubleshooting.test.tsx b/app/src/organisms/Devices/RobotSettings/AdvancedTab/__tests__/Troubleshooting.test.tsx index 700ae868ee7..fe7cb9598b5 100644 --- a/app/src/organisms/Devices/RobotSettings/AdvancedTab/__tests__/Troubleshooting.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/__tests__/Troubleshooting.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { MemoryRouter } from 'react-router-dom' -import { act, cleanup, waitFor } from '@testing-library/react' +import { act, waitFor } from '@testing-library/react' import { resetAllWhenMocks, when } from 'jest-when' import { renderWithProviders } from '@opentrons/components' @@ -16,7 +16,7 @@ import { useRobot } from '../../../hooks' import { Troubleshooting } from '../Troubleshooting' import type { HostConfig } from '@opentrons/api-client' -import { ToasterContextType } from '../../../../ToasterOven/ToasterContext' +import type { ToasterContextType } from '../../../../ToasterOven/ToasterContext' jest.mock('@opentrons/react-api-client') jest.mock('../../../../../organisms/ToasterOven') @@ -32,18 +32,25 @@ const HOST_CONFIG: HostConfig = { hostname: 'localhost' } const MOCK_MAKE_TOAST = jest.fn() const MOCK_EAT_TOAST = jest.fn() -const render = (robotName = ROBOT_NAME) => { +const render = (props: React.ComponentProps) => { return renderWithProviders( - + , { i18nInstance: i18n } ) } describe('RobotSettings Troubleshooting', () => { + let props: React.ComponentProps beforeEach(() => { - when(mockUseRobot).calledWith('otie').mockReturnValue(mockConnectableRobot) + props = { + robotName: ROBOT_NAME, + isEstopNotDisengaged: false, + } + when(mockUseRobot) + .calledWith(ROBOT_NAME) + .mockReturnValue(mockConnectableRobot) when(mockUseHost).calledWith().mockReturnValue(HOST_CONFIG) when(mockUseToaster) .calledWith() @@ -55,10 +62,9 @@ describe('RobotSettings Troubleshooting', () => { afterEach(() => { jest.resetAllMocks() resetAllWhenMocks() - cleanup() }) it('should render title, description, and button', () => { - const [{ getByText, getByRole, getByTestId }] = render() + const [{ getByText, getByRole, getByTestId }] = render(props) getByText('Troubleshooting') getByTestId('RobotSettings_Troubleshooting') getByRole('button', { name: 'Download logs' }) @@ -66,13 +72,13 @@ describe('RobotSettings Troubleshooting', () => { it('should be disabled when logs are not available', () => { when(mockUseRobot).calledWith('otie').mockReturnValue(mockUnreachableRobot) - const [{ getByRole }] = render() + const [{ getByRole }] = render(props) const downloadLogsButton = getByRole('button', { name: 'Download logs' }) expect(downloadLogsButton).toBeDisabled() }) it('should initiate log download when clicking Download logs button', async () => { - const [{ getByRole, queryByText }] = render() + const [{ getByRole, queryByText }] = render(props) const downloadLogsButton = getByRole('button', { name: 'Download logs' }) act(() => { downloadLogsButton.click() @@ -89,4 +95,10 @@ describe('RobotSettings Troubleshooting', () => { expect(downloadLogsButton).not.toBeDisabled() }) }) + + it('should make donwload button disabled when e-stop is pressed', () => { + props = { ...props, isEstopNotDisengaged: true } + const [{ getByRole }] = render(props) + expect(getByRole('button', { name: 'Download logs' })).toBeDisabled() + }) }) diff --git a/app/src/organisms/Devices/RobotSettings/AdvancedTab/index.ts b/app/src/organisms/Devices/RobotSettings/AdvancedTab/index.ts index 9e7ada15c5c..1c5cb506bc7 100644 --- a/app/src/organisms/Devices/RobotSettings/AdvancedTab/index.ts +++ b/app/src/organisms/Devices/RobotSettings/AdvancedTab/index.ts @@ -1,6 +1,7 @@ -export * from './GantryHoming' -export * from './DisplayRobotName' export * from './DeviceReset' +export * from './DisplayRobotName' +export * from './EnableStatusLight' +export * from './GantryHoming' export * from './LegacySettings' export * from './OpenJupyterControl' export * from './RobotInformation' diff --git a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/ConnectModal.test.tsx b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/ConnectModal.test.tsx index 37ae928218e..2a42de5819b 100644 --- a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/ConnectModal.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/ConnectModal.test.tsx @@ -1,202 +1,3 @@ -import * as React from 'react' -import { Formik } from 'formik' -import { shallow, mount } from 'enzyme' - -import * as Fixtures from '../../../../../../redux/networking/__fixtures__' -import * as FormFields from '../form-fields' - -import { ConnectModal, ConnectModalComponent } from '..' -import { FormModal } from '../FormModal' -import { ConnectFormField } from '../../types' - -import type { ShallowWrapper } from 'enzyme' - -jest.mock('../form-fields') - -const getConnectFormFields = FormFields.getConnectFormFields as jest.MockedFunction< - typeof FormFields.getConnectFormFields -> - -const validateConnectFormFields = FormFields.validateConnectFormFields as jest.MockedFunction< - typeof FormFields.validateConnectFormFields -> - -const connectFormToConfigureRequest = FormFields.connectFormToConfigureRequest as jest.MockedFunction< - typeof FormFields.connectFormToConfigureRequest -> - -const robotName = 'robotName' -const eapOptions = [Fixtures.mockEapOption] -const wifiKeys = [Fixtures.mockWifiKey] - describe("SelectNetwork's ConnectModal", () => { - const handleConnect = jest.fn() - const handleCancel = jest.fn() - - beforeEach(() => { - getConnectFormFields.mockReturnValue([]) - validateConnectFormFields.mockReturnValue({}) - connectFormToConfigureRequest.mockReturnValue(null) - }) - - afterEach(() => { - jest.resetAllMocks() - }) - - describe('Formik wrapper', () => { - const render = ( - network: - | React.ComponentProps['network'] - | null = null - ): ShallowWrapper> => { - return shallow( - - ) - } - - it('wraps ConnectModalComponent in a Formik wrapper', () => { - const wrapper = render() - const formik = wrapper.find(Formik) - const component = wrapper.find(ConnectModalComponent) - - expect(formik.prop('initialValues')).toEqual({}) - expect(formik.prop('onSubmit')).toEqual(expect.any(Function)) - expect(formik.prop('validate')).toEqual(expect.any(Function)) - expect(formik.prop('validateOnMount')).toBe(true) - expect(component.props()).toEqual({ - robotName, - eapOptions, - wifiKeys, - network: null, - onConnect: handleConnect, - onCancel: handleCancel, - }) - }) - - it('calls onConnect on submit', () => { - const network = Fixtures.mockWifiNetwork - const wrapper = render(network) - const formik: ShallowWrapper< - React.ComponentProps - > = wrapper.find(Formik) - const mockValues = { ssid: 'foobar' } as any - const mockRequest = { ssid: 'foobar', hidden: false } - - connectFormToConfigureRequest.mockReturnValue(mockRequest) - formik.invoke('onSubmit')?.(mockValues, {} as any) - - expect(connectFormToConfigureRequest).toHaveBeenCalledWith( - network, - mockValues - ) - expect(handleConnect).toHaveBeenCalledWith(mockRequest) - }) - - it('does not call onConnect if request comes back null', () => { - const network = Fixtures.mockWifiNetwork - const wrapper = render(network) - const formik = wrapper.find(Formik) - const mockValues = {} - - connectFormToConfigureRequest.mockReturnValue(null) - formik.invoke('onSubmit')?.(mockValues, {} as any) - - expect(handleConnect).not.toHaveBeenCalled() - }) - - it('validates using validateConnectFormFields', () => { - const network = Fixtures.mockWifiNetwork - const wrapper = render(network) - const formik = wrapper.find(Formik) - const mockValues = { ssid: 'foobar' } - const mockErrors = { ssid: 'oh no!' } - - validateConnectFormFields.mockReturnValue(mockErrors) - - const result = formik.invoke('validate')?.(mockValues) - - expect(result).toEqual(mockErrors) - expect(validateConnectFormFields).toHaveBeenCalledWith( - network, - eapOptions, - mockValues - ) - }) - }) - - describe('connected form', () => { - const handleSubmit = jest.fn() - const handleValidate = jest.fn() - - const render = ( - network: - | React.ComponentProps['network'] - | null = null - ): ReturnType => { - return mount( - , - { - wrappingComponent: Formik, - wrappingComponentProps: { - initialValues: {}, - onSubmit: handleSubmit, - validate: handleValidate, - }, - } - ) - } - - it('renders a FormModal for unknown network', () => { - const wrapper = render() - const modal = wrapper.find(FormModal) - - expect(modal.prop('id')).toContain(robotName) - expect(modal.prop('network')).toEqual(null) - expect(modal.prop('onCancel')).toBe(handleCancel) - }) - - it('renders a connect form for an known network', () => { - const network = Fixtures.mockWifiNetwork - const wrapper = render(network) - const modal = wrapper.find(FormModal) - - expect(modal.prop('network')).toEqual(network) - }) - - it('passes fields to the connect form modal', () => { - const mockFields: ConnectFormField[] = [ - { - type: 'text', - name: 'fieldName', - label: '* Field Name', - isPassword: false, - }, - ] as any - - getConnectFormFields.mockReturnValue(mockFields) - - const wrapper = render() - const modal = wrapper.find(FormModal) - - expect(modal.prop('fields')).toEqual(mockFields) - }) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/FormModal.test.tsx b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/FormModal.test.tsx index 590c46f4539..c1efe64434f 100644 --- a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/FormModal.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/FormModal.test.tsx @@ -1,220 +1,3 @@ -import * as React from 'react' -import { mount } from 'enzyme' -import { Formik, Form } from 'formik' -import * as Fixtures from '../../../../../../redux/networking/__fixtures__' -import * as Networking from '../../../../../../redux/networking' -import { ScrollableAlertModal } from '../../../../../../molecules/modals' -import * as Constants from '../../constants' -import { TextField } from '../TextField' -import { KeyFileField } from '../KeyFileField' -import { SecurityField } from '../SecurityField' -import { FormModal } from '../FormModal' - -import type { FormModalProps } from '../FormModal' - -// KeyFileField is wired to redux, so mock it out -jest.mock('../KeyFileField', () => ({ KeyFileField: () => null })) - -const id = 'formId' -const robotName = 'robotName' -const eapOptions = [Fixtures.mockEapOption] -const wifiKeys = [Fixtures.mockWifiKey] - describe('FormModal', () => { - const handleCancel = jest.fn() - - const render = ( - network: FormModalProps['network'] = null, - fields: FormModalProps['fields'] = [], - isValid: FormModalProps['isValid'] = false - ) => { - return mount( - , - { - wrappingComponent: Formik, - wrappingComponentProps: { initialValues: {} }, - } - ) - } - - afterEach(() => { - jest.resetAllMocks() - }) - - it('should render a with a form', () => { - const wrapper = render() - const modal = wrapper.find(ScrollableAlertModal) - - expect(modal.prop('alertOverlay')).toEqual(true) - expect(modal.prop('iconName')).toEqual('wifi') - expect(modal.prop('onCloseClick')).toEqual(handleCancel) - }) - - it('should render a form with attached cancel and submit buttons', () => { - const wrapper = render(null, [], true) - const modal = wrapper.find(ScrollableAlertModal) - const form = modal.find(Form) - const formId = form.prop('id') - - expect(formId).toBe(id) - expect(modal.prop('buttons')).toEqual([ - { children: 'cancel', onClick: handleCancel }, - { children: 'connect', type: 'submit', form: formId, disabled: false }, - ]) - }) - - it('should disable the button if form is not valid', () => { - const wrapper = render(null, [], false) - const modal = wrapper.find(ScrollableAlertModal) - const form = modal.find(Form) - const formId = form.prop('id') - - expect(modal.prop('buttons')).toEqual([ - { children: 'cancel', onClick: handleCancel }, - { children: 'connect', type: 'submit', form: formId, disabled: true }, - ]) - }) - - it('should render the correct heading for an unknown network', () => { - const wrapper = render() - const heading = wrapper.find(ScrollableAlertModal).prop('heading') - - expect(heading).toMatch(/Find and join a Wi-Fi network/) - }) - - it('should render the correct heading for a known network', () => { - const network = Fixtures.mockWifiNetwork - const wrapper = render(network) - const heading = wrapper.find(ScrollableAlertModal).prop('heading') - - expect(heading).toContain(`Connect to ${network.ssid}`) - }) - - it('should render the correct body copy for an unknown network', () => { - const wrapper = render() - const modal = wrapper.find(ScrollableAlertModal) - const copy = modal.find('p').html() - - expect(copy).toMatch(/Enter the network name and security/) - }) - - it('renders proper body for WPA-PSK network', () => { - const network = { - ...Fixtures.mockWifiNetwork, - securityType: Networking.SECURITY_WPA_PSK, - } - - const wrapper = render(network) - const modal = wrapper.find(ScrollableAlertModal) - const copy = modal.find('p').html() - - expect(copy).toMatch(/requires a WPA2 password/) - }) - - it('renders proper body for WPA-EAP network', () => { - const network = { - ...Fixtures.mockWifiNetwork, - securityType: Networking.SECURITY_WPA_EAP, - } - - const wrapper = render(network) - const alert = wrapper.find(ScrollableAlertModal) - const copy = alert.find('p').html() - - expect(copy).toMatch(/requires 802.1X authentication/) - }) - - describe('string fields', () => { - const stringField = { - type: Constants.FIELD_TYPE_TEXT, - name: 'fieldName', - label: '* Field Name', - isPassword: false, - } - - it('can render a string field', () => { - const fields = [stringField] - const wrapper = render(null, fields) - const field = wrapper.find(TextField) - - expect(field.prop('isPassword')).toBe(false) - expect(field.prop('label')).toBe('* Field Name') - expect(field.prop('name')).toBe('fieldName') - expect(field.prop('id')).toMatch(/__fieldName$/) - }) - - it('can render a password field', () => { - const fields = [{ ...stringField, isPassword: true }] - const wrapper = render(null, fields) - const field = wrapper.find(TextField) - - expect(field.prop('isPassword')).toBe(true) - expect(field.prop('label')).toBe('* Field Name') - expect(field.prop('name')).toBe('fieldName') - expect(field.prop('id')).toMatch(/__fieldName$/) - }) - }) - - describe('wifi key fields', () => { - const keyField = { - type: Constants.FIELD_TYPE_KEY_FILE, - name: 'fieldName', - label: '* Field Name', - placeholder: 'Select file', - robotName, - wifiKeys, - } - - it('can render a "file" field', () => { - const fields = [keyField] - const wrapper = render(null, fields) - const field = wrapper.find(KeyFileField) - - expect(field.prop('label')).toBe('* Field Name') - expect(field.prop('name')).toBe('fieldName') - expect(field.prop('placeholder')).toBe('Select file') - expect(field.prop('id')).toMatch(/__fieldName$/) - expect(field.prop('robotName')).toBe(robotName) - expect(field.prop('wifiKeys')).toBe(wifiKeys) - }) - }) - - describe('wifi security fields', () => { - const securityField = { - type: Constants.FIELD_TYPE_SECURITY, - name: 'securityType', - label: '* Authentication', - showAllOptions: true, - placeholder: 'Select authentication method', - eapOptions, - } - - it('can render a "security" field for unknown network', () => { - const fields = [securityField] - const wrapper = render(null, fields) - const field = wrapper.find(SecurityField) - - expect(field.prop('label')).toBe('* Authentication') - expect(field.prop('name')).toBe('securityType') - expect(field.prop('id')).toMatch(/__securityType$/) - expect(field.prop('showAllOptions')).toBe(true) - expect(field.prop('placeholder')).toBe('Select authentication method') - expect(field.prop('eapOptions')).toBe(eapOptions) - }) - - it('can render a "security" field for known network', () => { - const network = Fixtures.mockWifiNetwork - const fields = [{ ...securityField, showAllOptions: false }] - const wrapper = render(network, fields) - const field = wrapper.find(SecurityField) - - expect(field.prop('showAllOptions')).toBe(false) - }) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/KeyFileField.test.tsx b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/KeyFileField.test.tsx index 2306f6a3373..78b532daaa8 100644 --- a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/KeyFileField.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/KeyFileField.test.tsx @@ -1,163 +1,3 @@ -import * as React from 'react' -import { shallow } from 'enzyme' - -import * as Fixtures from '../../../../../../redux/networking/__fixtures__' -import { SelectField } from '@opentrons/components' -import { UploadKeyInput } from '../UploadKeyInput' -import { KeyFileField } from '../KeyFileField' -import * as FormState from '../form-state' - -import { LABEL_ADD_NEW_KEY } from '../../i18n' - -import type { ShallowWrapper } from 'enzyme' -import type { ActionMeta } from 'react-select' -import type { SelectOption } from '@opentrons/components' - -jest.mock('../form-state') - -const useConnectFormField = FormState.useConnectFormField as jest.MockedFunction< - typeof FormState.useConnectFormField -> - describe('ConnectModal KeyFileField', () => { - const fieldId = 'field-id' - const fieldName = 'field-name' - const fieldLabel = 'Field Label:' - const fieldPlaceholder = 'Placeholder...' - const fieldError = 'oh no!' - const robotName = 'robot-name' - const wifiKeys = [ - { ...Fixtures.mockWifiKey, id: 'foo', name: 'foo.crt' }, - { ...Fixtures.mockWifiKey, id: 'bar', name: 'bar.crt' }, - { ...Fixtures.mockWifiKey, id: 'baz', name: 'baz.crt' }, - ] - const setValue = jest.fn() - const setTouched = jest.fn() - - const render = (value: any | null = null): ReturnType => { - useConnectFormField.mockImplementation(name => { - expect(name).toBe(fieldName) - return { - value, - setValue, - setTouched, - error: fieldError, - onChange: () => {}, - onBlur: () => {}, - } - }) - - return shallow( - - ) - } - - it('renders a SelectField', () => { - const wrapper = render('bar') - const select = wrapper.find(SelectField) - - expect(select.prop('id')).toEqual(fieldId) - expect(select.prop('name')).toEqual(fieldName) - expect(select.prop('error')).toEqual(fieldError) - expect(select.prop('placeholder')).toEqual(fieldPlaceholder) - expect(select.prop('value')).toEqual('bar') - }) - - it('renders a label for the field', () => { - const wrapper = render() - - const label = wrapper - .find(`[label="${fieldLabel}"]`) - .dive() - .find(`[htmlFor="${fieldId}"]`) - - expect(label.text()).toEqual(fieldLabel) - }) - - it('renders wifiKeys as options', () => { - const wrapper = render() - const select = wrapper.find(SelectField) - - expect(select.prop('options')).toEqual( - expect.arrayContaining([ - { - options: [ - { value: 'foo', label: 'foo.crt' }, - { value: 'bar', label: 'bar.crt' }, - { value: 'baz', label: 'baz.crt' }, - ], - }, - ]) - ) - }) - - it('renders an UploadKeyInput and an option to trigger it', () => { - const wrapper = render() - const select = wrapper.find(SelectField) - const upload = wrapper.find(UploadKeyInput) - const expected = { value: expect.any(String), label: LABEL_ADD_NEW_KEY } - - expect(upload.prop('label')).toEqual(LABEL_ADD_NEW_KEY) - expect(upload.prop('robotName')).toEqual(robotName) - expect(select.prop('options')).toEqual( - expect.arrayContaining([ - { - options: [expected], - }, - ]) - ) - }) - - it('updates the field value with UploadKeyInput::onUpload', () => { - const wrapper = render() - const upload: ShallowWrapper< - React.ComponentProps - > = wrapper.find(UploadKeyInput) - - upload.invoke('onUpload')?.('new-key-id') - expect(setValue).toHaveBeenCalledWith('new-key-id') - }) - - it('updates the field value with SelectField::onValueChange', () => { - const wrapper = render() - const select = wrapper.find(SelectField) - - select.invoke('onValueChange')?.( - fieldName, - 'new-key-id', - ('input-change' as unknown) as ActionMeta - ) - expect(setValue).toHaveBeenCalledWith('new-key-id') - }) - - it('does not update the field value when add new option is selected', () => { - const wrapper = render() - const select = wrapper.find(SelectField) - const options = select.prop('options').flatMap((o: any) => o.options) - const addNewOpt = options.find(o => o?.label === LABEL_ADD_NEW_KEY) - - select.invoke('onValueChange')?.( - fieldName, - addNewOpt?.value, - ('input-change' as unknown) as ActionMeta - ) - expect(setValue).not.toHaveBeenCalledWith(addNewOpt?.value) - }) - - it('updates field touched with SelectField::onLoseFocus', () => { - const wrapper = render() - const select: ShallowWrapper< - React.ComponentProps - > = wrapper.find(SelectField) - - select.invoke('onLoseFocus')?.('') - expect(setTouched).toHaveBeenCalledWith(true) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/SecurityField.test.tsx b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/SecurityField.test.tsx index 2f02b498b78..f9b91b9ca4f 100644 --- a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/SecurityField.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/SecurityField.test.tsx @@ -1,133 +1,3 @@ -import * as React from 'react' -import { mount } from 'enzyme' - -import * as Fixtures from '../../../../../../redux/networking/__fixtures__' -import { SelectField } from '@opentrons/components' -import { SecurityField } from '../SecurityField' -import * as FormState from '../form-state' - -import { LABEL_SECURITY_NONE, LABEL_SECURITY_PSK } from '../../i18n' -import { SECURITY_NONE, SECURITY_WPA_PSK } from '../../constants' -import type { ActionMeta } from 'react-select' -import type { SelectOption } from '@opentrons/components' - -jest.mock('../form-state') - -const useConnectFormField = FormState.useConnectFormField as jest.MockedFunction< - typeof FormState.useConnectFormField -> - describe('ConnectModal SecurityField', () => { - const fieldId = 'field-id' - const fieldName = 'field-name' - const fieldLabel = 'Field Label:' - const fieldPlaceholder = 'Placeholder...' - const eapOptions = [ - { ...Fixtures.mockEapOption, name: 'option1', displayName: 'Option 1' }, - { ...Fixtures.mockEapOption, name: 'option2', displayName: 'Option 2' }, - { ...Fixtures.mockEapOption, name: 'option3', displayName: 'Option 3' }, - ] - const setValue = jest.fn() - const setTouched = jest.fn() - - const render = ( - value: any | null = null, - error: any | null = null, - showAllOptions: any | null = false - ): ReturnType => { - useConnectFormField.mockImplementation(name => { - expect(name).toBe(fieldName) - return { - value, - error, - setValue, - setTouched, - onChange: () => {}, - onBlur: () => {}, - } - }) - - return mount( - - ) - } - - it('renders a SelectField', () => { - const wrapper = render('value', 'error') - const select = wrapper.find(SelectField) - - expect(select.prop('id')).toEqual(fieldId) - expect(select.prop('name')).toEqual(fieldName) - expect(select.prop('placeholder')).toEqual(fieldPlaceholder) - expect(select.prop('value')).toEqual('value') - expect(select.prop('error')).toEqual('error') - }) - - it('renders a label for the field', () => { - const wrapper = render() - const label = wrapper.find(`label[htmlFor="${fieldId}"]`) - - expect(label.text()).toEqual(fieldLabel) - }) - - it('renders EAP security options', () => { - const wrapper = render() - const select = wrapper.find(SelectField) - - expect(select.prop('options')).toEqual( - expect.arrayContaining([ - { - options: [ - { value: 'option1', label: 'Option 1' }, - { value: 'option2', label: 'Option 2' }, - { value: 'option3', label: 'Option 3' }, - ], - }, - ]) - ) - }) - - it('can render all security options', () => { - const wrapper = render(null, null, true) - const select = wrapper.find(SelectField) - - expect(select.prop('options')).toEqual( - expect.arrayContaining([ - { - options: [{ value: SECURITY_NONE, label: LABEL_SECURITY_NONE }], - }, - { - options: [{ value: SECURITY_WPA_PSK, label: LABEL_SECURITY_PSK }], - }, - ]) - ) - }) - - it('triggers a value update if selected', () => { - const wrapper = render() - const select = wrapper.find(SelectField) - - select.invoke('onValueChange')?.( - fieldName, - SECURITY_NONE, - ('input-change' as unknown) as ActionMeta - ) - - expect(setValue).toHaveBeenCalledWith(SECURITY_NONE) - }) - - it('triggers a touched update if blurred', () => { - const wrapper = render() - const select = wrapper.find(SelectField) - - select.invoke('onLoseFocus')?.(fieldName) - expect(setTouched).toHaveBeenCalledWith(true) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/TextField.test.tsx b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/TextField.test.tsx index 4af3ce0a267..a3ee93706a0 100644 --- a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/TextField.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/TextField.test.tsx @@ -1,115 +1,3 @@ -import * as React from 'react' -import { act } from 'react-dom/test-utils' -import { mount } from 'enzyme' -import { TextField } from '../TextField' -import * as FormState from '../form-state' - -jest.mock('../form-state') - -const useConnectFormField = FormState.useConnectFormField as jest.MockedFunction< - typeof FormState.useConnectFormField -> - describe('ConnectModal TextField', () => { - const fieldId = 'field-id' - const fieldName = 'field-name' - const fieldValue = 'field-value' - const handleChange = jest.fn() - const handleBlur = jest.fn() - - const fieldLabel = 'Field Label:' - const inputSelector = `input[name="${fieldName}"]` - const labelSelector = `label[htmlFor="${fieldId}"]` - const checkboxSelector = 'input[type="checkbox"]' - - const render = ( - isPassword: boolean = false, - error: any | null = null - ): ReturnType => { - useConnectFormField.mockImplementation(name => { - expect(name).toBe(fieldName) - return { - value: fieldValue, - error, - onChange: handleChange, - onBlur: handleBlur, - setValue: () => {}, - setTouched: () => {}, - } - }) - - return mount( - - ) - } - - afterEach(() => { - jest.resetAllMocks() - }) - - it('renders an input and passes field props through', () => { - const wrapper = render() - const input = wrapper.find(inputSelector) - - expect(input.prop('id')).toEqual(fieldId) - expect(input.prop('name')).toEqual(fieldName) - expect(input.prop('value')).toEqual(fieldValue) - expect(input.prop('onChange')).toEqual(handleChange) - expect(input.prop('onBlur')).toEqual(handleBlur) - }) - - it('renders an input[type="text"] if props.type is string', () => { - const wrapper = render() - const input = wrapper.find(inputSelector) - - expect(input.prop('type')).toEqual('text') - }) - - it('renders an input[type="password"] if props.type is password', () => { - const wrapper = render(true) - const input = wrapper.find(inputSelector) - - expect(input.prop('type')).toEqual('password') - }) - - it('renders a checkbox to toggle showing password if type password', () => { - const wrapper = render(true) - const checkbox = wrapper.find(checkboxSelector) - - expect(checkbox).toHaveLength(1) - expect(checkbox.prop('checked')).toEqual(false) - }) - - it('toggling the checkbox switches password input to text', () => { - const wrapper = render(true) - const checkbox = wrapper.find(checkboxSelector) - - act(() => checkbox.invoke('onChange')?.({} as React.ChangeEvent)) - wrapper.update() - expect(wrapper.find(checkboxSelector).prop('checked')).toEqual(true) - expect(wrapper.find(inputSelector).prop('type')).toEqual('text') - - act(() => checkbox.invoke('onChange')?.({} as React.ChangeEvent)) - wrapper.update() - expect(wrapper.find(checkboxSelector).prop('checked')).toEqual(false) - expect(wrapper.find(inputSelector).prop('type')).toEqual('password') - }) - - it('renders a label attached to the input', () => { - const wrapper = render() - const label = wrapper.find(labelSelector) - - expect(label.text()).toEqual(fieldLabel) - }) - - it('can render an error message', () => { - const wrapper = render(false, 'oh no!') - - expect(wrapper.html()).toContain('oh no!') - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/UploadKeyInput.test.tsx b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/UploadKeyInput.test.tsx index 870f18433f4..48bf5edec0a 100644 --- a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/UploadKeyInput.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/UploadKeyInput.test.tsx @@ -1,109 +1,3 @@ -import * as React from 'react' -import { Provider } from 'react-redux' -import { act } from 'react-dom/test-utils' -import { mount } from 'enzyme' - -import * as Fixtures from '../../../../../../redux/networking/__fixtures__' -import * as Networking from '../../../../../../redux/networking' -import { UploadKeyInput } from '../UploadKeyInput' - -import type { Action } from '../../../../../../redux/types' - -jest.mock('../../../../../../redux/networking/selectors') - -const mockState = { state: true, mock: true } -const mockRobotName = 'robot-name' as any -const mockFile = new File(['key-contents'], 'key.crt') - -const mockGetWifiKeyByRequestId = Networking.getWifiKeyByRequestId as jest.MockedFunction< - typeof Networking.getWifiKeyByRequestId -> - describe('ConnectForm UploadKey input field', () => { - const handleUpload = jest.fn() - const label = 'field-label' - let dispatch: any - let mockStore: any - let render: (ref?: any) => ReturnType - - beforeEach(() => { - dispatch = jest.fn() - mockStore = { - dispatch, - subscribe: () => {}, - getState: () => mockState, - } - - mockGetWifiKeyByRequestId.mockReturnValue(null) - - render = ref => { - return mount( - , - { - wrappingComponent: Provider, - wrappingComponentProps: { store: mockStore }, - } - ) - } - }) - - afterEach(() => { - jest.clearAllMocks() - jest.clearAllTimers() - jest.useRealTimers() - }) - - it('has an input type=file', () => { - const wrapper = render() - const input = wrapper.find('input[type="file"]') - - expect(input).toHaveLength(1) - expect(input.prop('aria-label')).toEqual(label) - }) - - it('dispatches networking:POST_WIFI_KEYS on file input', () => { - const wrapper = render() - const input = wrapper.find('input[type="file"]') - - act(() => { - input.invoke('onChange')?.({ target: { files: [mockFile] } } as any) - }) - - expect(dispatch).toHaveBeenCalledWith( - expect.objectContaining({ - ...Networking.postWifiKeys(mockRobotName, mockFile), - meta: { requestId: expect.any(String) }, - }) - ) - }) - - it('calls onUpload with ID of POSTed key', () => { - const wrapper = render() - const input = wrapper.find('input[type="file"]') - - act(() => { - input.invoke('onChange')?.({ target: { files: [mockFile] } } as any) - const postAction = dispatch.mock.calls.find(([action]: Action[]) => { - return action.type === Networking.POST_WIFI_KEYS - }) - const requestId = postAction?.[0].meta.requestId - const mockKey = { ...Fixtures.mockWifiKey, requestId } - - mockGetWifiKeyByRequestId.mockImplementation( - (state, robotName, reqId) => { - expect(state).toEqual(mockState) - expect(robotName).toEqual(mockRobotName) - return reqId === requestId ? mockKey : null - } - ) - }) - wrapper.update() - - expect(handleUpload).toHaveBeenCalledWith(Fixtures.mockWifiKey.id) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/form-state.test.tsx b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/form-state.test.tsx index fdd50c8d84f..5ab862d776e 100644 --- a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/form-state.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/ConnectModal/__tests__/form-state.test.tsx @@ -1,166 +1,3 @@ -import * as React from 'react' -import { mount } from 'enzyme' -import * as Formik from 'formik' - -import { - useResetFormOnSecurityChange, - useConnectFormField, -} from '../form-state' - -import type { ConnectFormFieldProps } from '../../types' - -// TODO(mc, 2020-03-13): DANGER: mocking Formik hooks here is code smell, -// but unfortunately the async nature of validation in Formik v2 basically -// means Formik hooks can't be tested in `act`. This should be resolved by the -// removal of async validation in Formik v3 -// https://github.com/jaredpalmer/formik/issues/1543 -// https://github.com/jaredpalmer/formik/pull/2360 -jest.mock('formik') - -const useFormikContext = Formik.useFormikContext as jest.MockedFunction< - typeof Formik.useFormikContext -> - -const useField = Formik.useField as jest.MockedFunction - describe('ConnectModal state hooks', () => { - afterEach(() => { - jest.resetAllMocks() - }) - - describe('useResetFormOnSecurityChange', () => { - const setErrors = jest.fn() - const setTouched = jest.fn() - const setValues = jest.fn() - - const mockFormOnce = ( - values: any, - errors: any = {}, - touched: any = {} - ): void => { - useFormikContext.mockReturnValueOnce({ - values, - errors, - touched, - setValues, - setErrors, - setTouched, - } as any) - } - - const TestUseResetFormOnSecurityChange = (): JSX.Element => { - useResetFormOnSecurityChange() - return <> - } - - const render = (): ReturnType => { - return mount() - } - - it('resets form values if values.securityType changes', () => { - mockFormOnce({ ssid: 'foo', securityType: 'baz', psk: 'baz' }) - mockFormOnce({ ssid: 'foo', securityType: 'qux', psk: 'baz' }) - const wrapper = render() - - wrapper.setProps({}) - - expect(setValues).toHaveBeenCalledTimes(1) - expect(setValues).toHaveBeenCalledWith({ - ssid: 'foo', - securityType: 'qux', - }) - }) - - it('resets form errors if values.securityType changes', () => { - const errors = { ssid: 'missing!', psk: 'too short!' } - mockFormOnce({ ssid: '', securityType: 'baz', psk: 'baz' }, errors) - mockFormOnce({ ssid: '', securityType: 'qux', psk: 'baz' }, errors) - const wrapper = render() - - wrapper.setProps({}) - - expect(setErrors).toHaveBeenCalledTimes(1) - expect(setErrors).toHaveBeenCalledWith({ ssid: 'missing!' }) - }) - - it('resets form touched if values.securityType changes', () => { - const touched = { ssid: false, psk: true } - mockFormOnce({ ssid: '', securityType: 'baz', psk: 'baz' }, {}, touched) - mockFormOnce({ ssid: '', securityType: 'qux', psk: 'baz' }, {}, touched) - const wrapper = render() - - wrapper.setProps({}) - - expect(setTouched).toHaveBeenCalledTimes(1) - expect(setTouched).toHaveBeenCalledWith( - { - ssid: false, - securityType: true, - }, - false - ) - }) - }) - - describe('useConnectFormField', () => { - const fieldName = 'field-name' - const onChange = jest.fn() - const onBlur = jest.fn() - const setValue = jest.fn() - const setTouched = jest.fn() - - const mockFieldOnce = (value?: any, error?: any, touched?: any): void => { - const fieldProps: any = { value, onChange, onBlur } - const fieldMeta: any = { error, touched } - const fieldHelpers: any = { setValue, setTouched } - useField.mockReturnValueOnce([fieldProps, fieldMeta, fieldHelpers]) - } - - const MockField = (props: ConnectFormFieldProps): JSX.Element => <> - - const TestUseConnectFormField = (): JSX.Element => { - const fieldProps = useConnectFormField(fieldName) - return - } - - const render = (): ReturnType => - mount() - - it('passes field name to useField', () => { - mockFieldOnce() - render() - expect(useField).toHaveBeenCalledWith(fieldName) - }) - - it('passes down field props', () => { - mockFieldOnce('value', 'error', true) - const wrapper = render() - expect(wrapper.find(MockField).props()).toEqual({ - value: 'value', - error: 'error', - onChange, - onBlur, - setValue, - setTouched, - }) - }) - - it('maps undefined to null', () => { - mockFieldOnce(undefined, undefined, true) - const wrapper = render() - expect(wrapper.find(MockField).props()).toMatchObject({ - value: null, - error: null, - }) - }) - - it('sets error to null if not touched', () => { - mockFieldOnce('value', 'error', false) - const wrapper = render() - expect(wrapper.find(MockField).props()).toMatchObject({ - value: 'value', - error: null, - }) - }) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/DisconnectModal.tsx b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/DisconnectModal.tsx index 8f28029e201..662dbdce9b5 100644 --- a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/DisconnectModal.tsx +++ b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/DisconnectModal.tsx @@ -21,7 +21,11 @@ import { StyledText } from '../../../../atoms/text' import { LegacyModal } from '../../../../molecules/LegacyModal' import { useRobot } from '../../../../organisms/Devices/hooks' import { CONNECTABLE } from '../../../../redux/discovery' -import { postWifiDisconnect } from '../../../../redux/networking' +import { + clearWifiStatus, + getNetworkInterfaces, + postWifiDisconnect, +} from '../../../../redux/networking' import { useWifiList } from '../../../../resources/networking/hooks' import { dismissRequest, @@ -46,6 +50,9 @@ export const DisconnectModal = ({ const { t } = useTranslation(['device_settings', 'shared']) const wifiList = useWifiList(robotName) + const { wifi } = useSelector((state: State) => + getNetworkInterfaces(state, robotName) + ) const activeNetwork = wifiList?.find(nw => nw.active) const ssid = activeNetwork?.ssid ?? null @@ -93,7 +100,10 @@ export const DisconnectModal = ({ // check for connectable robot health status and presume successful disconnection if request pending and robot not connectable const { status } = useRobot(robotName) ?? {} const isDisconnected = - isRequestSucceeded || (isRequestPending && status !== CONNECTABLE) + isRequestSucceeded || + (isRequestPending && status !== CONNECTABLE) || + // as a fallback, if polled wifi interface ipAddress is null presume successful disconnection + wifi?.ipAddress == null if (isDisconnected) { disconnectModalBody = t('disconnect_from_wifi_network_success') @@ -103,6 +113,12 @@ export const DisconnectModal = ({ disconnectModalBody = t('disconnect_from_wifi_network_failure', { ssid }) } + React.useEffect(() => { + if (isDisconnected) { + dispatch(clearWifiStatus(robotName)) + } + }, [isDisconnected]) + return ( unknown } export const ResultModal = (props: ResultModalProps): JSX.Element => { - const { type, ssid, isPending, error, onClose } = props + const { type, ssid, requestStatus, error, onClose } = props const isDisconnect = type === DISCONNECT - if (isPending) { + if (requestStatus === PENDING) { const message = isDisconnect ? Copy.DISCONNECTING_FROM_NETWORK(ssid) : Copy.CONNECTING_TO_NETWORK(ssid) @@ -27,7 +30,7 @@ export const ResultModal = (props: ResultModalProps): JSX.Element => { return } - if (error) { + if (error || requestStatus === FAILURE) { const heading = isDisconnect ? Copy.UNABLE_TO_DISCONNECT : Copy.UNABLE_TO_CONNECT @@ -38,11 +41,15 @@ export const ResultModal = (props: ResultModalProps): JSX.Element => { const retryMessage = !isDisconnect ? ` ${Copy.CHECK_YOUR_CREDENTIALS}.` : '' + const placeholderError = { + message: `Likely incorrect network password. ${Copy.CHECK_YOUR_CREDENTIALS}.`, + } + return ( ) diff --git a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/SelectSsid/__tests__/NetworkOptionLabel.test.tsx b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/SelectSsid/__tests__/NetworkOptionLabel.test.tsx index b1d19ca9548..ac9e48fe8ea 100644 --- a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/SelectSsid/__tests__/NetworkOptionLabel.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/SelectSsid/__tests__/NetworkOptionLabel.test.tsx @@ -1,86 +1,3 @@ -import * as React from 'react' -import { mount } from 'enzyme' - -import * as Fixtures from '../../../../../../redux/networking/__fixtures__' -import { SECURITY_NONE } from '../../constants' -import { NetworkOptionLabel } from '../NetworkOptionLabel' - -import type { NetworkOptionLabelProps } from '../NetworkOptionLabel' - describe('NetworkOptionLabel presentational component', () => { - let props: NetworkOptionLabelProps - const render = () => mount() - - beforeEach(() => { - props = { ...Fixtures.mockWifiNetwork, showConnectedIcon: true } - }) - - it('renders the ssid of the network', () => { - const wrapper = render() - - expect(wrapper.html()).toContain(props.ssid) - }) - - it('renders the security icon if network has security', () => { - const wrapper = render() - const icon = wrapper.find('Icon[name="lock"]') - expect(icon).toHaveLength(1) - }) - - it('renders no security icon if network has no security', () => { - props = { ...props, securityType: SECURITY_NONE } - const wrapper = render() - const icon = wrapper.find('Icon[name="lock"]') - expect(icon).toHaveLength(0) - }) - - it('renders a check icon if network is active', () => { - props = { ...props, active: true, showConnectedIcon: true } - - const wrapper = render() - const icon = wrapper.find('Icon[name="check"]') - expect(icon).toHaveLength(1) - }) - - it('renders no check icon if network is not active', () => { - props = { ...props, active: false, showConnectedIcon: true } - const wrapper = render() - const icon = wrapper.find('Icon[name="check"]') - expect(icon).toHaveLength(0) - }) - - it('renders no check icon if network is active but showConnectedIcon is false', () => { - props = { ...props, active: true, showConnectedIcon: false } - const wrapper = render() - const icon = wrapper.find('Icon[name="check"]') - expect(icon).toHaveLength(0) - }) - - it('renders very low signal icon when props.signal is very low', () => { - props = { ...props, signal: 24 } - const wrapper = render() - const icon = wrapper.find('Icon[name="ot-wifi-0"]') - expect(icon).toHaveLength(1) - }) - - it('renders low signal icon when props.signal is "low"', () => { - props = { ...props, signal: 49 } - const wrapper = render() - const icon = wrapper.find('Icon[name="ot-wifi-1"]') - expect(icon).toHaveLength(1) - }) - - it('renders medium signal icon when props.signal is "medium"', () => { - props = { ...props, signal: 74 } - const wrapper = render() - const icon = wrapper.find('Icon[name="ot-wifi-2"]') - expect(icon).toHaveLength(1) - }) - - it('renders high signal icon when props.signal is "high"', () => { - props = { ...props, signal: 76 } - const wrapper = render() - const icon = wrapper.find('Icon[name="wifi"]') - expect(icon).toHaveLength(1) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/SelectSsid/__tests__/SelectSsid.test.tsx b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/SelectSsid/__tests__/SelectSsid.test.tsx index bba3dee4009..7e15ed7943b 100644 --- a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/SelectSsid/__tests__/SelectSsid.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/SelectSsid/__tests__/SelectSsid.test.tsx @@ -1,149 +1,3 @@ -import * as React from 'react' -import { mount } from 'enzyme' -import { CONTEXT_VALUE, CONTEXT_MENU } from '@opentrons/components' - -import { SelectField } from '../../../../../../atoms/SelectField' -import * as Fixtures from '../../../../../../redux/networking/__fixtures__' -import { LABEL_JOIN_OTHER_NETWORK } from '../../i18n' - -import { SelectSsid } from '..' -import { NetworkOptionLabel } from '../NetworkOptionLabel' - -import type { ActionMeta } from 'react-select' -import type { SelectOption } from '../../../../../../atoms/SelectField/Select' - -const mockWifiList = [ - { ...Fixtures.mockWifiNetwork, ssid: 'foo', active: true }, - { ...Fixtures.mockWifiNetwork, ssid: 'bar' }, - { ...Fixtures.mockWifiNetwork, ssid: 'baz' }, -] - describe('SelectSsid component', () => { - const handleConnect = jest.fn() - const handleJoinOther = jest.fn() - let mockIsRobotBusy = false - - const render = () => { - return mount( - - ) - } - - afterEach(() => { - jest.resetAllMocks() - }) - - it('renders a SelectField', () => { - const wrapper = render() - const selectField = wrapper.find(SelectField) - - expect(selectField).toHaveLength(1) - }) - - it('renders a disabled SelectField if a robot is busy', () => { - mockIsRobotBusy = true - const wrapper = render() - const selectField = wrapper.find(SelectField) - - expect(selectField.prop('disabled')).toBe(true) - }) - - it('maps ssid list to an ssid option group', () => { - const wrapper = render() - const selectField = wrapper.find(SelectField) - const options = selectField.prop('options') - - expect(options).toContainEqual({ - options: [{ value: 'foo' }, { value: 'bar' }, { value: 'baz' }], - }) - }) - - it('adds an option group for join other network', () => { - const wrapper = render() - const selectField = wrapper.find(SelectField) - const options = selectField.prop('options') - - expect(options).toContainEqual({ - options: [ - { - value: expect.any(String), - label: LABEL_JOIN_OTHER_NETWORK, - }, - ], - }) - }) - - it('if user selects ssid value, onSelect is called with ssid', () => { - const wrapper = render() - const selectField = wrapper.find(SelectField) - - selectField.invoke('onValueChange')?.( - '_', - 'foo', - ('input-change' as unknown) as ActionMeta - ) - - expect(handleConnect).toHaveBeenCalledWith('foo') - }) - - it('if user selects join other value, onJoinOther is called', () => { - const wrapper = render() - const selectField = wrapper.find(SelectField) - const options = selectField.prop('options').flatMap((o: any) => o.options) - const joinOtherValue = options.find( - o => o.label === LABEL_JOIN_OTHER_NETWORK - )?.value - - expect(joinOtherValue).toEqual(expect.any(String)) - selectField.invoke('onValueChange')?.( - '_', - joinOtherValue, - ('input-change' as unknown) as ActionMeta - ) - - expect(handleJoinOther).toHaveBeenCalled() - }) - - it('formats the wifi options as s', () => { - const wrapper = render() - const selectField = wrapper.find(SelectField) - - const expectedFoo = mount( - - ) - const expectedBar = mount( - - ) - const fooLabel = selectField.prop('formatOptionLabel')?.({ value: 'foo' }, { - context: CONTEXT_VALUE, - } as any) as any - const barLabel = selectField.prop('formatOptionLabel')?.({ value: 'bar' }, { - context: CONTEXT_MENU, - } as any) as any - - expect(mount(fooLabel)).toEqual(expectedFoo) - expect(mount(barLabel)).toEqual(expectedBar) - }) - - it('formats the join other label', () => { - const wrapper = render() - const selectField = wrapper.find(SelectField) - const options = selectField.prop('options').flatMap((o: any) => o.options) - const joinOtherOpt = options.find(o => o.label === LABEL_JOIN_OTHER_NETWORK) - - expect(joinOtherOpt?.value).toEqual(expect.any(String)) - expect(joinOtherOpt?.label).toEqual(expect.any(String)) - - const label = selectField.prop('formatOptionLabel')?.(joinOtherOpt, { - context: CONTEXT_MENU, - } as any) as any - - expect(mount(label).html()).toContain(joinOtherOpt?.label) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/__tests__/DisconnectModal.test.tsx b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/__tests__/DisconnectModal.test.tsx index b015fd295f7..d4db882de4b 100644 --- a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/__tests__/DisconnectModal.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/__tests__/DisconnectModal.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent } from '@testing-library/react' import { when, resetAllWhenMocks } from 'jest-when' import { renderWithProviders } from '@opentrons/components' @@ -10,7 +11,12 @@ import { mockConnectableRobot, mockReachableRobot, } from '../../../../../redux/discovery/__fixtures__' -import { postWifiDisconnect } from '../../../../../redux/networking' +import { + clearWifiStatus, + getNetworkInterfaces, + INTERFACE_WIFI, + postWifiDisconnect, +} from '../../../../../redux/networking' import { mockWifiNetwork } from '../../../../../redux/networking/__fixtures__' import { dismissRequest, @@ -38,6 +44,9 @@ const mockUseDispatchApiRequest = useDispatchApiRequest as jest.MockedFunction< const mockGetRequestById = getRequestById as jest.MockedFunction< typeof getRequestById > +const mockGetNetworkInterfaces = getNetworkInterfaces as jest.MockedFunction< + typeof getNetworkInterfaces +> const mockPostWifiDisconnect = postWifiDisconnect as jest.MockedFunction< typeof postWifiDisconnect > @@ -45,10 +54,19 @@ const mockDismissRequest = dismissRequest as jest.MockedFunction< typeof dismissRequest > const mockUseRobot = useRobot as jest.MockedFunction +const mockClearWifiStatus = clearWifiStatus as jest.MockedFunction< + typeof clearWifiStatus +> const ROBOT_NAME = 'otie' const LAST_ID = 'a request id' const mockOnCancel = jest.fn() +const MOCK_WIFI = { + ipAddress: '127.0.0.100', + subnetMask: '255.255.255.230', + macAddress: 'WI:FI:00:00:00:00', + type: INTERFACE_WIFI, +} const render = () => { return renderWithProviders( @@ -73,6 +91,9 @@ describe('DisconnectModal', () => { when(mockGetRequestById) .calledWith({} as State, LAST_ID) .mockReturnValue({} as RequestState) + when(mockGetNetworkInterfaces) + .calledWith({} as State, ROBOT_NAME) + .mockReturnValue({ wifi: MOCK_WIFI, ethernet: null }) when(mockUseRobot) .calledWith(ROBOT_NAME) .mockReturnValue(mockConnectableRobot) @@ -101,6 +122,7 @@ describe('DisconnectModal', () => { getByText('Disconnect from foo') getByText('Disconnecting from Wi-Fi network foo') getByRole('button', { name: 'cancel' }) + expect(mockClearWifiStatus).not.toHaveBeenCalled() }) it('renders success body when request is pending and robot is not connectable', () => { @@ -117,6 +139,7 @@ describe('DisconnectModal', () => { 'Your robot has successfully disconnected from the Wi-Fi network.' ) getByRole('button', { name: 'Done' }) + expect(mockClearWifiStatus).toHaveBeenCalled() }) it('renders success body when request is successful', () => { @@ -130,6 +153,24 @@ describe('DisconnectModal', () => { 'Your robot has successfully disconnected from the Wi-Fi network.' ) getByRole('button', { name: 'Done' }) + expect(mockClearWifiStatus).toHaveBeenCalled() + }) + + it('renders success body when wifi is not connected', () => { + when(mockGetNetworkInterfaces) + .calledWith({} as State, ROBOT_NAME) + .mockReturnValue({ + wifi: { ...MOCK_WIFI, ipAddress: null }, + ethernet: null, + }) + const { getByRole, getByText } = render() + + getByText('Disconnected from Wi-Fi') + getByText( + 'Your robot has successfully disconnected from the Wi-Fi network.' + ) + getByRole('button', { name: 'Done' }) + expect(mockClearWifiStatus).toHaveBeenCalled() }) it('renders error body when request is unsuccessful', () => { @@ -149,13 +190,14 @@ describe('DisconnectModal', () => { ) getByRole('button', { name: 'cancel' }) getByRole('button', { name: 'Disconnect' }) + expect(mockClearWifiStatus).not.toHaveBeenCalled() }) it('dispatches postWifiDisconnect on click Disconnect', () => { const { getByRole } = render() expect(mockPostWifiDisconnect).not.toHaveBeenCalled() - getByRole('button', { name: 'Disconnect' }).click() + fireEvent.click(getByRole('button', { name: 'Disconnect' })) expect(mockPostWifiDisconnect).toHaveBeenCalledWith(ROBOT_NAME, 'foo') }) @@ -164,7 +206,7 @@ describe('DisconnectModal', () => { expect(mockDismissRequest).not.toHaveBeenCalled() expect(mockOnCancel).not.toHaveBeenCalled() - getByRole('button', { name: 'cancel' }).click() + fireEvent.click(getByRole('button', { name: 'cancel' })) expect(mockDismissRequest).toHaveBeenCalledWith(LAST_ID) expect(mockOnCancel).toHaveBeenCalledWith() }) diff --git a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/__tests__/ResultModal.test.tsx b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/__tests__/ResultModal.test.tsx index 3cf51d805b4..c748d07f94c 100644 --- a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/__tests__/ResultModal.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/__tests__/ResultModal.test.tsx @@ -1,253 +1,3 @@ -import * as React from 'react' -import { shallow } from 'enzyme' - -import { AlertModal, SpinnerModal } from '@opentrons/components' -import { ErrorModal } from '../../../../../molecules/modals' -import { ResultModal } from '../ResultModal' -import { DISCONNECT, CONNECT, JOIN_OTHER } from '../constants' - -import type { ShallowWrapper } from 'enzyme' -import type { ResultModalProps } from '../ResultModal' - describe("SelectNetwork's ResultModal", () => { - const mockSsid = 'foobar' - const handleClose = jest.fn() - - afterEach(() => { - jest.resetAllMocks() - }) - - describe('pending', () => { - const render: ( - type: ResultModalProps['type'], - ssid?: ResultModalProps['ssid'] - ) => ShallowWrapper> = ( - type, - ssid = mockSsid - ) => { - return shallow( - - ) - } - - it('displays a spinner modal for disconnecting', () => { - const wrapper = render(DISCONNECT) - const spinner = wrapper.find(SpinnerModal) - - expect(spinner).toHaveLength(1) - expect(spinner.props()).toEqual({ - alertOverlay: true, - message: expect.stringContaining( - 'Disconnecting from Wi-Fi network foobar' - ), - }) - }) - - it('displays a spinner modal for connecting', () => { - const wrapper = render(CONNECT) - const spinner = wrapper.find(SpinnerModal) - - expect(spinner).toHaveLength(1) - expect(spinner.props()).toEqual({ - alertOverlay: true, - message: expect.stringContaining('Connecting to Wi-Fi network foobar'), - }) - }) - - it('displays a spinner modal for join other', () => { - const wrapper = render(JOIN_OTHER) - const spinner = wrapper.find(SpinnerModal) - - expect(spinner).toHaveLength(1) - expect(spinner.props()).toEqual({ - alertOverlay: true, - message: expect.stringContaining('Connecting to Wi-Fi network foobar'), - }) - }) - - it('displays a spinner modal even if ssid is not set', () => { - const wrapper = render(JOIN_OTHER, null) - const spinner = wrapper.find(SpinnerModal) - - expect(spinner).toHaveLength(1) - expect(spinner.props()).toEqual({ - alertOverlay: true, - message: expect.stringContaining('Connecting to Wi-Fi'), - }) - }) - }) - - describe('success', () => { - const render: ( - type: ResultModalProps['type'], - ssid?: ResultModalProps['ssid'] - ) => ShallowWrapper> = ( - type, - ssid = mockSsid - ) => { - return shallow( - - ) - } - - it('displays an AlertModal with success message for disconnect', () => { - const wrapper = render(DISCONNECT) - const alert = wrapper.find(AlertModal) - - expect(alert).toHaveLength(1) - expect(alert.props()).toMatchObject({ - alertOverlay: true, - iconName: 'wifi', - heading: 'Successfully disconnected from Wi-Fi', - onCloseClick: handleClose, - buttons: [{ children: 'close', onClick: handleClose }], - }) - expect(alert.children().text()).toContain( - 'disconnected from Wi-Fi network foobar' - ) - }) - - it('displays an AlertModal with success message for connect', () => { - const wrapper = render(CONNECT) - const alert = wrapper.find(AlertModal) - - expect(alert).toHaveLength(1) - expect(alert.props()).toMatchObject({ - alertOverlay: true, - iconName: 'wifi', - heading: 'Successfully connected to Wi-Fi', - onCloseClick: handleClose, - buttons: [{ children: 'close', onClick: handleClose }], - }) - expect(alert.children().text()).toContain( - 'connected to Wi-Fi network foobar' - ) - }) - - it('displays an AlertModal with success message for join other', () => { - const wrapper = render(JOIN_OTHER) - const alert = wrapper.find(AlertModal) - - expect(alert).toHaveLength(1) - expect(alert.props()).toMatchObject({ - alertOverlay: true, - iconName: 'wifi', - heading: 'Successfully connected to Wi-Fi', - onCloseClick: handleClose, - buttons: [{ children: 'close', onClick: handleClose }], - }) - expect(alert.children().text()).toContain( - 'connected to Wi-Fi network foobar' - ) - }) - - it('displays an AlertModal with success message for join other with ssid unset', () => { - const wrapper = render(JOIN_OTHER, null) - const alert = wrapper.find(AlertModal) - - expect(alert).toHaveLength(1) - expect(alert.props()).toMatchObject({ - alertOverlay: true, - iconName: 'wifi', - heading: 'Successfully connected to Wi-Fi', - onCloseClick: handleClose, - buttons: [{ children: 'close', onClick: handleClose }], - }) - expect(alert.children().text()).toContain('connected to Wi-Fi') - }) - }) - - describe('failure', () => { - const error = { message: 'oh no!' } - const render: ( - type: ResultModalProps['type'], - ssid?: ResultModalProps['ssid'] - ) => ShallowWrapper> = ( - type, - ssid = mockSsid - ) => { - return shallow( - - ) - } - - it('displays an ErrorModal with failure message for disconnect', () => { - const wrapper = render(DISCONNECT) - const alert = wrapper.find(ErrorModal) - - expect(alert).toHaveLength(1) - expect(alert).toHaveLength(1) - expect(alert.prop('heading')).toEqual('Unable to disconnect from Wi-Fi') - expect(alert.prop('description')).toEqual( - expect.stringContaining( - 'unable to disconnect from Wi-Fi network foobar' - ) - ) - expect(alert.prop('close')).toEqual(handleClose) - expect(alert.prop('error')).toEqual(error) - }) - - it('displays an ErrorModal with failure message for connect', () => { - const wrapper = render(CONNECT) - const alert = wrapper.find(ErrorModal) - - expect(alert).toHaveLength(1) - expect(alert.prop('heading')).toEqual('Unable to connect to Wi-Fi') - expect(alert.prop('description')).toEqual( - expect.stringContaining('unable to connect to Wi-Fi network foobar') - ) - expect(alert.prop('close')).toEqual(handleClose) - expect(alert.prop('error')).toEqual(error) - }) - - it('displays an ErrorModal with failure message for join other', () => { - const wrapper = render(JOIN_OTHER) - const alert = wrapper.find(ErrorModal) - - expect(alert).toHaveLength(1) - expect(alert.prop('heading')).toEqual('Unable to connect to Wi-Fi') - expect(alert.prop('description')).toEqual( - expect.stringContaining('unable to connect to Wi-Fi network foobar') - ) - expect(alert.prop('close')).toEqual(handleClose) - expect(alert.prop('error')).toEqual(error) - }) - - it('displays an ErrorModal with failure message for join other without ssid', () => { - const wrapper = render(JOIN_OTHER, null) - const alert = wrapper.find(ErrorModal) - - expect(alert).toHaveLength(1) - expect(alert.prop('heading')).toEqual('Unable to connect to Wi-Fi') - expect(alert.prop('description')).toEqual( - expect.stringContaining('unable to connect to Wi-Fi') - ) - expect(alert.prop('close')).toEqual(handleClose) - expect(alert.prop('error')).toEqual(error) - }) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/Devices/RobotSettings/RobotSettingsAdvanced.tsx b/app/src/organisms/Devices/RobotSettings/RobotSettingsAdvanced.tsx index d54e195784b..b1a6fc16410 100644 --- a/app/src/organisms/Devices/RobotSettings/RobotSettingsAdvanced.tsx +++ b/app/src/organisms/Devices/RobotSettings/RobotSettingsAdvanced.tsx @@ -13,12 +13,12 @@ import { import { Divider } from '../../../atoms/structure' import { StyledText } from '../../../atoms/text' import { ToggleButton } from '../../../atoms/buttons' -import { useIsOT3, useIsRobotBusy, useRobot } from '../hooks' -import { UsageSettings } from './AdvancedTab/UsageSettings' +import { useIsFlex, useIsRobotBusy, useRobot } from '../hooks' import { - GantryHoming, - DisplayRobotName, DeviceReset, + DisplayRobotName, + EnableStatusLight, + GantryHoming, LegacySettings, OpenJupyterControl, RobotInformation, @@ -26,6 +26,7 @@ import { ShortTrashBin, Troubleshooting, UpdateRobotSoftware, + UsageSettings, UseOlderAspirateBehavior, UseOlderProtocol, } from './AdvancedTab' @@ -37,9 +38,10 @@ import { import { RenameRobotSlideout } from './AdvancedTab/AdvancedTabSlideouts/RenameRobotSlideout' import { DeviceResetSlideout } from './AdvancedTab/AdvancedTabSlideouts/DeviceResetSlideout' import { DeviceResetModal } from './AdvancedTab/AdvancedTabSlideouts/DeviceResetModal' -import { UpdateBuildroot } from './UpdateBuildroot' +import { handleUpdateBuildroot } from './UpdateBuildroot' import { UNREACHABLE } from '../../../redux/discovery' import { Portal } from '../../../App/portal' +import { useIsEstopNotDisengaged } from '../../../resources/devices/hooks/useIsEstopNotDisengaged' import type { State, Dispatch } from '../../../redux/types' import type { @@ -69,15 +71,12 @@ export function RobotSettingsAdvanced({ showDeviceResetModal, setShowDeviceResetModal, ] = React.useState(false) - const [ - showSoftwareUpdateModal, - setShowSoftwareUpdateModal, - ] = React.useState(false) const isRobotBusy = useIsRobotBusy({ poll: true }) + const isEstopNotDisengaged = useIsEstopNotDisengaged(robotName) const robot = useRobot(robotName) - const isOT3 = useIsOT3(robotName) + const isFlex = useIsFlex(robotName) const ipAddress = robot?.ip != null ? robot.ip : '' const settings = useSelector((state: State) => getRobotSettings(state, robotName) @@ -123,14 +122,6 @@ export function RobotSettingsAdvanced({ return ( <> - {showSoftwareUpdateModal && - robot != null && - robot.status !== UNREACHABLE ? ( - setShowSoftwareUpdateModal(false)} - /> - ) : null} {showRenameRobotSlideout && ( - {isOT3 ? null : ( + {isFlex ? null : ( <> )} @@ -180,47 +171,63 @@ export function RobotSettingsAdvanced({ + + {isFlex ? ( + <> + + + + ) : null} - + setShowSoftwareUpdateModal(true)} + isRobotBusy={isRobotBusy || isEstopNotDisengaged} + onUpdateStart={() => handleUpdateBuildroot(robot)} + /> + - - {isOT3 ? null : ( + {isFlex ? null : ( <> )} diff --git a/app/src/organisms/Devices/RobotSettings/RobotSettingsFeatureFlags.tsx b/app/src/organisms/Devices/RobotSettings/RobotSettingsFeatureFlags.tsx index ffd2f00ca30..e538b099559 100644 --- a/app/src/organisms/Devices/RobotSettings/RobotSettingsFeatureFlags.tsx +++ b/app/src/organisms/Devices/RobotSettings/RobotSettingsFeatureFlags.tsx @@ -35,6 +35,7 @@ const NON_FEATURE_FLAG_SETTINGS = [ 'useOldAspirationFunctions', 'disableLogAggregation', 'disableFastProtocolUpload', + 'disableStatusBar', ] export function RobotSettingsFeatureFlags({ diff --git a/app/src/organisms/Devices/RobotSettings/RobotSettingsNetworking.tsx b/app/src/organisms/Devices/RobotSettings/RobotSettingsNetworking.tsx index 4241493a386..80c3e0beecc 100644 --- a/app/src/organisms/Devices/RobotSettings/RobotSettingsNetworking.tsx +++ b/app/src/organisms/Devices/RobotSettings/RobotSettingsNetworking.tsx @@ -31,9 +31,10 @@ import { } from '../../../redux/discovery' import { fetchStatus, getNetworkInterfaces } from '../../../redux/networking' -import { useIsOT3, useIsRobotBusy } from '../hooks' +import { useIsFlex, useIsRobotBusy } from '../hooks' import { DisconnectModal } from './ConnectNetwork/DisconnectModal' import { SelectNetwork } from './SelectNetwork' +import { useIsEstopNotDisengaged } from '../../../resources/devices/hooks/useIsEstopNotDisengaged' import type { State, Dispatch } from '../../../redux/types' import { Portal } from '../../../App/portal' @@ -55,7 +56,7 @@ export function RobotSettingsNetworking({ const wifiList = useWifiList(robotName, LIST_REFRESH_MS) const dispatch = useDispatch() const isRobotBusy = useIsRobotBusy({ poll: true }) - const isOT3 = useIsOT3(robotName) + const isFlex = useIsFlex(robotName) const [showDisconnectModal, setShowDisconnectModal] = React.useState( false @@ -73,19 +74,20 @@ export function RobotSettingsNetworking({ const addresses = useSelector((state: State) => getRobotAddressesByName(state, robotName) ) + const isEstopNotDisengaged = useIsEstopNotDisengaged(robotName) const wifiAddress = addresses.find(addr => addr.ip === wifi?.ipAddress) - const isOT3ConnectedViaWifi = + const isFlexConnectedViaWifi = wifiAddress != null && wifiAddress.healthStatus === HEALTH_STATUS_OK const ethernetAddress = addresses.find( addr => addr.ip === ethernet?.ipAddress ) - const isOT3ConnectedViaEthernet = + const isFlexConnectedViaEthernet = ethernetAddress != null && ethernetAddress.healthStatus === HEALTH_STATUS_OK const usbAddress = addresses.find(addr => addr.ip === OPENTRONS_USB) - const isOT3ConnectedViaUSB = + const isFlexConnectedViaUSB = usbAddress != null && usbAddress.healthStatus === HEALTH_STATUS_OK useInterval(() => dispatch(fetchStatus(robotName)), STATUS_REFRESH_MS, true) @@ -106,11 +108,11 @@ export function RobotSettingsNetworking({ - {isOT3ConnectedViaWifi ? ( + {isFlexConnectedViaWifi ? ( @@ -137,11 +139,14 @@ export function RobotSettingsNetworking({ {canDisconnect && !isRobotBusy ? ( - setShowDisconnectModal(true)}> + setShowDisconnectModal(true)} + disabled={isEstopNotDisengaged} + > {t('disconnect_from_wifi')} ) : null} @@ -154,7 +159,7 @@ export function RobotSettingsNetworking({ {t('wireless_ip')} - + {wifi?.ipAddress} @@ -165,7 +170,7 @@ export function RobotSettingsNetworking({ {t('wireless_subnet_mask')} - + {wifi?.subnetMask} @@ -177,7 +182,7 @@ export function RobotSettingsNetworking({ {t('wireless_mac_address')} - + {wifi?.macAddress}
@@ -191,11 +196,11 @@ export function RobotSettingsNetworking({ - {isOT3ConnectedViaEthernet ? ( + {isFlexConnectedViaEthernet ? ( @@ -204,12 +209,12 @@ export function RobotSettingsNetworking({ )} - {isOT3 ? t('ethernet') : t('wired_usb')} + {isFlex ? t('ethernet') : t('wired_usb')} @@ -223,7 +228,7 @@ export function RobotSettingsNetworking({ {t('wired_ip')} - + {ethernet?.ipAddress}
@@ -234,7 +239,7 @@ export function RobotSettingsNetworking({ {t('wired_subnet_mask')} - + {ethernet?.subnetMask}
@@ -245,20 +250,20 @@ export function RobotSettingsNetworking({ {t('wired_mac_address')} - + {ethernet?.macAddress}
) : ( - - {isOT3 + + {isFlex ? t('not_connected_via_ethernet') : t('not_connected_via_wired_usb')} )} - {isOT3 ? null : ( + {isFlex ? null : ( )} - {isOT3 ? ( + {isFlex ? ( <> - {isOT3ConnectedViaUSB ? ( + {isFlexConnectedViaUSB ? ( @@ -305,8 +310,8 @@ export function RobotSettingsNetworking({ - - {isOT3ConnectedViaUSB + + {isFlexConnectedViaUSB ? t('directly_connected_to_this_computer') : t('not_connected_via_usb')} diff --git a/app/src/organisms/Devices/RobotSettings/RobotSettingsPrivacy.tsx b/app/src/organisms/Devices/RobotSettings/RobotSettingsPrivacy.tsx deleted file mode 100644 index 267171774d9..00000000000 --- a/app/src/organisms/Devices/RobotSettings/RobotSettingsPrivacy.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import * as React from 'react' -import { useSelector, useDispatch } from 'react-redux' -import { useTranslation } from 'react-i18next' - -import { getRobotSettings, fetchSettings } from '../../../redux/robot-settings' - -import type { State, Dispatch } from '../../../redux/types' -import type { - RobotSettings, - RobotSettingsField, -} from '../../../redux/robot-settings/types' -import { SettingToggle } from './SettingToggle' - -interface RobotSettingsPrivacyProps { - robotName: string -} - -const PRIVACY_SETTINGS = ['disableLogAggregation'] - -const INFO_BY_SETTING_ID: { - [id: string]: { - titleKey: string - descriptionKey: string - invert: boolean - } -} = { - disableLogAggregation: { - titleKey: 'share_logs_with_opentrons', - descriptionKey: 'share_logs_with_opentrons_description', - invert: true, - }, -} - -export function RobotSettingsPrivacy({ - robotName, -}: RobotSettingsPrivacyProps): JSX.Element { - const { t } = useTranslation('device_settings') - const settings = useSelector((state: State) => - getRobotSettings(state, robotName) - ) - const privacySettings = settings.filter(({ id }) => - PRIVACY_SETTINGS.includes(id) - ) - const translatedPrivacySettings: Array< - RobotSettingsField & { invert: boolean } - > = privacySettings.map(s => { - const { titleKey, descriptionKey, invert } = INFO_BY_SETTING_ID[s.id] - return s.id in INFO_BY_SETTING_ID - ? { - ...s, - title: t(titleKey), - description: t(descriptionKey), - invert, - } - : { ...s, invert: false } - }) - - const dispatch = useDispatch() - - React.useEffect(() => { - dispatch(fetchSettings(robotName)) - }, [dispatch, robotName]) - - return ( - <> - {translatedPrivacySettings.map(field => ( - - ))} - - ) -} diff --git a/app/src/organisms/Devices/RobotSettings/SelectNetwork.tsx b/app/src/organisms/Devices/RobotSettings/SelectNetwork.tsx index b3151d0418e..98e539bb622 100644 --- a/app/src/organisms/Devices/RobotSettings/SelectNetwork.tsx +++ b/app/src/organisms/Devices/RobotSettings/SelectNetwork.tsx @@ -18,7 +18,7 @@ import type { NetworkChangeState, } from './ConnectNetwork/types' -interface TempSelectNetworkProps { +interface SelectNetworkProps { robotName: string isRobotBusy: boolean } @@ -26,7 +26,7 @@ interface TempSelectNetworkProps { export const SelectNetwork = ({ robotName, isRobotBusy, -}: TempSelectNetworkProps): JSX.Element => { +}: SelectNetworkProps): JSX.Element => { const list = useWifiList(robotName) const keys = useSelector((state: State) => Networking.getWifiKeys(state, robotName) @@ -104,7 +104,7 @@ export const SelectNetwork = ({ void +} + +export function RobotUpdateProgressModal({ + robotName, + session, + closeUpdateBuildroot, +}: RobotUpdateProgressModalProps): JSX.Element { + const dispatch = useDispatch() + const { t } = useTranslation('device_settings') + const [showFileSelect, setShowFileSelect] = React.useState(false) + const installFromFileRef = React.useRef(null) + + const completeRobotUpdateHandler = (): void => { + if (closeUpdateBuildroot != null) closeUpdateBuildroot() + } + + const { updateStep, progressPercent } = useRobotUpdateInfo(robotName, session) + + let { error } = session || { error: null } + const downloadError = useSelector((state: State) => + getRobotUpdateDownloadError(state, robotName) + ) + if (error == null && downloadError != null) error = downloadError + + useStatusBarAnimation(error != null) + useCleanupRobotUpdateSessionOnDismount() + + const handleFileSelect: React.ChangeEventHandler = event => { + const { files } = event.target + if (files?.length === 1) { + dispatch(startRobotUpdate(robotName, files[0].path)) + } + setShowFileSelect(false) + } + React.useEffect(() => { + if (showFileSelect && installFromFileRef.current) + installFromFileRef.current.click() + }, [showFileSelect]) + + const hasStoppedUpdating = error || updateStep === 'finished' + const letUserExitUpdate = useAllowExitIfUpdateStalled( + updateStep, + progressPercent + ) + + let modalBodyText = '' + let subProgressBarText = t('do_not_turn_off') + switch (updateStep) { + case 'initial': + case 'error': + modalBodyText = '' + break + case 'download': + modalBodyText = t('downloading_update') + break + case 'install': + modalBodyText = t('installing_update') + break + case 'restart': + modalBodyText = t('restarting_robot') + if (letUserExitUpdate) { + subProgressBarText = t('restart_taking_too_long', { robotName }) + } + break + default: + modalBodyText = t('installing_update') + } + + return ( + + ) : null + } + > + {hasStoppedUpdating ? ( + + + + ) : ( + + {modalBodyText} + + + {letUserExitUpdate && updateStep !== 'restart' ? ( + <> + {t('problem_during_update')} {t('try_restarting_the_update')} + {showFileSelect && ( + + )} + + ) : ( + subProgressBarText + )} + + + )} + + ) +} + +interface RobotUpdateProgressFooterProps { + closeUpdateBuildroot?: () => void +} + +function RobotUpdateProgressFooter({ + closeUpdateBuildroot, +}: RobotUpdateProgressFooterProps): JSX.Element { + const { t } = useTranslation('device_settings') + + return ( + + + {t('exit')} + + + ) +} interface SuccessOrErrorProps { errorMessage?: string | null @@ -49,7 +217,7 @@ function SuccessOrError({ errorMessage }: SuccessOrErrorProps): JSX.Element { ) @@ -64,100 +232,55 @@ function SuccessOrError({ errorMessage }: SuccessOrErrorProps): JSX.Element { ) } -interface RobotUpdateProgressFooterProps { - robotName: string - errorMessage?: string | null - closeUpdateBuildroot?: () => void -} +export const TIME_BEFORE_ALLOWING_EXIT_MS = 600000 // 10 mins -function RobotUpdateProgressFooter({ - robotName, - errorMessage, - closeUpdateBuildroot, -}: RobotUpdateProgressFooterProps): JSX.Element { - const { t } = useTranslation('device_settings') - const dispatch = useDispatch() - const installUpdate = React.useCallback(() => { - dispatch(clearRobotUpdateSession()) - dispatch(startRobotUpdate(robotName)) - }, [robotName]) +function useAllowExitIfUpdateStalled( + updateStep: UpdateStep | null, + progressPercent: number +): boolean { + const [letUserExitUpdate, setLetUserExitUpdate] = React.useState( + false + ) + const prevSeenUpdateProgress = React.useRef(null) + const exitTimeoutRef = React.useRef(null) - const { createLiveCommand } = useCreateLiveCommandMutation() - const idleCommand: SetStatusBarCreateCommand = { - commandType: 'setStatusBar', - params: { animation: 'idle' }, - } + React.useEffect(() => { + if (updateStep === 'initial' && prevSeenUpdateProgress.current !== null) { + prevSeenUpdateProgress.current = null + } else if (updateStep === 'finished' && exitTimeoutRef.current) { + clearTimeout(exitTimeoutRef.current) + setLetUserExitUpdate(false) + } else if (progressPercent !== prevSeenUpdateProgress.current) { + if (exitTimeoutRef.current) clearTimeout(exitTimeoutRef.current) + exitTimeoutRef.current = setTimeout(() => { + setLetUserExitUpdate(true) + }, TIME_BEFORE_ALLOWING_EXIT_MS) - // Called if the update fails - const startIdleAnimationIfFailed = (): void => { - if (errorMessage) { - createLiveCommand({ - command: idleCommand, - waitUntilComplete: false, - }).catch((e: Error) => - console.warn(`cannot run status bar animation: ${e.message}`) - ) + prevSeenUpdateProgress.current = progressPercent + setLetUserExitUpdate(false) } - } - - React.useEffect(startIdleAnimationIfFailed, []) + }, [progressPercent, updateStep]) - return ( - - {errorMessage && ( - - {t('try_again')} - - )} - - {t('exit')} - - - ) -} + React.useEffect(() => { + return () => { + if (exitTimeoutRef.current) clearTimeout(exitTimeoutRef.current) + } + }, []) -interface RobotUpdateProgressModalProps { - robotName: string - updateStep: UpdateStep - stepProgress: number | null - error?: string | null - closeUpdateBuildroot?: () => void + return letUserExitUpdate } -export function RobotUpdateProgressModal({ - robotName, - updateStep, - stepProgress, - error, - closeUpdateBuildroot, -}: RobotUpdateProgressModalProps): JSX.Element { - const { t } = useTranslation('device_settings') - const dispatch = useDispatch() - const progressPercent = React.useRef(0) - const [previousUpdateStep, setPreviousUpdateStep] = React.useState< - string | null - >(null) - const completeRobotUpdateHandler = (): RobotUpdateAction => { - if (closeUpdateBuildroot != null) closeUpdateBuildroot() - return dispatch(clearRobotUpdateSession()) - } - +function useStatusBarAnimation(isError: boolean): void { const { createLiveCommand } = useCreateLiveCommandMutation() const updatingCommand: SetStatusBarCreateCommand = { commandType: 'setStatusBar', params: { animation: 'updating' }, } + const idleCommand: SetStatusBarCreateCommand = { + commandType: 'setStatusBar', + params: { animation: 'idle' }, + } - // Called when the first step of the update begins const startUpdatingAnimation = (): void => { createLiveCommand({ command: updatingCommand, @@ -167,83 +290,26 @@ export function RobotUpdateProgressModal({ ) } - let modalBodyText = t('installing_update') - if (updateStep === 'restart') modalBodyText = t('restarting_robot') + const startIdleAnimationIfFailed = (): void => { + if (isError) { + createLiveCommand({ + command: idleCommand, + waitUntilComplete: false, + }).catch((e: Error) => + console.warn(`cannot run status bar animation: ${e.message}`) + ) + } + } - // Make sure to start the animation when this modal first pops up React.useEffect(startUpdatingAnimation, []) + React.useEffect(startIdleAnimationIfFailed, [isError]) +} - // Account for update methods that do not require download & decreasing percent oddities. +function useCleanupRobotUpdateSessionOnDismount(): void { + const dispatch = useDispatch() React.useEffect(() => { - const explicitStepProgress = stepProgress || 0 - if (previousUpdateStep === null) { - if (updateStep === 'install') - progressPercent.current = Math.max( - progressPercent.current, - explicitStepProgress - ) - else if (updateStep === 'download') { - progressPercent.current = Math.max( - progressPercent.current, - Math.floor(explicitStepProgress / 2) - ) - if (progressPercent.current === 50) setPreviousUpdateStep('download') - } else progressPercent.current = 100 - } else { - progressPercent.current = Math.max( - progressPercent.current, - 50 + Math.floor(explicitStepProgress / 2) - ) + return () => { + dispatch(clearRobotUpdateSession()) } - }, [updateStep, stepProgress, previousUpdateStep]) - - const completedUpdating = error || updateStep === 'finished' - - const UPDATE_PROGRESS_BAR_STYLE = css` - margin-top: ${SPACING.spacing24}; - margin-bottom: ${SPACING.spacing24}; - border-radius: ${BORDERS.borderRadiusSize3}; - background: ${COLORS.medGreyEnabled}; - ` - const dontTurnOffMessage = css` - color: ${COLORS.darkGreyEnabled}; - ` - - return ( - - ) : null - } - > - {completedUpdating ? ( - - - - ) : ( - - {modalBodyText} - - - {t('do_not_turn_off')} - - - )} - - ) + }, []) } diff --git a/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/UpdateRobotModal.tsx b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/UpdateRobotModal.tsx index 52a17eee2a9..3762cdd1955 100644 --- a/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/UpdateRobotModal.tsx +++ b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/UpdateRobotModal.tsx @@ -7,7 +7,8 @@ import { useHoverTooltip, ALIGN_CENTER, DIRECTION_COLUMN, - JUSTIFY_FLEX_END, + JUSTIFY_SPACE_BETWEEN, + JUSTIFY_SPACE_AROUND, SPACING, Flex, NewPrimaryBtn, @@ -18,21 +19,26 @@ import { import { getRobotUpdateDisplayInfo, robotUpdateChangelogSeen, - startRobotUpdate, OT2_BALENA, UPGRADE, REINSTALL, DOWNGRADE, + getRobotUpdateVersion, } from '../../../../redux/robot-update' +import { ExternalLink } from '../../../../atoms/Link/ExternalLink' import { ReleaseNotes } from '../../../../molecules/ReleaseNotes' import { useIsRobotBusy } from '../../hooks' import { Tooltip } from '../../../../atoms/Tooltip' import { LegacyModal } from '../../../../molecules/LegacyModal' import { Banner } from '../../../../atoms/Banner' +import { useDispatchStartRobotUpdate } from '../../../../redux/robot-update/hooks' import type { State, Dispatch } from '../../../../redux/types' import type { RobotSystemType } from '../../../../redux/robot-update/types' +export const RELEASE_NOTES_URL_BASE = + 'https://github.com/Opentrons/opentrons/releases/tag/v' + const UpdateAppBanner = styled(Banner)` border: none; ` @@ -72,6 +78,11 @@ export function UpdateRobotModal({ const { updateFromFileDisabledReason } = useSelector((state: State) => { return getRobotUpdateDisplayInfo(state, robotName) }) + const dispatchStartRobotUpdate = useDispatchStartRobotUpdate() + const robotUpdateVersion = useSelector((state: State) => { + return getRobotUpdateVersion(state, robotName) ?? '' + }) + const isRobotBusy = useIsRobotBusy() const updateDisabled = updateFromFileDisabledReason !== null || isRobotBusy @@ -97,28 +108,40 @@ export function UpdateRobotModal({ } const robotUpdateFooter = ( - - + - {updateType === UPGRADE ? t('remind_me_later') : t('not_now')} - - dispatch(startRobotUpdate(robotName))} - marginRight={SPACING.spacing12} - css={FOOTER_BUTTON_STYLE} - disabled={updateDisabled} - {...updateButtonProps} - > - {t('update_robot_now')} - - {updateDisabled && ( - - {disabledReason} - - )} + {t('release_notes')} + + + + {updateType === UPGRADE ? t('remind_me_later') : t('not_now')} + + dispatchStartRobotUpdate(robotName)} + marginRight={SPACING.spacing12} + css={FOOTER_BUTTON_STYLE} + disabled={updateDisabled} + {...updateButtonProps} + > + {t('update_robot_now')} + + {updateDisabled && ( + + {disabledReason} + + )} + ) diff --git a/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/ViewUpdateModal.tsx b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/ViewUpdateModal.tsx index 1ed4e328e33..1010313bb1d 100644 --- a/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/ViewUpdateModal.tsx +++ b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/ViewUpdateModal.tsx @@ -4,44 +4,44 @@ import { useSelector } from 'react-redux' import { OT2_BALENA, getRobotUpdateInfo, - getRobotUpdateDownloadProgress, getRobotUpdateDownloadError, + getRobotSystemType, + getRobotUpdateAvailable, } from '../../../../redux/robot-update' import { getAvailableShellUpdate } from '../../../../redux/shell' import { Portal } from '../../../../App/portal' import { UpdateAppModal } from '../../../../organisms/UpdateAppModal' import { MigrationWarningModal } from './MigrationWarningModal' -import { RobotUpdateProgressModal } from './RobotUpdateProgressModal' import { UpdateRobotModal } from './UpdateRobotModal' -import type { - RobotUpdateType, - RobotSystemType, -} from '../../../../redux/robot-update/types' import type { State } from '../../../../redux/types' +import { ReachableRobot, Robot } from '../../../../redux/discovery/types' export interface ViewUpdateModalProps { robotName: string - robotUpdateType: RobotUpdateType | null - robotSystemType: RobotSystemType | null + robot: Robot | ReachableRobot closeModal: () => void } export function ViewUpdateModal( props: ViewUpdateModalProps ): JSX.Element | null { - const { robotName, robotUpdateType, robotSystemType, closeModal } = props + const { robotName, robot, closeModal } = props + const [showAppUpdateModal, setShowAppUpdateModal] = React.useState(true) const updateInfo = useSelector((state: State) => getRobotUpdateInfo(state, robotName) ) - const downloadProgress = useSelector((state: State) => - getRobotUpdateDownloadProgress(state, robotName) - ) const downloadError = useSelector((state: State) => getRobotUpdateDownloadError(state, robotName) ) - const availableAppUpdateVersion = useSelector(getAvailableShellUpdate) + const robotUpdateType = useSelector((state: State) => + getRobotUpdateAvailable(state, robot) + ) + const robotSystemType = getRobotSystemType(robot) + const availableAppUpdateVersion = Boolean( + useSelector(getAvailableShellUpdate) + ) const [ showMigrationWarning, @@ -54,12 +54,12 @@ export function ViewUpdateModal( } let releaseNotes = '' - if (updateInfo?.releaseNotes) releaseNotes = updateInfo.releaseNotes + if (updateInfo?.releaseNotes != null) releaseNotes = updateInfo.releaseNotes - if (availableAppUpdateVersion) + if (availableAppUpdateVersion && showAppUpdateModal) return ( - + setShowAppUpdateModal(false)} /> ) @@ -73,16 +73,6 @@ export function ViewUpdateModal( ) } - if (updateInfo === null) - return ( - - ) - if (robotSystemType != null) return ( +const mockUseRobotUpdateInfo = useRobotUpdateInfo as jest.MockedFunction< + typeof useRobotUpdateInfo +> +const mockGetRobotSessionIsManualFile = getRobotSessionIsManualFile as jest.MockedFunction< + typeof getRobotSessionIsManualFile +> +const mockUseDispatchStartRobotUpdate = useDispatchStartRobotUpdate as jest.MockedFunction< + typeof useDispatchStartRobotUpdate +> +const mockGetRobotUpdateDownloadError = getRobotUpdateDownloadError as jest.MockedFunction< + typeof getRobotUpdateDownloadError +> const render = ( props: React.ComponentProps @@ -24,32 +47,52 @@ const render = ( } describe('DownloadUpdateModal', () => { + const mockRobotUpdateSession: RobotUpdateSession | null = { + robotName: 'testRobot', + fileInfo: null, + token: null, + pathPrefix: null, + step: 'getToken', + stage: 'validating', + progress: 50, + error: null, + } + let props: React.ComponentProps - let mockCreateLiveCommand = jest.fn() + const mockCreateLiveCommand = jest.fn() beforeEach(() => { - mockCreateLiveCommand = jest.fn() mockCreateLiveCommand.mockResolvedValue(null) props = { robotName: 'testRobot', - updateStep: 'download', - error: null, - stepProgress: 50, + session: mockRobotUpdateSession, closeUpdateBuildroot: jest.fn(), } mockUseCreateLiveCommandMutation.mockReturnValue({ createLiveCommand: mockCreateLiveCommand, } as any) + mockUseRobotUpdateInfo.mockReturnValue({ + updateStep: 'install', + progressPercent: 50, + }) + mockGetRobotSessionIsManualFile.mockReturnValue(false) + mockUseDispatchStartRobotUpdate.mockReturnValue(jest.fn) + mockGetRobotUpdateDownloadError.mockReturnValue(null) }) afterEach(() => { jest.resetAllMocks() }) - it('renders the robot name as a part of the header', () => { - const [{ getByText }] = render(props) + it('renders robot update download errors', () => { + mockGetRobotUpdateDownloadError.mockReturnValue('test download error') + render(props) + screen.getByText('test download error') + }) - expect(getByText('Updating testRobot')).toBeInTheDocument() + it('renders the robot name as a part of the header', () => { + render(props) + expect(screen.getByText('Updating testRobot')).toBeInTheDocument() }) it('activates the Update animation when first rendered', () => { @@ -58,7 +101,6 @@ describe('DownloadUpdateModal', () => { commandType: 'setStatusBar', params: { animation: 'updating' }, } - expect(mockUseCreateLiveCommandMutation).toBeCalledWith() expect(mockCreateLiveCommand).toBeCalledWith({ command: updatingCommand, @@ -67,47 +109,46 @@ describe('DownloadUpdateModal', () => { }) it('renders the correct text when installing the robot update with no close button', () => { - props = { - ...props, - updateStep: 'install', - } - - const [{ queryByRole, getByText }] = render(props) - - expect(getByText('Installing update...')).toBeInTheDocument() + render(props) + expect(screen.getByText('Installing update...')).toBeInTheDocument() expect( - getByText('Do not turn off the robot while updating') + screen.getByText( + "This could take up to 15 minutes. Don't turn off the robot." + ) ).toBeInTheDocument() - expect(queryByRole('button')).not.toBeInTheDocument() + expect(screen.queryByRole('button')).not.toBeInTheDocument() }) it('renders the correct text when finalizing the robot update with no close button', () => { - props = { - ...props, + mockUseRobotUpdateInfo.mockReturnValue({ updateStep: 'restart', - } - - const [{ queryByRole, getByText }] = render(props) + progressPercent: 100, + }) + render(props) expect( - getByText('Install complete, robot restarting...') + screen.getByText('Install complete, robot restarting...') ).toBeInTheDocument() expect( - getByText('Do not turn off the robot while updating') + screen.getByText( + "This could take up to 15 minutes. Don't turn off the robot." + ) ).toBeInTheDocument() - expect(queryByRole('button')).not.toBeInTheDocument() + expect(screen.queryByRole('button')).not.toBeInTheDocument() }) it('renders a success modal and exit button upon finishing the update process', () => { - props = { - ...props, + mockUseRobotUpdateInfo.mockReturnValue({ updateStep: 'finished', - } - const [{ getByText }] = render(props) + progressPercent: 100, + }) + render(props) - const exitButton = getByText('exit') + const exitButton = screen.getByText('exit') - expect(getByText('Robot software successfully updated')).toBeInTheDocument() + expect( + screen.getByText('Robot software successfully updated') + ).toBeInTheDocument() expect(exitButton).toBeInTheDocument() expect(mockCreateLiveCommand).toBeCalledTimes(1) fireEvent.click(exitButton) @@ -115,21 +156,23 @@ describe('DownloadUpdateModal', () => { }) it('renders an error modal and exit button if an error occurs', () => { + props = { + ...props, + session: { + ...mockRobotUpdateSession, + error: 'test error', + }, + } const idleCommand: SetStatusBarCreateCommand = { commandType: 'setStatusBar', params: { animation: 'idle' }, } - props = { - ...props, - error: 'test error', - } - const [{ getByText }] = render(props) - const exitButton = getByText('exit') + render(props) + const exitButton = screen.getByText('exit') - expect(getByText('test error')).toBeInTheDocument() + expect(screen.getByText('test error')).toBeInTheDocument() fireEvent.click(exitButton) - expect(getByText('Try again')).toBeInTheDocument() expect(props.closeUpdateBuildroot).toHaveBeenCalled() expect(mockUseCreateLiveCommandMutation).toBeCalledWith() @@ -139,4 +182,16 @@ describe('DownloadUpdateModal', () => { waitUntilComplete: false, }) }) + + it('renders alternative text if update takes too long', () => { + jest.useFakeTimers() + render(props) + + act(() => { + jest.advanceTimersByTime(TIME_BEFORE_ALLOWING_EXIT_MS) + }) + + screen.getByText(/Try restarting the update./i) + screen.getByText(/This update is taking longer than usual/i) + }) }) diff --git a/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/__tests__/UpdateBuildroot.test.tsx b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/__tests__/UpdateBuildroot.test.tsx index 98ac277b92d..f8dd57aa21e 100644 --- a/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/__tests__/UpdateBuildroot.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/__tests__/UpdateBuildroot.test.tsx @@ -1,98 +1,3 @@ -import React from 'react' - -import { mockConnectableRobot as mockRobot } from '../../../../../redux/discovery/__fixtures__' -import * as RobotUpdate from '../../../../../redux/robot-update' - -import { mountWithStore, WrapperWithStore } from '@opentrons/components' -import { UpdateBuildroot } from '..' -import { ViewUpdateModal } from '../ViewUpdateModal' -import { RobotUpdateProgressModal } from '../RobotUpdateProgressModal' - -import type { State } from '../../../../../redux/types' - -jest.mock('../ViewUpdateModal', () => ({ - ViewUpdateModal: () => <>, -})) - -jest.mock('../RobotUpdateProgressModal', () => ({ - RobotUpdateProgressModal: () => <>, -})) - -jest.mock('../../../../../redux/robot-update/selectors') - -const getRobotUpdateAvailable = RobotUpdate.getRobotUpdateAvailable as jest.MockedFunction< - typeof RobotUpdate.getRobotUpdateAvailable -> -const getRobotUpdateSession = RobotUpdate.getRobotUpdateSession as jest.MockedFunction< - typeof RobotUpdate.getRobotUpdateSession -> -const getRobotSystemType = RobotUpdate.getRobotSystemType as jest.MockedFunction< - typeof RobotUpdate.getRobotSystemType -> - -const MOCK_STATE: State = { mockState: true } as any - describe('UpdateBuildroot', () => { - const closeModal = jest.fn() - const render = (): WrapperWithStore< - React.ComponentProps - > => { - return mountWithStore>( - , - { initialState: MOCK_STATE } - ) - } - - beforeEach(() => { - getRobotUpdateAvailable.mockReturnValue(RobotUpdate.UPGRADE) - getRobotSystemType.mockReturnValue(RobotUpdate.OT2_BUILDROOT) - }) - - afterEach(() => { - jest.resetAllMocks() - }) - - it('should set the update as seen on mount', () => { - const { store } = render() - - expect(store.dispatch).toHaveBeenCalledWith( - RobotUpdate.setRobotUpdateSeen(mockRobot.name) - ) - }) - - it('renders a ViewUpdateModal if no session exists', () => { - const { wrapper } = render() - const viewUpdate = wrapper.find(ViewUpdateModal) - - expect(viewUpdate.prop('robotName')).toBe(mockRobot.name) - expect(viewUpdate.prop('robotUpdateType')).toBe(RobotUpdate.UPGRADE) - - expect(getRobotUpdateAvailable).toHaveBeenCalledWith(MOCK_STATE, mockRobot) - expect(closeModal).not.toHaveBeenCalled() - - viewUpdate.invoke('closeModal')?.() - expect(closeModal).toHaveBeenCalled() - }) - - it('renders RobotUpdateProgressModal if session exists', () => { - const mockSession = { - robotName: mockRobot.name, - fileInfo: null, - token: null, - pathPrefix: null, - step: null, - stage: null, - progress: 50, - error: null, - } - getRobotUpdateSession.mockReturnValue(mockSession) - - const { wrapper } = render() - const progressModal = wrapper.find(RobotUpdateProgressModal) - - expect(progressModal.prop('robotName')).toBe(mockRobot.name) - expect(progressModal.prop('updateStep')).toBe('download') - expect(progressModal.prop('error')).toBe(mockSession.error) - expect(progressModal.prop('stepProgress')).toBe(mockSession.progress) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/__tests__/UpdateRobotModal.test.tsx b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/__tests__/UpdateRobotModal.test.tsx index d36aab3d057..24228bca3fb 100644 --- a/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/__tests__/UpdateRobotModal.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/__tests__/UpdateRobotModal.test.tsx @@ -6,11 +6,15 @@ import { fireEvent } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../../../i18n' -import { getRobotUpdateDisplayInfo } from '../../../../../redux/robot-update' +import { + getRobotUpdateDisplayInfo, + getRobotUpdateVersion, +} from '../../../../../redux/robot-update' import { getDiscoverableRobotByName } from '../../../../../redux/discovery' -import { UpdateRobotModal } from '../UpdateRobotModal' -import type { Store } from 'redux' +import { UpdateRobotModal, RELEASE_NOTES_URL_BASE } from '../UpdateRobotModal' +import { useIsRobotBusy } from '../../../hooks' +import type { Store } from 'redux' import type { State } from '../../../../../redux/types' jest.mock('../../../../../redux/robot-update') @@ -18,6 +22,7 @@ jest.mock('../../../../../redux/discovery') jest.mock('../../../../UpdateAppModal', () => ({ UpdateAppModal: () => null, })) +jest.mock('../../../hooks') const mockGetRobotUpdateDisplayInfo = getRobotUpdateDisplayInfo as jest.MockedFunction< typeof getRobotUpdateDisplayInfo @@ -25,6 +30,12 @@ const mockGetRobotUpdateDisplayInfo = getRobotUpdateDisplayInfo as jest.MockedFu const mockGetDiscoverableRobotByName = getDiscoverableRobotByName as jest.MockedFunction< typeof getDiscoverableRobotByName > +const mockGetRobotUpdateVersion = getRobotUpdateVersion as jest.MockedFunction< + typeof getRobotUpdateVersion +> +const mockUseIsRobotBusy = useIsRobotBusy as jest.MockedFunction< + typeof useIsRobotBusy +> const render = (props: React.ComponentProps) => { return renderWithProviders(, { @@ -51,6 +62,8 @@ describe('UpdateRobotModal', () => { updateFromFileDisabledReason: 'test', }) when(mockGetDiscoverableRobotByName).mockReturnValue(null) + when(mockGetRobotUpdateVersion).mockReturnValue('7.0.0') + when(mockUseIsRobotBusy).mockReturnValue(false) }) afterEach(() => { @@ -93,6 +106,13 @@ describe('UpdateRobotModal', () => { expect(props.closeModal).toHaveBeenCalled() }) + it('renders a release notes link pointing to the Github releases page', () => { + const [{ getByText }] = render(props) + + const link = getByText('Release notes') + expect(link).toHaveAttribute('href', RELEASE_NOTES_URL_BASE + '7.0.0') + }) + it('renders proper text when reinstalling', () => { props = { ...props, diff --git a/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/__tests__/ViewUpdateModal.test.tsx b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/__tests__/ViewUpdateModal.test.tsx index 53717fb6685..5c17a8b9c79 100644 --- a/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/__tests__/ViewUpdateModal.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/__tests__/ViewUpdateModal.test.tsx @@ -1,157 +1,3 @@ -import * as React from 'react' -import { QueryClient, QueryClientProvider } from 'react-query' -import { mountWithStore } from '@opentrons/components' -import { useIsRobotBusy } from '../../../hooks' -import * as RobotUpdate from '../../../../../redux/robot-update' - -import { RobotUpdateProgressModal } from '../RobotUpdateProgressModal' -import { UpdateRobotModal } from '../UpdateRobotModal' -import { MigrationWarningModal } from '../MigrationWarningModal' -import { ViewUpdateModal } from '../ViewUpdateModal' - -import type { State } from '../../../../../redux/types' - -jest.mock('../../../../../redux/robot-update') -jest.mock('../../../../../redux/shell') -jest.mock('../../../hooks') - -const getRobotUpdateInfo = RobotUpdate.getRobotUpdateInfo as jest.MockedFunction< - typeof RobotUpdate.getRobotUpdateInfo -> -const getRobotUpdateDownloadProgress = RobotUpdate.getRobotUpdateDownloadProgress as jest.MockedFunction< - typeof RobotUpdate.getRobotUpdateDownloadProgress -> -const getRobotUpdateDownloadError = RobotUpdate.getRobotUpdateDownloadError as jest.MockedFunction< - typeof RobotUpdate.getRobotUpdateDownloadError -> -const getRobotUpdateDisplayInfo = RobotUpdate.getRobotUpdateDisplayInfo as jest.MockedFunction< - typeof RobotUpdate.getRobotUpdateDisplayInfo -> - -const mockUseIsRobotBusy = useIsRobotBusy as jest.MockedFunction< - typeof useIsRobotBusy -> - -const MOCK_STATE: State = { mockState: true } as any -const MOCK_ROBOT_NAME = 'robot-name' -const queryClient = new QueryClient() - describe('ViewUpdateModal', () => { - const handleClose = jest.fn() - - const render = ( - robotUpdateType: React.ComponentProps< - typeof ViewUpdateModal - >['robotUpdateType'] = RobotUpdate.UPGRADE, - robotSystemType: React.ComponentProps< - typeof ViewUpdateModal - >['robotSystemType'] = RobotUpdate.OT2_BUILDROOT - ) => { - return mountWithStore>( - - - , - { initialState: MOCK_STATE } - ) - } - beforeEach(() => { - getRobotUpdateInfo.mockReturnValue(null) - getRobotUpdateDownloadProgress.mockReturnValue(50) - getRobotUpdateDownloadError.mockReturnValue(null) - getRobotUpdateDisplayInfo.mockReturnValue({ - autoUpdateAction: 'upgrade', - autoUpdateDisabledReason: null, - updateFromFileDisabledReason: null, - }) - mockUseIsRobotBusy.mockReturnValue(false) - }) - - afterEach(() => { - jest.resetAllMocks() - }) - - it('renders a RobotUpdateProgressModal if the update has not completed downloading', () => { - const { wrapper } = render() - const robotUpdateProgressModal = wrapper.find(RobotUpdateProgressModal) - - expect(robotUpdateProgressModal.prop('error')).toEqual(null) - expect(robotUpdateProgressModal.prop('stepProgress')).toEqual(50) - expect(getRobotUpdateDownloadProgress).toHaveBeenCalledWith( - MOCK_STATE, - 'robot-name' - ) - }) - - it('should show a RobotUpdateProgressModal if the update download errored out', () => { - getRobotUpdateDownloadError.mockReturnValue('oh no!') - - const { wrapper } = render() - const robotUpdateProgressModal = wrapper.find(RobotUpdateProgressModal) - - expect(robotUpdateProgressModal.prop('error')).toEqual('oh no!') - expect(getRobotUpdateDownloadError).toHaveBeenCalledWith( - MOCK_STATE, - 'robot-name' - ) - }) - - it('should show a UpdateRobotModal if the update is an upgrade', () => { - getRobotUpdateInfo.mockReturnValue({ - version: '1.0.0', - target: 'ot2', - releaseNotes: 'hey look a release', - }) - - const { wrapper } = render() - const updateRobotModal = wrapper.find(UpdateRobotModal) - - expect(updateRobotModal.prop('robotName')).toBe(MOCK_ROBOT_NAME) - expect(updateRobotModal.prop('releaseNotes')).toBe('hey look a release') - expect(updateRobotModal.prop('systemType')).toBe(RobotUpdate.OT2_BUILDROOT) - expect(getRobotUpdateInfo).toHaveBeenCalledWith(MOCK_STATE, 'robot-name') - }) - - it('should show a MigrationWarningModal if the robot is on Balena', () => { - const { wrapper } = render(RobotUpdate.UPGRADE, RobotUpdate.OT2_BALENA) - const migrationWarning = wrapper.find(MigrationWarningModal) - - expect(migrationWarning.prop('updateType')).toBe(RobotUpdate.UPGRADE) - - const closeButtonProps = migrationWarning.prop('notNowButton') - - expect(closeButtonProps.children).toMatch(/not now/i) - expect(handleClose).not.toHaveBeenCalled() - closeButtonProps.onClick?.({} as React.MouseEvent) - expect(handleClose).toHaveBeenCalled() - }) - - it('should proceed from MigrationWarningModal to release notes if upgrade', () => { - getRobotUpdateInfo.mockReturnValue({ - version: '1.0.0', - target: 'ot2', - releaseNotes: 'hey look a release', - }) - - const { wrapper } = render(RobotUpdate.UPGRADE, RobotUpdate.OT2_BALENA) - const migrationWarning = wrapper.find(MigrationWarningModal) - - migrationWarning.invoke('proceed')?.() - - expect(wrapper.find(UpdateRobotModal).prop('systemType')).toBe( - RobotUpdate.OT2_BALENA - ) - }) - - it('should proceed from MigrationWarningModal to RobotUpdateProgressModal if still downloading', () => { - const { wrapper } = render(RobotUpdate.UPGRADE, RobotUpdate.OT2_BALENA) - const migrationWarning = wrapper.find(MigrationWarningModal) - - migrationWarning.invoke('proceed')?.() - expect(wrapper.exists(RobotUpdateProgressModal)).toBe(true) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/__tests__/useRobotUpdateInfo.test.tsx b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/__tests__/useRobotUpdateInfo.test.tsx new file mode 100644 index 00000000000..5684ece0d3c --- /dev/null +++ b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/__tests__/useRobotUpdateInfo.test.tsx @@ -0,0 +1,185 @@ +import * as React from 'react' +import { renderHook } from '@testing-library/react' +import { createStore } from 'redux' +import { I18nextProvider } from 'react-i18next' +import { Provider } from 'react-redux' + +import { i18n } from '../../../../../i18n' +import { useRobotUpdateInfo } from '../useRobotUpdateInfo' +import { getRobotUpdateDownloadProgress } from '../../../../../redux/robot-update' + +import type { Store } from 'redux' +import { State } from '../../../../../redux/types' +import type { + RobotUpdateSession, + UpdateSessionStep, + UpdateSessionStage, +} from '../../../../../redux/robot-update/types' + +jest.mock('../../../../../redux/robot-update') + +const mockGetRobotUpdateDownloadProgress = getRobotUpdateDownloadProgress as jest.MockedFunction< + typeof getRobotUpdateDownloadProgress +> + +describe('useRobotUpdateInfo', () => { + let store: Store + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + + const MOCK_ROBOT_NAME = 'testRobot' + const mockRobotUpdateSession: RobotUpdateSession | null = { + robotName: MOCK_ROBOT_NAME, + fileInfo: { isManualFile: true, systemFile: 'testFile', version: '1.0.0' }, + token: null, + pathPrefix: null, + step: 'processFile', + stage: 'writing', + progress: 50, + error: null, + } + + beforeEach(() => { + jest.useFakeTimers() + store = createStore(jest.fn(), {}) + store.dispatch = jest.fn() + wrapper = ({ children }) => ( + + {children} + + ) + mockGetRobotUpdateDownloadProgress.mockReturnValue(50) + }) + + it('should return null when session is null', () => { + const { result } = renderHook( + () => useRobotUpdateInfo(MOCK_ROBOT_NAME, null), + { wrapper } + ) + + expect(result.current.updateStep).toBe(null) + expect(result.current.progressPercent).toBe(0) + }) + + it('should return initial values when there is no session step and stage', () => { + const { result } = renderHook( + session => useRobotUpdateInfo(MOCK_ROBOT_NAME, session), + { + initialProps: { + ...mockRobotUpdateSession, + step: null, + stage: null, + } as any, + wrapper, + } + ) + + expect(result.current.updateStep).toBe('initial') + expect(result.current.progressPercent).toBe(0) + }) + + it('should return download updateStep and appropriate percentages when the update is downloading', () => { + const { result, rerender } = renderHook( + session => useRobotUpdateInfo(MOCK_ROBOT_NAME, session), + { + initialProps: { + ...mockRobotUpdateSession, + step: 'downloadFile', + } as any, + wrapper, + } + ) + + expect(result.current.updateStep).toBe('download') + expect(Math.round(result.current.progressPercent)).toBe(17) + + rerender({ + ...mockRobotUpdateSession, + }) + + expect(result.current.updateStep).toBe('install') + expect(result.current.progressPercent).toBe(50) + }) + + it('should update updateStep and progressPercent when session is provided', () => { + const { result, rerender } = renderHook( + session => useRobotUpdateInfo(MOCK_ROBOT_NAME, session), + { + initialProps: mockRobotUpdateSession as any, + wrapper, + } + ) + + expect(result.current.updateStep).toBe('install') + expect(Math.round(result.current.progressPercent)).toBe(25) + + rerender({ + ...mockRobotUpdateSession, + step: 'restart', + stage: 'ready-for-restart', + progress: 100, + error: null, + }) + + expect(result.current.updateStep).toBe('restart') + expect(result.current.progressPercent).toBe(100) + }) + + it('should return correct updateStep and progressPercent values when there is an error', () => { + const { result, rerender } = renderHook( + session => useRobotUpdateInfo(MOCK_ROBOT_NAME, session), + { + initialProps: mockRobotUpdateSession as any, + wrapper, + } + ) + + expect(result.current.updateStep).toBe('install') + expect(Math.round(result.current.progressPercent)).toBe(25) + + rerender({ + ...mockRobotUpdateSession, + error: 'Something went wrong', + }) + + expect(result.current.updateStep).toBe('error') + expect(Math.round(result.current.progressPercent)).toBe(25) + }) + + it('should calculate correct progressPercent when the update is not manual', () => { + const { result } = renderHook( + session => useRobotUpdateInfo(MOCK_ROBOT_NAME, session), + { + initialProps: { + ...mockRobotUpdateSession, + fileInfo: { + systemFile: 'downloadPath', + version: '1.0.0', + isManualFile: false, + }, + } as any, + wrapper, + } + ) + + expect(result.current.updateStep).toBe('install') + expect(Math.round(result.current.progressPercent)).toBe(25) + }) + + it('should ignore progressPercent reported by a step marked as ignored', () => { + const { result } = renderHook( + session => useRobotUpdateInfo(MOCK_ROBOT_NAME, session), + { + initialProps: { + ...mockRobotUpdateSession, + step: 'processFile' as UpdateSessionStep, + stage: 'awaiting-file' as UpdateSessionStage, + progress: 100, + } as any, + wrapper, + } + ) + + expect(result.current.updateStep).toBe('install') + expect(Math.round(result.current.progressPercent)).toBe(0) + }) +}) diff --git a/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/index.tsx b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/index.tsx index f57031d6e92..358de1368a1 100644 --- a/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/index.tsx +++ b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/index.tsx @@ -1,72 +1,69 @@ import * as React from 'react' import { useSelector, useDispatch } from 'react-redux' +import NiceModal, { useModal } from '@ebay/nice-modal-react' + import { setRobotUpdateSeen, robotUpdateIgnored, getRobotUpdateSession, - getRobotSystemType, - getRobotUpdateAvailable, } from '../../../../redux/robot-update' import { ViewUpdateModal } from './ViewUpdateModal' import { RobotUpdateProgressModal } from './RobotUpdateProgressModal' +import { UNREACHABLE } from '../../../../redux/discovery' -import type { State, Dispatch } from '../../../../redux/types' -import type { ViewableRobot } from '../../../../redux/discovery/types' - -export type UpdateStep = 'download' | 'install' | 'restart' | 'finished' +import type { Dispatch } from '../../../../redux/types' +import type { DiscoveredRobot } from '../../../../redux/discovery/types' -export interface UpdateBuildrootProps { - robot: ViewableRobot - close: () => void +interface UpdateBuildrootProps { + robot: DiscoveredRobot | null } -export function UpdateBuildroot(props: UpdateBuildrootProps): JSX.Element { - const { robot, close } = props - const robotName = robot.name - const session = useSelector(getRobotUpdateSession) - const robotUpdateType = useSelector((state: State) => - getRobotUpdateAvailable(state, robot) - ) - const dispatch = useDispatch() - const { step, error: installError } = session || { - step: null, - installError: null, - } - - // set update seen on component mount - React.useEffect(() => { - dispatch(setRobotUpdateSeen(robotName)) - }, [robotName]) +export const handleUpdateBuildroot = ( + robot: UpdateBuildrootProps['robot'] +): void => { + NiceModal.show(UpdateBuildroot, { robot }) +} - const ignoreUpdate = React.useCallback(() => { - dispatch(robotUpdateIgnored(robotName)) - close() - }, [robotName, close]) +const UpdateBuildroot = NiceModal.create( + (props: UpdateBuildrootProps): JSX.Element | null => { + const { robot } = props + const hasSeenSessionOnce = React.useRef(false) + const modal = useModal() + const robotName = React.useRef(robot?.name ?? '') + const dispatch = useDispatch() + const session = useSelector(getRobotUpdateSession) + if (!hasSeenSessionOnce.current && session) + hasSeenSessionOnce.current = true - const robotSystemType = getRobotSystemType(robot) + React.useEffect(() => { + if (robotName.current) { + dispatch(setRobotUpdateSeen(robotName.current)) + } + }, [robotName]) - // TODO(jh, 09-14-2023: add download logic to app-shell/redux/progress bar. - let updateStep: UpdateStep - const DOWNLOAD_STEPS = ['getToken'] - if (step == null || DOWNLOAD_STEPS.includes(step)) updateStep = 'download' - else if (step === 'finished') updateStep = 'finished' - else if (step === 'restart' || step === 'restarting') updateStep = 'restart' - else updateStep = 'install' + const ignoreUpdate = React.useCallback(() => { + if (robotName.current) { + dispatch(robotUpdateIgnored(robotName.current)) + } + modal.remove() + }, [robotName, close]) - return session ? ( - - ) : ( - - ) -} + if (hasSeenSessionOnce.current) + return ( + + ) + else if (robot != null && robot.status !== UNREACHABLE) + return ( + + ) + else return null + } +) diff --git a/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/useRobotUpdateInfo.ts b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/useRobotUpdateInfo.ts new file mode 100644 index 00000000000..75c35746c9d --- /dev/null +++ b/app/src/organisms/Devices/RobotSettings/UpdateBuildroot/useRobotUpdateInfo.ts @@ -0,0 +1,158 @@ +import * as React from 'react' +import { useSelector } from 'react-redux' + +import { getRobotUpdateDownloadProgress } from '../../../../redux/robot-update' + +import type { RobotUpdateSession } from '../../../../redux/robot-update/types' +import type { State } from '../../../../redux/types' + +export function useRobotUpdateInfo( + robotName: string, + session: RobotUpdateSession | null +): { updateStep: UpdateStep | null; progressPercent: number } { + const progressPercent = useFindProgressPercentFrom(robotName, session) + + const updateStep = React.useMemo(() => determineUpdateStepFrom(session), [ + session, + ]) + + return { + updateStep, + progressPercent, + } +} + +function useFindProgressPercentFrom( + robotName: string, + session: RobotUpdateSession | null +): number { + const [progressPercent, setProgressPercent] = React.useState(0) + const hasSeenDownloadFileStep = React.useRef(false) + const prevSeenUpdateStep = React.useRef(null) + const prevSeenStepProgress = React.useRef(0) + const currentStepWithProgress = React.useRef(-1) + + const downloadProgress = useSelector((state: State) => + getRobotUpdateDownloadProgress(state, robotName) + ) + + if (session == null) { + if (progressPercent !== 0) { + setProgressPercent(0) + prevSeenStepProgress.current = 0 + hasSeenDownloadFileStep.current = false + } + return progressPercent + } + + let { + step: sessionStep, + stage: sessionStage, + progress: stepProgress, + } = session + + if (sessionStep == null && sessionStage == null) { + if (progressPercent !== 0) { + setProgressPercent(0) + prevSeenStepProgress.current = 0 + } + return progressPercent + } else if (sessionStep === 'restart' || sessionStep === 'finished') { + if (progressPercent !== 100) { + setProgressPercent(100) + prevSeenStepProgress.current = 100 + } + return progressPercent + } else if (sessionStage === 'error') { + return progressPercent + } + + const stepAndStage = `${sessionStep}-${sessionStage}` + // Ignored because 0-100 is too fast to be worth recording or currently unsupported. + const IGNORED_STEPS_AND_STAGES = [ + 'processFile-awaiting-file', + 'uploadFile-awaiting-file', + ] + + if (sessionStep === 'downloadFile') { + hasSeenDownloadFileStep.current = true + stepProgress = downloadProgress + } + + stepProgress = stepProgress ?? 0 + + // Each stepAndStage is an equal fraction of the total steps. + const TOTAL_STEPS_WITH_PROGRESS = hasSeenDownloadFileStep.current ? 3 : 2 + + const isNewStateWithProgress = + prevSeenUpdateStep.current !== stepAndStage && + stepProgress > 0 && // Accommodate for shell progress oddities. + stepProgress < 100 + + // Proceed to next fraction of progress bar. + if ( + isNewStateWithProgress && + !IGNORED_STEPS_AND_STAGES.includes(stepAndStage) + ) { + currentStepWithProgress.current += 1 + const completedStepsWithProgress = + (100 * currentStepWithProgress.current) / TOTAL_STEPS_WITH_PROGRESS + prevSeenStepProgress.current = 0 + prevSeenUpdateStep.current = stepAndStage + setProgressPercent(completedStepsWithProgress) + } + // Proceed with current fraction of progress bar. + else if ( + stepProgress > prevSeenStepProgress.current && + !IGNORED_STEPS_AND_STAGES.includes(stepAndStage) + ) { + const currentStepProgress = + (stepProgress - prevSeenStepProgress.current) / TOTAL_STEPS_WITH_PROGRESS + + const nonBacktrackedProgressPercent = Math.max( + progressPercent, + currentStepProgress + progressPercent + ) + + prevSeenStepProgress.current = stepProgress + setProgressPercent(nonBacktrackedProgressPercent) + } + + return progressPercent +} + +export type UpdateStep = + | 'initial' + | 'download' + | 'install' + | 'restart' + | 'finished' + | 'error' + +function determineUpdateStepFrom( + session: RobotUpdateSession | null +): UpdateStep | null { + if (session == null) return null + const { step: sessionStep, stage: sessionStage, error } = session + + let reportedUpdateStep: UpdateStep + if (error != null) { + reportedUpdateStep = 'error' + } else if (sessionStep == null && sessionStage == null) { + reportedUpdateStep = 'initial' + } else if (sessionStep === 'downloadFile') { + reportedUpdateStep = 'download' + } else if (sessionStep === 'finished') { + reportedUpdateStep = 'finished' + } else if ( + sessionStep === 'restart' || + sessionStep === 'restarting' || + sessionStage === 'ready-for-restart' + ) { + reportedUpdateStep = 'restart' + } else { + reportedUpdateStep = 'install' + } + + return reportedUpdateStep +} diff --git a/app/src/organisms/Devices/RobotSettings/__tests__/RobotSettingsAdvanced.test.tsx b/app/src/organisms/Devices/RobotSettings/__tests__/RobotSettingsAdvanced.test.tsx index 8048be4f284..4aaaaa2b427 100644 --- a/app/src/organisms/Devices/RobotSettings/__tests__/RobotSettingsAdvanced.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/__tests__/RobotSettingsAdvanced.test.tsx @@ -6,11 +6,12 @@ import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../../i18n' import { getShellUpdateState } from '../../../../redux/shell' -import { useIsOT3 } from '../../hooks' +import { useIsFlex, useIsRobotBusy } from '../../hooks' import { - GantryHoming, - DisplayRobotName, DeviceReset, + DisplayRobotName, + EnableStatusLight, + GantryHoming, LegacySettings, OpenJupyterControl, RobotInformation, @@ -32,10 +33,11 @@ jest.mock('../../../../redux/shell/update', () => ({ ...jest.requireActual<{}>('../../../../redux/shell/update'), getShellUpdateState: jest.fn(), })) -jest.mock('../../hooks/useIsOT3') +jest.mock('../../hooks') +jest.mock('../AdvancedTab/DeviceReset') jest.mock('../AdvancedTab/DisplayRobotName') +jest.mock('../AdvancedTab/EnableStatusLight') jest.mock('../AdvancedTab/GantryHoming') -jest.mock('../AdvancedTab/DeviceReset') jest.mock('../AdvancedTab/LegacySettings') jest.mock('../AdvancedTab/OpenJupyterControl') jest.mock('../AdvancedTab/RobotInformation') @@ -88,7 +90,13 @@ const mockUseOlderAspirateBehavior = UseOlderAspirateBehavior as jest.MockedFunc const mockUseOlderProtocol = UseOlderProtocol as jest.MockedFunction< typeof UseOlderProtocol > -const mockUseIsOT3 = useIsOT3 as jest.MockedFunction +const mockEnableStatusLight = EnableStatusLight as jest.MockedFunction< + typeof EnableStatusLight +> +const mockUseIsFlex = useIsFlex as jest.MockedFunction +const mockUseIsRobotBusy = useIsRobotBusy as jest.MockedFunction< + typeof useIsRobotBusy +> const mockUpdateRobotStatus = jest.fn() @@ -136,7 +144,9 @@ describe('RobotSettings Advanced tab', () => { mockUseOlderProtocol.mockReturnValue(
Mock UseOlderProtocol Section
) - when(mockUseIsOT3).calledWith('otie').mockReturnValue(false) + when(mockUseIsFlex).calledWith('otie').mockReturnValue(false) + mockEnableStatusLight.mockReturnValue(
mock EnableStatusLight
) + when(mockUseIsRobotBusy).mockReturnValue(false) }) afterAll(() => { @@ -164,8 +174,8 @@ describe('RobotSettings Advanced tab', () => { getByText('Mock LegacySettings Section') }) - it('should not render LegacySettings section for OT-3', () => { - when(mockUseIsOT3).calledWith('otie').mockReturnValue(true) + it('should not render LegacySettings section for Flex', () => { + when(mockUseIsFlex).calledWith('otie').mockReturnValue(true) const [{ queryByText }] = render() expect(queryByText('Mock LegacySettings Section')).toBeNull() }) @@ -190,8 +200,8 @@ describe('RobotSettings Advanced tab', () => { getByText('Mock ShortTrashBin Section') }) - it('should not render ShortTrashBin section for OT-3', () => { - when(mockUseIsOT3).calledWith('otie').mockReturnValue(true) + it('should not render ShortTrashBin section for Flex', () => { + when(mockUseIsFlex).calledWith('otie').mockReturnValue(true) const [{ queryByText }] = render() expect(queryByText('Mock ShortTrashBin Section')).toBeNull() }) @@ -211,8 +221,8 @@ describe('RobotSettings Advanced tab', () => { getByText('Mock UsageSettings Section') }) - it('should not render UsageSettings for OT-3', () => { - when(mockUseIsOT3).calledWith('otie').mockReturnValue(true) + it('should not render UsageSettings for Flex', () => { + when(mockUseIsFlex).calledWith('otie').mockReturnValue(true) const [{ queryByText }] = render() expect(queryByText('Mock UsageSettings Section')).toBeNull() }) @@ -222,8 +232,8 @@ describe('RobotSettings Advanced tab', () => { getByText('Mock UseOlderAspirateBehavior Section') }) - it('should not render UseOlderAspirateBehavior section for OT-3', () => { - when(mockUseIsOT3).calledWith('otie').mockReturnValue(true) + it('should not render UseOlderAspirateBehavior section for Flex', () => { + when(mockUseIsFlex).calledWith('otie').mockReturnValue(true) const [{ queryByText }] = render() expect(queryByText('Mock UseOlderAspirateBehavior Section')).toBeNull() }) @@ -233,9 +243,20 @@ describe('RobotSettings Advanced tab', () => { getByText('Mock UseOlderProtocol Section') }) - it('should not render UseOlderProtocol section for OT-3', () => { - when(mockUseIsOT3).calledWith('otie').mockReturnValue(true) + it('should not render UseOlderProtocol section for Flex', () => { + when(mockUseIsFlex).calledWith('otie').mockReturnValue(true) const [{ queryByText }] = render() expect(queryByText('Mock UseOlderProtocol Section')).toBeNull() }) + + it('should not render EnableStatusLight section for OT-2', () => { + const [{ queryByText }] = render() + expect(queryByText('mock EnableStatusLight')).not.toBeInTheDocument() + }) + + it('should render EnableStatusLight section for Flex', () => { + when(mockUseIsFlex).calledWith('otie').mockReturnValue(true) + const [{ getByText }] = render() + getByText('mock EnableStatusLight') + }) }) diff --git a/app/src/organisms/Devices/RobotSettings/__tests__/RobotSettingsNetworking.test.tsx b/app/src/organisms/Devices/RobotSettings/__tests__/RobotSettingsNetworking.test.tsx index e50237d1e67..9eaf35b39fc 100644 --- a/app/src/organisms/Devices/RobotSettings/__tests__/RobotSettingsNetworking.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/__tests__/RobotSettingsNetworking.test.tsx @@ -17,12 +17,14 @@ import { useWifiList, } from '../../../../resources/networking/hooks' import * as Fixtures from '../../../../redux/networking/__fixtures__' -import { useIsOT3, useIsRobotBusy } from '../../hooks' +import { useIsFlex, useIsRobotBusy } from '../../hooks' import { DisconnectModal } from '../ConnectNetwork/DisconnectModal' +import { useIsEstopNotDisengaged } from '../../../../resources/devices/hooks/useIsEstopNotDisengaged' import { RobotSettingsNetworking } from '../RobotSettingsNetworking' import type { DiscoveryClientRobotAddress } from '../../../../redux/discovery/types' import type { State } from '../../../../redux/types' +import { fireEvent, screen } from '@testing-library/react' jest.mock('../../../../redux/discovery/selectors') jest.mock('../../../../redux/networking') @@ -30,6 +32,7 @@ jest.mock('../../../../redux/robot-api/selectors') jest.mock('../../../../resources/networking/hooks') jest.mock('../../hooks') jest.mock('../ConnectNetwork/DisconnectModal') +jest.mock('../../../../resources/devices/hooks/useIsEstopNotDisengaged') const mockUpdateRobotStatus = jest.fn() @@ -44,13 +47,16 @@ const mockUseCanDisconnect = useCanDisconnect as jest.MockedFunction< typeof useCanDisconnect > -const mockUseIsOT3 = useIsOT3 as jest.MockedFunction +const mockUseIsFlex = useIsFlex as jest.MockedFunction const mockUseIsRobotBusy = useIsRobotBusy as jest.MockedFunction< typeof useIsRobotBusy > const mockDisconnectModal = DisconnectModal as jest.MockedFunction< typeof DisconnectModal > +const mockUseIsEstopNotDisengaged = useIsEstopNotDisengaged as jest.MockedFunction< + typeof useIsEstopNotDisengaged +> const ROBOT_NAME = 'otie' @@ -114,10 +120,13 @@ describe('RobotSettingsNetworking', () => { .calledWith(ROBOT_NAME, 10000) .mockReturnValue(mockWifiList) - when(mockUseIsOT3).calledWith(ROBOT_NAME).mockReturnValue(false) + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(false) when(mockUseIsRobotBusy).calledWith({ poll: true }).mockReturnValue(false) when(mockUseCanDisconnect).calledWith(ROBOT_NAME).mockReturnValue(false) mockDisconnectModal.mockReturnValue(
mock disconnect modal
) + when(mockUseIsEstopNotDisengaged) + .calledWith(ROBOT_NAME) + .mockReturnValue(false) }) afterEach(() => { @@ -127,35 +136,43 @@ describe('RobotSettingsNetworking', () => { it('should render title and description for OT-2', () => { when(mockUseWifiList).calledWith(ROBOT_NAME).mockReturnValue(mockWifiList) - const [{ getByText, getByTestId, queryByRole, queryByText }] = render() - getByText('Wi-Fi - foo') - getByText('Wired USB') - getByText('Learn about connecting to a robot via USB') - getByText('Looking for USB-to-Ethernet Adapter info?') - getByText('Go to Advanced App Settings') + render() + screen.getByText('Wi-Fi - foo') + screen.getByText('Wired USB') + screen.getByText('Learn about connecting to a robot via USB') + screen.getByText('Looking for USB-to-Ethernet Adapter info?') + screen.getByText('Go to Advanced App Settings') + expect( + screen.getByTestId('RobotSettings_Networking_wifi_icon') + ).toBeInTheDocument() expect( - getByTestId('RobotSettings_Networking_wifi_icon') + screen.getByTestId('RobotSettings_Networking_usb_icon') ).toBeInTheDocument() - expect(getByTestId('RobotSettings_Networking_usb_icon')).toBeInTheDocument() - expect(queryByText('Wi-Fi - bar')).not.toBeInTheDocument() - expect(queryByRole('button', { name: 'Disconnect from Wi-Fi' })).toBeNull() + expect(screen.queryByText('Wi-Fi - bar')).not.toBeInTheDocument() + expect( + screen.queryByRole('button', { name: 'Disconnect from Wi-Fi' }) + ).toBeNull() }) - it('should render title and description for OT-3', () => { + it('should render title and description for Flex', () => { when(mockUseWifiList).calledWith(ROBOT_NAME).mockReturnValue(mockWifiList) - when(mockUseIsOT3).calledWith(ROBOT_NAME).mockReturnValue(true) - const [{ getByText, queryByText }] = render() - getByText('Wi-Fi - foo') - getByText('Ethernet') - getByText('USB') - expect(queryByText('Learn about connecting to a robot via USB')).toBeNull() - expect(queryByText('Looking for USB-to-Ethernet Adapter info?')).toBeNull() - expect(queryByText('Go to Advanced App Settings')).toBeNull() + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(true) + render() + screen.getByText('Wi-Fi - foo') + screen.getByText('Ethernet') + screen.getByText('USB') + expect( + screen.queryByText('Learn about connecting to a robot via USB') + ).toBeNull() + expect( + screen.queryByText('Looking for USB-to-Ethernet Adapter info?') + ).toBeNull() + expect(screen.queryByText('Go to Advanced App Settings')).toBeNull() }) - it('should render USB connection message for OT-3 when connected via USB', () => { + it('should render USB connection message for Flex when connected via USB', () => { when(mockUseWifiList).calledWith(ROBOT_NAME).mockReturnValue(mockWifiList) - when(mockUseIsOT3).calledWith(ROBOT_NAME).mockReturnValue(true) + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(true) when(mockGetRobotAddressesByName) .calledWith({} as State, ROBOT_NAME) .mockReturnValue([ @@ -165,34 +182,36 @@ describe('RobotSettingsNetworking', () => { } as DiscoveryClientRobotAddress, ]) - const [{ getByText }] = render() - getByText('Directly connected to this computer.') + render() + screen.getByText('Directly connected to this computer.') }) it('should render Wi-Fi mock data and ethernet mock data for OT-2', () => { when(mockUseWifiList).calledWith(ROBOT_NAME).mockReturnValue(mockWifiList) - const [{ getByText, getByTestId, queryByText, queryAllByTestId }] = render() - getByText('Wi-Fi - foo') - getByText('Wired USB') - getByText('Wireless IP') - getByText('Wireless Subnet Mask') - getByText('Wireless MAC Address') - getByText('127.0.0.100') - getByText('255.255.255.230') - getByText('WI:FI:00:00:00:00') - getByText('Wired IP') - getByText('Wired Subnet Mask') - getByText('Wired MAC Address') - getByText('127.0.0.101') - getByText('255.255.255.231') - getByText('US:B0:00:00:00:00') - expect(queryByText('Wi-Fi - bar')).not.toBeInTheDocument() + render() + screen.getByText('Wi-Fi - foo') + screen.getByText('Wired USB') + screen.getByText('Wireless IP') + screen.getByText('Wireless Subnet Mask') + screen.getByText('Wireless MAC Address') + screen.getByText('127.0.0.100') + screen.getByText('255.255.255.230') + screen.getByText('WI:FI:00:00:00:00') + screen.getByText('Wired IP') + screen.getByText('Wired Subnet Mask') + screen.getByText('Wired MAC Address') + screen.getByText('127.0.0.101') + screen.getByText('255.255.255.231') + screen.getByText('US:B0:00:00:00:00') + expect(screen.queryByText('Wi-Fi - bar')).not.toBeInTheDocument() expect( - getByTestId('RobotSettings_Networking_wifi_icon') + screen.getByTestId('RobotSettings_Networking_wifi_icon') ).toBeInTheDocument() - expect(getByTestId('RobotSettings_Networking_usb_icon')).toBeInTheDocument() expect( - queryAllByTestId('RobotSettings_Networking_check_circle') + screen.getByTestId('RobotSettings_Networking_usb_icon') + ).toBeInTheDocument() + expect( + screen.queryAllByTestId('RobotSettings_Networking_check_circle') ).toHaveLength(2) }) @@ -215,23 +234,25 @@ describe('RobotSettingsNetworking', () => { healthStatus: HEALTH_STATUS_OK, } as DiscoveryClientRobotAddress, ]) - const [{ getByText, getByTestId, queryByText, queryAllByTestId }] = render() - getByText('Wi-Fi - foo') - getByText('Wireless IP') - getByText('Wireless Subnet Mask') - getByText('Wireless MAC Address') - getByText('1.2.3.4') - getByText('255.255.255.123') - getByText('00:00:00:00:00:00') - getByText('Wired USB') - getByText('Not connected via wired USB') - expect(queryByText('Wi-Fi - bar')).not.toBeInTheDocument() + render() + screen.getByText('Wi-Fi - foo') + screen.getByText('Wireless IP') + screen.getByText('Wireless Subnet Mask') + screen.getByText('Wireless MAC Address') + screen.getByText('1.2.3.4') + screen.getByText('255.255.255.123') + screen.getByText('00:00:00:00:00:00') + screen.getByText('Wired USB') + screen.getByText('Not connected via wired USB') + expect(screen.queryByText('Wi-Fi - bar')).not.toBeInTheDocument() + expect( + screen.getByTestId('RobotSettings_Networking_wifi_icon') + ).toBeInTheDocument() expect( - getByTestId('RobotSettings_Networking_wifi_icon') + screen.getByTestId('RobotSettings_Networking_usb_icon') ).toBeInTheDocument() - expect(getByTestId('RobotSettings_Networking_usb_icon')).toBeInTheDocument() expect( - queryAllByTestId('RobotSettings_Networking_check_circle') + screen.queryAllByTestId('RobotSettings_Networking_check_circle') ).toHaveLength(1) }) @@ -257,22 +278,24 @@ describe('RobotSettingsNetworking', () => { } as DiscoveryClientRobotAddress, ]) when(mockUseWifiList).calledWith(ROBOT_NAME).mockReturnValue([]) - const [{ getByText, getByTestId, queryAllByTestId }] = render() - - getByText('Wired USB') - getByText('Wired IP') - getByText('Wired Subnet Mask') - getByText('Wired MAC Address') - getByText('5.6.7.8') - getByText('255.255.255.124') - getByText('00:00:00:00:00:00') - getByText('Wi-Fi - foo') + render() + + screen.getByText('Wired USB') + screen.getByText('Wired IP') + screen.getByText('Wired Subnet Mask') + screen.getByText('Wired MAC Address') + screen.getByText('5.6.7.8') + screen.getByText('255.255.255.124') + screen.getByText('00:00:00:00:00:00') + screen.getByText('Wi-Fi - foo') + expect( + screen.getByTestId('RobotSettings_Networking_wifi_icon') + ).toBeInTheDocument() expect( - getByTestId('RobotSettings_Networking_wifi_icon') + screen.getByTestId('RobotSettings_Networking_usb_icon') ).toBeInTheDocument() - expect(getByTestId('RobotSettings_Networking_usb_icon')).toBeInTheDocument() expect( - queryAllByTestId('RobotSettings_Networking_check_circle') + screen.queryAllByTestId('RobotSettings_Networking_check_circle') ).toHaveLength(1) }) @@ -284,20 +307,20 @@ describe('RobotSettingsNetworking', () => { ethernet: null, }) when(mockUseWifiList).calledWith(ROBOT_NAME).mockReturnValue([]) - const [{ getByText, queryByText, queryAllByTestId }] = render() - - expect(queryByText('Wireless IP')).not.toBeInTheDocument() - expect(queryByText('Wireless Subnet Mask')).not.toBeInTheDocument() - expect(queryByText('Wireless MAC Address')).not.toBeInTheDocument() - expect(queryByText('Wired IP')).not.toBeInTheDocument() - expect(queryByText('Wired Subnet Mask')).not.toBeInTheDocument() - expect(queryByText('Wired MAC Address')).not.toBeInTheDocument() + render() + + expect(screen.queryByText('Wireless IP')).not.toBeInTheDocument() + expect(screen.queryByText('Wireless Subnet Mask')).not.toBeInTheDocument() + expect(screen.queryByText('Wireless MAC Address')).not.toBeInTheDocument() + expect(screen.queryByText('Wired IP')).not.toBeInTheDocument() + expect(screen.queryByText('Wired Subnet Mask')).not.toBeInTheDocument() + expect(screen.queryByText('Wired MAC Address')).not.toBeInTheDocument() expect( - queryAllByTestId('RobotSettings_Networking_check_circle') + screen.queryAllByTestId('RobotSettings_Networking_check_circle') ).toHaveLength(0) - getByText('Wi-Fi - foo') - getByText('Wired USB') - getByText('Not connected via wired USB') + screen.getByText('Wi-Fi - foo') + screen.getByText('Wired USB') + screen.getByText('Not connected via wired USB') }) it('should render the right links to external resource and internal resource for OT-2', () => { @@ -305,30 +328,35 @@ describe('RobotSettingsNetworking', () => { const usbExternalLink = 'https://support.opentrons.com/s/article/Get-started-Connect-to-your-OT-2-over-USB' const usbInternalLink = '/app-settings/advanced' - const [{ getByText }] = render() - const externalLink = getByText('Learn about connecting to a robot via USB') - const internalLink = getByText('Go to Advanced App Settings') - expect(externalLink.closest('a')).toHaveAttribute('href', usbExternalLink) - expect(internalLink.closest('a')).toHaveAttribute('href', usbInternalLink) + render() + const externalLink = screen.getByText( + 'Learn about connecting to a robot via USB' + ) + const internalLink = screen.getByText('Go to Advanced App Settings') + expect(externalLink).toHaveAttribute('href', usbExternalLink) + expect(internalLink).toHaveAttribute('href', usbInternalLink) }) it('should render Disconnect from Wi-Fi button when robot can disconnect and is not busy', () => { when(mockUseWifiList).calledWith(ROBOT_NAME).mockReturnValue([]) when(mockUseCanDisconnect).calledWith(ROBOT_NAME).mockReturnValue(true) - const [{ getByRole, getByText, queryByText }] = render() - - expect(queryByText('mock disconnect modal')).toBeNull() - getByRole('button', { name: 'Disconnect from Wi-Fi' }).click() - getByText('mock disconnect modal') + render() + expect(screen.queryByText('mock disconnect modal')).toBeNull() + fireEvent.click( + screen.getByRole('button', { name: 'Disconnect from Wi-Fi' }) + ) + screen.getByText('mock disconnect modal') }) it('should not render Disconnect from Wi-Fi button when robot is busy', () => { when(mockUseWifiList).calledWith(ROBOT_NAME).mockReturnValue([]) when(mockUseCanDisconnect).calledWith(ROBOT_NAME).mockReturnValue(true) when(mockUseIsRobotBusy).calledWith({ poll: true }).mockReturnValue(true) - const [{ queryByRole }] = render() + render() - expect(queryByRole('button', { name: 'Disconnect from Wi-Fi' })).toBeNull() + expect( + screen.queryByRole('button', { name: 'Disconnect from Wi-Fi' }) + ).toBeNull() }) it('should not render connected check circles when discovery client cannot find a healthy robot at its network connection ip addresses', () => { @@ -345,28 +373,42 @@ describe('RobotSettingsNetworking', () => { healthStatus: HEALTH_STATUS_NOT_OK, } as DiscoveryClientRobotAddress, ]) - const [{ getByText, getByTestId, queryByText, queryAllByTestId }] = render() - getByText('Wi-Fi - foo') - getByText('Wired USB') - getByText('Wireless IP') - getByText('Wireless Subnet Mask') - getByText('Wireless MAC Address') - getByText('127.0.0.100') - getByText('255.255.255.230') - getByText('WI:FI:00:00:00:00') - getByText('Wired IP') - getByText('Wired Subnet Mask') - getByText('Wired MAC Address') - getByText('127.0.0.101') - getByText('255.255.255.231') - getByText('US:B0:00:00:00:00') - expect(queryByText('Wi-Fi - bar')).not.toBeInTheDocument() + render() + screen.getByText('Wi-Fi - foo') + screen.getByText('Wired USB') + screen.getByText('Wireless IP') + screen.getByText('Wireless Subnet Mask') + screen.getByText('Wireless MAC Address') + screen.getByText('127.0.0.100') + screen.getByText('255.255.255.230') + screen.getByText('WI:FI:00:00:00:00') + screen.getByText('Wired IP') + screen.getByText('Wired Subnet Mask') + screen.getByText('Wired MAC Address') + screen.getByText('127.0.0.101') + screen.getByText('255.255.255.231') + screen.getByText('US:B0:00:00:00:00') + expect(screen.queryByText('Wi-Fi - bar')).not.toBeInTheDocument() expect( - getByTestId('RobotSettings_Networking_wifi_icon') + screen.getByTestId('RobotSettings_Networking_wifi_icon') ).toBeInTheDocument() - expect(getByTestId('RobotSettings_Networking_usb_icon')).toBeInTheDocument() expect( - queryAllByTestId('RobotSettings_Networking_check_circle') + screen.getByTestId('RobotSettings_Networking_usb_icon') + ).toBeInTheDocument() + expect( + screen.queryAllByTestId('RobotSettings_Networking_check_circle') ).toHaveLength(0) }) + + it('should not render disabled Disconnect from Wi-Fi button when e-stop is pressed', () => { + when(mockUseWifiList).calledWith(ROBOT_NAME).mockReturnValue([]) + when(mockUseCanDisconnect).calledWith(ROBOT_NAME).mockReturnValue(true) + when(mockUseIsEstopNotDisengaged) + .calledWith(ROBOT_NAME) + .mockReturnValue(true) + const [{ queryByRole }] = render() + expect( + queryByRole('button', { name: 'Disconnect from Wi-Fi' }) + ).toBeDisabled() + }) }) diff --git a/app/src/organisms/Devices/RobotSettings/__tests__/SelectNetwork.test.tsx b/app/src/organisms/Devices/RobotSettings/__tests__/SelectNetwork.test.tsx index f236c74046b..fcf78b48e91 100644 --- a/app/src/organisms/Devices/RobotSettings/__tests__/SelectNetwork.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/__tests__/SelectNetwork.test.tsx @@ -1,350 +1,3 @@ -import * as React from 'react' -import { when, resetAllWhenMocks } from 'jest-when' -import { Provider } from 'react-redux' - -import { act } from 'react-dom/test-utils' -import { mount } from 'enzyme' - -import { useWifiList } from '../../../../resources/networking/hooks' -import * as Networking from '../../../../redux/networking' -import * as RobotApi from '../../../../redux/robot-api' -import * as Fixtures from '../../../../redux/networking/__fixtures__' -import * as Constants from '../ConnectNetwork/constants' - -import { Portal } from '../../../../App/portal' -import { SelectSsid } from '../ConnectNetwork/SelectSsid' -import { ConnectModal } from '../ConnectNetwork/ConnectModal' -import { ResultModal } from '../ConnectNetwork/ResultModal' - -import { SelectNetwork } from '../SelectNetwork' - -import type { ReactWrapper } from 'enzyme' -import { RequestState } from '../../../../redux/robot-api/types' - -jest.mock('../../../../resources/networking/hooks') -jest.mock('../../../../redux/networking/selectors') -jest.mock('../../../../redux/robot-api/selectors') - -// mock out ConnectModal to prevent warning logs from async formik -// validation happening outside an `act` -jest.mock('../ConnectNetwork/ConnectModal', () => ({ - ConnectModal: () => <>, -})) - -const mockState = { state: true, mock: true } - -const mockRobotName = 'robot-name' - -const mockWifiList = [ - { ...Fixtures.mockWifiNetwork, ssid: 'foo', active: true }, - { ...Fixtures.mockWifiNetwork, ssid: 'bar' }, - { - ...Fixtures.mockWifiNetwork, - ssid: 'baz', - securityType: Networking.SECURITY_NONE, - }, -] - -const mockWifiKeys = [ - { ...Fixtures.mockWifiKey, id: 'abc' }, - { ...Fixtures.mockWifiKey, id: 'def' }, - { ...Fixtures.mockWifiKey, id: 'ghi' }, -] - -const mockEapOptions = [Fixtures.mockEapOption] - -const mockUseWifiList = useWifiList as jest.MockedFunction - -const mockGetWifiKeys = Networking.getWifiKeys as jest.MockedFunction< - typeof Networking.getWifiKeys -> - -const mockGetEapOptions = Networking.getEapOptions as jest.MockedFunction< - typeof Networking.getEapOptions -> - -const mockGetRequestById = RobotApi.getRequestById as jest.MockedFunction< - typeof RobotApi.getRequestById -> - -describe('', () => { - let dispatch: any - let mockStore: any - - let render: () => ReactWrapper> - - beforeEach(() => { - dispatch = jest.fn() - mockStore = { - dispatch, - subscribe: () => {}, - getState: () => mockState, - } - - jest.useFakeTimers() - - when(mockUseWifiList) - .calledWith(mockRobotName) - .mockReturnValue(mockWifiList) - - mockGetWifiKeys.mockImplementation((state, robotName) => { - expect(state).toEqual(mockState) - expect(robotName).toEqual(mockRobotName) - return mockWifiKeys - }) - - mockGetEapOptions.mockImplementation((state, robotName) => { - expect(state).toEqual(mockState) - expect(robotName).toEqual(mockRobotName) - return mockEapOptions - }) - - render = () => { - return mount( - , - { - wrappingComponent: Provider, - wrappingComponentProps: { store: mockStore }, - } - ) - } - }) - - afterEach(() => { - jest.clearAllMocks() - jest.clearAllTimers() - jest.useRealTimers() - resetAllWhenMocks() - }) - - it('renders an child with props from state', () => { - const wrapper = render() - const selectSsid = wrapper.find(SelectSsid) - expect(selectSsid.prop('list')).toEqual(mockWifiList) - expect(selectSsid.prop('value')).toEqual('foo') - }) - - it('renders an child with no active ssid', () => { - when(mockUseWifiList) - .calledWith(mockRobotName) - .mockReturnValue(mockWifiList.slice(1)) - - const wrapper = render() - const selectSsid = wrapper.find(SelectSsid) - expect(selectSsid.prop('list')).toEqual(mockWifiList.slice(1)) - expect(selectSsid.prop('value')).toEqual(null) - }) - - describe('joining a network', () => { - let wrapper: ReactWrapper> - let connectModal: ReactWrapper> - - beforeEach(() => { - wrapper = render() - const selectSsid = wrapper.find(SelectSsid) - dispatch.mockReset() - - act(() => { - selectSsid.invoke('onConnect')?.(mockWifiList[1].ssid) - }) - wrapper.update() - - connectModal = wrapper.find(ConnectModal) - }) - - it('renders a ConnectModal on SelectSsid::onSelect', () => { - expect(connectModal).toHaveLength(1) - expect(connectModal.props()).toEqual({ - robotName: mockRobotName, - network: mockWifiList[1], - wifiKeys: mockWifiKeys, - eapOptions: mockEapOptions, - onConnect: expect.any(Function), - onCancel: expect.any(Function), - }) - }) - - it('dispatches fetchEapOptions and fetchWifiKeys on SelectSsid::onSelect', () => { - const expectedFetchEap = Networking.fetchEapOptions(mockRobotName) - const expectedFetchKeys = Networking.fetchEapOptions(mockRobotName) - - expect(dispatch).toHaveBeenCalledWith(expectedFetchEap) - expect(dispatch).toHaveBeenCalledWith(expectedFetchKeys) - }) - - it('renders a ConnectModal with network={null} on SelectSsid::onJoinOther', () => { - wrapper = render() - const selectSsid = wrapper.find(SelectSsid) - - act(() => { - selectSsid.invoke('onJoinOther')?.() - }) - wrapper.update() - connectModal = wrapper.find(Portal).find(ConnectModal) - - expect(connectModal).toHaveLength(1) - expect(connectModal.props()).toEqual({ - robotName: mockRobotName, - network: null, - wifiKeys: mockWifiKeys, - eapOptions: mockEapOptions, - onConnect: expect.any(Function), - onCancel: expect.any(Function), - }) - }) - - it('dispatches fetchEapOptions and fetchWifiKeys on SelectSsid::onJoinOther', () => { - wrapper = render() - const selectSsid = wrapper.find(SelectSsid) - dispatch.mockReset() - - act(() => { - selectSsid.invoke('onJoinOther')?.() - }) - - const expectedFetchEap = Networking.fetchEapOptions(mockRobotName) - const expectedFetchKeys = Networking.fetchEapOptions(mockRobotName) - - expect(dispatch).toHaveBeenCalledWith(expectedFetchEap) - expect(dispatch).toHaveBeenCalledWith(expectedFetchKeys) - }) - - it('passes onCancel prop that closes the modal', () => { - act(() => { - connectModal.invoke('onCancel')?.() - }) - wrapper.update() - - expect(wrapper.find(ConnectModal)).toHaveLength(0) - }) - - describe('dispatching the request', () => { - const mockConfigure = { ssid: mockWifiList[1].ssid, psk: 'password' } - let requestId: string | null - - const connectAndSetMockRequestState = ( - requestState: RequestState | null = null - ) => { - act(() => { - connectModal.invoke('onConnect')?.(mockConfigure) - const actionCall = dispatch.mock.calls.find( - (call: any) => call[0].type === Networking.POST_WIFI_CONFIGURE - ) - requestId = actionCall?.[0].meta.requestId - - mockGetRequestById.mockImplementation((state, reqId) => { - expect(state).toEqual(mockState) - return reqId === requestId ? requestState : null - }) - }) - wrapper.update() - } - - it('passes an onConnect prop that dispatches networking:POST_WIFI_CONFIGURE', () => { - connectAndSetMockRequestState() - - expect(dispatch).toHaveBeenCalledWith( - expect.objectContaining({ - ...Networking.postWifiConfigure(mockRobotName, mockConfigure), - meta: { requestId: expect.any(String) }, - }) - ) - }) - - it('closes modal and shows a spinner while disconnect is in progress', () => { - connectAndSetMockRequestState({ status: RobotApi.PENDING }) - - expect(wrapper.find(ConnectModal)).toHaveLength(0) - const resultModal = wrapper.find(Portal).find(ResultModal) - expect(resultModal).toHaveLength(1) - expect(resultModal.props()).toEqual({ - type: Constants.CONNECT, - ssid: mockConfigure.ssid, - isPending: true, - error: null, - onClose: expect.any(Function), - }) - }) - - it('closes spinner and shows success if connect succeeds', () => { - connectAndSetMockRequestState({ - status: RobotApi.SUCCESS, - response: {} as any, - }) - - expect(wrapper.find(ConnectModal)).toHaveLength(0) - const resultModal = wrapper.find(Portal).find(ResultModal) - expect(resultModal).toHaveLength(1) - expect(resultModal.props()).toEqual({ - type: Constants.CONNECT, - ssid: mockConfigure.ssid, - isPending: false, - error: null, - onClose: expect.any(Function), - }) - - act(() => { - resultModal.invoke('onClose')?.() - }) - wrapper.update() - - expect(wrapper.find(ResultModal)).toHaveLength(0) - expect(dispatch).toHaveBeenCalledWith( - RobotApi.dismissRequest(requestId as any) - ) - }) - - it('closes spinner and shows failure if connect fails', () => { - connectAndSetMockRequestState({ - status: RobotApi.FAILURE, - response: {} as any, - error: { message: 'oh no!' }, - }) - - expect(wrapper.find(ConnectModal)).toHaveLength(0) - const resultModal = wrapper.find(Portal).find(ResultModal) - expect(resultModal).toHaveLength(1) - expect(resultModal.props()).toEqual({ - type: Constants.CONNECT, - ssid: mockConfigure.ssid, - isPending: false, - error: { message: 'oh no!' }, - onClose: expect.any(Function), - }) - - act(() => { - resultModal.invoke('onClose')?.() - }) - wrapper.update() - - expect(wrapper.find(ResultModal)).toHaveLength(0) - expect(dispatch).toHaveBeenCalledWith( - RobotApi.dismissRequest(requestId as any) - ) - }) - - it('dispatches a configure request immediately for an open network', () => { - wrapper = render() - - const selectSsid = wrapper.find(SelectSsid) - const expectedConfigure = { - ssid: mockWifiList[2].ssid, - securityType: Networking.SECURITY_NONE, - hidden: false, - } - - act(() => { - selectSsid.invoke('onConnect')?.(mockWifiList[2].ssid) - }) - wrapper.update() - - expect(dispatch).toHaveBeenCalledWith( - expect.objectContaining({ - ...Networking.postWifiConfigure(mockRobotName, expectedConfigure), - meta: { requestId: expect.any(String) }, - }) - ) - }) - }) - }) +describe('', () => { + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/organisms/Devices/RobotStatusHeader.tsx b/app/src/organisms/Devices/RobotStatusHeader.tsx index 668c1fe15aa..16463bab1c6 100644 --- a/app/src/organisms/Devices/RobotStatusHeader.tsx +++ b/app/src/organisms/Devices/RobotStatusHeader.tsx @@ -2,26 +2,30 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { useSelector, useDispatch } from 'react-redux' import { Link, useHistory } from 'react-router-dom' +import styled from 'styled-components' -import { useProtocolQuery, useRunQuery } from '@opentrons/react-api-client' +import { useProtocolQuery } from '@opentrons/react-api-client' import { RUN_STATUS_IDLE } from '@opentrons/api-client' import { - Btn, - Flex, - Icon, - useHoverTooltip, ALIGN_CENTER, + Btn, COLORS, DIRECTION_COLUMN, + Flex, + Icon, JUSTIFY_SPACE_BETWEEN, + OVERFLOW_WRAP_ANYWHERE, SPACING, - TYPOGRAPHY, truncateString, + TYPOGRAPHY, + useHoverTooltip, + useInterval, } from '@opentrons/components' import { QuaternaryButton } from '../../atoms/buttons' import { StyledText } from '../../atoms/text' import { Tooltip } from '../../atoms/Tooltip' +import { useIsFlex } from '../../organisms/Devices/hooks' import { useCurrentRunId } from '../../organisms/ProtocolUpload/hooks' import { useCurrentRunStatus } from '../../organisms/RunTimeControl/hooks' import { @@ -30,6 +34,7 @@ import { OPENTRONS_USB, } from '../../redux/discovery' import { getNetworkInterfaces, fetchStatus } from '../../redux/networking' +import { useNotifyRunQuery } from '../../resources/runs/useNotifyRunQuery' import type { IconName, StyleProps } from '@opentrons/components' import type { DiscoveredRobot } from '../../redux/discovery/types' @@ -40,9 +45,15 @@ type RobotStatusHeaderProps = StyleProps & robotModel: string | null } +const STATUS_REFRESH_MS = 5000 + +interface RobotNameContainerProps { + isGoToRun: boolean +} + export function RobotStatusHeader(props: RobotStatusHeaderProps): JSX.Element { const { name, local, robotModel, ...styleProps } = props - const { t } = useTranslation([ + const { t, i18n } = useTranslation([ 'devices_landing', 'device_settings', 'run_details', @@ -51,9 +62,12 @@ export function RobotStatusHeader(props: RobotStatusHeaderProps): JSX.Element { const [targetProps, tooltipProps] = useHoverTooltip() const dispatch = useDispatch() + const isFlex = useIsFlex(name) const currentRunId = useCurrentRunId() const currentRunStatus = useCurrentRunStatus() - const { data: runRecord } = useRunQuery(currentRunId, { staleTime: Infinity }) + const { data: runRecord } = useNotifyRunQuery(currentRunId, { + staleTime: Infinity, + }) const protocolId = runRecord?.data?.protocolId ?? null const { data: protocolRecord } = useProtocolQuery(protocolId, { staleTime: Infinity, @@ -68,10 +82,11 @@ export function RobotStatusHeader(props: RobotStatusHeaderProps): JSX.Element { - {`${truncateString(displayName, 80, 65)}; ${t( - `run_details:status_${currentRunStatus}` + {`${truncateString(displayName, 68)}; ${i18n.format( + t(`run_details:status_${currentRunStatus}`), + 'lowerCase' )}`} addr.ip === wifi?.ipAddress) - const isOT3ConnectedViaWifi = + const isConnectedViaWifi = wifiAddress != null && wifiAddress.healthStatus === HEALTH_STATUS_OK const ethernetAddress = addresses.find( addr => addr.ip === ethernet?.ipAddress ) - const isOT3ConnectedViaEthernet = - ethernetAddress != null && ethernetAddress.healthStatus === HEALTH_STATUS_OK + // do not show ethernet connection for OT-2 + const isFlexConnectedViaEthernet = + isFlex && + ethernetAddress != null && + ethernetAddress.healthStatus === HEALTH_STATUS_OK const usbAddress = addresses.find(addr => addr.ip === OPENTRONS_USB) - const isOT3ConnectedViaUSB = + const isFlexConnectedViaUSB = usbAddress != null && usbAddress.healthStatus === HEALTH_STATUS_OK let iconName: IconName | null = null let tooltipTranslationKey = null - if (isOT3ConnectedViaEthernet) { + if (isFlexConnectedViaEthernet) { iconName = 'ethernet' tooltipTranslationKey = 'device_settings:ethernet' - } else if (isOT3ConnectedViaWifi) { + } else if (isConnectedViaWifi) { iconName = 'wifi' tooltipTranslationKey = 'device_settings:wifi' - } else if ((local != null && local) || isOT3ConnectedViaUSB) { + } else if ((local != null && local) || isFlexConnectedViaUSB) { iconName = 'usb' tooltipTranslationKey = 'device_settings:wired_usb' } - React.useEffect(() => { - dispatch(fetchStatus(name)) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) + useInterval(() => dispatch(fetchStatus(name)), STATUS_REFRESH_MS, true) + + const RobotNameContainer = styled.div` + max-width: ${(props: RobotNameContainerProps) => + props.isGoToRun ? `150px` : undefined}; + @media screen and (max-width: 678px) { + max-width: ${(props: RobotNameContainerProps) => + props.isGoToRun ? `105px` : undefined}; + } + ` + + const isGoToRun = + currentRunId != null && currentRunStatus != null && displayName != null return ( - - {name} - + + + {name} + + {iconName != null ? ( diff --git a/app/src/organisms/Devices/__tests__/DevicesEmptyState.test.tsx b/app/src/organisms/Devices/__tests__/DevicesEmptyState.test.tsx index dd93acb4885..962a9a70c7f 100644 --- a/app/src/organisms/Devices/__tests__/DevicesEmptyState.test.tsx +++ b/app/src/organisms/Devices/__tests__/DevicesEmptyState.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { i18n } from '../../../i18n' @@ -33,7 +34,7 @@ describe('DevicesEmptyState', () => { const refreshButton = getByRole('button', { name: 'Refresh', }) - refreshButton.click() + fireEvent.click(refreshButton) expect(mockStartDiscovery).toBeCalled() }) diff --git a/app/src/organisms/Devices/__tests__/HistoricalProtocolRunOverflowMenu.test.tsx b/app/src/organisms/Devices/__tests__/HistoricalProtocolRunOverflowMenu.test.tsx index 1fbb07ad6f4..0939700387e 100644 --- a/app/src/organisms/Devices/__tests__/HistoricalProtocolRunOverflowMenu.test.tsx +++ b/app/src/organisms/Devices/__tests__/HistoricalProtocolRunOverflowMenu.test.tsx @@ -12,12 +12,13 @@ import { i18n } from '../../../i18n' import runRecord from '../../../organisms/RunDetails/__fixtures__/runRecord.json' import { useDownloadRunLog, useTrackProtocolRunEvent } from '../hooks' import { useRunControls } from '../../RunTimeControl/hooks' -import { HistoricalProtocolRunOverflowMenu } from '../HistoricalProtocolRunOverflowMenu' import { useTrackEvent, ANALYTICS_PROTOCOL_PROCEED_TO_RUN, } from '../../../redux/analytics' import { getRobotUpdateDisplayInfo } from '../../../redux/robot-update' +import { useIsEstopNotDisengaged } from '../../../resources/devices/hooks/useIsEstopNotDisengaged' +import { HistoricalProtocolRunOverflowMenu } from '../HistoricalProtocolRunOverflowMenu' import type { CommandsData } from '@opentrons/api-client' @@ -30,6 +31,7 @@ jest.mock('../../RunTimeControl/hooks') jest.mock('../../../redux/analytics') jest.mock('../../../redux/config') jest.mock('@opentrons/react-api-client') +jest.mock('../../../resources/devices/hooks/useIsEstopNotDisengaged') jest.mock('react-router-dom', () => { const reactRouterDom = jest.requireActual('react-router-dom') return { @@ -59,6 +61,9 @@ const mockGetBuildrootUpdateDisplayInfo = getRobotUpdateDisplayInfo as jest.Mock const mockUseDownloadRunLog = useDownloadRunLog as jest.MockedFunction< typeof useDownloadRunLog > +const mockUseIsEstopNotDisengaged = useIsEstopNotDisengaged as jest.MockedFunction< + typeof useIsEstopNotDisengaged +> const render = ( props: React.ComponentProps @@ -74,6 +79,7 @@ const render = ( } const PAGE_LENGTH = 101 const RUN_ID = 'id' +const ROBOT_NAME = 'otie' let mockTrackEvent: jest.Mock let mockTrackProtocolRunEvent: jest.Mock const mockDownloadRunLog = jest.fn() @@ -127,9 +133,12 @@ describe('HistoricalProtocolRunOverflowMenu', () => { .mockReturnValue(({ data: { data: runRecord.data.commands, meta: { totalLength: 14 } }, } as unknown) as UseQueryResult) + when(mockUseIsEstopNotDisengaged) + .calledWith(ROBOT_NAME) + .mockReturnValue(false) props = { runId: RUN_ID, - robotName: 'otie', + robotName: ROBOT_NAME, robotIsBusy: false, } }) @@ -178,4 +187,12 @@ describe('HistoricalProtocolRunOverflowMenu', () => { const rerunBtn = getByRole('button', { name: 'Rerun protocol now' }) expect(rerunBtn).toBeDisabled() }) + + it('should make overflow menu disabled when e-stop is pressed', () => { + when(mockUseIsEstopNotDisengaged) + .calledWith(ROBOT_NAME) + .mockReturnValue(true) + const { getByRole } = render(props) + expect(getByRole('button')).toBeDisabled() + }) }) diff --git a/app/src/organisms/Devices/__tests__/InstrumentsAndModules.test.tsx b/app/src/organisms/Devices/__tests__/InstrumentsAndModules.test.tsx index 855a70409e6..1ea1631f003 100644 --- a/app/src/organisms/Devices/__tests__/InstrumentsAndModules.test.tsx +++ b/app/src/organisms/Devices/__tests__/InstrumentsAndModules.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { when, resetAllWhenMocks } from 'jest-when' import { renderWithProviders } from '@opentrons/components' import { useAllPipetteOffsetCalibrationsQuery, @@ -6,21 +7,27 @@ import { useInstrumentsQuery, usePipettesQuery, } from '@opentrons/react-api-client' +import { instrumentsResponseFixture } from '@opentrons/api-client' + import { i18n } from '../../../i18n' import { Banner } from '../../../atoms/Banner' import { mockMagneticModule } from '../../../redux/modules/__fixtures__' import { useCurrentRunId } from '../../ProtocolUpload/hooks' -import { useIsOT3, useIsRobotViewable, useRunStatuses } from '../hooks' +import { useIsFlex, useIsRobotViewable, useRunStatuses } from '../hooks' import { ModuleCard } from '../../ModuleCard' import { InstrumentsAndModules } from '../InstrumentsAndModules' import { GripperCard } from '../../GripperCard' import { PipetteCard } from '../PipetteCard' -import { getIs96ChannelPipetteAttached } from '../utils' +import { PipetteRecalibrationWarning } from '../PipetteCard/PipetteRecalibrationWarning' +import { + getIs96ChannelPipetteAttached, + getShowPipetteCalibrationWarning, +} from '../utils' import { mockPipetteOffsetCalibration1, mockPipetteOffsetCalibration2, } from '../../../redux/calibration/pipette-offset/__fixtures__' -import { instrumentsResponseFixture } from '@opentrons/api-client' +import { useIsEstopNotDisengaged } from '../../../resources/devices/hooks/useIsEstopNotDisengaged' jest.mock('@opentrons/components', () => { const actualComponents = jest.requireActual('@opentrons/components') @@ -34,6 +41,7 @@ jest.mock('../hooks') jest.mock('../../GripperCard') jest.mock('../../ModuleCard') jest.mock('../PipetteCard') +jest.mock('../PipetteCard/PipetteRecalibrationWarning') jest.mock('../../ProtocolUpload/hooks') jest.mock('../../../atoms/Banner') jest.mock('../utils', () => { @@ -41,9 +49,11 @@ jest.mock('../utils', () => { return { ...actualUtils, getIs96ChannelPipetteAttached: jest.fn(), + getShowPipetteCalibrationWarning: jest.fn(), } }) jest.mock('../../RunTimeControl/hooks') +jest.mock('../../../resources/devices/hooks/useIsEstopNotDisengaged') const mockUseModulesQuery = useModulesQuery as jest.MockedFunction< typeof useModulesQuery @@ -60,6 +70,9 @@ const mockUseAllPipetteOffsetCalibrationsQuery = useAllPipetteOffsetCalibrations const mockModuleCard = ModuleCard as jest.MockedFunction const mockPipetteCard = PipetteCard as jest.MockedFunction const mockGripperCard = GripperCard as jest.MockedFunction +const mockPipetteRecalibrationWarning = PipetteRecalibrationWarning as jest.MockedFunction< + typeof PipetteRecalibrationWarning +> const mockUsePipettesQuery = usePipettesQuery as jest.MockedFunction< typeof usePipettesQuery > @@ -73,10 +86,18 @@ const mockUseRunStatuses = useRunStatuses as jest.MockedFunction< const mockGetIs96ChannelPipetteAttached = getIs96ChannelPipetteAttached as jest.MockedFunction< typeof getIs96ChannelPipetteAttached > -const mockUseIsOT3 = useIsOT3 as jest.MockedFunction +const mockGetShowPipetteCalibrationWarning = getShowPipetteCalibrationWarning as jest.MockedFunction< + typeof getShowPipetteCalibrationWarning +> +const mockUseIsFlex = useIsFlex as jest.MockedFunction +const mockUseIsEstopNotDisengaged = useIsEstopNotDisengaged as jest.MockedFunction< + typeof useIsEstopNotDisengaged +> + +const ROBOT_NAME = 'otie' const render = () => { - return renderWithProviders(, { + return renderWithProviders(, { i18nInstance: i18n, }) } @@ -91,16 +112,24 @@ describe('InstrumentsAndModules', () => { isRunTerminal: false, }) mockGetIs96ChannelPipetteAttached.mockReturnValue(false) + mockGetShowPipetteCalibrationWarning.mockReturnValue(false) mockUseInstrumentsQuery.mockReturnValue({ data: { data: [] }, } as any) mockPipetteCard.mockReturnValue(
Mock PipetteCard
) mockGripperCard.mockReturnValue(
Mock GripperCard
) mockModuleCard.mockReturnValue(
Mock ModuleCard
) - mockUseIsOT3.mockReturnValue(false) + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(false) + when(mockUseIsEstopNotDisengaged) + .calledWith(ROBOT_NAME) + .mockReturnValue(false) + mockPipetteRecalibrationWarning.mockReturnValue( +
Mock PipetteRecalibrationWarning
+ ) }) afterEach(() => { jest.resetAllMocks() + resetAllWhenMocks() }) it('renders an empty state message when robot is not on the network', () => { @@ -142,7 +171,7 @@ describe('InstrumentsAndModules', () => { getAllByText('Mock PipetteCard') }) it('renders gripper cards when a robot is Flex', () => { - mockUseIsOT3.mockReturnValue(true) + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(true) mockUseIsRobotViewable.mockReturnValue(true) mockUseModulesQuery.mockReturnValue({ data: { data: [] } } as any) mockUsePipettesQuery.mockReturnValue({ @@ -167,6 +196,12 @@ describe('InstrumentsAndModules', () => { const [{ getByText }] = render() getByText('Mock PipetteCard') }) + it('renders pipette recalibration recommendation banner when offsets fail reasonability checks', () => { + mockGetShowPipetteCalibrationWarning.mockReturnValue(true) + mockUseIsRobotViewable.mockReturnValue(true) + const [{ getByText }] = render() + getByText('Mock PipetteRecalibrationWarning') + }) it('fetches offset calibrations on long poll and pipettes, instruments, and modules on short poll', () => { const { pipette: pipette1 } = mockPipetteOffsetCalibration1 const { pipette: pipette2 } = mockPipetteOffsetCalibration2 diff --git a/app/src/organisms/Devices/__tests__/ModuleInfo.test.tsx b/app/src/organisms/Devices/__tests__/ModuleInfo.test.tsx index 7de52aba6b8..5d4cbbbf771 100644 --- a/app/src/organisms/Devices/__tests__/ModuleInfo.test.tsx +++ b/app/src/organisms/Devices/__tests__/ModuleInfo.test.tsx @@ -1,5 +1,5 @@ import React from 'react' -import '@testing-library/jest-dom' +import { screen } from '@testing-library/react' import { when, resetAllWhenMocks } from 'jest-when' import { ModuleModel, ModuleType } from '@opentrons/shared-data' import { renderWithProviders } from '@opentrons/components' @@ -43,15 +43,15 @@ describe('ModuleInfo', () => { }) it('should show module not connected', () => { - const { getByText } = render(props) - getByText('Not connected') + render(props) + screen.getByText('Not connected') }) it('should show module connected and no USB number', () => { props = { ...props, isAttached: true } - const { getByText } = render(props) - getByText('Connected') - getByText('USB Port Connected') + render(props) + screen.getByText('Connected') + screen.getByText('USB Port Connected') }) it('should show module connected and USB number', () => { @@ -60,9 +60,9 @@ describe('ModuleInfo', () => { physicalPort: { port: 1, hub: false, portGroup: 'unknown', path: '' }, isAttached: true, } - const { getByText } = render(props) - getByText('Connected') - getByText('USB Port 1') + render(props) + screen.getByText('Connected') + screen.getByText('USB Port 1') }) it('should not show module connected when run has started', () => { @@ -73,9 +73,9 @@ describe('ModuleInfo', () => { runId: MOCK_RUN_ID, } when(mockUseRunHasStarted).calledWith(MOCK_RUN_ID).mockReturnValue(true) - const { getByText, queryByText } = render(props) - expect(queryByText('Connected')).toBeNull() - getByText('Connection info not available once run has started') + render(props) + expect(screen.queryByText('Connected')).toBeNull() + screen.getByText('Connection info not available once run has started') }) it('should show the correct information when the magnetic block is in the protocol', () => { @@ -83,8 +83,8 @@ describe('ModuleInfo', () => { ...props, moduleModel: 'magneticBlockV1', } - const { getByText, queryByText } = render(props) - getByText('No USB required') - expect(queryByText('Connected')).toBeNull() + render(props) + screen.getByText('No USB required') + expect(screen.queryByText('Connected')).toBeNull() }) }) diff --git a/app/src/organisms/Devices/__tests__/RecentProtocolRuns.test.tsx b/app/src/organisms/Devices/__tests__/RecentProtocolRuns.test.tsx index 570da04652d..e95f2952ff5 100644 --- a/app/src/organisms/Devices/__tests__/RecentProtocolRuns.test.tsx +++ b/app/src/organisms/Devices/__tests__/RecentProtocolRuns.test.tsx @@ -1,15 +1,17 @@ import * as React from 'react' import { UseQueryResult } from 'react-query' import { renderWithProviders } from '@opentrons/components' -import { useAllRunsQuery } from '@opentrons/react-api-client' + +import { useNotifyAllRunsQuery } from '../../../resources/runs/useNotifyAllRunsQuery' import { i18n } from '../../../i18n' import { useIsRobotViewable, useRunStatuses } from '../hooks' import { RecentProtocolRuns } from '../RecentProtocolRuns' import { HistoricalProtocolRun } from '../HistoricalProtocolRun' import type { Runs } from '@opentrons/api-client' +import type { AxiosError } from 'axios' -jest.mock('@opentrons/react-api-client') +jest.mock('../../../resources/runs/useNotifyAllRunsQuery') jest.mock('../hooks') jest.mock('../../ProtocolUpload/hooks') jest.mock('../HistoricalProtocolRun') @@ -17,8 +19,8 @@ jest.mock('../HistoricalProtocolRun') const mockUseIsRobotViewable = useIsRobotViewable as jest.MockedFunction< typeof useIsRobotViewable > -const mockUseAllRunsQuery = useAllRunsQuery as jest.MockedFunction< - typeof useAllRunsQuery +const mockUseNotifyAllRunsQuery = useNotifyAllRunsQuery as jest.MockedFunction< + typeof useNotifyAllRunsQuery > const mockHistoricalProtocolRun = HistoricalProtocolRun as jest.MockedFunction< typeof HistoricalProtocolRun @@ -55,16 +57,16 @@ describe('RecentProtocolRuns', () => { }) it('renders an empty state message when there are no runs', () => { mockUseIsRobotViewable.mockReturnValue(true) - mockUseAllRunsQuery.mockReturnValue({ + mockUseNotifyAllRunsQuery.mockReturnValue({ data: {}, - } as UseQueryResult) + } as UseQueryResult) const [{ getByText }] = render() getByText('No protocol runs yet!') }) it('renders table headers if there are runs', () => { mockUseIsRobotViewable.mockReturnValue(true) - mockUseAllRunsQuery.mockReturnValue({ + mockUseNotifyAllRunsQuery.mockReturnValue({ data: { data: [ { @@ -76,7 +78,7 @@ describe('RecentProtocolRuns', () => { }, ], }, - } as UseQueryResult) + } as UseQueryResult) const [{ getByText }] = render() getByText('Recent Protocol Runs') getByText('Run') diff --git a/app/src/organisms/Devices/__tests__/RobotCard.test.tsx b/app/src/organisms/Devices/__tests__/RobotCard.test.tsx index bebe3f3999c..c6d29cc5ea8 100644 --- a/app/src/organisms/Devices/__tests__/RobotCard.test.tsx +++ b/app/src/organisms/Devices/__tests__/RobotCard.test.tsx @@ -154,7 +154,7 @@ describe('RobotCard', () => { expect(image.getAttribute('src')).toEqual(OT2_PNG_FILE_NAME) }) - it('renders an OT-3 image when robot model is OT-3', () => { + it('renders a Flex image when robot model is OT-3', () => { props = { robot: { ...mockConnectableRobot, name: 'buzz' } } when(mockGetRobotModelByName) .calledWith(MOCK_STATE, 'buzz') diff --git a/app/src/organisms/Devices/__tests__/RobotOverview.test.tsx b/app/src/organisms/Devices/__tests__/RobotOverview.test.tsx index 0329391881e..aff850c7756 100644 --- a/app/src/organisms/Devices/__tests__/RobotOverview.test.tsx +++ b/app/src/organisms/Devices/__tests__/RobotOverview.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { fireEvent } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' import { when, resetAllWhenMocks } from 'jest-when' @@ -29,6 +30,7 @@ import { useLights, useRobot, useRunStatuses, + useIsRobotViewable, } from '../hooks' import { expectedBadDeckTaskList, @@ -124,12 +126,13 @@ const mockGetRobotModelByName = getRobotModelByName as jest.MockedFunction< const mockGetRobotAddressesByName = getRobotAddressesByName as jest.MockedFunction< typeof getRobotAddressesByName > - const mockGetConfig = getConfig as jest.MockedFunction - const mockUseAuthorization = useAuthorization as jest.MockedFunction< typeof useAuthorization > +const mockUseIsRobotViewable = useIsRobotViewable as jest.MockedFunction< + typeof useIsRobotViewable +> const mockToggleLights = jest.fn() @@ -196,6 +199,7 @@ describe('RobotOverview', () => { authorizationToken: { token: 'my.authorization.jwt' }, registrationToken: { token: 'my.registration.jwt' }, }) + when(mockUseIsRobotViewable).mockReturnValue(true) }) afterEach(() => { jest.resetAllMocks() @@ -208,7 +212,7 @@ describe('RobotOverview', () => { expect(image.getAttribute('src')).toEqual(OT2_PNG_FILE_NAME) }) - it('renders an OT-3 image', () => { + it('renders a Flex image', () => { when(mockGetRobotModelByName) .calledWith(MOCK_STATE, mockConnectableRobot.name) .mockReturnValue('Opentrons Flex') @@ -252,6 +256,18 @@ describe('RobotOverview', () => { ) }) + it('does not render a missing calibration status label when the robot is not viewable', () => { + mockUseCalibrationTaskList.mockReturnValue( + expectedIncompleteDeckCalTaskList + ) + mockUseFeatureFlag.mockReturnValue(true) + when(mockUseIsRobotViewable).mockReturnValue(false) + const [{ queryByText }] = render(props) + expect( + queryByText('Robot is missing calibration data') + ).not.toBeInTheDocument() + }) + it('renders a recommended recalibration status label when the deck is bad and calibration wizard feature flag is set', () => { mockUseCalibrationTaskList.mockReturnValue(expectedBadDeckTaskList) mockUseFeatureFlag.mockReturnValue(true) @@ -364,7 +380,7 @@ describe('RobotOverview', () => { getByText('Controls') getByText('Lights') const toggle = getByRole('switch', { name: 'Lights' }) - toggle.click() + fireEvent.click(toggle) expect(mockToggleLights).toBeCalled() }) diff --git a/app/src/organisms/Devices/__tests__/RobotOverviewOverflowMenu.test.tsx b/app/src/organisms/Devices/__tests__/RobotOverviewOverflowMenu.test.tsx index 8d452cf8797..10a3bfff7bc 100644 --- a/app/src/organisms/Devices/__tests__/RobotOverviewOverflowMenu.test.tsx +++ b/app/src/organisms/Devices/__tests__/RobotOverviewOverflowMenu.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { MemoryRouter } from 'react-router-dom' import { when, resetAllWhenMocks } from 'jest-when' -import { fireEvent } from '@testing-library/react' +import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' @@ -18,9 +18,10 @@ import { useCanDisconnect } from '../../../resources/networking/hooks' import { DisconnectModal } from '../../../organisms/Devices/RobotSettings/ConnectNetwork/DisconnectModal' import { ChooseProtocolSlideout } from '../../ChooseProtocolSlideout' import { useCurrentRunId } from '../../ProtocolUpload/hooks' -import { RobotOverviewOverflowMenu } from '../RobotOverviewOverflowMenu' import { useIsRobotBusy } from '../hooks' -import { UpdateBuildroot } from '../RobotSettings/UpdateBuildroot' +import { handleUpdateBuildroot } from '../RobotSettings/UpdateBuildroot' +import { useIsEstopNotDisengaged } from '../../../resources/devices/hooks/useIsEstopNotDisengaged' +import { RobotOverviewOverflowMenu } from '../RobotOverviewOverflowMenu' import type { State } from '../../../redux/types' @@ -35,6 +36,7 @@ jest.mock( jest.mock('../../ChooseProtocolSlideout') jest.mock('../../ProtocolUpload/hooks') jest.mock('../RobotSettings/UpdateBuildroot') +jest.mock('../../../resources/devices/hooks/useIsEstopNotDisengaged') const mockUseCurrentRunId = useCurrentRunId as jest.MockedFunction< typeof useCurrentRunId @@ -49,8 +51,8 @@ const mockRestartRobot = restartRobot as jest.MockedFunction< const mockUseIsRobotBusy = useIsRobotBusy as jest.MockedFunction< typeof useIsRobotBusy > -const mockUpdateBuildroot = UpdateBuildroot as jest.MockedFunction< - typeof UpdateBuildroot +const mockUpdateBuildroot = handleUpdateBuildroot as jest.MockedFunction< + typeof handleUpdateBuildroot > const mockChooseProtocolSlideout = ChooseProtocolSlideout as jest.MockedFunction< typeof ChooseProtocolSlideout @@ -61,6 +63,9 @@ const mockDisconnectModal = DisconnectModal as jest.MockedFunction< const mockUseCanDisconnect = useCanDisconnect as jest.MockedFunction< typeof useCanDisconnect > +const mockUseIsEstopNotDisengaged = useIsEstopNotDisengaged as jest.MockedFunction< + typeof useIsEstopNotDisengaged +> const render = ( props: React.ComponentProps @@ -90,7 +95,7 @@ describe('RobotOverviewOverflowMenu', () => { }) when(mockUseCurrentRunId).calledWith().mockReturnValue(null) when(mockUseIsRobotBusy).calledWith().mockReturnValue(false) - when(mockUpdateBuildroot).mockReturnValue(
mock update buildroot
) + when(mockUpdateBuildroot).mockReturnValue() when(mockChooseProtocolSlideout).mockReturnValue(
choose protocol slideout
) @@ -98,6 +103,9 @@ describe('RobotOverviewOverflowMenu', () => { when(mockUseCanDisconnect) .calledWith(mockConnectableRobot.name) .mockReturnValue(true) + when(mockUseIsEstopNotDisengaged) + .calledWith(mockConnectableRobot.name) + .mockReturnValue(false) }) afterEach(() => { resetAllWhenMocks() @@ -105,22 +113,22 @@ describe('RobotOverviewOverflowMenu', () => { }) it('should render enabled buttons in the menu when the status is idle', () => { - const { getByRole, queryByText } = render(props) + render(props) - const btn = getByRole('button') + const btn = screen.getByRole('button') fireEvent.click(btn) - const runAProtocolBtn = getByRole('button', { + const runAProtocolBtn = screen.getByRole('button', { name: 'Run a protocol', }) - const restartBtn = getByRole('button', { name: 'Restart robot' }) - const homeBtn = getByRole('button', { name: 'Home gantry' }) - const disconnectBtn = getByRole('button', { + const restartBtn = screen.getByRole('button', { name: 'Restart robot' }) + const homeBtn = screen.getByRole('button', { name: 'Home gantry' }) + const disconnectBtn = screen.getByRole('button', { name: 'Disconnect from network', }) - const settingsBtn = getByRole('button', { name: 'Robot settings' }) + const settingsBtn = screen.getByRole('button', { name: 'Robot settings' }) - expect(queryByText('Update robot software')).toBeNull() + expect(screen.queryByText('Update robot software')).toBeNull() expect(runAProtocolBtn).toBeEnabled() expect(restartBtn).toBeEnabled() expect(homeBtn).toBeEnabled() @@ -137,20 +145,20 @@ describe('RobotOverviewOverflowMenu', () => { updateFromFileDisabledReason: null, }) - const { getByRole, getByText } = render(props) + render(props) - const btn = getByRole('button') + const btn = screen.getByRole('button') fireEvent.click(btn) - const updateRobotSoftwareBtn = getByRole('button', { + const updateRobotSoftwareBtn = screen.getByRole('button', { name: 'Update robot software', }) - const runAProtocolBtn = getByRole('button', { + const runAProtocolBtn = screen.getByRole('button', { name: 'Run a protocol', }) - const restartBtn = getByRole('button', { name: 'Restart robot' }) - const homeBtn = getByRole('button', { name: 'Home gantry' }) - const settingsBtn = getByRole('button', { name: 'Robot settings' }) + const restartBtn = screen.getByRole('button', { name: 'Restart robot' }) + const homeBtn = screen.getByRole('button', { name: 'Home gantry' }) + const settingsBtn = screen.getByRole('button', { name: 'Robot settings' }) expect(updateRobotSoftwareBtn).toBeEnabled() expect(runAProtocolBtn).toBeDisabled() @@ -158,45 +166,47 @@ describe('RobotOverviewOverflowMenu', () => { expect(homeBtn).toBeEnabled() expect(settingsBtn).toBeEnabled() fireEvent.click(updateRobotSoftwareBtn) - getByText('mock update buildroot') + expect(mockUpdateBuildroot).toHaveBeenCalled() }) it('should render disabled run a protocol, restart, disconnect, and home gantry menu items when robot is busy', () => { when(mockUseIsRobotBusy).calledWith().mockReturnValue(true) - const { getByRole } = render(props) + render(props) - const btn = getByRole('button') + const btn = screen.getByRole('button') fireEvent.click(btn) - expect(getByRole('button', { name: 'Run a protocol' })).toBeDisabled() - expect(getByRole('button', { name: 'Restart robot' })).toBeDisabled() - expect(getByRole('button', { name: 'Home gantry' })).toBeDisabled() expect( - getByRole('button', { name: 'Disconnect from network' }) + screen.getByRole('button', { name: 'Run a protocol' }) + ).toBeDisabled() + expect(screen.getByRole('button', { name: 'Restart robot' })).toBeDisabled() + expect(screen.getByRole('button', { name: 'Home gantry' })).toBeDisabled() + expect( + screen.getByRole('button', { name: 'Disconnect from network' }) ).toBeDisabled() - expect(getByRole('button', { name: 'Robot settings' })).toBeEnabled() + expect(screen.getByRole('button', { name: 'Robot settings' })).toBeEnabled() }) it('should render menu items when the robot is reachable', () => { - const { getByRole, queryByRole } = render({ robot: mockReachableRobot }) + render({ robot: mockReachableRobot }) - getByRole('button').click() - expect(getByRole('button', { name: 'Restart robot' })).toBeDisabled() - expect(getByRole('button', { name: 'Home gantry' })).toBeDisabled() + fireEvent.click(screen.getByRole('button')) + expect(screen.getByRole('button', { name: 'Restart robot' })).toBeDisabled() + expect(screen.getByRole('button', { name: 'Home gantry' })).toBeDisabled() expect( - queryByRole('button', { name: 'Disconnect from network' }) + screen.queryByRole('button', { name: 'Disconnect from network' }) ).toBeNull() - expect(getByRole('button', { name: 'Robot settings' })).toBeEnabled() + expect(screen.getByRole('button', { name: 'Robot settings' })).toBeEnabled() }) it('clicking home gantry should home the robot arm', () => { - const { getByRole } = render(props) + render(props) - const btn = getByRole('button') + const btn = screen.getByRole('button') fireEvent.click(btn) - const homeBtn = getByRole('button', { name: 'Home gantry' }) + const homeBtn = screen.getByRole('button', { name: 'Home gantry' }) fireEvent.click(homeBtn) expect(mockHome).toBeCalled() @@ -207,22 +217,22 @@ describe('RobotOverviewOverflowMenu', () => { .calledWith(mockConnectableRobot.name) .mockReturnValue(false) - const { getByRole, queryByText } = render(props) + render(props) - const btn = getByRole('button') + const btn = screen.getByRole('button') fireEvent.click(btn) - const runAProtocolBtn = getByRole('button', { + const runAProtocolBtn = screen.getByRole('button', { name: 'Run a protocol', }) - const restartBtn = getByRole('button', { name: 'Restart robot' }) - const homeBtn = getByRole('button', { name: 'Home gantry' }) - const disconnectBtn = getByRole('button', { + const restartBtn = screen.getByRole('button', { name: 'Restart robot' }) + const homeBtn = screen.getByRole('button', { name: 'Home gantry' }) + const disconnectBtn = screen.getByRole('button', { name: 'Disconnect from network', }) - const settingsBtn = getByRole('button', { name: 'Robot settings' }) + const settingsBtn = screen.getByRole('button', { name: 'Robot settings' }) - expect(queryByText('Update robot software')).toBeNull() + expect(screen.queryByText('Update robot software')).toBeNull() expect(runAProtocolBtn).toBeEnabled() expect(restartBtn).toBeEnabled() expect(homeBtn).toBeEnabled() @@ -231,28 +241,28 @@ describe('RobotOverviewOverflowMenu', () => { }) it('clicking disconnect from network should launch the disconnect modal', () => { - const { getByRole, getByText, queryByText } = render(props) + render(props) - const btn = getByRole('button') + const btn = screen.getByRole('button') fireEvent.click(btn) - expect(queryByText('mock disconnect modal')).toBeNull() + expect(screen.queryByText('mock disconnect modal')).toBeNull() - const disconnectBtn = getByRole('button', { + const disconnectBtn = screen.getByRole('button', { name: 'Disconnect from network', }) fireEvent.click(disconnectBtn) - getByText('mock disconnect modal') + screen.getByText('mock disconnect modal') }) it('clicking the restart robot button should restart the robot', () => { - const { getByRole } = render(props) + render(props) - const btn = getByRole('button') + const btn = screen.getByRole('button') fireEvent.click(btn) - const restartBtn = getByRole('button', { name: 'Restart robot' }) + const restartBtn = screen.getByRole('button', { name: 'Restart robot' }) fireEvent.click(restartBtn) expect(mockRestartRobot).toBeCalled() @@ -263,20 +273,44 @@ describe('RobotOverviewOverflowMenu', () => { autoUpdateDisabledReason: null, updateFromFileDisabledReason: null, }) - const { getByRole, queryByRole } = render(props) - const btn = getByRole('button') - btn.click() - expect(queryByRole('Update robot software')).toBeNull() - getByRole('button', { name: 'Run a protocol' }) - getByRole('button', { name: 'Restart robot' }) - getByRole('button', { name: 'Home gantry' }) - getByRole('button', { name: 'Disconnect from network' }) - getByRole('button', { name: 'Robot settings' }) + render(props) + const btn = screen.getByRole('button') + fireEvent.click(btn) + expect(screen.queryByRole('Update robot software')).toBeNull() + screen.getByRole('button', { name: 'Run a protocol' }) + screen.getByRole('button', { name: 'Restart robot' }) + screen.getByRole('button', { name: 'Home gantry' }) + screen.getByRole('button', { name: 'Disconnect from network' }) + screen.getByRole('button', { name: 'Robot settings' }) }) it('should disable settings link when the robot is unreachable', () => { - const { getByRole } = render({ robot: mockUnreachableRobot }) - const btn = getByRole('button') + render({ robot: mockUnreachableRobot }) + const btn = screen.getByRole('button') fireEvent.click(btn) - expect(getByRole('button', { name: 'Robot settings' })).toBeDisabled() + expect( + screen.getByRole('button', { name: 'Robot settings' }) + ).toBeDisabled() + }) + + it('should render disabled menu items except restart robot and robot settings when e-stop is pressed', () => { + when(mockGetBuildrootUpdateDisplayInfo).mockReturnValue({ + autoUpdateAction: 'reinstall', + autoUpdateDisabledReason: null, + updateFromFileDisabledReason: null, + }) + when(mockUseIsEstopNotDisengaged) + .calledWith(mockConnectableRobot.name) + .mockReturnValue(true) + render(props) + fireEvent.click(screen.getByRole('button')) + expect( + screen.getByRole('button', { name: 'Run a protocol' }) + ).toBeDisabled() + expect(screen.getByRole('button', { name: 'Restart robot' })).toBeEnabled() + expect(screen.getByRole('button', { name: 'Home gantry' })).toBeDisabled() + expect( + screen.getByRole('button', { name: 'Disconnect from network' }) + ).toBeDisabled() + expect(screen.getByRole('button', { name: 'Robot settings' })).toBeEnabled() }) }) diff --git a/app/src/organisms/Devices/__tests__/RobotStatusHeader.test.tsx b/app/src/organisms/Devices/__tests__/RobotStatusHeader.test.tsx index 2c9587012ea..6d037c365d7 100644 --- a/app/src/organisms/Devices/__tests__/RobotStatusHeader.test.tsx +++ b/app/src/organisms/Devices/__tests__/RobotStatusHeader.test.tsx @@ -4,7 +4,7 @@ import { when, resetAllWhenMocks } from 'jest-when' import { RUN_STATUS_RUNNING } from '@opentrons/api-client' import { renderWithProviders } from '@opentrons/components' -import { useProtocolQuery, useRunQuery } from '@opentrons/react-api-client' +import { useProtocolQuery } from '@opentrons/react-api-client' import { i18n } from '../../../i18n' import { useCurrentRunId } from '../../../organisms/ProtocolUpload/hooks' @@ -15,8 +15,9 @@ import { OPENTRONS_USB, } from '../../../redux/discovery' import { getNetworkInterfaces } from '../../../redux/networking' - +import { useIsFlex } from '../hooks' import { RobotStatusHeader } from '../RobotStatusHeader' +import { useNotifyRunQuery } from '../../../resources/runs/useNotifyRunQuery' import type { DiscoveryClientRobotAddress } from '../../../redux/discovery/types' import type { SimpleInterfaceStatus } from '../../../redux/networking/types' @@ -28,6 +29,7 @@ jest.mock('../../../organisms/RunTimeControl/hooks') jest.mock('../../../redux/discovery') jest.mock('../../../redux/networking') jest.mock('../hooks') +jest.mock('../../../resources/runs/useNotifyRunQuery') const mockUseCurrentRunId = useCurrentRunId as jest.MockedFunction< typeof useCurrentRunId @@ -38,13 +40,16 @@ const mockUseCurrentRunStatus = useCurrentRunStatus as jest.MockedFunction< const mockUseProtocolQuery = useProtocolQuery as jest.MockedFunction< typeof useProtocolQuery > -const mockUseRunQuery = useRunQuery as jest.MockedFunction +const mockUseNotifyRunQuery = useNotifyRunQuery as jest.MockedFunction< + typeof useNotifyRunQuery +> const mockGetNetworkInterfaces = getNetworkInterfaces as jest.MockedFunction< typeof getNetworkInterfaces > const mockGetRobotAddressesByName = getRobotAddressesByName as jest.MockedFunction< typeof getRobotAddressesByName > +const mockUseIsFlex = useIsFlex as jest.MockedFunction const MOCK_OTIE = { name: 'otie', @@ -77,10 +82,10 @@ describe('RobotStatusHeader', () => { props = MOCK_OTIE when(mockUseCurrentRunId).calledWith().mockReturnValue(null) when(mockUseCurrentRunStatus).calledWith().mockReturnValue(null) - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(null, { staleTime: Infinity }) .mockReturnValue({} as any) - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith('fakeRunId', { staleTime: Infinity }) .mockReturnValue({ data: { @@ -118,6 +123,7 @@ describe('RobotStatusHeader', () => { healthStatus: HEALTH_STATUS_OK, } as DiscoveryClientRobotAddress, ]) + when(mockUseIsFlex).calledWith('otie').mockReturnValue(true) }) afterEach(() => { resetAllWhenMocks() @@ -169,7 +175,7 @@ describe('RobotStatusHeader', () => { const [{ getByRole, getByText }] = render(props) - getByText('fake protocol name; Running') + getByText('fake protocol name; running') const runLink = getByRole('link', { name: 'Go to Run' }) expect(runLink.getAttribute('href')).toEqual( @@ -203,6 +209,19 @@ describe('RobotStatusHeader', () => { getByLabelText('wifi') }) + it('renders a usb icon when OT-2 connected locally via USB-ethernet adapter', () => { + when(mockGetNetworkInterfaces) + .calledWith({} as State, 'otie') + .mockReturnValue({ + wifi: null, + ethernet: { ipAddress: ETHERNET_IP } as SimpleInterfaceStatus, + }) + when(mockUseIsFlex).calledWith('otie').mockReturnValue(false) + const [{ getByLabelText }] = render(props) + + getByLabelText('usb') + }) + it('renders a usb icon when only connected locally', () => { const [{ getByLabelText }] = render(props) diff --git a/app/src/organisms/Devices/getModulePrepCommands.ts b/app/src/organisms/Devices/getModulePrepCommands.ts index 48bcecd4856..dcb320417b2 100644 --- a/app/src/organisms/Devices/getModulePrepCommands.ts +++ b/app/src/organisms/Devices/getModulePrepCommands.ts @@ -34,10 +34,6 @@ export function getModulePrepCommands( let modulePrepCommands: ModulePrepCommandsType[] = [] if (module.id != null && module.moduleType === THERMOCYCLER_MODULE_TYPE) { modulePrepCommands = [ - { - commandType: 'thermocycler/closeLid', - params: { moduleId: module.id }, - }, { commandType: 'thermocycler/deactivateLid', params: { moduleId: module.id }, diff --git a/app/src/organisms/Devices/hooks/__fixtures__/modifiedSimpleV6.json b/app/src/organisms/Devices/hooks/__fixtures__/modifiedSimpleV6.json index fc861e5a1f4..eb5bd1fd300 100644 --- a/app/src/organisms/Devices/hooks/__fixtures__/modifiedSimpleV6.json +++ b/app/src/organisms/Devices/hooks/__fixtures__/modifiedSimpleV6.json @@ -123,7 +123,7 @@ ] }, "metadata": { - "displayName": "Opentrons 96 Tip Rack 10 µL", + "displayName": "Opentrons OT-2 96 Tip Rack 10 µL", "displayCategory": "tipRack", "displayVolumeUnits": "µL", "tags": [] diff --git a/app/src/organisms/Devices/hooks/__tests__/useAttachedModules.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useAttachedModules.test.tsx index e005fc7b2bd..ec8420edf6b 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useAttachedModules.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useAttachedModules.test.tsx @@ -1,6 +1,6 @@ import { resetAllWhenMocks } from 'jest-when' import { UseQueryResult } from 'react-query' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { mockModulesResponse } from '@opentrons/api-client' import { useModulesQuery } from '@opentrons/react-api-client' import { useAttachedModules } from '..' @@ -14,7 +14,7 @@ const mockUseModulesQuery = useModulesQuery as jest.MockedFunction< > describe('useAttachedModules hook', () => { - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> afterEach(() => { resetAllWhenMocks() jest.resetAllMocks() diff --git a/app/src/organisms/Devices/hooks/__tests__/useAttachedPipetteCalibrations.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useAttachedPipetteCalibrations.test.tsx index 27acbf0e4c6..d2643cbacba 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useAttachedPipetteCalibrations.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useAttachedPipetteCalibrations.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' import { Provider } from 'react-redux' import { createStore, Store } from 'redux' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { useAllPipetteOffsetCalibrationsQuery, @@ -50,7 +50,7 @@ const PIPETTE_CALIBRATIONS = { } describe('useAttachedPipetteCalibrations hook', () => { - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( diff --git a/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettes.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettes.test.tsx index e4f140205ec..e94721a957e 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettes.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettes.test.tsx @@ -1,15 +1,16 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' import { UseQueryResult } from 'react-query' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { usePipettesQuery } from '@opentrons/react-api-client' -import { getPipetteModelSpecs, PipetteModelSpecs } from '@opentrons/shared-data' +import { getPipetteModelSpecs } from '@opentrons/shared-data' import { useAttachedPipettes } from '../useAttachedPipettes' import { pipetteResponseFixtureLeft, pipetteResponseFixtureRight, } from '@opentrons/api-client' import type { FetchPipettesResponseBody } from '@opentrons/api-client' +import type { PipetteModelSpecs } from '@opentrons/shared-data' jest.mock('@opentrons/react-api-client') jest.mock('@opentrons/shared-data') @@ -22,7 +23,7 @@ const mockGetPipetteModelSpecs = getPipetteModelSpecs as jest.MockedFunction< > describe('useAttachedPipettes hook', () => { - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> beforeEach(() => { mockGetPipetteModelSpecs.mockReturnValue({ name: 'mockName', diff --git a/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettesFromInstrumentsQuery.test.ts b/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettesFromInstrumentsQuery.test.ts index f3f1994d384..4d169ce9330 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettesFromInstrumentsQuery.test.ts +++ b/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettesFromInstrumentsQuery.test.ts @@ -1,5 +1,5 @@ import * as React from 'react' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { useInstrumentsQuery } from '@opentrons/react-api-client' import { instrumentsResponseLeftPipetteFixture, @@ -13,7 +13,7 @@ const mockUseInstrumentsQuery = useInstrumentsQuery as jest.MockedFunction< typeof useInstrumentsQuery > describe('useAttachedPipettesFromInstrumentsQuery hook', () => { - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> it('returns attached pipettes', () => { mockUseInstrumentsQuery.mockReturnValue({ data: { diff --git a/app/src/organisms/Devices/hooks/__tests__/useCalibrationTaskList.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useCalibrationTaskList.test.tsx index be9160e1fb1..60f59f0e2b9 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useCalibrationTaskList.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useCalibrationTaskList.test.tsx @@ -3,7 +3,7 @@ import { createStore } from 'redux' import { I18nextProvider } from 'react-i18next' import { Provider } from 'react-redux' import { when, resetAllWhenMocks } from 'jest-when' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { useDeleteCalibrationMutation, useAllPipetteOffsetCalibrationsQuery, @@ -56,7 +56,7 @@ const mockTipLengthCalLauncher = jest.fn() const mockDeckCalLauncher = jest.fn() describe('useCalibrationTaskList hook', () => { - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> let store: Store const mockDeleteCalibration = jest.fn() diff --git a/app/src/organisms/Devices/hooks/__tests__/useDeckCalibrationData.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useDeckCalibrationData.test.tsx index 8d6578b0693..439e645b316 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useDeckCalibrationData.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useDeckCalibrationData.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' import { Provider } from 'react-redux' import { createStore, Store } from 'redux' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { useCalibrationStatusQuery } from '@opentrons/react-api-client' @@ -40,7 +40,7 @@ const store: Store = createStore(jest.fn(), {}) describe('useDeckCalibrationData hook', () => { let dispatchApiRequest: DispatchApiRequestType - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> beforeEach(() => { dispatchApiRequest = jest.fn() const queryClient = new QueryClient() diff --git a/app/src/organisms/Devices/hooks/__tests__/useDeckCalibrationStatus.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useDeckCalibrationStatus.test.tsx index e21da9867db..6549f430682 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useDeckCalibrationStatus.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useDeckCalibrationStatus.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' import { Provider } from 'react-redux' import { createStore, Store } from 'redux' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { useCalibrationStatusQuery } from '@opentrons/react-api-client' @@ -26,7 +26,7 @@ const mockUseCalibrationStatusQuery = useCalibrationStatusQuery as jest.MockedFu const store: Store = createStore(jest.fn(), {}) describe('useDeckCalibrationStatus hook', () => { - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( diff --git a/app/src/organisms/Devices/hooks/__tests__/useIsOT3.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useIsFlex.test.tsx similarity index 81% rename from app/src/organisms/Devices/hooks/__tests__/useIsOT3.test.tsx rename to app/src/organisms/Devices/hooks/__tests__/useIsFlex.test.tsx index 2031d52874c..776d65b99cb 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useIsOT3.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useIsFlex.test.tsx @@ -2,12 +2,12 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' import { Provider } from 'react-redux' import { createStore, Store } from 'redux' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { getRobotModelByName } from '../../../../redux/discovery' -import { useIsOT3 } from '..' +import { useIsFlex } from '..' jest.mock('../../../../redux/discovery/selectors') @@ -17,8 +17,8 @@ const mockGetRobotModelByName = getRobotModelByName as jest.MockedFunction< const store: Store = createStore(jest.fn(), {}) -describe('useIsOT3 hook', () => { - let wrapper: React.FunctionComponent<{}> +describe('useIsFlex hook', () => { + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( @@ -39,7 +39,7 @@ describe('useIsOT3 hook', () => { .calledWith(undefined as any, 'otie') .mockReturnValue(null) - const { result } = renderHook(() => useIsOT3('otie'), { wrapper }) + const { result } = renderHook(() => useIsFlex('otie'), { wrapper }) expect(result.current).toEqual(false) }) @@ -49,7 +49,7 @@ describe('useIsOT3 hook', () => { .calledWith(undefined as any, 'otie') .mockReturnValue('OT-3 Classic') - const { result } = renderHook(() => useIsOT3('otie'), { + const { result } = renderHook(() => useIsFlex('otie'), { wrapper, }) @@ -60,7 +60,7 @@ describe('useIsOT3 hook', () => { .calledWith(undefined as any, 'otie') .mockReturnValue('Opentrons Flex') - const { result } = renderHook(() => useIsOT3('otie'), { + const { result } = renderHook(() => useIsFlex('otie'), { wrapper, }) diff --git a/app/src/organisms/Devices/hooks/__tests__/useIsRobotBusy.test.ts b/app/src/organisms/Devices/hooks/__tests__/useIsRobotBusy.test.ts index 458e9fc97a1..3057f76d168 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useIsRobotBusy.test.ts +++ b/app/src/organisms/Devices/hooks/__tests__/useIsRobotBusy.test.ts @@ -1,23 +1,27 @@ import { UseQueryResult } from 'react-query' -import { - useAllSessionsQuery, - useAllRunsQuery, - useEstopQuery, -} from '@opentrons/react-api-client' + +import { useAllSessionsQuery, useEstopQuery } from '@opentrons/react-api-client' + import { DISENGAGED, NOT_PRESENT, PHYSICALLY_ENGAGED, } from '../../../EmergencyStop' - import { useIsRobotBusy } from '../useIsRobotBusy' -import { useIsOT3 } from '../useIsOT3' +import { useIsFlex } from '../useIsFlex' +import { useNotifyCurrentMaintenanceRun } from '../../../../resources/maintenance_runs/useNotifyCurrentMaintenanceRun' +import { useNotifyAllRunsQuery } from '../../../../resources/runs/useNotifyAllRunsQuery' import type { Sessions, Runs } from '@opentrons/api-client' +import type { AxiosError } from 'axios' jest.mock('@opentrons/react-api-client') jest.mock('../../../ProtocolUpload/hooks') -jest.mock('../useIsOT3') +jest.mock('../useIsFlex') +jest.mock('../../../../resources/runs/useNotifyAllRunsQuery') +jest.mock( + '../../../../resources/maintenance_runs/useNotifyCurrentMaintenanceRun' +) const mockEstopStatus = { data: { @@ -30,28 +34,34 @@ const mockEstopStatus = { const mockUseAllSessionsQuery = useAllSessionsQuery as jest.MockedFunction< typeof useAllSessionsQuery > -const mockUseAllRunsQuery = useAllRunsQuery as jest.MockedFunction< - typeof useAllRunsQuery +const mockUseNotifyAllRunsQuery = useNotifyAllRunsQuery as jest.MockedFunction< + typeof useNotifyAllRunsQuery +> +const mockUseNotifyCurrentMaintenanceRun = useNotifyCurrentMaintenanceRun as jest.MockedFunction< + typeof useNotifyCurrentMaintenanceRun > const mockUseEstopQuery = useEstopQuery as jest.MockedFunction< typeof useEstopQuery > -const mockUseIsOT3 = useIsOT3 as jest.MockedFunction +const mockUseIsFlex = useIsFlex as jest.MockedFunction describe('useIsRobotBusy', () => { beforeEach(() => { mockUseAllSessionsQuery.mockReturnValue({ data: {}, } as UseQueryResult) - mockUseAllRunsQuery.mockReturnValue({ + mockUseNotifyAllRunsQuery.mockReturnValue({ data: { links: { current: {}, }, }, - } as UseQueryResult) + } as UseQueryResult) + mockUseNotifyCurrentMaintenanceRun.mockReturnValue({ + data: {}, + } as any) mockUseEstopQuery.mockReturnValue({ data: mockEstopStatus } as any) - mockUseIsOT3.mockReturnValue(false) + mockUseIsFlex.mockReturnValue(false) }) afterEach(() => { @@ -69,7 +79,7 @@ describe('useIsRobotBusy', () => { }) it('returns false when current runId is null and sessions are empty', () => { - mockUseAllRunsQuery.mockReturnValue({ + mockUseNotifyAllRunsQuery.mockReturnValue({ data: { links: { current: null, @@ -93,7 +103,7 @@ describe('useIsRobotBusy', () => { }) it('returns false when Estop status is disengaged', () => { - mockUseAllRunsQuery.mockReturnValue({ + mockUseNotifyAllRunsQuery.mockReturnValue({ data: { links: { current: null, @@ -117,8 +127,8 @@ describe('useIsRobotBusy', () => { }) it('returns true when robot is a Flex and Estop status is engaged', () => { - mockUseIsOT3.mockReturnValue(true) - mockUseAllRunsQuery.mockReturnValue({ + mockUseIsFlex.mockReturnValue(true) + mockUseNotifyAllRunsQuery.mockReturnValue({ data: { links: { current: null, @@ -148,8 +158,8 @@ describe('useIsRobotBusy', () => { expect(result).toBe(true) }) it('returns false when robot is NOT a Flex and Estop status is engaged', () => { - mockUseIsOT3.mockReturnValue(false) - mockUseAllRunsQuery.mockReturnValue({ + mockUseIsFlex.mockReturnValue(false) + mockUseNotifyAllRunsQuery.mockReturnValue({ data: { links: { current: null, @@ -179,15 +189,15 @@ describe('useIsRobotBusy', () => { expect(result).toBe(false) }) - // TODO: kj 07/13/2022 This test is temporary pending but should be solved by another PR. - // it('should poll the run and sessions if poll option is true', async () => { - // const result = useIsRobotBusy({ poll: true }) - // expect(result).toBe(true) - - // act(() => { - // jest.advanceTimersByTime(30000) - // }) - // expect(mockUseAllRunsQuery).toHaveBeenCalled() - // expect(mockUseAllSessionsQuery).toHaveBeenCalled() - // }) + it('returns true when a maintenance run exists', () => { + mockUseNotifyCurrentMaintenanceRun.mockReturnValue({ + data: { + data: { + id: '123', + }, + }, + } as any) + const result = useIsRobotBusy() + expect(result).toBe(true) + }) }) diff --git a/app/src/organisms/Devices/hooks/__tests__/useIsRobotViewable.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useIsRobotViewable.test.tsx index 09d4d345a1a..df86235c9e7 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useIsRobotViewable.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useIsRobotViewable.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' import { Provider } from 'react-redux' import { createStore, Store } from 'redux' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { getDiscoverableRobotByName } from '../../../../redux/discovery' @@ -23,7 +23,7 @@ const mockGetDiscoverableRobotByName = getDiscoverableRobotByName as jest.Mocked const store: Store = createStore(jest.fn(), {}) describe('useIsRobotViewable hook', () => { - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( diff --git a/app/src/organisms/Devices/hooks/__tests__/useLPCDisabledReason.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useLPCDisabledReason.test.tsx index 108dd1094f6..bfc2ed3200e 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useLPCDisabledReason.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useLPCDisabledReason.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { Provider } from 'react-redux' import { I18nextProvider } from 'react-i18next' import { createStore } from 'redux' @@ -51,7 +51,9 @@ const simpleV6Protocol = (_uncastedSimpleV6Protocol as unknown) as ProtocolAnaly describe('useLPCDisabledReason', () => { const store: Store = createStore(jest.fn(), {}) - const wrapper: React.FunctionComponent<{}> = ({ children }) => ( + const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + children, + }) => ( {children} diff --git a/app/src/organisms/Devices/hooks/__tests__/useLPCSuccessToast.test.ts b/app/src/organisms/Devices/hooks/__tests__/useLPCSuccessToast.test.ts index 9c45be5bfa0..3877015470b 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useLPCSuccessToast.test.ts +++ b/app/src/organisms/Devices/hooks/__tests__/useLPCSuccessToast.test.ts @@ -1,5 +1,5 @@ import * as React from 'react' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { useLPCSuccessToast } from '..' jest.mock('react', () => { diff --git a/app/src/organisms/Devices/hooks/__tests__/useLabwareRenderInfoForRunById.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useLabwareRenderInfoForRunById.test.tsx deleted file mode 100644 index 163ec5ab0e3..00000000000 --- a/app/src/organisms/Devices/hooks/__tests__/useLabwareRenderInfoForRunById.test.tsx +++ /dev/null @@ -1,154 +0,0 @@ -import { renderHook } from '@testing-library/react-hooks' -import { when, resetAllWhenMocks } from 'jest-when' - -import standardDeckDef from '@opentrons/shared-data/deck/definitions/3/ot2_standard.json' -import _heaterShakerCommandsWithResultsKey from '@opentrons/shared-data/protocol/fixtures/6/heaterShakerCommandsWithResultsKey.json' -import { useMostRecentCompletedAnalysis } from '../../../LabwarePositionCheck/useMostRecentCompletedAnalysis' - -import { getLabwareRenderInfo } from '../../ProtocolRun/utils/getLabwareRenderInfo' -import { - useLabwareRenderInfoForRunById, - useProtocolDetailsForRun, - useStoredProtocolAnalysis, -} from '..' - -import type { ProtocolAnalysisOutput } from '@opentrons/shared-data' -import type { ProtocolDetails } from '..' - -jest.mock('../../ProtocolRun/utils/getLabwareRenderInfo') -jest.mock('../../../LabwarePositionCheck/useMostRecentCompletedAnalysis') -jest.mock('../useProtocolDetailsForRun') -jest.mock('../useStoredProtocolAnalysis') - -const mockGetLabwareRenderInfo = getLabwareRenderInfo as jest.MockedFunction< - typeof getLabwareRenderInfo -> -const mockUseProtocolDetailsForRun = useProtocolDetailsForRun as jest.MockedFunction< - typeof useProtocolDetailsForRun -> -const mockUseMostRecentCompletedAnalysis = useMostRecentCompletedAnalysis as jest.MockedFunction< - typeof useMostRecentCompletedAnalysis -> -const mockUseStoredProtocolAnalysis = useStoredProtocolAnalysis as jest.MockedFunction< - typeof useStoredProtocolAnalysis -> - -const heaterShakerCommandsWithResultsKey = (_heaterShakerCommandsWithResultsKey as unknown) as ProtocolAnalysisOutput - -const PROTOCOL_DETAILS = { - displayName: 'fake protocol', - protocolData: heaterShakerCommandsWithResultsKey, - protocolKey: 'fakeProtocolKey', - robotType: 'OT-2 Standard' as const, -} - -// these are just taken from the ot-2 deck def for readability -const SLOT_2_COORDS = [132.5, 0.0, 0.0] -const SLOT_4_COORDS = [0.0, 90.5, 0.0] -const SLOT_5_COORDS = [132.5, 90.5, 0.0] -const SLOT_6_COORDS = [265.0, 90.5, 0.0] -const SLOT_9_COORDS = [265.0, 181.0, 0.0] -const SLOT_10_COORDS = [0.0, 271.5, 0.0] - -// labware ids come from the fixture protocol, they are just here for readability -const OPENTRONS_96_TIPRACK_1000UL_TIPRACK_ID = - '3e047fb0-3412-11eb-ad93-ed232a2337cf:opentrons/opentrons_96_tiprack_1000ul/1' -const NEST_1_RESEVOIR_195ML_ID = - '5ae317e0-3412-11eb-ad93-ed232a2337cf:opentrons/nest_1_reservoir_195ml/1' -const CORNING_24_WELLPLATE_1_ID = '53d3b350-a9c0-11eb-bce6-9f1d5b9c1a1b' -const CORNING_24_WELLPLATE_2_ID = - '60e8b050-3412-11eb-ad93-ed232a2337cf:opentrons/corning_24_wellplate_3.4ml_flat/1' -const OPENTRONS_96_TIPRACK_20UL_TIPRACK_ID = - 'faa13a50-a9bf-11eb-bce6-9f1d5b9c1a1b:opentrons/opentrons_96_tiprack_20ul/1' -const labeledLabwareDisplayName = 'customLabwareDisplayName' - -const LABWARE_RENDER_INFO = { - // slot 1 has mag mod - // slot 2 - [OPENTRONS_96_TIPRACK_1000UL_TIPRACK_ID]: { - labwareDef: expect.anything(), - displayName: null, - x: SLOT_2_COORDS[0], - y: SLOT_2_COORDS[1], - z: SLOT_2_COORDS[2], - }, - // slot 3 has temp mod - // slot 4 - [NEST_1_RESEVOIR_195ML_ID]: { - labwareDef: expect.anything(), - displayName: null, - x: SLOT_4_COORDS[0], - y: SLOT_4_COORDS[1], - z: SLOT_4_COORDS[2], - }, - // slot 5 - [CORNING_24_WELLPLATE_2_ID]: { - labwareDef: expect.anything(), - displayName: null, - x: SLOT_5_COORDS[0], - y: SLOT_5_COORDS[1], - z: SLOT_5_COORDS[2], - }, - // slot 6 - [CORNING_24_WELLPLATE_1_ID]: { - labwareDef: expect.anything(), - displayName: null, - x: SLOT_6_COORDS[0], - y: SLOT_6_COORDS[1], - z: SLOT_6_COORDS[2], - }, - // slot 7 has TC - // slot 9 - [OPENTRONS_96_TIPRACK_20UL_TIPRACK_ID]: { - labwareDef: expect.anything(), - displayName: null, - x: SLOT_9_COORDS[0], - y: SLOT_9_COORDS[1], - z: SLOT_9_COORDS[2], - }, - // slot 10 - abc123: { - labwareDef: expect.anything(), - displayName: labeledLabwareDisplayName, - x: SLOT_10_COORDS[0], - y: SLOT_10_COORDS[1], - z: SLOT_10_COORDS[2], - }, -} - -describe('useLabwareRenderInfoForRunById hook', () => { - beforeEach(() => { - when(mockUseProtocolDetailsForRun) - .calledWith('1') - .mockReturnValue(PROTOCOL_DETAILS as any) - when(mockUseMostRecentCompletedAnalysis) - .calledWith('1') - .mockReturnValue(PROTOCOL_DETAILS.protocolData as any) - when(mockUseStoredProtocolAnalysis) - .calledWith('1') - .mockReturnValue((PROTOCOL_DETAILS as unknown) as ProtocolAnalysisOutput) - when(mockGetLabwareRenderInfo) - .calledWith(heaterShakerCommandsWithResultsKey, standardDeckDef as any) - .mockReturnValue(LABWARE_RENDER_INFO) - }) - afterEach(() => { - resetAllWhenMocks() - }) - - it('should return no labware render info when protocol details not found', () => { - when(mockUseProtocolDetailsForRun) - .calledWith('1') - .mockReturnValue({} as ProtocolDetails) - when(mockUseMostRecentCompletedAnalysis) - .calledWith('1') - .mockReturnValue(null) - when(mockUseStoredProtocolAnalysis).calledWith('1').mockReturnValue(null) - const { result } = renderHook(() => useLabwareRenderInfoForRunById('1')) - expect(result.current).toStrictEqual({}) - }) - - it('should return labware render info', () => { - const { result } = renderHook(() => useLabwareRenderInfoForRunById('1')) - expect(result.current).toStrictEqual(LABWARE_RENDER_INFO) - }) -}) diff --git a/app/src/organisms/Devices/hooks/__tests__/useLights.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useLights.test.tsx index 7a9ff667d02..29c59e6f515 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useLights.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useLights.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { resetAllWhenMocks } from 'jest-when' import { Provider } from 'react-redux' import { createStore, Store } from 'redux' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { useLightsQuery, @@ -23,7 +23,7 @@ const mockUseSetLightsMutation = useSetLightsMutation as jest.MockedFunction< const store: Store = createStore(jest.fn(), {}) describe('useLights hook', () => { - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> let setLights: jest.Mock beforeEach(() => { diff --git a/app/src/organisms/Devices/hooks/__tests__/useModuleCalibrationStatus.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useModuleCalibrationStatus.test.tsx new file mode 100644 index 00000000000..d242d8b69d4 --- /dev/null +++ b/app/src/organisms/Devices/hooks/__tests__/useModuleCalibrationStatus.test.tsx @@ -0,0 +1,161 @@ +import * as React from 'react' +import { QueryClient, QueryClientProvider } from 'react-query' +import { renderHook } from '@testing-library/react' +import { when, resetAllWhenMocks } from 'jest-when' + +import { + useIsFlex, + useModuleCalibrationStatus, + useModuleRenderInfoForProtocolById, +} from '..' + +import { mockMagneticModuleGen2 } from '../../../../redux/modules/__fixtures__' + +import type { ModuleModel, ModuleType } from '@opentrons/shared-data' + +import { Provider } from 'react-redux' +import { createStore } from 'redux' + +jest.mock('../useIsFlex') +jest.mock('../useModuleRenderInfoForProtocolById') + +const mockUseIsFlex = useIsFlex as jest.MockedFunction +const mockUseModuleRenderInfoForProtocolById = useModuleRenderInfoForProtocolById as jest.MockedFunction< + typeof useModuleRenderInfoForProtocolById +> +let wrapper: React.FunctionComponent<{ children: React.ReactNode }> + +const mockMagneticModuleDefinition = { + moduleId: 'someMagneticModule', + model: 'magneticModuleV2' as ModuleModel, + type: 'magneticModuleType' as ModuleType, + labwareOffset: { x: 5, y: 5, z: 5 }, + cornerOffsetFromSlot: { x: 1, y: 1, z: 1 }, + dimensions: { + xDimension: 100, + yDimension: 100, + footprintXDimension: 50, + footprintYDimension: 50, + labwareInterfaceXDimension: 80, + labwareInterfaceYDimension: 120, + }, + twoDimensionalRendering: { children: [] }, +} + +const MAGNETIC_MODULE_INFO = { + moduleId: 'magneticModuleId', + x: 0, + y: 0, + z: 0, + moduleDef: mockMagneticModuleDefinition as any, + nestedLabwareDef: null, + nestedLabwareId: null, + nestedLabwareDisplayName: null, + protocolLoadOrder: 0, + slotName: '1', +} + +const mockOffsetData = { + offset: { + x: 0.2578125, + y: -0.3515625, + z: -0.7515000000000001, + }, + slot: 'D1', + last_modified: '2023-10-11T14:11:14.061780+00:00', +} + +describe('useModuleCalibrationStatus hook', () => { + beforeEach(() => { + const queryClient = new QueryClient() + const store = createStore(jest.fn(), {}) + store.dispatch = jest.fn() + store.getState = jest.fn(() => {}) + + wrapper = ({ children }) => ( + + {children} + + ) + }) + afterEach(() => { + resetAllWhenMocks() + jest.resetAllMocks() + }) + + it('should return calibration complete if OT-2', () => { + when(mockUseIsFlex).calledWith('otie').mockReturnValue(false) + when(mockUseModuleRenderInfoForProtocolById) + .calledWith('1') + .mockReturnValue({}) + + const { result } = renderHook( + () => useModuleCalibrationStatus('otie', '1'), + { wrapper } + ) + + expect(result.current).toEqual({ complete: true }) + }) + + it('should return calibration complete if no modules needed', () => { + when(mockUseIsFlex).calledWith('otie').mockReturnValue(true) + when(mockUseModuleRenderInfoForProtocolById) + .calledWith('1') + .mockReturnValue({}) + + const { result } = renderHook( + () => useModuleCalibrationStatus('otie', '1'), + { wrapper } + ) + + expect(result.current).toEqual({ complete: true }) + }) + + it('should return calibration complete if offset date exists', () => { + when(mockUseIsFlex).calledWith('otie').mockReturnValue(true) + when(mockUseModuleRenderInfoForProtocolById) + .calledWith('1') + .mockReturnValue({ + magneticModuleId: { + attachedModuleMatch: { + ...mockMagneticModuleGen2, + moduleOffset: mockOffsetData, + }, + conflictedFixture: null, + ...MAGNETIC_MODULE_INFO, + }, + }) + + const { result } = renderHook( + () => useModuleCalibrationStatus('otie', '1'), + { wrapper } + ) + + expect(result.current).toEqual({ complete: true }) + }) + + it('should return calibration needed if offset date does not exist', () => { + when(mockUseIsFlex).calledWith('otie').mockReturnValue(true) + when(mockUseModuleRenderInfoForProtocolById) + .calledWith('1') + .mockReturnValue({ + magneticModuleId: { + attachedModuleMatch: { + ...mockMagneticModuleGen2, + }, + conflictedFixture: null, + ...MAGNETIC_MODULE_INFO, + }, + }) + + const { result } = renderHook( + () => useModuleCalibrationStatus('otie', '1'), + { wrapper } + ) + + expect(result.current).toEqual({ + complete: false, + reason: 'calibrate_module_failure_reason', + }) + }) +}) diff --git a/app/src/organisms/Devices/hooks/__tests__/useModuleRenderInfoForProtocolById.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useModuleRenderInfoForProtocolById.test.tsx index 0e63f9e04b2..ae14d61fb6f 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useModuleRenderInfoForProtocolById.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useModuleRenderInfoForProtocolById.test.tsx @@ -1,9 +1,11 @@ -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { when, resetAllWhenMocks } from 'jest-when' +import { UseQueryResult } from 'react-query' -import standardDeckDef from '@opentrons/shared-data/deck/definitions/3/ot2_standard.json' +import { STAGING_AREA_RIGHT_SLOT_FIXTURE } from '@opentrons/shared-data' import _heaterShakerCommandsWithResultsKey from '@opentrons/shared-data/protocol/fixtures/6/heaterShakerCommandsWithResultsKey.json' import { useMostRecentCompletedAnalysis } from '../../../LabwarePositionCheck/useMostRecentCompletedAnalysis' +import { useDeckConfigurationQuery } from '@opentrons/react-api-client/src/deck_configuration' import { getProtocolModulesInfo } from '../../ProtocolRun/utils/getProtocolModulesInfo' @@ -15,20 +17,20 @@ import { import { useAttachedModules, useModuleRenderInfoForProtocolById, - useProtocolDetailsForRun, useStoredProtocolAnalysis, } from '..' import type { + CutoutConfig, + DeckConfiguration, ModuleModel, ModuleType, ProtocolAnalysisOutput, } from '@opentrons/shared-data' -import type { ProtocolDetails } from '..' +jest.mock('@opentrons/react-api-client/src/deck_configuration') jest.mock('../../ProtocolRun/utils/getProtocolModulesInfo') jest.mock('../useAttachedModules') -jest.mock('../useProtocolDetailsForRun') jest.mock('../useStoredProtocolAnalysis') jest.mock('../../../LabwarePositionCheck/useMostRecentCompletedAnalysis') @@ -38,23 +40,29 @@ const mockGetProtocolModulesInfo = getProtocolModulesInfo as jest.MockedFunction const mockUseAttachedModules = useAttachedModules as jest.MockedFunction< typeof useAttachedModules > -const mockUseProtocolDetailsForRun = useProtocolDetailsForRun as jest.MockedFunction< - typeof useProtocolDetailsForRun -> const mockUseStoredProtocolAnalysis = useStoredProtocolAnalysis as jest.MockedFunction< typeof useStoredProtocolAnalysis > const mockUseMostRecentCompletedAnalysis = useMostRecentCompletedAnalysis as jest.MockedFunction< typeof useMostRecentCompletedAnalysis > - +const mockUseDeckConfigurationQuery = useDeckConfigurationQuery as jest.MockedFunction< + typeof useDeckConfigurationQuery +> const heaterShakerCommandsWithResultsKey = (_heaterShakerCommandsWithResultsKey as unknown) as ProtocolAnalysisOutput const PROTOCOL_DETAILS = { displayName: 'fake protocol', - protocolData: heaterShakerCommandsWithResultsKey, + protocolData: { + ...heaterShakerCommandsWithResultsKey, + labware: [ + { + displayName: 'Trash', + definitionId: 'opentrons/opentrons_1_trash_3200ml_fixed/1', + }, + ], + }, protocolKey: 'fakeProtocolKey', - robotType: 'OT-2 Standard' as const, } const mockMagneticModuleDefinition = { @@ -101,7 +109,7 @@ const MAGNETIC_MODULE_INFO = { nestedLabwareId: null, nestedLabwareDisplayName: null, protocolLoadOrder: 0, - slotName: '1', + slotName: 'D1', } const TEMPERATURE_MODULE_INFO = { @@ -114,11 +122,19 @@ const TEMPERATURE_MODULE_INFO = { nestedLabwareId: null, nestedLabwareDisplayName: null, protocolLoadOrder: 0, - slotName: '1', + slotName: 'D1', +} + +const mockCutoutConfig: CutoutConfig = { + cutoutId: 'cutoutD1', + cutoutFixtureId: STAGING_AREA_RIGHT_SLOT_FIXTURE, } describe('useModuleRenderInfoForProtocolById hook', () => { beforeEach(() => { + when(mockUseDeckConfigurationQuery).mockReturnValue({ + data: [mockCutoutConfig], + } as UseQueryResult) when(mockUseAttachedModules) .calledWith() .mockReturnValue([ @@ -126,46 +142,39 @@ describe('useModuleRenderInfoForProtocolById hook', () => { mockTemperatureModuleGen2, mockThermocycler, ]) - when(mockUseProtocolDetailsForRun) - .calledWith('1') - .mockReturnValue(PROTOCOL_DETAILS as any) when(mockUseStoredProtocolAnalysis) .calledWith('1') .mockReturnValue((PROTOCOL_DETAILS as unknown) as ProtocolAnalysisOutput) when(mockUseMostRecentCompletedAnalysis) .calledWith('1') .mockReturnValue(PROTOCOL_DETAILS.protocolData as any) - when(mockGetProtocolModulesInfo) - .calledWith(heaterShakerCommandsWithResultsKey, standardDeckDef as any) - .mockReturnValue([TEMPERATURE_MODULE_INFO, MAGNETIC_MODULE_INFO]) + mockGetProtocolModulesInfo.mockReturnValue([ + TEMPERATURE_MODULE_INFO, + MAGNETIC_MODULE_INFO, + ]) }) afterEach(() => { resetAllWhenMocks() }) it('should return no module render info when protocol details not found', () => { - when(mockUseProtocolDetailsForRun) - .calledWith('1') - .mockReturnValue({} as ProtocolDetails) when(mockUseMostRecentCompletedAnalysis) .calledWith('1') .mockReturnValue(null) when(mockUseStoredProtocolAnalysis).calledWith('1').mockReturnValue(null) - const { result } = renderHook(() => - useModuleRenderInfoForProtocolById('otie', '1') - ) + const { result } = renderHook(() => useModuleRenderInfoForProtocolById('1')) expect(result.current).toStrictEqual({}) }) it('should return module render info', () => { - const { result } = renderHook(() => - useModuleRenderInfoForProtocolById('otie', '1') - ) + const { result } = renderHook(() => useModuleRenderInfoForProtocolById('1')) expect(result.current).toStrictEqual({ magneticModuleId: { + conflictedFixture: mockCutoutConfig, attachedModuleMatch: mockMagneticModuleGen2, ...MAGNETIC_MODULE_INFO, }, temperatureModuleId: { + conflictedFixture: mockCutoutConfig, attachedModuleMatch: mockTemperatureModuleGen2, ...TEMPERATURE_MODULE_INFO, }, diff --git a/app/src/organisms/Devices/hooks/__tests__/usePipetteOffsetCalibration.test.tsx b/app/src/organisms/Devices/hooks/__tests__/usePipetteOffsetCalibration.test.tsx index cdfa62a2240..a30a036529b 100644 --- a/app/src/organisms/Devices/hooks/__tests__/usePipetteOffsetCalibration.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/usePipetteOffsetCalibration.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' import { Provider } from 'react-redux' import { createStore, Store } from 'redux' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { @@ -41,7 +41,7 @@ const MOUNT = 'left' as Mount describe('usePipetteOffsetCalibration hook', () => { let dispatchApiRequest: DispatchApiRequestType - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> beforeEach(() => { dispatchApiRequest = jest.fn() const queryClient = new QueryClient() diff --git a/app/src/organisms/Devices/hooks/__tests__/usePipetteOffsetCalibrations.test.tsx b/app/src/organisms/Devices/hooks/__tests__/usePipetteOffsetCalibrations.test.tsx index feb18e5ff98..755503279ca 100644 --- a/app/src/organisms/Devices/hooks/__tests__/usePipetteOffsetCalibrations.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/usePipetteOffsetCalibrations.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { useAllPipetteOffsetCalibrationsQuery } from '@opentrons/react-api-client' import { @@ -19,7 +19,7 @@ const mockUseAllPipetteOffsetCalibrationsQuery = useAllPipetteOffsetCalibrations const CALIBRATION_DATA_POLL_MS = 5000 describe('usePipetteOffsetCalibrations hook', () => { - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( diff --git a/app/src/organisms/Devices/hooks/__tests__/useProtocolAnalysisErrors.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useProtocolAnalysisErrors.test.tsx index 86f4d6c1180..bcdc00c9624 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useProtocolAnalysisErrors.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useProtocolAnalysisErrors.test.tsx @@ -1,14 +1,14 @@ import { when, resetAllWhenMocks } from 'jest-when' import { UseQueryResult } from 'react-query' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { useProtocolAnalysisAsDocumentQuery, useProtocolQuery, - useRunQuery, } from '@opentrons/react-api-client' import { useProtocolAnalysisErrors } from '..' +import { useNotifyRunQuery } from '../../../../resources/runs/useNotifyRunQuery' import { RUN_ID_2 } from '../../../../organisms/RunTimeControl/__fixtures__' @@ -19,8 +19,11 @@ import type { } from '@opentrons/shared-data' jest.mock('@opentrons/react-api-client') +jest.mock('../../../../resources/runs/useNotifyRunQuery') -const mockUseRunQuery = useRunQuery as jest.MockedFunction +const mockUseNotifyRunQuery = useNotifyRunQuery as jest.MockedFunction< + typeof useNotifyRunQuery +> const mockUseProtocolQuery = useProtocolQuery as jest.MockedFunction< typeof useProtocolQuery @@ -31,7 +34,7 @@ const mockUseProtocolAnalysisAsDocumentQuery = useProtocolAnalysisAsDocumentQuer describe('useProtocolAnalysisErrors hook', () => { beforeEach(() => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(null, { staleTime: Infinity }) .mockReturnValue({} as UseQueryResult) when(mockUseProtocolQuery) @@ -49,7 +52,7 @@ describe('useProtocolAnalysisErrors hook', () => { }) it('returns null when protocol id is null', () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID_2, { staleTime: Infinity }) .mockReturnValue({ data: { data: { protocolId: null } } as any, @@ -66,7 +69,7 @@ describe('useProtocolAnalysisErrors hook', () => { id: 'fake analysis', status: 'completed', } as CompletedProtocolAnalysis - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID_2, { staleTime: Infinity }) .mockReturnValue({ data: { data: { protocolId: PROTOCOL_ID } } as any, @@ -95,7 +98,7 @@ describe('useProtocolAnalysisErrors hook', () => { id: 'fake analysis', status: 'pending', } as PendingProtocolAnalysis - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID_2, { staleTime: Infinity }) .mockReturnValue({ data: { data: { protocolId: PROTOCOL_ID } } as any, @@ -125,7 +128,7 @@ describe('useProtocolAnalysisErrors hook', () => { status: 'completed', errors: [{ detail: 'fake error' }], } as CompletedProtocolAnalysis - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID_2, { staleTime: Infinity }) .mockReturnValue({ data: { data: { protocolId: PROTOCOL_ID } } as any, diff --git a/app/src/organisms/Devices/hooks/__tests__/useProtocolDetailsForRun.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useProtocolDetailsForRun.test.tsx index 2c94afeedf1..04b0223c3b9 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useProtocolDetailsForRun.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useProtocolDetailsForRun.test.tsx @@ -1,21 +1,25 @@ import { when, resetAllWhenMocks } from 'jest-when' import { UseQueryResult } from 'react-query' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { useProtocolAnalysisAsDocumentQuery, useProtocolQuery, - useRunQuery, } from '@opentrons/react-api-client' import { useProtocolDetailsForRun } from '..' +import { useNotifyRunQuery } from '../../../../resources/runs/useNotifyRunQuery' import { RUN_ID_2 } from '../../../../organisms/RunTimeControl/__fixtures__' import type { Protocol, Run } from '@opentrons/api-client' -import { CompletedProtocolAnalysis } from '@opentrons/shared-data' +import { + CompletedProtocolAnalysis, + OT2_ROBOT_TYPE, +} from '@opentrons/shared-data' jest.mock('@opentrons/react-api-client') +jest.mock('../../../../resources/runs/useNotifyRunQuery') const mockUseProtocolQuery = useProtocolQuery as jest.MockedFunction< typeof useProtocolQuery @@ -23,7 +27,9 @@ const mockUseProtocolQuery = useProtocolQuery as jest.MockedFunction< const mockUseProtocolAnalysisAsDocumentQuery = useProtocolAnalysisAsDocumentQuery as jest.MockedFunction< typeof useProtocolAnalysisAsDocumentQuery > -const mockUseRunQuery = useRunQuery as jest.MockedFunction +const mockUseNotifyRunQuery = useNotifyRunQuery as jest.MockedFunction< + typeof useNotifyRunQuery +> const PROTOCOL_ID = 'fake_protocol_id' const PROTOCOL_ANALYSIS = { @@ -39,12 +45,13 @@ const PROTOCOL_RESPONSE = { metadata: { protocolName: 'fake protocol' }, analysisSummaries: [{ id: PROTOCOL_ANALYSIS.id, status: 'completed' }], key: 'fakeProtocolKey', + robotType: OT2_ROBOT_TYPE, }, } as Protocol describe('useProtocolDetailsForRun hook', () => { beforeEach(() => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(null, { staleTime: Infinity }) .mockReturnValue({} as UseQueryResult) when(mockUseProtocolQuery) @@ -68,12 +75,12 @@ describe('useProtocolDetailsForRun hook', () => { protocolData: null, protocolKey: null, isProtocolAnalyzing: false, - robotType: 'OT-2 Standard', + robotType: 'OT-3 Standard', }) }) it('returns the protocol file when given a run id', async () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID_2, { staleTime: Infinity }) .mockReturnValue({ data: { data: { protocolId: PROTOCOL_ID } } as any, diff --git a/app/src/organisms/Devices/hooks/__tests__/useProtocolMetadata.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useProtocolMetadata.test.tsx index 475b4bd69ba..8ed6189c5d0 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useProtocolMetadata.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useProtocolMetadata.test.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import { when } from 'jest-when' import { Provider } from 'react-redux' import { createStore } from 'redux' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { useCurrentProtocol } from '../../../ProtocolUpload/hooks' import { useProtocolMetadata } from '../useProtocolMetadata' @@ -42,9 +42,9 @@ describe('useProtocolMetadata', () => { }) it('should return author, lastUpdated, method, description, and robot type', () => { - const wrapper: React.FunctionComponent<{}> = ({ children }) => ( - {children} - ) + const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + children, + }) => {children} const { result } = renderHook(useProtocolMetadata, { wrapper }) const { author, diff --git a/app/src/organisms/Devices/hooks/__tests__/useProtocolRunAnalyticsData.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useProtocolRunAnalyticsData.test.tsx index 0d1a9c48731..0cfbb7fce93 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useProtocolRunAnalyticsData.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useProtocolRunAnalyticsData.test.tsx @@ -1,7 +1,6 @@ import * as React from 'react' import { resetAllWhenMocks, when } from 'jest-when' -import { renderHook } from '@testing-library/react-hooks' -import { waitFor } from '@testing-library/react' +import { renderHook, waitFor } from '@testing-library/react' import { createStore, Store } from 'redux' import { Provider } from 'react-redux' import { QueryClient, QueryClientProvider } from 'react-query' @@ -41,7 +40,7 @@ const mockFormatInterval = formatInterval as jest.MockedFunction< typeof formatInterval > -let wrapper: React.FunctionComponent<{}> +let wrapper: React.FunctionComponent<{ children: React.ReactNode }> let store: Store = createStore(jest.fn(), {}) const RUN_ID = '1' diff --git a/app/src/organisms/Devices/hooks/__tests__/useRobot.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useRobot.test.tsx index 4bb464655fe..5f3320d2ea2 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useRobot.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useRobot.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' import { Provider } from 'react-redux' import { createStore, Store } from 'redux' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { getDiscoverableRobotByName } from '../../../../redux/discovery' @@ -19,7 +19,7 @@ const mockGetDiscoverableRobotByName = getDiscoverableRobotByName as jest.Mocked const store: Store = createStore(jest.fn(), {}) describe('useRobot hook', () => { - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( diff --git a/app/src/organisms/Devices/hooks/__tests__/useRobotAnalyticsData.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useRobotAnalyticsData.test.tsx index 13535050f68..9719675a9f4 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useRobotAnalyticsData.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useRobotAnalyticsData.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { resetAllWhenMocks, when } from 'jest-when' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { createStore, Store } from 'redux' import { Provider } from 'react-redux' import { QueryClient, QueryClientProvider } from 'react-query' @@ -48,7 +48,7 @@ const ATTACHED_PIPETTES = { right: { id: '2', model: 'testModelRight' }, } -let wrapper: React.FunctionComponent<{}> +let wrapper: React.FunctionComponent<{ children: React.ReactNode }> let store: Store = createStore(jest.fn(), {}) describe('useProtocolAnalysisErrors hook', () => { diff --git a/app/src/organisms/Devices/hooks/__tests__/useRunCalibrationStatus.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useRunCalibrationStatus.test.tsx index 82f75f7eb84..421df4215f1 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useRunCalibrationStatus.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useRunCalibrationStatus.test.tsx @@ -1,32 +1,37 @@ import * as React from 'react' import { QueryClient, QueryClientProvider } from 'react-query' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { when, resetAllWhenMocks } from 'jest-when' import { mockTipRackDefinition } from '../../../../redux/custom-labware/__fixtures__' import { useRunCalibrationStatus, useDeckCalibrationStatus, - useIsOT3, + useIsFlex, useRunPipetteInfoByMount, } from '..' +import { useNotifyRunQuery } from '../../../../resources/runs/useNotifyRunQuery' import type { PipetteInfo } from '..' import { Provider } from 'react-redux' import { createStore } from 'redux' jest.mock('../useDeckCalibrationStatus') -jest.mock('../useIsOT3') +jest.mock('../useIsFlex') jest.mock('../useRunPipetteInfoByMount') +jest.mock('../../../../resources/runs/useNotifyRunQuery') const mockUseDeckCalibrationStatus = useDeckCalibrationStatus as jest.MockedFunction< typeof useDeckCalibrationStatus > -const mockUseIsOT3 = useIsOT3 as jest.MockedFunction +const mockUseIsFlex = useIsFlex as jest.MockedFunction const mockUseRunPipetteInfoByMount = useRunPipetteInfoByMount as jest.MockedFunction< typeof useRunPipetteInfoByMount > -let wrapper: React.FunctionComponent<{}> +const mockUseNotifyRunQuery = useNotifyRunQuery as jest.MockedFunction< + typeof useNotifyRunQuery +> +let wrapper: React.FunctionComponent<{ children: React.ReactNode }> describe('useRunCalibrationStatus hook', () => { beforeEach(() => { @@ -36,7 +41,8 @@ describe('useRunCalibrationStatus hook', () => { left: null, right: null, }) - when(mockUseIsOT3).calledWith('otie').mockReturnValue(false) + when(mockUseIsFlex).calledWith('otie').mockReturnValue(false) + mockUseNotifyRunQuery.mockReturnValue({} as any) const store = createStore(jest.fn(), {}) store.dispatch = jest.fn() @@ -65,11 +71,11 @@ describe('useRunCalibrationStatus hook', () => { reason: 'calibrate_deck_failure_reason', }) }) - it('should ignore deck calibration status of an OT-3', () => { + it('should ignore deck calibration status of a Flex', () => { when(mockUseDeckCalibrationStatus) .calledWith('otie') .mockReturnValue('BAD_CALIBRATION') - when(mockUseIsOT3).calledWith('otie').mockReturnValue(true) + when(mockUseIsFlex).calledWith('otie').mockReturnValue(true) const { result } = renderHook(() => useRunCalibrationStatus('otie', '1'), { wrapper, }) @@ -161,7 +167,7 @@ describe('useRunCalibrationStatus hook', () => { reason: 'calibrate_tiprack_failure_reason', }) }) - it('should ignore tip rack calibration for the OT-3', () => { + it('should ignore tip rack calibration for the Flex', () => { when(mockUseRunPipetteInfoByMount) .calledWith('1') .mockReturnValue({ @@ -181,7 +187,7 @@ describe('useRunCalibrationStatus hook', () => { } as PipetteInfo, right: null, }) - when(mockUseIsOT3).calledWith('otie').mockReturnValue(true) + when(mockUseIsFlex).calledWith('otie').mockReturnValue(true) const { result } = renderHook(() => useRunCalibrationStatus('otie', '1'), { wrapper, }) diff --git a/app/src/organisms/Devices/hooks/__tests__/useRunCreatedAtTimestamp.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useRunCreatedAtTimestamp.test.tsx index b18f57aac51..d95579bc7ad 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useRunCreatedAtTimestamp.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useRunCreatedAtTimestamp.test.tsx @@ -1,19 +1,20 @@ -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { when, resetAllWhenMocks } from 'jest-when' -import { useRunQuery } from '@opentrons/react-api-client' - import { mockIdleUnstartedRun } from '../../../../organisms/RunTimeControl/__fixtures__' import { formatTimestamp } from '../../utils' import { useRunCreatedAtTimestamp } from '../useRunCreatedAtTimestamp' +import { useNotifyRunQuery } from '../../../../resources/runs/useNotifyRunQuery' import type { UseQueryResult } from 'react-query' import type { Run } from '@opentrons/api-client' -jest.mock('@opentrons/react-api-client') +jest.mock('../../../../resources/runs/useNotifyRunQuery') jest.mock('../../utils') -const mockUseRunQuery = useRunQuery as jest.MockedFunction +const mockUseNotifyRunQuery = useNotifyRunQuery as jest.MockedFunction< + typeof useNotifyRunQuery +> const mockFormatTimestamp = formatTimestamp as jest.MockedFunction< typeof formatTimestamp > @@ -22,7 +23,7 @@ const MOCK_RUN_ID = '1' describe('useRunCreatedAtTimestamp', () => { beforeEach(() => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(MOCK_RUN_ID) .mockReturnValue({ data: { data: mockIdleUnstartedRun }, diff --git a/app/src/organisms/Devices/hooks/__tests__/useRunHasStarted.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useRunHasStarted.test.tsx index 241847dfb5f..e5c13169eb8 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useRunHasStarted.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useRunHasStarted.test.tsx @@ -1,4 +1,4 @@ -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { when, resetAllWhenMocks } from 'jest-when' import { RUN_STATUS_IDLE, RUN_STATUS_RUNNING } from '@opentrons/api-client' diff --git a/app/src/organisms/Devices/hooks/__tests__/useRunPipetteInfoByMount.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useRunPipetteInfoByMount.test.tsx index 153680827bb..6bbe18a90db 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useRunPipetteInfoByMount.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useRunPipetteInfoByMount.test.tsx @@ -1,4 +1,4 @@ -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { when, resetAllWhenMocks } from 'jest-when' import { @@ -50,7 +50,6 @@ jest.mock('../../../LabwarePositionCheck/useMostRecentCompletedAnalysis') jest.mock('../useAttachedPipetteCalibrations') jest.mock('../useAttachedPipettes') jest.mock('../useTipLengthCalibrations') -jest.mock('../useProtocolDetailsForRun') jest.mock('../useStoredProtocolAnalysis') const mockGetPipetteNameSpecs = getPipetteNameSpecs as jest.MockedFunction< @@ -108,7 +107,7 @@ const modifiedSimpleV6Protocol = ({ }, { id: 'tipRackId', - displayName: 'Opentrons 96 Tip Rack 10 µL', + displayName: 'Opentrons OT-2 96 Tip Rack 10 µL', definitionUri: 'opentrons/opentrons_96_tiprack_10ul/1', loadName: 'opentrons_96_tiprack_10ul', }, @@ -200,7 +199,7 @@ describe('useRunPipetteInfoByMount hook', () => { }, tipRacksForPipette: [ { - displayName: 'Opentrons 96 Tip Rack 10 µL', + displayName: 'Opentrons OT-2 96 Tip Rack 10 µL', lastModifiedDate: null, tipRackDef: tiprack10ul, }, diff --git a/app/src/organisms/Devices/hooks/__tests__/useStoredProtocolAnalysis.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useStoredProtocolAnalysis.test.tsx index 66fbe643c74..f8b152ff4db 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useStoredProtocolAnalysis.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useStoredProtocolAnalysis.test.tsx @@ -3,14 +3,14 @@ import { when, resetAllWhenMocks } from 'jest-when' import { QueryClient, QueryClientProvider, UseQueryResult } from 'react-query' import { Provider } from 'react-redux' import { createStore, Store } from 'redux' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { parseRequiredModulesEntity, parseInitialLoadedLabwareEntity, parsePipetteEntity, } from '@opentrons/api-client' -import { useProtocolQuery, useRunQuery } from '@opentrons/react-api-client' +import { useProtocolQuery } from '@opentrons/react-api-client' import { storedProtocolData } from '../../../../redux/protocol-storage/__fixtures__' import { @@ -24,18 +24,21 @@ import { PIPETTE_ENTITY, STORED_PROTOCOL_ANALYSIS, } from '../__fixtures__/storedProtocolAnalysis' +import { useNotifyRunQuery } from '../../../../resources/runs/useNotifyRunQuery' import type { Protocol, Run } from '@opentrons/api-client' -jest.mock('@opentrons/shared-data') jest.mock('@opentrons/api-client') jest.mock('@opentrons/react-api-client') jest.mock('../../../../redux/protocol-storage/selectors') +jest.mock('../../../../resources/runs/useNotifyRunQuery') const mockUseProtocolQuery = useProtocolQuery as jest.MockedFunction< typeof useProtocolQuery > -const mockUseRunQuery = useRunQuery as jest.MockedFunction +const mockUseNotifyRunQuery = useNotifyRunQuery as jest.MockedFunction< + typeof useNotifyRunQuery +> const mockGetStoredProtocol = getStoredProtocol as jest.MockedFunction< typeof getStoredProtocol > @@ -64,7 +67,7 @@ const PROTOCOL_ID = 'the_protocol_id' const PROTOCOL_KEY = 'the_protocol_key' describe('useStoredProtocolAnalysis hook', () => { - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( @@ -75,7 +78,7 @@ describe('useStoredProtocolAnalysis hook', () => { ) - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(null, { staleTime: Infinity }) .mockReturnValue({} as UseQueryResult) when(mockUseProtocolQuery) @@ -102,7 +105,7 @@ describe('useStoredProtocolAnalysis hook', () => { }) it('returns null when there is no stored protocol analysis for a protocol key', () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID, { staleTime: Infinity }) .mockReturnValue({ data: { data: { protocolId: PROTOCOL_ID } }, @@ -124,7 +127,7 @@ describe('useStoredProtocolAnalysis hook', () => { }) it('returns a stored protocol analysis when one exists for a protocol key', () => { - when(mockUseRunQuery) + when(mockUseNotifyRunQuery) .calledWith(RUN_ID, { staleTime: Infinity }) .mockReturnValue({ data: { data: { protocolId: PROTOCOL_ID } }, diff --git a/app/src/organisms/Devices/hooks/__tests__/useSyncRobotClock.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useSyncRobotClock.test.tsx index 602deb48362..e8ec95a4a78 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useSyncRobotClock.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useSyncRobotClock.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { resetAllWhenMocks } from 'jest-when' import { Provider } from 'react-redux' import { createStore, Store } from 'redux' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { syncSystemTime } from '../../../../redux/robot-admin' @@ -13,7 +13,7 @@ jest.mock('../../../../redux/discovery') const store: Store = createStore(jest.fn(), {}) describe('useSyncRobotClock hook', () => { - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> beforeEach(() => { store.dispatch = jest.fn() const queryClient = new QueryClient() diff --git a/app/src/organisms/Devices/hooks/__tests__/useTipLengthCalibrations.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useTipLengthCalibrations.test.tsx index bda52131e7f..7934ce0f652 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useTipLengthCalibrations.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useTipLengthCalibrations.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' import { QueryClient, QueryClientProvider } from 'react-query' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { useAllTipLengthCalibrationsQuery } from '@opentrons/react-api-client' import { mockTipLengthCalibration1, @@ -19,7 +19,7 @@ const mockUseAllTipLengthCalibrationsQuery = useAllTipLengthCalibrationsQuery as const CALIBRATIONS_FETCH_MS = 5000 describe('useTipLengthCalibrations hook', () => { - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> beforeEach(() => { const queryClient = new QueryClient() wrapper = ({ children }) => ( diff --git a/app/src/organisms/Devices/hooks/__tests__/useTrackCreateProtocolRunEvent.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useTrackCreateProtocolRunEvent.test.tsx index b118bd6c291..de223800946 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useTrackCreateProtocolRunEvent.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useTrackCreateProtocolRunEvent.test.tsx @@ -3,8 +3,7 @@ import { createStore, Store } from 'redux' import { Provider } from 'react-redux' import { QueryClient, QueryClientProvider } from 'react-query' import { resetAllWhenMocks, when } from 'jest-when' -import { waitFor } from '@testing-library/react' -import { renderHook } from '@testing-library/react-hooks' +import { waitFor, renderHook } from '@testing-library/react' import { STORED_PROTOCOL_ANALYSIS } from '../__fixtures__/storedProtocolAnalysis' import { useTrackCreateProtocolRunEvent } from '../useTrackCreateProtocolRunEvent' @@ -37,7 +36,7 @@ const PROTOCOL_PROPERTIES = { protocolType: 'python' } as ProtocolAnalyticsData let mockTrackEvent: jest.Mock let mockGetProtocolRunAnalyticsData: jest.Mock -let wrapper: React.FunctionComponent<{}> +let wrapper: React.FunctionComponent<{ children: React.ReactNode }> let store: Store = createStore(jest.fn(), {}) describe('useTrackCreateProtocolRunEvent hook', () => { diff --git a/app/src/organisms/Devices/hooks/__tests__/useTrackProtocolRunEvent.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useTrackProtocolRunEvent.test.tsx index 6f75538e17b..5dfff1c91b4 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useTrackProtocolRunEvent.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useTrackProtocolRunEvent.test.tsx @@ -3,8 +3,7 @@ import { createStore, Store } from 'redux' import { Provider } from 'react-redux' import { QueryClient, QueryClientProvider } from 'react-query' import { resetAllWhenMocks, when } from 'jest-when' -import { waitFor } from '@testing-library/react' -import { renderHook } from '@testing-library/react-hooks' +import { waitFor, renderHook } from '@testing-library/react' import { useTrackProtocolRunEvent } from '../useTrackProtocolRunEvent' import { useProtocolRunAnalyticsData } from '../useProtocolRunAnalyticsData' @@ -32,7 +31,7 @@ const PROTOCOL_PROPERTIES = { protocolType: 'python' } let mockTrackEvent: jest.Mock let mockGetProtocolRunAnalyticsData: jest.Mock -let wrapper: React.FunctionComponent<{}> +let wrapper: React.FunctionComponent<{ children: React.ReactNode }> let store: Store = createStore(jest.fn(), {}) describe('useTrackProtocolRunEvent hook', () => { diff --git a/app/src/organisms/Devices/hooks/__tests__/useUnmatchedModulesForProtocol.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useUnmatchedModulesForProtocol.test.tsx index e524aa53d5a..6fe469954b9 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useUnmatchedModulesForProtocol.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useUnmatchedModulesForProtocol.test.tsx @@ -1,5 +1,5 @@ import { when, resetAllWhenMocks } from 'jest-when' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { mockConnectedRobot } from '../../../../redux/discovery/__fixtures__' import { mockTemperatureModule } from '../../../../redux/modules/__fixtures__' @@ -10,7 +10,7 @@ import { useUnmatchedModulesForProtocol, } from '..' -import type { ModuleModel, ModuleType } from '@opentrons/shared-data' +import type { ModuleDefinition } from '@opentrons/shared-data' jest.mock('../useAttachedModules') jest.mock('../useModuleRenderInfoForProtocolById') @@ -27,22 +27,22 @@ const mockUseRobot = useRobot as jest.MockedFunction const mockMagneticBlockDef = { labwareOffset: { x: 5, y: 5, z: 5 }, moduleId: 'someMagneticBlock', - model: 'magneticBlockV1' as ModuleModel, - type: 'magneticBlockType' as ModuleType, + model: 'magneticBlockV1', + type: 'magneticBlockType', compatibleWith: [], } const mockMagneticModuleDef = { labwareOffset: { x: 5, y: 5, z: 5 }, moduleId: 'someMagneticModule', - model: 'magneticModuleV2' as ModuleModel, - type: 'magneticModuleType' as ModuleType, + model: 'magneticModuleV2', + type: 'magneticModuleType', compatibleWith: [], } const mockTemperatureModuleDef = { labwareOffset: { x: 5, y: 5, z: 5 }, moduleId: 'someTempModule', - model: 'temperatureModuleV2' as ModuleModel, - type: 'temperatureModuleType' as ModuleType, + model: 'temperatureModuleV2', + type: 'temperatureModuleType', compatibleWith: ['temperatureModuleV1'], } describe('useModuleMatchResults', () => { @@ -51,7 +51,7 @@ describe('useModuleMatchResults', () => { .calledWith(mockConnectedRobot.name) .mockReturnValue(mockConnectedRobot) when(mockUseModuleRenderInfoForProtocolById) - .calledWith(mockConnectedRobot.name, '1') + .calledWith('1') .mockReturnValue({}) when(mockUseAttachedModules) @@ -67,20 +67,21 @@ describe('useModuleMatchResults', () => { when(mockUseAttachedModules).calledWith().mockReturnValue([]) const moduleId = 'fakeMagBlockId' when(mockUseModuleRenderInfoForProtocolById) - .calledWith(mockConnectedRobot.name, '1') + .calledWith('1') .mockReturnValue({ [moduleId]: { moduleId: moduleId, x: 0, y: 0, z: 0, - moduleDef: mockMagneticBlockDef as any, + moduleDef: (mockMagneticBlockDef as unknown) as ModuleDefinition, nestedLabwareDef: null, nestedLabwareId: null, nestedLabwareDisplayName: null, protocolLoadOrder: 0, attachedModuleMatch: null, slotName: '1', + conflictedFixture: null, }, }) @@ -94,7 +95,7 @@ describe('useModuleMatchResults', () => { it('should return 1 missing moduleId if requested model not attached', () => { const moduleId = 'fakeMagModuleId' when(mockUseModuleRenderInfoForProtocolById) - .calledWith(mockConnectedRobot.name, '1') + .calledWith('1') .mockReturnValue({ [moduleId]: { moduleId: moduleId, @@ -108,6 +109,7 @@ describe('useModuleMatchResults', () => { protocolLoadOrder: 0, attachedModuleMatch: null, slotName: '1', + conflictedFixture: null, }, }) when(mockUseAttachedModules).calledWith().mockReturnValue([]) @@ -121,20 +123,21 @@ describe('useModuleMatchResults', () => { it('should return no missing moduleId if compatible model is attached', () => { const moduleId = 'someTempModule' when(mockUseModuleRenderInfoForProtocolById) - .calledWith(mockConnectedRobot.name, '1') + .calledWith('1') .mockReturnValue({ [moduleId]: { moduleId: moduleId, x: 0, y: 0, z: 0, - moduleDef: mockTemperatureModuleDef as any, + moduleDef: (mockTemperatureModuleDef as unknown) as ModuleDefinition, nestedLabwareDef: null, nestedLabwareId: null, nestedLabwareDisplayName: null, protocolLoadOrder: 0, attachedModuleMatch: null, slotName: '1', + conflictedFixture: null, }, }) @@ -147,23 +150,24 @@ describe('useModuleMatchResults', () => { it('should return one missing moduleId if nocompatible model is attached', () => { const moduleId = 'someTempModule' when(mockUseModuleRenderInfoForProtocolById) - .calledWith(mockConnectedRobot.name, '1') + .calledWith('1') .mockReturnValue({ [moduleId]: { moduleId: moduleId, x: 0, y: 0, z: 0, - moduleDef: { + moduleDef: ({ ...mockTemperatureModuleDef, compatibleWith: ['fakeModuleModel'], - } as any, + } as unknown) as ModuleDefinition, nestedLabwareDef: null, nestedLabwareId: null, nestedLabwareDisplayName: null, protocolLoadOrder: 0, attachedModuleMatch: null, slotName: '1', + conflictedFixture: null, }, }) diff --git a/app/src/organisms/Devices/hooks/index.ts b/app/src/organisms/Devices/hooks/index.ts index 6fd6b9bcc6d..f8cdeaa68e8 100644 --- a/app/src/organisms/Devices/hooks/index.ts +++ b/app/src/organisms/Devices/hooks/index.ts @@ -5,19 +5,20 @@ export * from './useDeckCalibrationData' export * from './useDeckCalibrationStatus' export * from './useDownloadRunLog' export * from './useCalibrationTaskList' -export * from './useIsOT3' +export * from './useIsFlex' export * from './useIsRobotBusy' export * from './useIsRobotViewable' -export * from './useLabwareRenderInfoForRunById' export * from './useLights' export * from './useLEDLights' export * from './useLPCDisabledReason' export * from './useLPCSuccessToast' export * from './useModuleRenderInfoForProtocolById' +export * from './useModuleCalibrationStatus' export * from './usePipetteOffsetCalibrations' export * from './usePipetteOffsetCalibration' export * from './useProtocolDetailsForRun' export * from './useRobot' +export * from './useRobotType' export * from './useRunCalibrationStatus' export * from './useRunCreatedAtTimestamp' export * from './useRunHasStarted' diff --git a/app/src/organisms/Devices/hooks/useAttachedModules.ts b/app/src/organisms/Devices/hooks/useAttachedModules.ts index 0fd94d4d4eb..219482ce52e 100644 --- a/app/src/organisms/Devices/hooks/useAttachedModules.ts +++ b/app/src/organisms/Devices/hooks/useAttachedModules.ts @@ -1,8 +1,11 @@ import { useModulesQuery } from '@opentrons/react-api-client' -import type { AttachedModule } from '@opentrons/api-client' +import type { UseQueryOptions } from 'react-query' +import type { AttachedModule, Modules } from '@opentrons/api-client' -export function useAttachedModules(): AttachedModule[] { - const attachedModulesResponse = useModulesQuery() +export function useAttachedModules( + options: UseQueryOptions = {} +): AttachedModule[] { + const attachedModulesResponse = useModulesQuery({ ...options }) return attachedModulesResponse.data?.data || [] } diff --git a/app/src/organisms/Devices/hooks/useIsOT3.ts b/app/src/organisms/Devices/hooks/useIsFlex.ts similarity index 85% rename from app/src/organisms/Devices/hooks/useIsOT3.ts rename to app/src/organisms/Devices/hooks/useIsFlex.ts index d28f4d47351..bb78712578a 100644 --- a/app/src/organisms/Devices/hooks/useIsOT3.ts +++ b/app/src/organisms/Devices/hooks/useIsFlex.ts @@ -7,7 +7,7 @@ import { import type { State } from '../../../redux/types' -export function useIsOT3(robotName: string): boolean { +export function useIsFlex(robotName: string): boolean { const robotModel = useSelector((state: State) => getRobotModelByName(state, robotName) ) diff --git a/app/src/organisms/Devices/hooks/useIsRobotBusy.ts b/app/src/organisms/Devices/hooks/useIsRobotBusy.ts index 7271e21f3f6..d867f78f123 100644 --- a/app/src/organisms/Devices/hooks/useIsRobotBusy.ts +++ b/app/src/organisms/Devices/hooks/useIsRobotBusy.ts @@ -1,11 +1,13 @@ import { useAllSessionsQuery, - useAllRunsQuery, useEstopQuery, useHost, } from '@opentrons/react-api-client' + +import { useNotifyCurrentMaintenanceRun } from '../../../resources/maintenance_runs/useNotifyCurrentMaintenanceRun' +import { useNotifyAllRunsQuery } from '../../../resources/runs/useNotifyAllRunsQuery' import { DISENGAGED } from '../../EmergencyStop' -import { useIsOT3 } from './useIsOT3' +import { useIsFlex } from './useIsFlex' const ROBOT_STATUS_POLL_MS = 30000 @@ -18,20 +20,25 @@ export function useIsRobotBusy( const { poll } = options const queryOptions = poll ? { refetchInterval: ROBOT_STATUS_POLL_MS } : {} const robotHasCurrentRun = - useAllRunsQuery({}, queryOptions)?.data?.links?.current != null + useNotifyAllRunsQuery({}, queryOptions)?.data?.links?.current != null + const { data: maintenanceRunData } = useNotifyCurrentMaintenanceRun({ + refetchInterval: poll ? ROBOT_STATUS_POLL_MS : false, + }) + const isMaintenanceRunExisting = maintenanceRunData?.data?.id != null const allSessionsQueryResponse = useAllSessionsQuery(queryOptions) const host = useHost() const robotName = host?.robotName - const isOT3 = useIsOT3(robotName ?? '') + const isFlex = useIsFlex(robotName ?? '') const { data: estopStatus, error: estopError } = useEstopQuery({ ...queryOptions, - enabled: isOT3, + enabled: isFlex, }) return ( robotHasCurrentRun || + isMaintenanceRunExisting || (allSessionsQueryResponse?.data?.data != null && allSessionsQueryResponse?.data?.data?.length !== 0) || - (isOT3 && estopStatus?.data.status !== DISENGAGED && estopError == null) + (isFlex && estopStatus?.data.status !== DISENGAGED && estopError == null) ) } diff --git a/app/src/organisms/Devices/hooks/useLabwareRenderInfoForRunById.ts b/app/src/organisms/Devices/hooks/useLabwareRenderInfoForRunById.ts deleted file mode 100644 index 726493a63ac..00000000000 --- a/app/src/organisms/Devices/hooks/useLabwareRenderInfoForRunById.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { getDeckDefFromRobotType } from '@opentrons/shared-data' -import { getLabwareRenderInfo } from '../ProtocolRun/utils/getLabwareRenderInfo' -import { useMostRecentCompletedAnalysis } from '../../LabwarePositionCheck/useMostRecentCompletedAnalysis' -import { useProtocolDetailsForRun, useStoredProtocolAnalysis } from '.' - -import type { LabwareRenderInfoById } from '../ProtocolRun/utils/getLabwareRenderInfo' - -export function useLabwareRenderInfoForRunById( - runId: string -): LabwareRenderInfoById { - const { robotType } = useProtocolDetailsForRun(runId) - const robotProtocolAnalysis = useMostRecentCompletedAnalysis(runId) - - const storedProtocolAnalysis = useStoredProtocolAnalysis(runId) - const protocolData = robotProtocolAnalysis ?? storedProtocolAnalysis - const deckDef = getDeckDefFromRobotType(robotType) - - return protocolData != null ? getLabwareRenderInfo(protocolData, deckDef) : {} -} diff --git a/app/src/organisms/Devices/hooks/useLastRunCommandKey.ts b/app/src/organisms/Devices/hooks/useLastRunCommandKey.ts index 04299f0bbae..15b35c5f1ed 100644 --- a/app/src/organisms/Devices/hooks/useLastRunCommandKey.ts +++ b/app/src/organisms/Devices/hooks/useLastRunCommandKey.ts @@ -10,6 +10,9 @@ import { RUN_STATUS_STOP_REQUESTED, } from '@opentrons/api-client' +import type { UseQueryOptions } from 'react-query' +import type { CommandsData } from '@opentrons/api-client' + const LIVE_RUN_STATUSES = [ RUN_STATUS_IDLE, RUN_STATUS_PAUSED, @@ -21,18 +24,23 @@ const LIVE_RUN_STATUSES = [ ] const LIVE_RUN_COMMANDS_POLL_MS = 3000 -export function useLastRunCommandKey(runId: string): string | null { +export function useLastRunCommandKey( + runId: string, + options: UseQueryOptions = {} +): string | null { const runStatus = useRunStatus(runId) const { data: commandsData } = useAllCommandsQuery( runId, { cursor: null, pageLength: 1 }, { + ...options, refetchInterval: runStatus != null && LIVE_RUN_STATUSES.includes(runStatus) - ? LIVE_RUN_COMMANDS_POLL_MS + ? options.refetchInterval ?? LIVE_RUN_COMMANDS_POLL_MS : Infinity, } ) + return commandsData?.data?.[0]?.intent !== 'setup' ? commandsData?.links?.current?.meta?.key ?? commandsData?.data?.[0]?.key ?? diff --git a/app/src/organisms/Devices/hooks/useModuleCalibrationStatus.ts b/app/src/organisms/Devices/hooks/useModuleCalibrationStatus.ts new file mode 100644 index 00000000000..e8bddaaeadb --- /dev/null +++ b/app/src/organisms/Devices/hooks/useModuleCalibrationStatus.ts @@ -0,0 +1,40 @@ +import omitBy from 'lodash/omitBy' +import { MAGNETIC_BLOCK_TYPE } from '@opentrons/shared-data' +import { useModuleRenderInfoForProtocolById } from './useModuleRenderInfoForProtocolById' +import { ProtocolCalibrationStatus } from './useRunCalibrationStatus' +import { useIsFlex } from './useIsFlex' + +export function useModuleCalibrationStatus( + robotName: string, + runId: string +): ProtocolCalibrationStatus { + const isFlex = useIsFlex(robotName) + // TODO: can probably use getProtocolModulesInfo but in a rush to get out 7.0.1 + const moduleRenderInfoForProtocolById = omitBy( + useModuleRenderInfoForProtocolById(runId), + moduleRenderInfo => + moduleRenderInfo.moduleDef.moduleType === MAGNETIC_BLOCK_TYPE + ) + + // only check module calibration for Flex + if (!isFlex) { + return { complete: true } + } + + const moduleInfoKeys = Object.keys(moduleRenderInfoForProtocolById) + if (moduleInfoKeys.length === 0) { + return { complete: true } + } + const moduleData = moduleInfoKeys.map( + key => moduleRenderInfoForProtocolById[key] + ) + if ( + moduleData.some( + m => m.attachedModuleMatch?.moduleOffset?.last_modified == null + ) + ) { + return { complete: false, reason: 'calibrate_module_failure_reason' } + } else { + return { complete: true } + } +} diff --git a/app/src/organisms/Devices/hooks/useModuleRenderInfoForProtocolById.ts b/app/src/organisms/Devices/hooks/useModuleRenderInfoForProtocolById.ts index 8d5c9208220..73a879d32e4 100644 --- a/app/src/organisms/Devices/hooks/useModuleRenderInfoForProtocolById.ts +++ b/app/src/organisms/Devices/hooks/useModuleRenderInfoForProtocolById.ts @@ -1,41 +1,52 @@ import { checkModuleCompatibility, + FLEX_ROBOT_TYPE, + getCutoutIdForSlotName, getDeckDefFromRobotType, + MAGNETIC_BLOCK_TYPE, + SINGLE_SLOT_FIXTURES, + STAGING_AREA_RIGHT_SLOT_FIXTURE, + THERMOCYCLER_MODULE_TYPE, } from '@opentrons/shared-data' +import { useDeckConfigurationQuery } from '@opentrons/react-api-client/src/deck_configuration' import { getProtocolModulesInfo } from '../ProtocolRun/utils/getProtocolModulesInfo' -import { - useAttachedModules, - useProtocolDetailsForRun, - useStoredProtocolAnalysis, -} from '.' import { useMostRecentCompletedAnalysis } from '../../LabwarePositionCheck/useMostRecentCompletedAnalysis' -import type { ProtocolModuleInfo } from '../ProtocolRun/utils/getProtocolModulesInfo' +import { useAttachedModules } from './useAttachedModules' +import { useStoredProtocolAnalysis } from './useStoredProtocolAnalysis' + +import type { CutoutConfig } from '@opentrons/shared-data' import type { AttachedModule } from '../../../redux/modules/types' +import type { ProtocolModuleInfo } from '../ProtocolRun/utils/getProtocolModulesInfo' export interface ModuleRenderInfoForProtocol extends ProtocolModuleInfo { attachedModuleMatch: AttachedModule | null + conflictedFixture: CutoutConfig | null } export interface ModuleRenderInfoById { [moduleId: string]: ModuleRenderInfoForProtocol } +const DECK_CONFIG_REFETCH_INTERVAL = 5000 + export function useModuleRenderInfoForProtocolById( - robotName: string, runId: string ): ModuleRenderInfoById { - const { robotType } = useProtocolDetailsForRun(runId) const robotProtocolAnalysis = useMostRecentCompletedAnalysis(runId) - + const { data: deckConfig } = useDeckConfigurationQuery({ + refetchInterval: DECK_CONFIG_REFETCH_INTERVAL, + }) const storedProtocolAnalysis = useStoredProtocolAnalysis(runId) - const protocolData = robotProtocolAnalysis ?? storedProtocolAnalysis + const protocolAnalysis = robotProtocolAnalysis ?? storedProtocolAnalysis const attachedModules = useAttachedModules() - if (protocolData == null) return {} + if (protocolAnalysis == null) return {} - const deckDef = getDeckDefFromRobotType(robotType) + const deckDef = getDeckDefFromRobotType( + protocolAnalysis.robotType ?? FLEX_ROBOT_TYPE + ) - const protocolModulesInfo = getProtocolModulesInfo(protocolData, deckDef) + const protocolModulesInfo = getProtocolModulesInfo(protocolAnalysis, deckDef) const protocolModulesInfoInLoadOrder = protocolModulesInfo.sort( (modA, modB) => modA.protocolLoadOrder - modB.protocolLoadOrder @@ -51,20 +62,47 @@ export function useModuleRenderInfoForProtocolById( protocolMod.moduleDef.model ) && !matchedAmod.find(m => m === attachedMod) ) ?? null + + const cutoutIdForSlotName = getCutoutIdForSlotName( + protocolMod.slotName, + deckDef + ) + + const isMagneticBlockModule = + protocolMod.moduleDef.moduleType === MAGNETIC_BLOCK_TYPE + + const isThermocycler = + protocolMod.moduleDef.moduleType === THERMOCYCLER_MODULE_TYPE + + const conflictedFixture = + deckConfig?.find( + fixture => + (fixture.cutoutId === cutoutIdForSlotName || + // special-case A1 for the thermocycler to require a single slot fixture + (isThermocycler && fixture.cutoutId === 'cutoutA1')) && + fixture.cutoutFixtureId != null && + // do not generate a conflict for single slot fixtures, because modules are not yet fixtures + !SINGLE_SLOT_FIXTURES.includes(fixture.cutoutFixtureId) && + // special case the magnetic module because unlike other modules it sits in a slot that can also be provided by a staging area fixture + (!isMagneticBlockModule || + fixture.cutoutFixtureId !== STAGING_AREA_RIGHT_SLOT_FIXTURE) + ) ?? null + if (compatibleAttachedModule !== null) { matchedAmod = [...matchedAmod, compatibleAttachedModule] return { ...protocolMod, attachedModuleMatch: compatibleAttachedModule, + conflictedFixture, } } return { ...protocolMod, attachedModuleMatch: null, + conflictedFixture, } } ) - return allModuleRenderInfo.reduce( (acc, moduleInfo) => ({ ...acc, diff --git a/app/src/organisms/Devices/hooks/useProtocolAnalysisErrors.ts b/app/src/organisms/Devices/hooks/useProtocolAnalysisErrors.ts index 8e50c6b153c..996c44989d4 100644 --- a/app/src/organisms/Devices/hooks/useProtocolAnalysisErrors.ts +++ b/app/src/organisms/Devices/hooks/useProtocolAnalysisErrors.ts @@ -2,9 +2,10 @@ import last from 'lodash/last' import { useProtocolAnalysisAsDocumentQuery, useProtocolQuery, - useRunQuery, } from '@opentrons/react-api-client' +import { useNotifyRunQuery } from '../../../resources/runs/useNotifyRunQuery' + import { AnalysisError } from '@opentrons/shared-data' export interface ProtocolAnalysisErrors { @@ -14,7 +15,7 @@ export interface ProtocolAnalysisErrors { export function useProtocolAnalysisErrors( runId: string | null ): ProtocolAnalysisErrors { - const { data: runRecord } = useRunQuery(runId, { staleTime: Infinity }) + const { data: runRecord } = useNotifyRunQuery(runId, { staleTime: Infinity }) const protocolId = runRecord?.data?.protocolId ?? null const { data: protocolData } = useProtocolQuery(protocolId) const { diff --git a/app/src/organisms/Devices/hooks/useProtocolDetailsForRun.ts b/app/src/organisms/Devices/hooks/useProtocolDetailsForRun.ts index ec61b88967f..f610b623d5c 100644 --- a/app/src/organisms/Devices/hooks/useProtocolDetailsForRun.ts +++ b/app/src/organisms/Devices/hooks/useProtocolDetailsForRun.ts @@ -1,12 +1,13 @@ import * as React from 'react' import last from 'lodash/last' -import { getRobotTypeFromLoadedLabware } from '@opentrons/shared-data' +import { FLEX_ROBOT_TYPE } from '@opentrons/shared-data' import { useProtocolQuery, - useRunQuery, useProtocolAnalysisAsDocumentQuery, } from '@opentrons/react-api-client' +import { useNotifyRunQuery } from '../../../resources/runs/useNotifyRunQuery' + import type { RobotType, CompletedProtocolAnalysis, @@ -25,7 +26,7 @@ export interface ProtocolDetails { export function useProtocolDetailsForRun( runId: string | null ): ProtocolDetails { - const { data: runRecord } = useRunQuery(runId, { staleTime: Infinity }) + const { data: runRecord } = useNotifyRunQuery(runId, { staleTime: Infinity }) const protocolId = runRecord?.data?.protocolId ?? null const [ isPollingProtocolAnalyses, @@ -61,10 +62,10 @@ export function useProtocolDetailsForRun( protocolData: mostRecentAnalysis ?? null, protocolKey: protocolRecord?.data.key ?? null, isProtocolAnalyzing: protocolRecord != null && mostRecentAnalysis == null, - // this should be deleted as soon as analysis tells us intended robot type robotType: - mostRecentAnalysis?.status === 'completed' - ? getRobotTypeFromLoadedLabware(mostRecentAnalysis.labware) - : 'OT-2 Standard', + protocolRecord?.data.robotType ?? + (mostRecentAnalysis?.status === 'completed' + ? mostRecentAnalysis?.robotType ?? FLEX_ROBOT_TYPE + : FLEX_ROBOT_TYPE), } } diff --git a/app/src/organisms/Devices/hooks/useProtocolRunAnalyticsData.ts b/app/src/organisms/Devices/hooks/useProtocolRunAnalyticsData.ts index 39b61cea486..653e352384c 100644 --- a/app/src/organisms/Devices/hooks/useProtocolRunAnalyticsData.ts +++ b/app/src/organisms/Devices/hooks/useProtocolRunAnalyticsData.ts @@ -46,7 +46,9 @@ export const parseProtocolRunAnalyticsData = ( protocolAuthor: protocolAuthor !== '' ? protocolAuthor : '', protocolText: protocolText !== '' ? protocolText : '', robotType: - protocolAnalysis?.robotType != null ? protocolAnalysis?.robotType : '', + protocolAnalysis?.robotType != null + ? protocolAnalysis?.robotType + : storedProtocol?.mostRecentAnalysis?.robotType, }, runTime: startedAt != null ? formatInterval(startedAt, Date()) : EMPTY_TIMESTAMP, diff --git a/app/src/organisms/Devices/hooks/useRobotAnalyticsData.ts b/app/src/organisms/Devices/hooks/useRobotAnalyticsData.ts index c1289e0da83..6ca8c95fbca 100644 --- a/app/src/organisms/Devices/hooks/useRobotAnalyticsData.ts +++ b/app/src/organisms/Devices/hooks/useRobotAnalyticsData.ts @@ -4,7 +4,6 @@ import { useSelector, useDispatch } from 'react-redux' import { useRobot } from './' import { getAttachedPipettes } from '../../../redux/pipettes' import { getRobotSettings, fetchSettings } from '../../../redux/robot-settings' -import { FF_PREFIX } from '../../../redux/analytics' import { getRobotApiVersion, getRobotFirmwareVersion, @@ -13,6 +12,8 @@ import { import type { State, Dispatch } from '../../../redux/types' import type { RobotAnalyticsData } from '../../../redux/analytics/types' +const FF_PREFIX = 'robotFF_' + /** * * @param {string} robotName @@ -45,10 +46,10 @@ export function useRobotAnalyticsData( }), // @ts-expect-error RobotAnalyticsData type needs boolean values should it be boolean | string { - robotApiServerVersion: getRobotApiVersion(robot) || '', - robotSmoothieVersion: getRobotFirmwareVersion(robot) || '', - robotLeftPipette: pipettes.left?.model || '', - robotRightPipette: pipettes.right?.model || '', + robotApiServerVersion: getRobotApiVersion(robot) ?? '', + robotSmoothieVersion: getRobotFirmwareVersion(robot) ?? '', + robotLeftPipette: pipettes.left?.model ?? '', + robotRightPipette: pipettes.right?.model ?? '', } ) } diff --git a/app/src/organisms/Devices/hooks/useRobotType.ts b/app/src/organisms/Devices/hooks/useRobotType.ts new file mode 100644 index 00000000000..324e7af911a --- /dev/null +++ b/app/src/organisms/Devices/hooks/useRobotType.ts @@ -0,0 +1,8 @@ +import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE } from '@opentrons/shared-data' +import { useIsFlex } from './useIsFlex' +import type { RobotType } from '@opentrons/shared-data' + +export function useRobotType(robotName: string): RobotType { + const isFlex = useIsFlex(robotName) + return isFlex ? FLEX_ROBOT_TYPE : OT2_ROBOT_TYPE +} diff --git a/app/src/organisms/Devices/hooks/useRunCalibrationStatus.ts b/app/src/organisms/Devices/hooks/useRunCalibrationStatus.ts index dbb0ee19812..27f16c107fe 100644 --- a/app/src/organisms/Devices/hooks/useRunCalibrationStatus.ts +++ b/app/src/organisms/Devices/hooks/useRunCalibrationStatus.ts @@ -1,7 +1,7 @@ import { MATCH, INEXACT_MATCH } from '../../../redux/pipettes' import { useDeckCalibrationStatus, - useIsOT3, + useIsFlex, useRunPipetteInfoByMount, useStoredProtocolAnalysis, } from '.' @@ -23,6 +23,7 @@ export interface ProtocolCalibrationStatus { | 'calibrate_tiprack_failure_reason' | 'calibrate_pipette_failure_reason' | 'calibrate_gripper_failure_reason' + | 'calibrate_module_failure_reason' | 'attach_pipette_failure_reason' | 'attach_gripper_failure_reason' } @@ -33,12 +34,12 @@ export function useRunCalibrationStatus( ): ProtocolCalibrationStatus { const deckCalStatus = useDeckCalibrationStatus(robotName) const runPipetteInfoByMount = useRunPipetteInfoByMount(runId) - const isOT3 = useIsOT3(robotName) + const isFlex = useIsFlex(robotName) const mostRecentAnalysis = useMostRecentCompletedAnalysis(runId) const storedProtocolAnalysis = useStoredProtocolAnalysis(runId) const { data: instrumentsQueryData = null } = useInstrumentsQuery() - return isOT3 + return isFlex ? getFlexRunCalibrationStatus( mostRecentAnalysis, storedProtocolAnalysis, diff --git a/app/src/organisms/Devices/hooks/useRunCreatedAtTimestamp.ts b/app/src/organisms/Devices/hooks/useRunCreatedAtTimestamp.ts index e49615ab99e..03def4f2a4a 100644 --- a/app/src/organisms/Devices/hooks/useRunCreatedAtTimestamp.ts +++ b/app/src/organisms/Devices/hooks/useRunCreatedAtTimestamp.ts @@ -1,9 +1,9 @@ -import { useRunQuery } from '@opentrons/react-api-client' import { formatTimestamp } from '../utils' import { EMPTY_TIMESTAMP } from '../constants' +import { useNotifyRunQuery } from '../../../resources/runs/useNotifyRunQuery' export function useRunCreatedAtTimestamp(runId: string | null): string { - const runRecord = useRunQuery(runId) + const runRecord = useNotifyRunQuery(runId) const createdAtTimestamp = runRecord?.data?.data.createdAt != null diff --git a/app/src/organisms/Devices/hooks/useRunPipetteInfoByMount.ts b/app/src/organisms/Devices/hooks/useRunPipetteInfoByMount.ts index f465848e913..9445bb3ab8b 100644 --- a/app/src/organisms/Devices/hooks/useRunPipetteInfoByMount.ts +++ b/app/src/organisms/Devices/hooks/useRunPipetteInfoByMount.ts @@ -12,17 +12,17 @@ import { useStoredProtocolAnalysis, } from '.' import { useMostRecentCompletedAnalysis } from '../../LabwarePositionCheck/useMostRecentCompletedAnalysis' -import type { LoadPipetteRunTimeCommand } from '@opentrons/shared-data/protocol/types/schemaV7/command/setup' -import type { PickUpTipRunTimeCommand } from '@opentrons/shared-data/protocol/types/schemaV7/command/pipetting' +import type { + PickUpTipRunTimeCommand, + LoadPipetteRunTimeCommand, + LabwareDefinition2, + PipetteNameSpecs, +} from '@opentrons/shared-data' import type { Mount, AttachedPipette, TipRackCalibrationData, } from '../../../redux/pipettes/types' -import type { - LabwareDefinition2, - PipetteNameSpecs, -} from '@opentrons/shared-data' const EMPTY_MOUNTS = { left: null, right: null } diff --git a/app/src/organisms/Devices/hooks/useStoredProtocolAnalysis.ts b/app/src/organisms/Devices/hooks/useStoredProtocolAnalysis.ts index 759aaf8fdfd..0a7571b1f6b 100644 --- a/app/src/organisms/Devices/hooks/useStoredProtocolAnalysis.ts +++ b/app/src/organisms/Devices/hooks/useStoredProtocolAnalysis.ts @@ -4,9 +4,10 @@ import { parseInitialLoadedLabwareEntity, parsePipetteEntity, } from '@opentrons/api-client' -import { useProtocolQuery, useRunQuery } from '@opentrons/react-api-client' +import { useProtocolQuery } from '@opentrons/react-api-client' import { getStoredProtocol } from '../../../redux/protocol-storage' +import { useNotifyRunQuery } from '../../../resources/runs/useNotifyRunQuery' import type { ProtocolAnalysisOutput } from '@opentrons/shared-data' import type { State } from '../../../redux/types' @@ -36,7 +37,7 @@ export const parseProtocolAnalysisOutput = ( export function useStoredProtocolAnalysis( runId: string | null ): ProtocolAnalysisOutput | null { - const { data: runRecord } = useRunQuery(runId, { staleTime: Infinity }) + const { data: runRecord } = useNotifyRunQuery(runId, { staleTime: Infinity }) const protocolId = runRecord?.data?.protocolId ?? null const { data: protocolRecord } = useProtocolQuery(protocolId, { diff --git a/app/src/organisms/Devices/hooks/useUnmatchedModulesForProtocol.ts b/app/src/organisms/Devices/hooks/useUnmatchedModulesForProtocol.ts index 5e6d52e292d..9c76e899c45 100644 --- a/app/src/organisms/Devices/hooks/useUnmatchedModulesForProtocol.ts +++ b/app/src/organisms/Devices/hooks/useUnmatchedModulesForProtocol.ts @@ -23,10 +23,7 @@ export function useUnmatchedModulesForProtocol( runId: string ): UnmatchedModuleResults { const robot = useRobot(robotName) - const moduleRenderInfoById = useModuleRenderInfoForProtocolById( - robotName, - runId - ) + const moduleRenderInfoById = useModuleRenderInfoForProtocolById(runId) const attachedModules = useAttachedModules() if (robot === null) { return { missingModuleIds: [], remainingAttachedModules: [] } diff --git a/app/src/organisms/Devices/utils.ts b/app/src/organisms/Devices/utils.ts index 723c299a844..a4d72e0d279 100644 --- a/app/src/organisms/Devices/utils.ts +++ b/app/src/organisms/Devices/utils.ts @@ -1,10 +1,15 @@ import { format, parseISO } from 'date-fns' +import { INCONSISTENT_PIPETTE_OFFSET } from '@opentrons/api-client' import type { FetchPipettesResponseBody, FetchPipettesResponsePipette, Mount, } from '../../redux/pipettes/types' -import type { PipetteOffsetCalibration } from '@opentrons/api-client' +import type { + Instruments, + PipetteData, + PipetteOffsetCalibration, +} from '@opentrons/api-client' /** * formats a string if it is in ISO 8601 date format @@ -68,3 +73,19 @@ export function getOffsetCalibrationForMount( ) } } + +export function getShowPipetteCalibrationWarning( + attachedInstruments?: Instruments +): boolean { + return ( + attachedInstruments?.data.some((i): i is PipetteData => { + const failuresList = + i.ok && i.data.calibratedOffset?.reasonability_check_failures != null + ? i.data.calibratedOffset?.reasonability_check_failures + : [] + if (failuresList.length > 0) { + return failuresList[0]?.kind === INCONSISTENT_PIPETTE_OFFSET + } else return false + }) ?? false + ) +} diff --git a/app/src/organisms/DropTipWizard/BeforeBeginning.tsx b/app/src/organisms/DropTipWizard/BeforeBeginning.tsx new file mode 100644 index 00000000000..aec456bd028 --- /dev/null +++ b/app/src/organisms/DropTipWizard/BeforeBeginning.tsx @@ -0,0 +1,261 @@ +import * as React from 'react' +import styled, { css } from 'styled-components' +import { useTranslation } from 'react-i18next' + +import { + Flex, + SPACING, + DIRECTION_COLUMN, + TYPOGRAPHY, + DIRECTION_ROW, + COLORS, + BORDERS, + JUSTIFY_CENTER, + ALIGN_CENTER, + RESPONSIVENESS, + JUSTIFY_FLEX_START, + DISPLAY_INLINE_BLOCK, + JUSTIFY_SPACE_BETWEEN, + PrimaryButton, + JUSTIFY_FLEX_END, + JUSTIFY_SPACE_AROUND, +} from '@opentrons/components' + +import { StyledText } from '../../atoms/text' +import { SmallButton, MediumButton } from '../../atoms/buttons' +import { InProgressModal } from '../../molecules/InProgressModal/InProgressModal' +// import { NeedHelpLink } from '../CalibrationPanels' + +import blowoutVideo from '../../assets/videos/droptip-wizard/Blowout-Liquid.webm' +import droptipVideo from '../../assets/videos/droptip-wizard/Drop-tip.webm' + +// TODO: get help link article URL +// const NEED_HELP_URL = '' + +interface BeforeBeginningProps { + setShouldDispenseLiquid: (shouldDispenseLiquid: boolean) => void + createdMaintenanceRunId: string | null + isOnDevice: boolean + isRobotMoving: boolean +} + +export const BeforeBeginning = ( + props: BeforeBeginningProps +): JSX.Element | null => { + const { + setShouldDispenseLiquid, + createdMaintenanceRunId, + isOnDevice, + isRobotMoving, + } = props + const { i18n, t } = useTranslation(['drop_tip_wizard', 'shared']) + const [flowType, setFlowType] = React.useState< + 'liquid_and_tips' | 'only_tips' | null + >(null) + + const handleProceed = (): void => { + setShouldDispenseLiquid(flowType === 'liquid_and_tips') + } + + if (isRobotMoving || createdMaintenanceRunId == null) { + return ( + + ) + } + + if (isOnDevice) { + return ( + + + + {t('before_you_begin_do_you_want_to_blowout')} + + + setFlowType('liquid_and_tips')} + buttonText={i18n.format(t('yes_blow_out_liquid'), 'capitalize')} + justifyContent={JUSTIFY_FLEX_START} + paddingLeft={SPACING.spacing24} + /> + + + { + setFlowType('only_tips') + }} + buttonText={i18n.format( + t('no_proceed_to_drop_tip'), + 'capitalize' + )} + justifyContent={JUSTIFY_FLEX_START} + paddingLeft={SPACING.spacing24} + /> + + + + + + + ) + } else { + return ( + + {t('before_you_begin_do_you_want_to_blowout')} + + { + setFlowType('liquid_and_tips') + }} + css={ + flowType === 'liquid_and_tips' + ? SELECTED_OPTIONS_STYLE + : UNSELECTED_OPTIONS_STYLE + } + > + + {t('yes_blow_out_liquid')} + + setFlowType('only_tips')} + css={ + flowType === 'only_tips' + ? SELECTED_OPTIONS_STYLE + : UNSELECTED_OPTIONS_STYLE + } + > + + {t('no_proceed_to_drop_tip')} + + + + {/* */} + + {i18n.format(t('shared:continue'), 'capitalize')} + + + + ) + } +} + +const UNSELECTED_OPTIONS_STYLE = css` + background-color: ${COLORS.white}; + border: 1px solid ${COLORS.grey30}; + border-radius: ${BORDERS.radiusSoftCorners}; + height: 12.5625rem; + width: 14.5625rem; + cursor: pointer; + flex-direction: ${DIRECTION_COLUMN}; + justify-content: ${JUSTIFY_CENTER}; + align-items: ${ALIGN_CENTER}; + grid-gap: ${SPACING.spacing8} + + &:hover { + border: 1px solid ${COLORS.grey60}; + } + + @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { + flex-direction: ${DIRECTION_ROW}; + justify-content: ${JUSTIFY_FLEX_START}; + background-color: ${COLORS.blue35}; + border-width: 0; + border-radius: ${BORDERS.borderRadiusSize4}; + padding: ${SPACING.spacing24}; + height: 5.25rem; + width: 57.8125rem; + + &:hover { + border-width: 0px; + } + } +` +const SELECTED_OPTIONS_STYLE = css` + ${UNSELECTED_OPTIONS_STYLE} + border: 1px solid ${COLORS.blue50}; + + &:hover { + border: 1px solid ${COLORS.blue50}; + } + + @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { + border-width: 0px; + background-color: ${COLORS.blue50}; + color: ${COLORS.white}; + + &:hover { + border-width: 0px; + background-color: ${COLORS.blue50}; + } + } +` + +const Title = styled.h1` + ${TYPOGRAPHY.h1Default}; + margin-bottom: ${SPACING.spacing8}; + @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { + ${TYPOGRAPHY.level4HeaderSemiBold}; + margin-bottom: 0; + height: ${SPACING.spacing40}; + display: ${DISPLAY_INLINE_BLOCK}; + } +` + +const ODD_TITLE_STYLE = css` + ${TYPOGRAPHY.level4HeaderSemiBold} + margin-bottom: ${SPACING.spacing16}; +` + +const TILE_CONTAINER_STYLE = css` + flex-direction: ${DIRECTION_COLUMN}; + justify-content: ${JUSTIFY_SPACE_BETWEEN}; + padding: ${SPACING.spacing32}; + @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { + height: 29.5rem; + } +` diff --git a/app/src/organisms/DropTipWizard/ChooseLocation.tsx b/app/src/organisms/DropTipWizard/ChooseLocation.tsx new file mode 100644 index 00000000000..566ce5d9040 --- /dev/null +++ b/app/src/organisms/DropTipWizard/ChooseLocation.tsx @@ -0,0 +1,196 @@ +import * as React from 'react' +import { css } from 'styled-components' +import { useTranslation } from 'react-i18next' + +import { + Btn, + Flex, + COLORS, + DIRECTION_COLUMN, + DIRECTION_ROW, + RESPONSIVENESS, + JUSTIFY_SPACE_BETWEEN, + JUSTIFY_CENTER, + ALIGN_FLEX_END, + ALIGN_CENTER, + PrimaryButton, + useDeckLocationSelect, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' +import { getDeckDefFromRobotType } from '@opentrons/shared-data' + +import { SmallButton } from '../../atoms/buttons' +import { StyledText } from '../../atoms/text' +import { InProgressModal } from '../../molecules/InProgressModal/InProgressModal' +// import { NeedHelpLink } from '../CalibrationPanels' +import { TwoUpTileLayout } from '../LabwarePositionCheck/TwoUpTileLayout' + +import type { CommandData } from '@opentrons/api-client' +import type { AddressableAreaName, RobotType } from '@opentrons/shared-data' + +// TODO: get help link article URL +// const NEED_HELP_URL = '' + +interface ChooseLocationProps { + handleProceed: () => void + handleGoBack: () => void + title: string + body: string | JSX.Element + robotType: RobotType + moveToAddressableArea: ( + addressableArea: AddressableAreaName + ) => Promise + isRobotMoving: boolean + isOnDevice: boolean + setErrorMessage: (arg0: string) => void +} + +export const ChooseLocation = ( + props: ChooseLocationProps +): JSX.Element | null => { + const { + handleProceed, + handleGoBack, + title, + body, + robotType, + moveToAddressableArea, + isRobotMoving, + isOnDevice, + setErrorMessage, + } = props + const { i18n, t } = useTranslation(['drop_tip_wizard', 'shared']) + const deckDef = getDeckDefFromRobotType(robotType) + const { DeckLocationSelect, selectedLocation } = useDeckLocationSelect( + robotType + ) + + const handleConfirmPosition = (): void => { + const deckSlot = deckDef.locations.addressableAreas.find( + l => l.id === selectedLocation.slotName + )?.id + + if (deckSlot != null) { + moveToAddressableArea(deckSlot) + .then(() => handleProceed()) + .catch(e => setErrorMessage(`${e.message}`)) + } + } + + if (isRobotMoving) { + return + } + + if (isOnDevice) { + return ( + + + + + {title} + + {body} + + + {DeckLocationSelect} + + + + handleGoBack()}> + + {t('shared:go_back')} + + + + + + ) + } else { + return ( + + + handleGoBack()}> + + {t('shared:go_back')} + + + + {i18n.format(t('move_to_slot'), 'capitalize')} + + + } + /> +
+ ) + } +} + +const TILE_CONTAINER_STYLE = css` + flex-direction: ${DIRECTION_COLUMN}; + justify-content: ${JUSTIFY_SPACE_BETWEEN}; + height: 24.625rem; + @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { + height: 29.5rem; + } +` +const GO_BACK_BUTTON_STYLE = css` + ${TYPOGRAPHY.pSemiBold}; + color: ${COLORS.grey50}; + + &:hover { + opacity: 70%; + } + + @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { + font-weight: ${TYPOGRAPHY.fontWeightSemiBold}; + font-size: ${TYPOGRAPHY.fontSize22}; + padding-left: 0rem; + &:hover { + opacity: 100%; + } + } +` + +const ALIGN_BUTTONS = css` + align-items: ${ALIGN_FLEX_END}; + + @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { + align-items: ${ALIGN_CENTER}; + } +` diff --git a/app/src/organisms/DropTipWizard/ExitConfirmation.tsx b/app/src/organisms/DropTipWizard/ExitConfirmation.tsx new file mode 100644 index 00000000000..805457d876c --- /dev/null +++ b/app/src/organisms/DropTipWizard/ExitConfirmation.tsx @@ -0,0 +1,72 @@ +import * as React from 'react' +import { useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' +import { + Flex, + COLORS, + SPACING, + AlertPrimaryButton, + SecondaryButton, + JUSTIFY_FLEX_END, +} from '@opentrons/components' +import { getIsOnDevice } from '../../redux/config' +import { SimpleWizardBody } from '../../molecules/SimpleWizardBody' +import { InProgressModal } from '../../molecules/InProgressModal/InProgressModal' +import { SmallButton } from '../../atoms/buttons' + +interface ExitConfirmationProps { + handleExit: () => void + handleGoBack: () => void + isRobotMoving: boolean +} + +export function ExitConfirmation(props: ExitConfirmationProps): JSX.Element { + const { handleGoBack, handleExit, isRobotMoving } = props + const { i18n, t } = useTranslation(['drop_tip_wizard', 'shared']) + + const flowTitle = t('drop_tips') + const isOnDevice = useSelector(getIsOnDevice) + + if (isRobotMoving) { + return + } + + return ( + + {isOnDevice ? ( + + + + + ) : ( + <> + + {t('shared:go_back')} + + + {i18n.format(t('shared:exit'), 'capitalize')} + + + )} + + ) +} diff --git a/app/src/organisms/DropTipWizard/JogToPosition.tsx b/app/src/organisms/DropTipWizard/JogToPosition.tsx new file mode 100644 index 00000000000..45f6628e934 --- /dev/null +++ b/app/src/organisms/DropTipWizard/JogToPosition.tsx @@ -0,0 +1,284 @@ +import * as React from 'react' +import styled from 'styled-components' +import { useTranslation } from 'react-i18next' +import { POSITION_AND_BLOWOUT } from './constants' +import { + Flex, + DIRECTION_COLUMN, + ALIGN_CENTER, + RESPONSIVENESS, + JUSTIFY_SPACE_BETWEEN, + JUSTIFY_CENTER, + PrimaryButton, + SecondaryButton, + SPACING, + ALIGN_FLEX_START, + JUSTIFY_FLEX_END, + TYPOGRAPHY, + COLORS, + TEXT_ALIGN_CENTER, + Icon, + ALIGN_FLEX_END, +} from '@opentrons/components' +// import { NeedHelpLink } from '../CalibrationPanels' +import { SmallButton } from '../../atoms/buttons' +import { Jog, JogControls } from '../../molecules/JogControls' +import { InProgressModal } from '../../molecules/InProgressModal/InProgressModal' +import { StyledText } from '../../atoms/text' +import { SimpleWizardBody } from '../../molecules/SimpleWizardBody' + +// TODO: get help link article URL +// const NEED_HELP_URL = '' + +const Header = styled.h1` + ${TYPOGRAPHY.h1Default} + @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { + ${TYPOGRAPHY.level4HeaderSemiBold} + } +` + +interface ConfirmPositionProps { + handlePipetteAction: () => void + handleGoBack: () => void + isOnDevice: boolean + currentStep: string +} + +const ConfirmPosition = (props: ConfirmPositionProps): JSX.Element | null => { + const { handlePipetteAction, handleGoBack, isOnDevice, currentStep } = props + const { i18n, t } = useTranslation(['drop_tip_wizard', 'shared']) + const flowTitle = t('drop_tips') + + if (isOnDevice) { + return ( + + + + + + + {currentStep === POSITION_AND_BLOWOUT + ? t('confirm_blowout_location', { flow: flowTitle }) + : t('confirm_drop_tip_location', { flow: flowTitle })} + + + + + + + + ) + } else { + return ( + + + {/* */} + + + {t('shared:go_back')} + + + {currentStep === POSITION_AND_BLOWOUT + ? i18n.format(t('blowout_liquid'), 'capitalize') + : i18n.format(t('drop_tips'), 'capitalize')} + + + + + ) + } +} + +interface JogToPositionProps { + handleGoBack: () => void + handleJog: Jog + handleProceed: () => void + body: string + isRobotMoving: boolean + currentStep: string + isOnDevice: boolean +} + +export const JogToPosition = ( + props: JogToPositionProps +): JSX.Element | null => { + const { + handleGoBack, + handleJog, + handleProceed, + body, + isRobotMoving, + currentStep, + isOnDevice, + } = props + const { i18n, t } = useTranslation(['drop_tip_wizard', 'shared']) + const [ + showPositionConfirmation, + setShowPositionConfirmation, + ] = React.useState(false) + // Includes special case homing only present in this step. + const [isRobotInMotion, setIsRobotInMotion] = React.useState(isRobotMoving) + + const onGoBack = (): void => { + setIsRobotInMotion(() => true) + handleGoBack() + } + + if (showPositionConfirmation) { + return isRobotInMotion ? ( + + ) : ( + { + setIsRobotInMotion(true) + handleProceed() + }} + handleGoBack={() => setShowPositionConfirmation(false)} + isOnDevice={isOnDevice} + currentStep={currentStep} + /> + ) + } + + // Moving due to "Exit" or "Go back" click. + if (isRobotInMotion) { + return + } + + if (isOnDevice) { + return ( + + + + + + + + setShowPositionConfirmation(true)} + /> + + + + ) + } else { + return ( + + + +
+ {i18n.format(t('position_the_pipette'), 'capitalize')} +
+ {body} +
+ {/* no animations */} + +
+ <> + + + {/* */} + + + {t('shared:go_back')} + + setShowPositionConfirmation(true)}> + {t('shared:confirm_position')} + + + + +
+ ) + } +} diff --git a/app/src/organisms/DropTipWizard/Success.tsx b/app/src/organisms/DropTipWizard/Success.tsx new file mode 100644 index 00000000000..45daeb7fcdb --- /dev/null +++ b/app/src/organisms/DropTipWizard/Success.tsx @@ -0,0 +1,49 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { + COLORS, + PrimaryButton, + TEXT_TRANSFORM_CAPITALIZE, + JUSTIFY_FLEX_END, + Flex, +} from '@opentrons/components' +import { SimpleWizardBody } from '../../molecules/SimpleWizardBody' +import { InProgressModal } from '../../molecules/InProgressModal/InProgressModal' +import { SmallButton } from '../../atoms/buttons' + +interface SuccessProps { + message: string + proceedText: string + handleProceed: () => void + isExiting: boolean + isOnDevice: boolean +} +export const Success = (props: SuccessProps): JSX.Element => { + const { message, proceedText, handleProceed, isExiting, isOnDevice } = props + + const { i18n, t } = useTranslation(['drop_tip_wizard', 'shared']) + + if (isExiting) { + return + } + + return ( + + {isOnDevice ? ( + + + + ) : ( + {proceedText} + )} + + ) +} diff --git a/app/src/organisms/DropTipWizard/TipsAttachedModal.tsx b/app/src/organisms/DropTipWizard/TipsAttachedModal.tsx new file mode 100644 index 00000000000..1d18ec1b02b --- /dev/null +++ b/app/src/organisms/DropTipWizard/TipsAttachedModal.tsx @@ -0,0 +1,110 @@ +import * as React from 'react' +import { capitalize } from 'lodash' +import NiceModal, { useModal } from '@ebay/nice-modal-react' +import { Trans, useTranslation } from 'react-i18next' + +import { Flex, COLORS, SPACING, DIRECTION_COLUMN } from '@opentrons/components' + +import { useCloseCurrentRun } from '../ProtocolUpload/hooks' +import { SmallButton } from '../../atoms/buttons' +import { StyledText } from '../../atoms/text' +import { Modal } from '../../molecules/Modal' +import { DropTipWizard } from '.' + +import type { PipetteData } from '@opentrons/api-client' +import type { PipetteModelSpecs, RobotType } from '@opentrons/shared-data' +import type { ModalHeaderBaseProps } from '../../molecules/Modal/types' + +interface TipsAttachedModalProps { + mount: PipetteData['mount'] + instrumentModelSpecs: PipetteModelSpecs + robotType: RobotType + onCloseClick?: (arg0: any) => void +} + +export const handleTipsAttachedModal = ( + mount: TipsAttachedModalProps['mount'], + instrumentModelSpecs: TipsAttachedModalProps['instrumentModelSpecs'], + robotType: TipsAttachedModalProps['robotType'], + onCloseClick: TipsAttachedModalProps['onCloseClick'] +): Promise => { + return NiceModal.show(TipsAttachedModal, { + mount, + instrumentModelSpecs, + robotType, + onCloseClick, + }) +} + +const TipsAttachedModal = NiceModal.create( + (props: TipsAttachedModalProps): JSX.Element => { + const { mount, onCloseClick, instrumentModelSpecs } = props + const { t } = useTranslation(['drop_tip_wizard']) + const modal = useModal() + const [showWizard, setShowWizard] = React.useState(false) + + const { closeCurrentRun } = useCloseCurrentRun() + + const tipsAttachedHeader: ModalHeaderBaseProps = { + title: t('tips_are_attached'), + iconName: 'ot-alert', + iconColor: COLORS.yellow50, + } + + const is96Channel = instrumentModelSpecs.channels === 96 + const displayMountText = is96Channel ? '96-Channel' : capitalize(mount) + + return ( + <> + + + + , + }} + /> + + + { + onCloseClick?.([]) + closeCurrentRun() + modal.remove() + }} + /> + { + setShowWizard(true) + }} + /> + + + + {showWizard ? ( + { + onCloseClick?.((pipettesWithTip: PipetteData[]) => { + const newPipettesWithTip = pipettesWithTip.slice(1) + if (newPipettesWithTip.length === 0) closeCurrentRun() + return newPipettesWithTip + }) + modal.remove() + }} + /> + ) : null} + + ) + } +) diff --git a/app/src/organisms/DropTipWizard/__tests__/TipsAttachedModal.test.tsx b/app/src/organisms/DropTipWizard/__tests__/TipsAttachedModal.test.tsx new file mode 100644 index 00000000000..3b4344bf081 --- /dev/null +++ b/app/src/organisms/DropTipWizard/__tests__/TipsAttachedModal.test.tsx @@ -0,0 +1,109 @@ +import React from 'react' +import NiceModal from '@ebay/nice-modal-react' +import { fireEvent } from '@testing-library/react' + +import { renderWithProviders } from '@opentrons/components' +import { i18n } from '../../../i18n' + +import { handleTipsAttachedModal } from '../TipsAttachedModal' +import { LEFT } from '@opentrons/shared-data' +import { mockPipetteInfo } from '../../../redux/pipettes/__fixtures__' +import { ROBOT_MODEL_OT3 } from '../../../redux/discovery' +import { useNotifyCurrentMaintenanceRun } from '../../../resources/maintenance_runs/useNotifyCurrentMaintenanceRun' + +import type { PipetteModelSpecs } from '@opentrons/shared-data' + +jest.mock('../../../resources/maintenance_runs/useNotifyCurrentMaintenanceRun') + +const MOCK_ACTUAL_PIPETTE = { + ...mockPipetteInfo.pipetteSpecs, + model: 'model', + tipLength: { + value: 20, + }, +} as PipetteModelSpecs + +const mockOnClose = jest.fn() +const mockUseNotifyCurrentMaintenanceRun = useNotifyCurrentMaintenanceRun as jest.MockedFunction< + typeof useNotifyCurrentMaintenanceRun +> + +const render = (pipetteSpecs: PipetteModelSpecs) => { + return renderWithProviders( + + ) - ).toBeTruthy() - expect( - wrapper.containsMatchingElement() - ).toBeTruthy() - const useBlockButton = wrapper.findWhere( - n => n.type() === 'button' && n.text() === 'Use Calibration Block' - ) - useBlockButton.simulate('click') - - wrapper.setProps({}) - expect( - wrapper.containsMatchingElement() - ).toBeFalsy() - expect( - wrapper.containsMatchingElement() - ).toBeFalsy() - }) - - it('closes AskForCalibrationBlockModal when exit is clicked', () => { - const { wrapper } = mountWithStore(, { - initialState: { robotApi: {} }, - }) - act(() => - startCalibration({ - params: { mount: mountString }, - hasBlockModalResponse: null, - }) - ) - - wrapper.setProps({}) - expect(CalWizardComponent).not.toBe(null) - expect( - wrapper.containsMatchingElement() - ).toBeTruthy() - expect( - wrapper.containsMatchingElement() - ).toBeTruthy() - - wrapper.find('button[aria-label="Exit"]').invoke('onClick')?.( - {} as React.MouseEvent - ) - wrapper.setProps({}) - expect( - wrapper.containsMatchingElement() - ).toBeFalsy() - expect( - wrapper.containsMatchingElement() - ).toBeFalsy() - }) - - it('wizard should appear after create request succeeds with session and close on closeWizard', () => { - const seshId = 'fake-session-id' - const mockTipLengthCalSession = { - id: seshId, - ...mockTipLengthCalibrationSessionAttributes, - details: { - ...mockTipLengthCalibrationSessionAttributes.details, - currentStep: Sessions.TIP_LENGTH_STEP_CALIBRATION_COMPLETE, - }, - } - const { store, wrapper } = mountWithStore( - , - { - initialState: { robotApi: {} }, - } - ) - mockGetRobotSessionOfType.mockReturnValue(mockTipLengthCalSession) - mockGetRequestById.mockReturnValue({ - status: RobotApi.SUCCESS, - response: { - method: 'POST', - ok: true, - path: '/', - status: 200, - }, - }) - act(() => - startCalibration({ - params: { mount: mountString }, - hasBlockModalResponse: true, - }) - ) - wrapper.setProps({}) - expect(CalWizardComponent).not.toBe(null) - - wrapper.find('button[aria-label="Exit"]').invoke('onClick')?.( - {} as React.MouseEvent - ) - wrapper.find('button[aria-label="Exit"]').invoke('onClick')?.( - {} as React.MouseEvent - ) - wrapper.setProps({}) - expect(store.dispatch).toHaveBeenCalledWith({ - ...Sessions.deleteSession(robotName, seshId), - meta: { requestId: expect.any(String) }, - }) - }) - - it('loading state modal should appear while session is being created', () => { - const seshId = 'fake-session-id' - const mockDeckCalSession = { - id: seshId, - ...mockTipLengthCalibrationSessionAttributes, - details: { - ...mockTipLengthCalibrationSessionAttributes.details, - currentStep: Sessions.TIP_LENGTH_STEP_SESSION_STARTED, - }, - } - const { wrapper } = mountWithStore(, { - initialState: { robotApi: {} }, - }) - mockGetRobotSessionOfType.mockReturnValue(mockDeckCalSession) - mockGetRequestById.mockReturnValue({ - status: RobotApi.PENDING, - }) - act(() => - startCalibration({ - params: { mount: mountString }, - hasBlockModalResponse: null, - }) - ) - wrapper.setProps({}) - expect(CalWizardComponent).not.toBe(null) - expect(LoadingState).not.toBe(null) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/pages/Devices/CalibrationDashboard/hooks/useDashboardCalibrateDeck.tsx b/app/src/pages/Devices/CalibrationDashboard/hooks/useDashboardCalibrateDeck.tsx index f037f8ddb5c..428ec953487 100644 --- a/app/src/pages/Devices/CalibrationDashboard/hooks/useDashboardCalibrateDeck.tsx +++ b/app/src/pages/Devices/CalibrationDashboard/hooks/useDashboardCalibrateDeck.tsx @@ -29,10 +29,11 @@ export type DashboardCalDeckInvoker = ( export function useDashboardCalibrateDeck( robotName: string -): [DashboardCalDeckInvoker, JSX.Element | null] { +): [DashboardCalDeckInvoker, JSX.Element | null, boolean] { const trackedRequestId = React.useRef(null) const createRequestId = React.useRef(null) const jogRequestId = React.useRef(null) + const exitBeforeDeckConfigCompletion = React.useRef(false) const invalidateHandlerRef = React.useRef<(() => void) | undefined>() const { t } = useTranslation('robot_calibration') @@ -118,6 +119,7 @@ export function useDashboardCalibrateDeck( showSpinner={showSpinner} dispatchRequests={dispatchRequests} isJogging={isJogging} + exitBeforeDeckConfigCompletion={exitBeforeDeckConfigCompletion} offsetInvalidationHandler={invalidateHandlerRef.current} /> )} @@ -126,5 +128,9 @@ export function useDashboardCalibrateDeck( if (!(startingSession || deckCalSession != null)) Wizard = null - return [handleStartDashboardDeckCalSession, Wizard] + return [ + handleStartDashboardDeckCalSession, + Wizard, + exitBeforeDeckConfigCompletion.current, + ] } diff --git a/app/src/pages/Devices/CalibrationDashboard/hooks/useDashboardCalibrateTipLength.tsx b/app/src/pages/Devices/CalibrationDashboard/hooks/useDashboardCalibrateTipLength.tsx index f368c4061c0..a26a63ac6f5 100644 --- a/app/src/pages/Devices/CalibrationDashboard/hooks/useDashboardCalibrateTipLength.tsx +++ b/app/src/pages/Devices/CalibrationDashboard/hooks/useDashboardCalibrateTipLength.tsx @@ -180,6 +180,7 @@ export function useDashboardCalibrateTipLength( dispatchRequests={dispatchRequests} isJogging={isJogging} offsetInvalidationHandler={invalidateHandlerRef.current} + allowChangeTipRack={sessionParams.current?.tipRackDefinition == null} /> ) diff --git a/app/src/pages/Devices/CalibrationDashboard/index.tsx b/app/src/pages/Devices/CalibrationDashboard/index.tsx index 7f2b96d933d..bcdd71cc31c 100644 --- a/app/src/pages/Devices/CalibrationDashboard/index.tsx +++ b/app/src/pages/Devices/CalibrationDashboard/index.tsx @@ -25,6 +25,7 @@ export function CalibrationDashboard(): JSX.Element { const [ dashboardDeckCalLauncher, DashboardDeckCalWizard, + exitBeforeDeckConfigCompletion, ] = useDashboardCalibrateDeck(robotName) return ( {DashboardDeckCalWizard} {DashboardOffsetCalWizard} diff --git a/app/src/pages/Devices/DeviceDetails/DeviceDetailsComponent.tsx b/app/src/pages/Devices/DeviceDetails/DeviceDetailsComponent.tsx index a500ca8bd5e..f3d8a9c5515 100644 --- a/app/src/pages/Devices/DeviceDetails/DeviceDetailsComponent.tsx +++ b/app/src/pages/Devices/DeviceDetails/DeviceDetailsComponent.tsx @@ -9,12 +9,13 @@ import { SPACING, } from '@opentrons/components' +import { DeviceDetailsDeckConfiguration } from '../../../organisms/DeviceDetailsDeckConfiguration' import { RobotOverview } from '../../../organisms/Devices/RobotOverview' import { InstrumentsAndModules } from '../../../organisms/Devices/InstrumentsAndModules' import { RecentProtocolRuns } from '../../../organisms/Devices/RecentProtocolRuns' import { EstopBanner } from '../../../organisms/Devices/EstopBanner' import { DISENGAGED, useEstopContext } from '../../../organisms/EmergencyStop' -import { useIsOT3 } from '../../../organisms/Devices/hooks' +import { useIsFlex } from '../../../organisms/Devices/hooks' interface DeviceDetailsComponentProps { robotName: string @@ -23,9 +24,9 @@ interface DeviceDetailsComponentProps { export function DeviceDetailsComponent({ robotName, }: DeviceDetailsComponentProps): JSX.Element { - const isOT3 = useIsOT3(robotName) + const isFlex = useIsFlex(robotName) const { data: estopStatus, error: estopError } = useEstopQuery({ - enabled: isOT3, + enabled: isFlex, }) const { isEmergencyStopModalDismissed } = useEstopContext() @@ -37,7 +38,7 @@ export function DeviceDetailsComponent({ paddingTop={SPACING.spacing16} paddingBottom={SPACING.spacing48} > - {isOT3 && + {isFlex && estopStatus?.data.status !== DISENGAGED && estopError == null && isEmergencyStopModalDismissed ? ( @@ -48,7 +49,6 @@ export function DeviceDetailsComponent({ + {isFlex ? : null}
) diff --git a/app/src/pages/Devices/DeviceDetails/__tests__/DeviceDetailsComponent.test.tsx b/app/src/pages/Devices/DeviceDetails/__tests__/DeviceDetailsComponent.test.tsx index a09f1a9cc71..4ca21ca603b 100644 --- a/app/src/pages/Devices/DeviceDetails/__tests__/DeviceDetailsComponent.test.tsx +++ b/app/src/pages/Devices/DeviceDetails/__tests__/DeviceDetailsComponent.test.tsx @@ -12,6 +12,8 @@ import { InstrumentsAndModules } from '../../../../organisms/Devices/Instruments import { RecentProtocolRuns } from '../../../../organisms/Devices/RecentProtocolRuns' import { RobotOverview } from '../../../../organisms/Devices/RobotOverview' import { DISENGAGED, NOT_PRESENT } from '../../../../organisms/EmergencyStop' +import { DeviceDetailsDeckConfiguration } from '../../../../organisms/DeviceDetailsDeckConfiguration' +import { useIsFlex } from '../../../../organisms/Devices/hooks' import { DeviceDetailsComponent } from '../DeviceDetailsComponent' jest.mock('@opentrons/react-api-client') @@ -19,6 +21,7 @@ jest.mock('../../../../organisms/Devices/hooks') jest.mock('../../../../organisms/Devices/InstrumentsAndModules') jest.mock('../../../../organisms/Devices/RecentProtocolRuns') jest.mock('../../../../organisms/Devices/RobotOverview') +jest.mock('../../../../organisms/DeviceDetailsDeckConfiguration') jest.mock('../../../../redux/discovery') const ROBOT_NAME = 'otie' @@ -42,6 +45,10 @@ const mockRecentProtocolRuns = RecentProtocolRuns as jest.MockedFunction< const mockUseEstopQuery = useEstopQuery as jest.MockedFunction< typeof useEstopQuery > +const mockDeviceDetailsDeckConfiguration = DeviceDetailsDeckConfiguration as jest.MockedFunction< + typeof DeviceDetailsDeckConfiguration +> +const mockUseIsFlex = useIsFlex as jest.MockedFunction const render = () => { return renderWithProviders( @@ -64,6 +71,10 @@ describe('DeviceDetailsComponent', () => { .calledWith(componentPropsMatcher({ robotName: ROBOT_NAME })) .mockReturnValue(
Mock RecentProtocolRuns
) mockUseEstopQuery.mockReturnValue({ data: mockEstopStatus } as any) + mockDeviceDetailsDeckConfiguration.mockReturnValue( +
Mock DeviceDetailsDeckConfiguration
+ ) + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(false) }) afterEach(() => { @@ -85,6 +96,12 @@ describe('DeviceDetailsComponent', () => { getByText('Mock RecentProtocolRuns') }) + it('renders Deck Configuration when a robot is flex', () => { + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(true) + const [{ getByText }] = render() + getByText('Mock DeviceDetailsDeckConfiguration') + }) + it.todo('renders EstopBanner when estop is engaged') // mockEstopStatus.data.status = PHYSICALLY_ENGAGED // mockUseEstopQuery.mockReturnValue({ data: mockEstopStatus } as any) diff --git a/app/src/pages/Devices/DevicesLanding/index.tsx b/app/src/pages/Devices/DevicesLanding/index.tsx index 4ee59b16f45..6701fa4c0bb 100644 --- a/app/src/pages/Devices/DevicesLanding/index.tsx +++ b/app/src/pages/Devices/DevicesLanding/index.tsx @@ -154,7 +154,7 @@ function DevicesLoadingState(): JSX.Element { size="3.25rem" marginTop={SPACING.spacing16} marginBottom={SPACING.spacing16} - color={COLORS.darkGreyEnabled} + color={COLORS.grey50} /> { it('does not render a ProtocolRunHeader when a robot is not found', () => { mockUseRobot.mockReturnValue(null) - const [{ queryByText }] = render( - `/devices/otie/protocol-runs/${RUN_ID}/setup` - ) + render(`/devices/otie/protocol-runs/${RUN_ID}/setup`) - expect(queryByText('Mock ProtocolRunHeader')).toBeFalsy() + expect(screen.queryByText('Mock ProtocolRunHeader')).toBeFalsy() }) it('renders a ProtocolRunHeader when a robot is found', () => { - const [{ getByText }] = render( - `/devices/otie/protocol-runs/${RUN_ID}/setup` - ) + render(`/devices/otie/protocol-runs/${RUN_ID}/setup`) - getByText('Mock ProtocolRunHeader') + screen.getByText('Mock ProtocolRunHeader') }) it('syncs robot system clock on mount', () => { @@ -154,67 +151,55 @@ describe('ProtocolRunDetails', () => { }) it('renders navigation tabs', () => { - const [{ getByText }] = render( - `/devices/otie/protocol-runs/${RUN_ID}/setup` - ) + render(`/devices/otie/protocol-runs/${RUN_ID}/setup`) - getByText('Setup') - getByText('Module Controls') - getByText('Run Preview') + screen.getByText('Setup') + screen.getByText('Module Controls') + screen.getByText('Run Preview') }) it('defaults to setup content when given an unspecified tab', () => { - const [{ getByText }] = render( - `/devices/otie/protocol-runs/${RUN_ID}/this-is-not-a-real-tab` - ) + render(`/devices/otie/protocol-runs/${RUN_ID}/this-is-not-a-real-tab`) - getByText('Mock ProtocolRunSetup') + screen.getByText('Mock ProtocolRunSetup') }) it('renders a run when the run tab is clicked', () => { - const [{ getByText, queryByText }] = render( - `/devices/otie/protocol-runs/${RUN_ID}` - ) + render(`/devices/otie/protocol-runs/${RUN_ID}`) - expect(queryByText('Mock RunPreview')).toBeFalsy() - const runTab = getByText('Run Preview') - runTab.click() - getByText('Mock RunPreview') + expect(screen.queryByText('Mock RunPreview')).toBeFalsy() + const runTab = screen.getByText('Run Preview') + fireEvent.click(runTab) + screen.getByText('Mock RunPreview') }) it('renders protocol run setup when the setup tab is clicked', () => { - const [{ getByText, queryByText }] = render( - `/devices/otie/protocol-runs/${RUN_ID}` - ) - - const setupTab = getByText('Setup') - const runTab = getByText('Run Preview') - runTab.click() - getByText('Mock RunPreview') - expect(queryByText('Mock ProtocolRunSetup')).toBeFalsy() - setupTab.click() - getByText('Mock ProtocolRunSetup') + render(`/devices/otie/protocol-runs/${RUN_ID}`) + + const setupTab = screen.getByText('Setup') + const runTab = screen.getByText('Run Preview') + fireEvent.click(runTab) + screen.getByText('Mock RunPreview') + expect(screen.queryByText('Mock ProtocolRunSetup')).toBeFalsy() + fireEvent.click(setupTab) + screen.getByText('Mock ProtocolRunSetup') }) it('renders module controls when the module controls tab is clicked', () => { - const [{ getByText, queryByText }] = render( - `/devices/otie/protocol-runs/${RUN_ID}` - ) - - const moduleTab = getByText('Module Controls') - getByText('Mock ProtocolRunSetup') - expect(queryByText('Mock ProtocolRunModuleControls')).toBeFalsy() - moduleTab.click() - getByText('Mock ProtocolRunModuleControls') - expect(queryByText('Mock ProtocolRunSetup')).toBeFalsy() + render(`/devices/otie/protocol-runs/${RUN_ID}`) + + const moduleTab = screen.getByText('Module Controls') + screen.getByText('Mock ProtocolRunSetup') + expect(screen.queryByText('Mock ProtocolRunModuleControls')).toBeFalsy() + fireEvent.click(moduleTab) + screen.getByText('Mock ProtocolRunModuleControls') + expect(screen.queryByText('Mock ProtocolRunSetup')).toBeFalsy() }) it('should NOT render module controls when there are no modules', () => { mockUseModuleRenderInfoForProtocolById.mockReturnValue({}) - const [{ queryByText }] = render( - `/devices/otie/protocol-runs/${RUN_ID}/setup` - ) - expect(queryByText('Module Controls')).toBeNull() + render(`/devices/otie/protocol-runs/${RUN_ID}/setup`) + expect(screen.queryByText('Module Controls')).toBeNull() }) it('disables module controls tab when the run current but not idle', () => { @@ -225,36 +210,30 @@ describe('ProtocolRunDetails', () => { isRunTerminal: false, isRunIdle: false, }) - const [{ getByText, queryByText }] = render( - `/devices/otie/protocol-runs/${RUN_ID}` - ) + render(`/devices/otie/protocol-runs/${RUN_ID}`) - const moduleTab = getByText('Module Controls') - expect(queryByText('Mock ProtocolRunModuleControls')).toBeFalsy() - moduleTab.click() - expect(queryByText('Mock ProtocolRunModuleControls')).toBeFalsy() + const moduleTab = screen.getByText('Module Controls') + expect(screen.queryByText('Mock ProtocolRunModuleControls')).toBeFalsy() + fireEvent.click(moduleTab) + expect(screen.queryByText('Mock ProtocolRunModuleControls')).toBeFalsy() }) it('disables run tab if robot-analyzed protocol data is null', () => { mockUseMostRecentCompletedAnalysis.mockReturnValue(null) - const [{ getByText, queryByText }] = render( - `/devices/otie/protocol-runs/${RUN_ID}` - ) + render(`/devices/otie/protocol-runs/${RUN_ID}`) - const runTab = getByText('Run Preview') - getByText('Mock ProtocolRunSetup') - expect(queryByText('Mock RunPreview')).toBeFalsy() - runTab.click() - expect(queryByText('Mock RunPreview')).toBeFalsy() + const runTab = screen.getByText('Run Preview') + screen.getByText('Mock ProtocolRunSetup') + expect(screen.queryByText('Mock RunPreview')).toBeFalsy() + fireEvent.click(runTab) + expect(screen.queryByText('Mock RunPreview')).toBeFalsy() }) it('redirects to the run tab when the run is not current', () => { mockUseCurrentRunId.mockReturnValue(null) - const [{ getByText, queryByText }] = render( - `/devices/otie/protocol-runs/${RUN_ID}/setup` - ) + render(`/devices/otie/protocol-runs/${RUN_ID}/setup`) - getByText('Mock RunPreview') - expect(queryByText('Mock ProtocolRunSetup')).toBeFalsy() + screen.getByText('Mock RunPreview') + expect(screen.queryByText('Mock ProtocolRunSetup')).toBeFalsy() }) }) diff --git a/app/src/pages/Devices/ProtocolRunDetails/index.tsx b/app/src/pages/Devices/ProtocolRunDetails/index.tsx index 47297315ab9..dcd0b3997ae 100644 --- a/app/src/pages/Devices/ProtocolRunDetails/index.tsx +++ b/app/src/pages/Devices/ProtocolRunDetails/index.tsx @@ -10,8 +10,6 @@ import { Flex, useHoverTooltip, DIRECTION_COLUMN, - DISPLAY_BLOCK, - POSITION_ABSOLUTE, POSITION_RELATIVE, OVERFLOW_SCROLL, SIZE_6, @@ -26,6 +24,7 @@ import { Tooltip } from '../../../atoms/Tooltip' import { useModuleRenderInfoForProtocolById, useRobot, + useRobotType, useRunStatuses, useSyncRobotClock, } from '../../../organisms/Devices/hooks' @@ -48,46 +47,50 @@ import { ViewportListRef } from 'react-viewport-list' const baseRoundTabStyling = css` ${TYPOGRAPHY.pSemiBold} - border-radius: ${BORDERS.radiusSoftCorners} ${BORDERS.radiusSoftCorners} 0 0; - border-top: ${BORDERS.transparentLineBorder}; - border-left: ${BORDERS.transparentLineBorder}; - border-right: ${BORDERS.transparentLineBorder}; + color: ${COLORS.black90}; + background-color: ${COLORS.purple30}; + border: 0px ${BORDERS.styleSolid} ${COLORS.purple30}; + border-radius: ${BORDERS.borderRadiusSize2}; padding: ${SPACING.spacing8} ${SPACING.spacing16}; position: ${POSITION_RELATIVE}; + + &:hover { + background-color: ${COLORS.purple35}; + } + + &:focus-visible { + outline: 2px ${BORDERS.styleSolid} ${COLORS.yellow50}; + } +` + +const disabledRoundTabStyling = css` + ${baseRoundTabStyling} + color: ${COLORS.grey40}; + background-color: ${COLORS.grey30}; + + &:hover { + background-color: ${COLORS.grey30}; + } ` const RoundNavLink = styled(NavLink)` ${baseRoundTabStyling} - color: ${COLORS.darkGreyEnabled}; + color: ${COLORS.grey60}; &:hover { - background-color: ${COLORS.fundamentalsBackgroundShade}; + background-color: ${COLORS.purple35}; } &.active { - background-color: ${COLORS.white}; - border-top: ${BORDERS.lineBorder}; - border-left: ${BORDERS.lineBorder}; - border-right: ${BORDERS.lineBorder}; - color: ${COLORS.blueEnabled}; + background-color: ${COLORS.purple50}; + color: ${COLORS.white}; &:hover { - color: ${COLORS.blueHover}; - } - - /* extend below the tab when active to flow into the content */ - &:after { - position: ${POSITION_ABSOLUTE}; - display: ${DISPLAY_BLOCK}; - content: ''; - background-color: ${COLORS.white}; - bottom: -1px; - left: 0; - height: 1px; - width: 100%; + background-color: ${COLORS.purple55}; } } ` + const JUMP_OFFSET_FROM_TOP_PX = 20 interface RoundTabProps { @@ -106,11 +109,7 @@ function RoundTab({ const [targetProps, tooltipProps] = useHoverTooltip() return disabled ? ( <> - + {tabName} {tabDisabledReason != null ? ( @@ -175,6 +174,7 @@ interface PageContentsProps { } function PageContents(props: PageContentsProps): JSX.Element { const { runId, robotName, protocolRunDetailsTab } = props + const robotType = useRobotType(robotName) const protocolRunHeaderRef = React.useRef(null) const listRef = React.useRef(null) const [jumpedIndex, setJumpedIndex] = React.useState(null) @@ -207,6 +207,7 @@ function PageContents(props: PageContentsProps): JSX.Element { 'run-preview': ( - + {protocolRunDetailsContent} @@ -297,7 +295,6 @@ const ModuleControlsTab = ( const { t } = useTranslation('run_details') const currentRunId = useCurrentRunId() const moduleRenderInfoForProtocolById = useModuleRenderInfoForProtocolById( - robotName, runId ) const { isRunStill } = useRunStatuses() diff --git a/app/src/pages/Devices/RobotSettings/__tests__/RobotSettings.test.tsx b/app/src/pages/Devices/RobotSettings/__tests__/RobotSettings.test.tsx index 60f6673d1ef..7d0276a9ac1 100644 --- a/app/src/pages/Devices/RobotSettings/__tests__/RobotSettings.test.tsx +++ b/app/src/pages/Devices/RobotSettings/__tests__/RobotSettings.test.tsx @@ -1,5 +1,6 @@ import * as React from 'react' import { Route } from 'react-router' +import { fireEvent, screen } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' import { renderWithProviders } from '@opentrons/components' @@ -7,7 +8,6 @@ import { i18n } from '../../../../i18n' import { RobotSettingsCalibration } from '../../../../organisms/RobotSettingsCalibration' import { RobotSettingsNetworking } from '../../../../organisms/Devices/RobotSettings/RobotSettingsNetworking' import { RobotSettingsAdvanced } from '../../../../organisms/Devices/RobotSettings/RobotSettingsAdvanced' -import { RobotSettingsPrivacy } from '../../../../organisms/Devices/RobotSettings/RobotSettingsPrivacy' import { useRobot } from '../../../../organisms/Devices/hooks' import { RobotSettings } from '..' import { when } from 'jest-when' @@ -21,7 +21,6 @@ import { getRobotUpdateSession } from '../../../../redux/robot-update' jest.mock('../../../../organisms/RobotSettingsCalibration') jest.mock('../../../../organisms/Devices/RobotSettings/RobotSettingsNetworking') jest.mock('../../../../organisms/Devices/RobotSettings/RobotSettingsAdvanced') -jest.mock('../../../../organisms/Devices/RobotSettings/RobotSettingsPrivacy') jest.mock('../../../../organisms/Devices/hooks') jest.mock('../../../../redux/discovery/selectors') jest.mock('../../../../redux/robot-update') @@ -35,9 +34,6 @@ const mockRobotSettingsNetworking = RobotSettingsNetworking as jest.MockedFuncti const mockRobotSettingsAdvanced = RobotSettingsAdvanced as jest.MockedFunction< typeof RobotSettingsAdvanced > -const mockRobotSettingsPrivacy = RobotSettingsPrivacy as jest.MockedFunction< - typeof RobotSettingsPrivacy -> const mockUseRobot = useRobot as jest.MockedFunction const mockGetRobotUpdateSession = getRobotUpdateSession as jest.MockedFunction< @@ -72,33 +68,30 @@ describe('RobotSettings', () => { mockRobotSettingsAdvanced.mockReturnValue(
Mock RobotSettingsAdvanced
) - mockRobotSettingsPrivacy.mockReturnValue( -
Mock RobotSettingsPrivacy
- ) }) afterEach(() => { jest.resetAllMocks() }) it('renders a title and navigation tabs', () => { - const [{ getByText }] = render('/devices/otie/robot-settings/calibration') + render('/devices/otie/robot-settings/calibration') - getByText('Robot Settings') - getByText('Calibration') - getByText('Networking') - getByText('Advanced') + screen.getByText('Robot Settings') + screen.getByText('Calibration') + screen.getByText('Networking') + screen.getByText('Advanced') }) it('redirects to device details if robot is unreachable', () => { when(mockUseRobot).calledWith('otie').mockReturnValue(mockUnreachableRobot) - const [{ getByText }] = render('/devices/otie/robot-settings/calibration') - getByText('mock device details') + render('/devices/otie/robot-settings/calibration') + screen.getByText('mock device details') }) it('redirects to device details if robot is null', () => { when(mockUseRobot).calledWith('otie').mockReturnValue(null) - const [{ getByText }] = render('/devices/otie/robot-settings/calibration') - getByText('mock device details') + render('/devices/otie/robot-settings/calibration') + screen.getByText('mock device details') }) it('does NOT redirect to device details if robot is null but a robot update session is active', () => { @@ -113,79 +106,60 @@ describe('RobotSettings', () => { progress: null, error: null, }) - const [{ getByText }] = render('/devices/otie/robot-settings/calibration') - getByText('Robot Settings') + render('/devices/otie/robot-settings/calibration') + screen.getByText('Robot Settings') }) it('redirects to device details if robot is reachable but server is down', () => { when(mockUseRobot) .calledWith('otie') .mockReturnValue({ ...mockReachableRobot, serverHealthStatus: 'notOk' }) - const [{ getByText }] = render('/devices/otie/robot-settings/calibration') - getByText('mock device details') + render('/devices/otie/robot-settings/calibration') + screen.getByText('mock device details') }) it('redirects to networking tab if robot not connectable', () => { when(mockUseRobot).calledWith('otie').mockReturnValue(mockReachableRobot) - const [{ getByText }] = render('/devices/otie/robot-settings/calibration') - getByText('Mock RobotSettingsNetworking') + render('/devices/otie/robot-settings/calibration') + screen.getByText('Mock RobotSettingsNetworking') }) it('redirects to networking tab if feature flags hidden', () => { when(mockUseRobot).calledWith('otie').mockReturnValue(mockReachableRobot) - const [{ getByText }] = render('/devices/otie/robot-settings/feature-flags') - getByText('Mock RobotSettingsNetworking') + render('/devices/otie/robot-settings/feature-flags') + screen.getByText('Mock RobotSettingsNetworking') }) it('renders calibration content when the calibration tab is clicked', () => { - const [{ getByText, queryByText }] = render( - '/devices/otie/robot-settings/advanced' - ) + render('/devices/otie/robot-settings/advanced') - const calibrationTab = getByText('Calibration') - expect(queryByText('Mock RobotSettingsCalibration')).toBeFalsy() - calibrationTab.click() - getByText('Mock RobotSettingsCalibration') + const calibrationTab = screen.getByText('Calibration') + expect(screen.queryByText('Mock RobotSettingsCalibration')).toBeFalsy() + fireEvent.click(calibrationTab) + screen.getByText('Mock RobotSettingsCalibration') }) it('defaults to calibration content when given an unspecified tab', () => { - const [{ getByText }] = render( - '/devices/otie/robot-settings/this-is-not-a-real-tab' - ) + render('/devices/otie/robot-settings/this-is-not-a-real-tab') - getByText('Mock RobotSettingsCalibration') + screen.getByText('Mock RobotSettingsCalibration') }) it('renders networking content when the networking tab is clicked', () => { - const [{ getByText, queryByText }] = render( - '/devices/otie/robot-settings/advanced' - ) + render('/devices/otie/robot-settings/advanced') - const networkingTab = getByText('Networking') - expect(queryByText('Mock RobotSettingsNetworking')).toBeFalsy() - networkingTab.click() - getByText('Mock RobotSettingsNetworking') + const networkingTab = screen.getByText('Networking') + expect(screen.queryByText('Mock RobotSettingsNetworking')).toBeFalsy() + fireEvent.click(networkingTab) + screen.getByText('Mock RobotSettingsNetworking') }) it('renders advanced content when the advanced tab is clicked', () => { - const [{ getByText, queryByText }] = render( - '/devices/otie/robot-settings/calibration' - ) - - const AdvancedTab = getByText('Advanced') - expect(queryByText('Mock RobotSettingsAdvanced')).toBeFalsy() - AdvancedTab.click() - getByText('Mock RobotSettingsAdvanced') - }) - - it('renders privacy content when the privacy tab is clicked', () => { - const [{ getByText, queryByText }] = render( - '/devices/otie/robot-settings/calibration' - ) + render('/devices/otie/robot-settings/calibration') - const PrivacyTab = getByText('Privacy') - expect(queryByText('Mock RobotSettingsPrivacy')).toBeFalsy() - PrivacyTab.click() - getByText('Mock RobotSettingsPrivacy') + const AdvancedTab = screen.getByText('Advanced') + expect(screen.queryByText('Mock RobotSettingsAdvanced')).toBeFalsy() + fireEvent.click(AdvancedTab) + screen.getByText('Mock RobotSettingsAdvanced') }) }) diff --git a/app/src/pages/Devices/RobotSettings/index.tsx b/app/src/pages/Devices/RobotSettings/index.tsx index fac4bee0f66..9d21f8b3d4e 100644 --- a/app/src/pages/Devices/RobotSettings/index.tsx +++ b/app/src/pages/Devices/RobotSettings/index.tsx @@ -33,7 +33,6 @@ import { RobotSettingsCalibration } from '../../../organisms/RobotSettingsCalibr import { RobotSettingsAdvanced } from '../../../organisms/Devices/RobotSettings/RobotSettingsAdvanced' import { RobotSettingsNetworking } from '../../../organisms/Devices/RobotSettings/RobotSettingsNetworking' import { RobotSettingsFeatureFlags } from '../../../organisms/Devices/RobotSettings/RobotSettingsFeatureFlags' -import { RobotSettingsPrivacy } from '../../../organisms/Devices/RobotSettings/RobotSettingsPrivacy' import { ReachableBanner } from '../../../organisms/Devices/ReachableBanner' import type { DesktopRouteParams, RobotSettingsTab } from '../../../App/types' @@ -43,7 +42,6 @@ export function RobotSettings(): JSX.Element | null { const { robotName, robotSettingsTab } = useParams() const robot = useRobot(robotName) const isCalibrationDisabled = robot?.status !== CONNECTABLE - const isPrivacyDisabled = robot?.status === UNREACHABLE const isNetworkingDisabled = robot?.status === UNREACHABLE const [showRobotBusyBanner, setShowRobotBusyBanner] = React.useState( false @@ -76,7 +74,6 @@ export function RobotSettings(): JSX.Element | null { /> ), 'feature-flags': , - privacy: , } const devToolsOn = useSelector(getDevtoolsEnabled) @@ -93,8 +90,7 @@ export function RobotSettings(): JSX.Element | null { robotSettingsTab === 'calibration' && isCalibrationDisabled const cannotViewFeatureFlags = robotSettingsTab === 'feature-flags' && !devToolsOn - const cannotViewPrivacy = robotSettingsTab === 'privacy' && isPrivacyDisabled - if (cannotViewCalibration || cannotViewFeatureFlags || cannotViewPrivacy) { + if (cannotViewCalibration || cannotViewFeatureFlags) { return } @@ -116,7 +112,7 @@ export function RobotSettings(): JSX.Element | null { > @@ -145,11 +141,6 @@ export function RobotSettings(): JSX.Element | null { tabName={t('networking')} disabled={isNetworkingDisabled} /> - { } as any mockUseEstopQuery.mockReturnValue({ data: mockConnectedEstop } as any) const [{ getByRole }] = render() - getByRole('button').click() + fireEvent.click(getByRole('button')) expect(mockPush).toHaveBeenCalledWith('/robot-settings/rename-robot') }) }) diff --git a/app/src/pages/EmergencyStop/index.tsx b/app/src/pages/EmergencyStop/index.tsx index 03d6fe2ed0d..5d2a85074b9 100644 --- a/app/src/pages/EmergencyStop/index.tsx +++ b/app/src/pages/EmergencyStop/index.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { useHistory } from 'react-router-dom' +import { useSelector } from 'react-redux' import { Icon, @@ -14,6 +15,10 @@ import { TYPOGRAPHY, } from '@opentrons/components' import { useEstopQuery } from '@opentrons/react-api-client' +import { + getAnalyticsOptInSeen, + getAnalyticsOptedIn, +} from '../../redux/analytics' import { StyledText } from '../../atoms/text' import { MediumButton } from '../../atoms/buttons' @@ -26,6 +31,8 @@ const ESTOP_STATUS_REFETCH_INTERVAL_MS = 10000 export function EmergencyStop(): JSX.Element { const { i18n, t } = useTranslation(['device_settings', 'shared']) const history = useHistory() + const seenOptIn = useSelector(getAnalyticsOptInSeen) + const optedIn = useSelector(getAnalyticsOptedIn) // Note here the touchscreen app is using status since status is linked to EstopPhysicalStatuses // left notPresent + right disengaged => disengaged @@ -38,7 +45,7 @@ export function EmergencyStop(): JSX.Element { return ( <> - + @@ -74,7 +79,7 @@ export function EmergencyStop(): JSX.Element { @@ -87,7 +92,7 @@ export function EmergencyStop(): JSX.Element { {t('e_stop_not_connected')} @@ -100,7 +105,11 @@ export function EmergencyStop(): JSX.Element { flex="1" buttonText={i18n.format(t('shared:continue'), 'capitalize')} disabled={!isEstopConnected} - onClick={() => history.push('/robot-settings/rename-robot')} + onClick={() => { + seenOptIn && optedIn + ? history.push('/robot-settings/rename-robot') + : history.push('/privacy-policy') + }} /> diff --git a/app/src/pages/InitialLoadingScreen/__tests__/InitialLoadingScreen.test.tsx b/app/src/pages/InitialLoadingScreen/__tests__/InitialLoadingScreen.test.tsx new file mode 100644 index 00000000000..d3c3ee20397 --- /dev/null +++ b/app/src/pages/InitialLoadingScreen/__tests__/InitialLoadingScreen.test.tsx @@ -0,0 +1,47 @@ +import * as React from 'react' +import { screen } from '@testing-library/react' + +import { renderWithProviders } from '@opentrons/components' + +import { getOnDeviceDisplaySettings } from '../../../redux/config' +import { getIsShellReady } from '../../../redux/shell' + +import { InitialLoadingScreen } from '..' + +import type { OnDeviceDisplaySettings } from '../../../redux/config/schema-types' + +jest.mock('../../../redux/config') +jest.mock('../../../redux/shell') + +const mockGetOnDeviceDisplaySettings = getOnDeviceDisplaySettings as jest.MockedFunction< + typeof getOnDeviceDisplaySettings +> +const mockGetIsShellReady = getIsShellReady as jest.MockedFunction< + typeof getIsShellReady +> + +const mockSettings = { + sleepMs: 60 * 1000 * 60 * 24 * 7, + brightness: 4, + textSize: 1, + unfinishedUnboxingFlowRoute: null, +} as OnDeviceDisplaySettings + +const render = () => { + return renderWithProviders() +} + +describe('InitialLoadingScreen', () => { + beforeEach(() => { + mockGetOnDeviceDisplaySettings.mockReturnValue(mockSettings) + mockGetIsShellReady.mockReturnValue(false) + }) + + afterEach(() => { + jest.resetAllMocks() + }) + it('should display spinner', () => { + render() + screen.getByLabelText('InitialLoadingScreen-spinner') + }) +}) diff --git a/app/src/pages/OnDeviceDisplay/InitialLoadingScreen.tsx b/app/src/pages/InitialLoadingScreen/index.tsx similarity index 85% rename from app/src/pages/OnDeviceDisplay/InitialLoadingScreen.tsx rename to app/src/pages/InitialLoadingScreen/index.tsx index 45ffdc9724b..3a200a78b24 100644 --- a/app/src/pages/OnDeviceDisplay/InitialLoadingScreen.tsx +++ b/app/src/pages/InitialLoadingScreen/index.tsx @@ -2,13 +2,13 @@ import * as React from 'react' import { Redirect } from 'react-router-dom' import { useSelector } from 'react-redux' import { - Flex, + ALIGN_CENTER, COLORS, - SPACING, DIRECTION_COLUMN, - ALIGN_CENTER, - JUSTIFY_CENTER, + Flex, Icon, + JUSTIFY_CENTER, + SPACING, } from '@opentrons/components' import { getOnDeviceDisplaySettings } from '../../redux/config' import { getIsShellReady } from '../../redux/shell' @@ -35,7 +35,7 @@ export function InitialLoadingScreen(): JSX.Element { return ( - + {targetPath != null && } ) diff --git a/app/src/pages/InstrumentDetail/InstrumentDetailOverflowMenu.tsx b/app/src/pages/InstrumentDetail/InstrumentDetailOverflowMenu.tsx new file mode 100644 index 00000000000..5d3aedf9c8c --- /dev/null +++ b/app/src/pages/InstrumentDetail/InstrumentDetailOverflowMenu.tsx @@ -0,0 +1,153 @@ +import * as React from 'react' +import NiceModal, { useModal } from '@ebay/nice-modal-react' +import { useTranslation } from 'react-i18next' +import { + ALIGN_CENTER, + Flex, + Icon, + SPACING, + TYPOGRAPHY, + COLORS, +} from '@opentrons/components' +import { + SINGLE_MOUNT_PIPETTES, + NINETY_SIX_CHANNEL, + FLEX_ROBOT_TYPE, + getPipetteModelSpecs, +} from '@opentrons/shared-data' + +import { StyledText } from '../../atoms/text' +import { MenuList } from '../../atoms/MenuList' +import { MenuItem } from '../../atoms/MenuList/MenuItem' +import { PipetteWizardFlows } from '../../organisms/PipetteWizardFlows' +import { GripperWizardFlows } from '../../organisms/GripperWizardFlows' +import { DropTipWizard } from '../../organisms/DropTipWizard' +import { FLOWS } from '../../organisms/PipetteWizardFlows/constants' +import { GRIPPER_FLOW_TYPES } from '../../organisms/GripperWizardFlows/constants' + +import type { PipetteData, GripperData } from '@opentrons/api-client' + +interface InstrumentDetailsOverflowMenuProps { + instrument: PipetteData | GripperData +} + +export const handleInstrumentDetailOverflowMenu = ( + instrument: InstrumentDetailsOverflowMenuProps['instrument'] +): void => { + NiceModal.show(InstrumentDetailsOverflowMenu, { instrument }) +} + +const InstrumentDetailsOverflowMenu = NiceModal.create( + (props: InstrumentDetailsOverflowMenuProps): JSX.Element => { + const { instrument } = props + const { t } = useTranslation('robot_controls') + const modal = useModal() + const [showDropTipWizard, setShowDropTipWizard] = React.useState(false) + const [wizardProps, setWizardProps] = React.useState< + | React.ComponentProps + | React.ComponentProps + | null + >(null) + const sharedGripperWizardProps: Pick< + React.ComponentProps, + 'attachedGripper' | 'closeFlow' + > = { + attachedGripper: instrument, + closeFlow: () => { + modal.remove() + }, + } + const pipetteModelSpecs = + getPipetteModelSpecs((instrument as PipetteData).instrumentModel) ?? null + + const is96Channel = + instrument?.ok && + instrument.mount !== 'extension' && + instrument.data?.channels === 96 + + const handleRecalibrate: React.MouseEventHandler = () => { + if (instrument?.ok) { + setWizardProps( + instrument.mount === 'extension' + ? { + ...sharedGripperWizardProps, + flowType: GRIPPER_FLOW_TYPES.RECALIBRATE, + } + : { + closeFlow: () => { + modal.remove() + }, + mount: instrument.mount, + selectedPipette: is96Channel + ? NINETY_SIX_CHANNEL + : SINGLE_MOUNT_PIPETTES, + flowType: FLOWS.CALIBRATE, + } + ) + } + } + + return ( + <> + + {instrument.data.calibratedOffset?.last_modified != null ? ( + + + + + {t('recalibrate')} + + + + ) : null} + {instrument.mount !== 'extension' ? ( + setShowDropTipWizard(true)} + > + + + + {t('drop_tips')} + + + + ) : null} + + {wizardProps != null && 'mount' in wizardProps ? ( + + ) : null} + {wizardProps != null && !('mount' in wizardProps) ? ( + + ) : null} + {showDropTipWizard && + instrument.mount !== 'extension' && + pipetteModelSpecs != null ? ( + + ) : null} + + ) + } +) diff --git a/app/src/pages/InstrumentDetail/__tests__/InstrumentDetail.test.tsx b/app/src/pages/InstrumentDetail/__tests__/InstrumentDetail.test.tsx new file mode 100644 index 00000000000..d0b9baa4d76 --- /dev/null +++ b/app/src/pages/InstrumentDetail/__tests__/InstrumentDetail.test.tsx @@ -0,0 +1,213 @@ +import React from 'react' +import { when } from 'jest-when' +import { useParams } from 'react-router-dom' + +import { useInstrumentsQuery } from '@opentrons/react-api-client' +import { renderWithProviders } from '@opentrons/components' +import { + getPipetteModelSpecs, + getGripperDisplayName, +} from '@opentrons/shared-data' + +import { i18n } from '../../../i18n' +import { InstrumentDetail } from '../../../pages/InstrumentDetail' + +import type { Instruments } from '@opentrons/api-client' + +jest.mock('@opentrons/react-api-client') +jest.mock('@opentrons/shared-data', () => ({ + getAllPipetteNames: jest.fn( + jest.requireActual('@opentrons/shared-data').getAllPipetteNames + ), + getPipetteNameSpecs: jest.fn( + jest.requireActual('@opentrons/shared-data').getPipetteNameSpecs + ), + getPipetteModelSpecs: jest.fn(), + getGripperDisplayName: jest.fn(), +})) +jest.mock('react-router-dom', () => ({ + useParams: jest.fn(), + useHistory: jest.fn(), +})) + +const mockUseInstrumentsQuery = useInstrumentsQuery as jest.MockedFunction< + typeof useInstrumentsQuery +> +const mockUseParams = useParams as jest.MockedFunction + +const render = () => { + return renderWithProviders(, { + i18nInstance: i18n, + }) +} + +describe('InstrumentDetail', () => { + let mockInstrumentsQuery: Instruments + + beforeEach(() => { + mockInstrumentsQuery = { + data: [ + { + mount: 'left', + instrumentType: 'pipette', + instrumentModel: 'p1000_single_v3.4', + serialNumber: 'P1KSV3420230721', + subsystem: 'pipette_left', + ok: true, + firmwareVersion: '40', + data: { + channels: 1, + min_volume: 5.0, + max_volume: 1000.0, + calibratedOffset: { + offset: { + x: 0.6796875, + y: -0.0703125, + z: -0.11325000000002206, + }, + source: 'user', + last_modified: '2023-10-11T22:25:44.858359+00:00', + reasonability_check_failures: [], + }, + }, + instrumentName: 'p1000_single_flex', + } as any, + { + mount: 'extension', + instrumentType: 'gripper', + instrumentModel: 'test', + serialNumber: 'P1KSV3420230721', + subsystem: 'gripper', + ok: true, + firmwareVersion: '40', + data: { + jawState: 'test', + calibratedOffset: { + offset: { + x: 0.6796875, + y: -0.0703125, + z: -0.11325000000002206, + }, + source: 'user', + last_modified: '2023-10-11T22:25:44.858359+00:00', + reasonability_check_failures: [], + }, + }, + }, + ], + meta: { + cursor: 0, + totalLength: 2, + }, + } + mockUseInstrumentsQuery.mockReturnValue({ + data: mockInstrumentsQuery, + } as any) + when(getPipetteModelSpecs).mockReturnValue({ + displayName: 'mockPipette', + } as any) + when(getGripperDisplayName).mockReturnValue('mockGripper') + mockUseParams.mockReturnValue({ mount: 'left' }) + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + it('displays header containing the instrument name and an overflow menu button', () => { + const [{ getByText, getByLabelText }] = render() + + getByText('mockPipette') + getByLabelText('overflow menu button') + }) + + it('renders the gripper name if the instrument is a gripper', () => { + mockUseParams.mockReturnValue({ mount: 'extension' }) + const [{ getByText }] = render() + + getByText('mockGripper') + }) + + it('does not display the overflow menu button when instrument is not ok', () => { + mockInstrumentsQuery = { + ...mockInstrumentsQuery, + data: mockInstrumentsQuery.data.map(item => ({ + ...item, + ok: false, + })), + } as any + + when(mockUseInstrumentsQuery).mockReturnValue({ + data: mockInstrumentsQuery, + } as any) + + const [{ queryByText }] = render() + + expect(queryByText('overflow menu button')).not.toBeInTheDocument() + }) + + it('renders calibration date when present', () => { + const [{ getByText, queryByText }] = render() + + getByText('last calibrated') + queryByText('UTC') + }) + + it("renders 'No calibration data' when no calibration data is present", () => { + mockInstrumentsQuery = { + ...mockInstrumentsQuery, + data: mockInstrumentsQuery.data.map((item: any) => ({ + ...item, + data: { ...item.data, calibratedOffset: null }, + })), + } + mockUseInstrumentsQuery.mockReturnValue({ + data: mockInstrumentsQuery, + } as any) + const [{ getByText }] = render() + getByText('last calibrated') + getByText('No calibration data') + }) + + it('renders firmware version information', () => { + const [{ getByText }] = render() + getByText('firmware version') + getByText('40') + }) + + it('renders serial number information', () => { + const [{ getByText }] = render() + getByText('serial number') + getByText('P1KSV3420230721') + }) + + it('renders detach and no recalibrate button if calibration data exists for a pipette', () => { + const [{ getByText, queryByText }] = render() + getByText('detach') + expect(queryByText('recalibrate')).not.toBeInTheDocument() + }) + + it('renders detach and recalibrate button if calibration data exists for a gripper', () => { + mockUseParams.mockReturnValue({ mount: 'extension' }) + const [{ getByText }] = render() + getByText('detach') + getByText('recalibrate') + }) + + it('renders detach and calibration buttons if no calibration data exists', () => { + mockInstrumentsQuery = { + ...mockInstrumentsQuery, + data: mockInstrumentsQuery.data.map((item: any) => ({ + ...item, + data: { ...item.data, calibratedOffset: null }, + })), + } + mockUseInstrumentsQuery.mockReturnValue({ + data: mockInstrumentsQuery, + } as any) + + const [{ getByText }] = render() + getByText('detach') + getByText('calibrate') + }) +}) diff --git a/app/src/pages/InstrumentDetail/__tests__/InstrumentDetailOverflowMenu.test.tsx b/app/src/pages/InstrumentDetail/__tests__/InstrumentDetailOverflowMenu.test.tsx new file mode 100644 index 00000000000..1541beed39c --- /dev/null +++ b/app/src/pages/InstrumentDetail/__tests__/InstrumentDetailOverflowMenu.test.tsx @@ -0,0 +1,211 @@ +import React from 'react' +import NiceModal from '@ebay/nice-modal-react' +import { fireEvent, waitFor } from '@testing-library/react' + +import { renderWithProviders } from '@opentrons/components' +import { getPipetteModelSpecs } from '@opentrons/shared-data' + +import { i18n } from '../../../i18n' +import { handleInstrumentDetailOverflowMenu } from '../InstrumentDetailOverflowMenu' +import { useNotifyCurrentMaintenanceRun } from '../../../resources/maintenance_runs/useNotifyCurrentMaintenanceRun' + +import type { PipetteData, GripperData } from '@opentrons/api-client' + +jest.mock('@opentrons/shared-data', () => ({ + getAllPipetteNames: jest.fn( + jest.requireActual('@opentrons/shared-data').getAllPipetteNames + ), + getPipetteNameSpecs: jest.fn( + jest.requireActual('@opentrons/shared-data').getPipetteNameSpecs + ), + getPipetteModelSpecs: jest.fn(), +})) +jest.mock('../../../resources/maintenance_runs/useNotifyCurrentMaintenanceRun') + +const mockGetPipetteModelSpecs = getPipetteModelSpecs as jest.MockedFunction< + typeof getPipetteModelSpecs +> +const mockUseNotifyCurrentMaintenanceRun = useNotifyCurrentMaintenanceRun as jest.MockedFunction< + typeof useNotifyCurrentMaintenanceRun +> + +const MOCK_PIPETTE = { + mount: 'left', + instrumentType: 'pipette', + instrumentModel: 'p1000_single_v3.4', + serialNumber: 'P1KSV3420230721', + subsystem: 'pipette_left', + ok: true, + firmwareVersion: '40', + data: { + channels: 1, + min_volume: 5.0, + max_volume: 1000.0, + calibratedOffset: { + offset: { + x: 0.6796875, + y: -0.0703125, + z: -0.11325000000002206, + }, + source: 'user', + last_modified: '2023-10-11T22:25:44.858359+00:00', + reasonability_check_failures: [], + }, + }, + instrumentName: 'p1000_single_flex', +} as any + +const MOCK_PIPETTE_WITHOUT_CALIBRATION = { + mount: 'left', + instrumentType: 'pipette', + instrumentModel: 'p1000_single_v3.4', + serialNumber: 'P1KSV3420230721', + subsystem: 'pipette_left', + ok: true, + firmwareVersion: '40', + data: { + channels: 1, + min_volume: 5.0, + max_volume: 1000.0, + }, + instrumentName: 'p1000_single_flex', +} as PipetteData + +const MOCK_GRIPPER = { + mount: 'extension', + instrumentType: 'gripper', + instrumentModel: 'test', + serialNumber: 'P1KSV3420230721', + subsystem: 'gripper', + ok: true, + firmwareVersion: '40', + data: { + jawState: 'test', + channels: 1, + min_volume: 5.0, + max_volume: 1000.0, + calibratedOffset: { + offset: { + x: 0.6796875, + y: -0.0703125, + z: -0.11325000000002206, + }, + source: 'user', + last_modified: '2023-10-11T22:25:44.858359+00:00', + reasonability_check_failures: [], + }, + }, + instrumentName: 'p1000_single_flex', +} as GripperData + +const render = (pipetteOrGripper: PipetteData | GripperData) => { + return renderWithProviders( + + - ) - } - - beforeEach(() => { - let mockIdCounter = 0 - mockUniqueId.mockImplementation(() => `mockId_${mockIdCounter++}`) - - render = () => mountWithStore() - }) - - afterEach(() => { - jest.resetAllMocks() - }) - - it('adds meta.requestId to action and dispatches it', () => { - const { wrapper, store } = render() - expect(store.dispatch).toHaveBeenCalledTimes(0) - - wrapper.find('button').invoke('onClick')?.({} as React.MouseEvent) - wrapper.update() - - expect(store.dispatch).toHaveBeenCalledWith({ - type: 'mockAction', - meta: { requestId: 'mockId_0' } as any, - }) - }) - - it('adds requestId to requestIds list', () => { - const { wrapper } = render() - wrapper.find('button').invoke('onClick')?.({} as React.MouseEvent) - wrapper.update() - - expect(wrapper.text()).toEqual('mockId_0') - }) - - it('can dispatch multiple requests', () => { - const { wrapper, store } = render() - wrapper.find('button').invoke('onClick')?.({} as React.MouseEvent) - wrapper.update() - wrapper.find('button').invoke('onClick')?.({} as React.MouseEvent) - wrapper.update() - - expect(store.dispatch).toHaveBeenCalledTimes(2) - expect(wrapper.text()).toEqual('mockId_0 mockId_1') - }) -}) - -describe('useDispatchApiRequests', () => { - let render: () => ReturnType - - const TestUseDispatchApiRequests = (): JSX.Element => { - const mockAction: any = { type: 'mockAction', meta: {} } - const mockOtherAction: any = { type: 'mockOtherAction', meta: {} } - const [dispatchRequests] = useDispatchApiRequests() - - return ( - - ) - } - - beforeEach(() => { - let mockIdCounter = 0 - mockUniqueId.mockImplementation(() => `mockId_${mockIdCounter++}`) - - render = () => - mountWithStore(, { - initialState: { - robotApi: {}, - }, - } as any) - }) - - afterEach(() => { - jest.resetAllMocks() - }) - - it('dispatches first request first', () => { - const { store, wrapper } = render() - store.getState.mockReturnValue({ - robotApi: { - mockId_0: { - status: PENDING, - }, - }, - }) - wrapper.find('button').invoke('onClick')?.({} as React.MouseEvent) - wrapper.update() - - expect(store.dispatch).toHaveBeenCalledTimes(1) - expect(store.dispatch).toHaveBeenCalledWith({ - type: 'mockAction', - meta: { requestId: 'mockId_0' } as any, - }) - }) - - it('dispatches second if first not pending', () => { - const { store, wrapper } = render() - store.getState.mockReturnValue({ - robotApi: { - mockId_0: { - status: SUCCESS, - response: { method: 'GET', ok: true, path: '/test', status: 200 }, - }, - }, - }) - wrapper.find('button').invoke('onClick')?.({} as React.MouseEvent) - wrapper.update() - - expect(store.dispatch).toHaveBeenCalledTimes(2) - expect(store.dispatch).toHaveBeenCalledWith({ - type: 'mockAction', - meta: { requestId: 'mockId_0' } as any, - }) - expect(store.dispatch).toHaveBeenCalledWith({ - type: 'mockOtherAction', - meta: { requestId: 'mockId_1' } as any, - }) - }) - - it('dispatches first and second, but waits for third if second is pending', () => { - const { store, wrapper } = render() - store.getState.mockReturnValue({ - robotApi: { - mockId_0: { - status: SUCCESS, - response: { method: 'GET', ok: true, path: '/test', status: 200 }, - }, - mockId_1: { status: PENDING }, - }, - }) - wrapper.find('button').invoke('onClick')?.({} as React.MouseEvent) - wrapper.update() - - expect(store.dispatch).toHaveBeenCalledTimes(2) - expect(store.dispatch).toHaveBeenCalledWith({ - type: 'mockAction', - meta: { requestId: 'mockId_0' } as any, - }) - expect(store.dispatch).toHaveBeenCalledWith({ - type: 'mockOtherAction', - meta: { requestId: 'mockId_1' } as any, - }) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/app/src/redux/robot-api/hooks.ts b/app/src/redux/robot-api/hooks.ts index c29904ed1ed..37aaaa9fc95 100644 --- a/app/src/redux/robot-api/hooks.ts +++ b/app/src/redux/robot-api/hooks.ts @@ -38,6 +38,7 @@ export type DispatchRequestsType = (...actions: Action[]) => void * } */ export function useDispatchApiRequest(): [DispatchApiRequestType, string[]] { + // @ts-expect-error(BC, 2023-12-06): replace void with T const dispatch = useDispatch<(a: Action) => void>() // TODO(mc, 2019-11-06): evaluate whether or not this can be a ref diff --git a/app/src/redux/robot-api/http.ts b/app/src/redux/robot-api/http.ts index 098493913c6..7dd41b87da6 100644 --- a/app/src/redux/robot-api/http.ts +++ b/app/src/redux/robot-api/http.ts @@ -4,6 +4,7 @@ import { map, switchMap, catchError } from 'rxjs/operators' import mapValues from 'lodash/mapValues' import toString from 'lodash/toString' import omitBy from 'lodash/omitBy' +import inRange from 'lodash/inRange' import { OPENTRONS_USB } from '../../redux/discovery' import { appShellRequestor } from '../../redux/shell/remote' @@ -59,6 +60,7 @@ export function fetchRobotApi( headers: options.headers, method, url, + data: options.body, }) ).pipe( map(response => ({ @@ -68,7 +70,7 @@ export function fetchRobotApi( body: response?.data, status: response?.status, // appShellRequestor eventually calls axios.request, which doesn't provide an ok boolean in the response - ok: response?.statusText === 'OK', + ok: inRange(response?.status, 200, 300), })) ) : from(fetch(url, options)).pipe( diff --git a/app/src/redux/robot-update/__tests__/epic.test.ts b/app/src/redux/robot-update/__tests__/epic.test.ts index 016e4ed7465..91141fa75ab 100644 --- a/app/src/redux/robot-update/__tests__/epic.test.ts +++ b/app/src/redux/robot-update/__tests__/epic.test.ts @@ -207,7 +207,7 @@ describe('robot update epics', () => { expectObservable(output$).toBe('-a', { a: actions.unexpectedRobotUpdateError( - 'This robot must be updated by the system before a custom update can occur.' + 'This robot must be updated by the system before a custom update can occur' ), }) }) @@ -286,23 +286,78 @@ describe('robot update epics', () => { }) }) - it('issues error if begin request fails without 409', () => { + it('sends request to cancel URL if a non 409 occurs and reissues CREATE_SESSION', () => { testScheduler.run(({ hot, cold, expectObservable, flush }) => { const action = actions.createSession(robot, '/server/update/begin') - mockFetchRobotApi.mockReturnValueOnce( - cold('r', { r: Fixtures.mockUpdateBeginFailure }) - ) + mockFetchRobotApi + .mockReturnValueOnce( + cold('r', { r: Fixtures.mockUpdateBeginFailure }) + ) + .mockReturnValueOnce( + cold('r', { r: Fixtures.mockUpdateCancelSuccess }) + ) const action$ = hot('-a', { a: action }) const state$ = hot('a-', { a: state } as any) const output$ = epics.createSessionEpic(action$, state$) - expectObservable(output$).toBe('-e', { - e: actions.unexpectedRobotUpdateError( + expectObservable(output$).toBe('-a', { a: action }) + flush() + expect(mockFetchRobotApi).toHaveBeenCalledWith(robot, { + method: 'POST', + path: '/server/update/cancel', + }) + }) + }) + + it('Issues an error if cancelling a session fails after a 409 error occurs', () => { + testScheduler.run(({ hot, cold, expectObservable, flush }) => { + const action = actions.createSession(robot, '/server/update/begin') + + mockFetchRobotApi + .mockReturnValueOnce( + cold('r', { r: Fixtures.mockUpdateBeginConflict }) + ) + .mockReturnValueOnce( + cold('r', { r: Fixtures.mockUpdateCancelFailure }) + ) + + const action$ = hot('-a', { a: action }) + const state$ = hot('a-', { a: state } as any) + const output$ = epics.createSessionEpic(action$, state$) + + expectObservable(output$).toBe('-a', { + a: actions.unexpectedRobotUpdateError( + 'Unable to cancel in-progress update session' + ), + }) + flush() + }) + }) + + it('Issues an error if cancelling a session fails after a non 409 error occurs', () => { + testScheduler.run(({ hot, cold, expectObservable, flush }) => { + const action = actions.createSession(robot, '/server/update/begin') + + mockFetchRobotApi + .mockReturnValueOnce( + cold('r', { r: Fixtures.mockUpdateBeginFailure }) + ) + .mockReturnValueOnce( + cold('r', { r: Fixtures.mockUpdateCancelFailure }) + ) + + const action$ = hot('-a', { a: action }) + const state$ = hot('a-', { a: state } as any) + const output$ = epics.createSessionEpic(action$, state$) + + expectObservable(output$).toBe('-a', { + a: actions.unexpectedRobotUpdateError( 'Unable to start update session' ), }) + flush() }) }) @@ -331,6 +386,46 @@ describe('robot update epics', () => { }) }) + describe('startUpdateAfterFileDownload', () => { + it('should start the update after file download if the robot is a flex', () => { + testScheduler.run(({ hot, cold, expectObservable }) => { + const session: ReturnType = { + stage: 'done', + step: 'downloadFile', + } as any + + getRobotUpdateRobot.mockReturnValue(brRobotFlex) + getRobotUpdateSession.mockReturnValue(session) + + const state$ = hot('-a', { a: state }) + const output$ = epics.startUpdateAfterFileDownload(null as any, state$) + + expectObservable(output$).toBe('-a', { + a: actions.readSystemRobotUpdateFile('flex'), + }) + }) + }) + + it('should start the update after file download if the robot is a ot-2', () => { + testScheduler.run(({ hot, cold, expectObservable }) => { + const session: ReturnType = { + stage: 'done', + step: 'downloadFile', + } as any + + getRobotUpdateRobot.mockReturnValue(brRobotOt2) + getRobotUpdateSession.mockReturnValue(session) + + const state$ = hot('-a', { a: state }) + const output$ = epics.startUpdateAfterFileDownload(null as any, state$) + + expectObservable(output$).toBe('-a', { + a: actions.readSystemRobotUpdateFile('ot2'), + }) + }) + }) + }) + it('retryAfterPremigrationEpic', () => { testScheduler.run(({ hot, expectObservable }) => { getRobotUpdateRobot.mockReturnValueOnce(brReadyRobot) diff --git a/app/src/redux/robot-update/__tests__/hooks.test.ts b/app/src/redux/robot-update/__tests__/hooks.test.ts new file mode 100644 index 00000000000..9e26ddd521c --- /dev/null +++ b/app/src/redux/robot-update/__tests__/hooks.test.ts @@ -0,0 +1,35 @@ +import { useDispatch } from 'react-redux' +import { renderHook } from '@testing-library/react' + +import { useDispatchStartRobotUpdate } from '../hooks' +import { startRobotUpdate, clearRobotUpdateSession } from '../actions' + +jest.mock('react-redux') + +const mockUseDispatch = useDispatch as jest.MockedFunction + +describe('useDispatchStartRobotUpdate', () => { + let mockDispatch: jest.Mock + const mockRobotName = 'robotName' + const mockSystemFile = 'systemFile' + + beforeEach(() => { + mockDispatch = jest.fn() + mockUseDispatch.mockReturnValue(mockDispatch) + }) + + afterEach(() => { + mockUseDispatch.mockClear() + jest.clearAllMocks() + }) + + it('clears the robot update session before dispatching a new session with the given robotName and systemFile', () => { + const { result } = renderHook(useDispatchStartRobotUpdate) + + result.current(mockRobotName, mockSystemFile) + expect(mockDispatch).toHaveBeenCalledWith(clearRobotUpdateSession()) + expect(mockDispatch).toHaveBeenCalledWith( + startRobotUpdate(mockRobotName, mockSystemFile) + ) + }) +}) diff --git a/app/src/redux/robot-update/__tests__/reducer.test.ts b/app/src/redux/robot-update/__tests__/reducer.test.ts index f2532910818..f681706c2b6 100644 --- a/app/src/redux/robot-update/__tests__/reducer.test.ts +++ b/app/src/redux/robot-update/__tests__/reducer.test.ts @@ -29,7 +29,12 @@ describe('robot update reducer', () => { initialState: { ...INITIAL_STATE, ...{ - flex: { ...INITIAL_STATE.flex, releaseNotes: null, version: null }, + flex: { + ...INITIAL_STATE.flex, + releaseNotes: null, + version: null, + force: false, + }, }, }, expected: { @@ -38,9 +43,40 @@ describe('robot update reducer', () => { ...INITIAL_STATE.flex, version: '1.0.0', releaseNotes: 'release notes', + force: false, }, }, }, + { + name: 'handles forced robotUpdate:UPDATE_VERSION for flex', + action: { + type: 'robotUpdate:UPDATE_VERSION', + payload: { + version: '1.0.0', + target: 'flex', + force: true, + }, + }, + initialState: { + ...INITIAL_STATE, + ...{ + flex: { + ...INITIAL_STATE.flex, + version: null, + force: true, + }, + }, + }, + expected: { + ...INITIAL_STATE, + flex: { + ...INITIAL_STATE.flex, + version: '1.0.0', + force: true, + }, + }, + }, + { name: 'handles robotUpdate:UPDATE_INFO for ot2', action: { @@ -53,7 +89,14 @@ describe('robot update reducer', () => { }, initialState: { ...INITIAL_STATE, - ...{ ot2: { ...INITIAL_STATE.ot2, releaseNotes: null, version: null } }, + ...{ + ot2: { + ...INITIAL_STATE.ot2, + releaseNotes: null, + version: null, + force: false, + }, + }, }, expected: { ...INITIAL_STATE, @@ -61,6 +104,99 @@ describe('robot update reducer', () => { ...INITIAL_STATE.ot2, version: '1.0.0', releaseNotes: 'release notes', + force: false, + }, + }, + }, + { + name: 'handles forced robotUpdate:UPDATE_VERSION for ot2', + action: { + type: 'robotUpdate:UPDATE_VERSION', + payload: { + version: '1.0.0', + target: 'ot2', + force: true, + }, + }, + initialState: { + ...INITIAL_STATE, + ...{ + ot2: { + ...INITIAL_STATE.ot2, + version: null, + force: false, + }, + }, + }, + expected: { + ...INITIAL_STATE, + ot2: { + ...INITIAL_STATE.ot2, + version: '1.0.0', + force: true, + }, + }, + }, + { + name: 'handles robotUpdate:CHECKING_FOR_UPDATE', + action: { + type: 'robotUpdate:CHECKING_FOR_UPDATE', + payload: 'ot2', + }, + initialState: { ...INITIAL_STATE, session: null }, + expected: { + ...INITIAL_STATE, + session: { + step: 'downloadFile', + stage: 'writing', + target: 'ot2', + }, + }, + }, + { + name: + 'handles robotUpdate:DOWNLOAD_DONE when the target matches the robot type', + action: { + type: 'robotUpdate:DOWNLOAD_DONE', + payload: 'ot2', + }, + initialState: { + ...INITIAL_STATE, + session: { + step: 'downloadFile', + stage: 'writing', + target: 'ot2', + }, + }, + expected: { + ...INITIAL_STATE, + session: { + step: 'downloadFile', + stage: 'done', + }, + }, + }, + { + name: + 'handles robotUpdate:DOWNLOAD_DONE when the target does not match the robot type', + action: { + type: 'robotUpdate:DOWNLOAD_DONE', + payload: 'ot2', + }, + initialState: { + ...INITIAL_STATE, + session: { + step: 'downloadFile', + stage: 'writing', + target: 'flex', + }, + }, + expected: { + ...INITIAL_STATE, + session: { + step: 'downloadFile', + stage: 'writing', + target: 'flex', }, }, }, diff --git a/app/src/redux/robot-update/__tests__/selectors.test.ts b/app/src/redux/robot-update/__tests__/selectors.test.ts index 81df4498f2f..ea834b94c02 100644 --- a/app/src/redux/robot-update/__tests__/selectors.test.ts +++ b/app/src/redux/robot-update/__tests__/selectors.test.ts @@ -359,6 +359,17 @@ describe('robot update selectors', () => { }) }) + it('should get whether the robot is updated via a manual file', () => { + const state: State = { + robotUpdate: { + session: { fileInfo: { isManualFile: true } }, + }, + } as any + const result = selectors.getRobotSessionIsManualFile(state) + + expect(result).toBeTruthy() + }) + it('should get the robot from session after migration with opentrons- name prefix', () => { const state: State = { robotUpdate: { diff --git a/app/src/redux/robot-update/constants.ts b/app/src/redux/robot-update/constants.ts index 1fd507ec592..cff9ed795ca 100644 --- a/app/src/redux/robot-update/constants.ts +++ b/app/src/redux/robot-update/constants.ts @@ -2,6 +2,7 @@ export const PREMIGRATION: 'premigration' = 'premigration' export const PREMIGRATION_RESTART: 'premigrationRestart' = 'premigrationRestart' +export const DOWNLOAD_FILE: 'downloadFile' = 'downloadFile' export const GET_TOKEN: 'getToken' = 'getToken' export const UPLOAD_FILE: 'uploadFile' = 'uploadFile' export const PROCESS_FILE: 'processFile' = 'processFile' @@ -32,6 +33,9 @@ export const REINSTALL: 'reinstall' = 'reinstall' // action types +export const ROBOTUPDATE_CHECKING_FOR_UPDATE: 'robotUpdate:CHECKING_FOR_UPDATE' = + 'robotUpdate:CHECKING_FOR_UPDATE' + export const ROBOTUPDATE_UPDATE_VERSION: 'robotUpdate:UPDATE_VERSION' = 'robotUpdate:UPDATE_VERSION' @@ -47,6 +51,9 @@ export const ROBOTUPDATE_DOWNLOAD_PROGRESS: 'robotUpdate:DOWNLOAD_PROGRESS' = export const ROBOTUPDATE_DOWNLOAD_ERROR: 'robotUpdate:DOWNLOAD_ERROR' = 'robotUpdate:DOWNLOAD_ERROR' +export const ROBOTUPDATE_DOWNLOAD_DONE: 'robotUpdate:DOWNLOAD_DONE' = + 'robotUpdate:DOWNLOAD_DONE' + export const ROBOTUPDATE_SET_UPDATE_SEEN: 'robotUpdate:SET_UPDATE_SEEN' = 'robotUpdate:SET_UPDATE_SEEN' @@ -96,3 +103,6 @@ export const ROBOTUPDATE_UNEXPECTED_ERROR: 'robotUpdate:UNEXPECTED_ERROR' = export const ROBOTUPDATE_SET_SESSION_STEP: 'robotUpdate:SET_SESSION_STEP' = 'robotUpdate:SET_SESSION_STEP' + +export const ROBOTUPDATE_FILE_UPLOAD_PROGRESS: 'robotUpdate:FILE_UPLOAD_PROGRESS' = + 'robotUpdate:FILE_UPLOAD_PROGRESS' diff --git a/app/src/redux/robot-update/epic.ts b/app/src/redux/robot-update/epic.ts index a8e29594c91..f3ec8fcfacf 100644 --- a/app/src/redux/robot-update/epic.ts +++ b/app/src/redux/robot-update/epic.ts @@ -25,7 +25,6 @@ import { RESTART_PATH, RESTART_STATUS_CHANGED, RESTART_SUCCEEDED_STATUS, - RESTART_TIMED_OUT_STATUS, restartRobotSuccess, } from '../robot-admin' @@ -63,6 +62,7 @@ import { ROBOTUPDATE_FILE_INFO, ROBOTUPDATE_CREATE_SESSION, ROBOTUPDATE_CREATE_SESSION_SUCCESS, + DOWNLOAD_FILE, } from './constants' import type { Observable } from 'rxjs' @@ -93,14 +93,13 @@ const UNABLE_TO_CANCEL_UPDATE_SESSION = const UNABLE_TO_COMMIT_UPDATE = 'Unable to commit update' const UNABLE_TO_RESTART_ROBOT = 'Unable to restart robot' const ROBOT_RECONNECTED_WITH_VERSION = 'Robot reconnected with version' -const ROBOT_DID_NOT_RECONNECT = 'Robot did not successfully reconnect' const BUT_WE_EXPECTED = 'but we expected' const UNKNOWN = 'unknown' const CHECK_TO_VERIFY_UPDATE = - "Check your robot's settings page to verify whether or not the update was successful." -const UNABLE_TO_FIND_SYSTEM_FILE = 'Unable to find system file for update.' + "Check your robot's settings page to verify whether or not the update was successful" +const UNABLE_TO_FIND_SYSTEM_FILE = 'Unable to find system file for update' const ROBOT_REQUIRES_PREMIGRATION = - 'This robot must be updated by the system before a custom update can occur.' + 'This robot must be updated by the system before a custom update can occur' // listen for the kickoff action and: // if not ready for buildroot, kickoff premigration @@ -146,6 +145,19 @@ export const startUpdateEpic: Epic = (action$, state$) => }) ) +export const startUpdateAfterFileDownload: Epic = (_, state$) => { + return state$.pipe( + filter(passActiveSession({ step: DOWNLOAD_FILE, stage: DONE })), + switchMap(stateWithSession => { + const host: ViewableRobot = getRobotUpdateRobot(stateWithSession) as any + const robotModel = + host?.serverHealth?.robotModel === 'OT-3 Standard' ? 'flex' : 'ot2' + + return of(readSystemRobotUpdateFile(robotModel)) + }) + ) +} + // listen for a the active robot to come back with capabilities after premigration export const retryAfterPremigrationEpic: Epic = (_, state$) => { return state$.pipe( @@ -221,7 +233,16 @@ export const createSessionEpic: Epic = action$ => { ) } - return of(unexpectedRobotUpdateError(UNABLE_TO_START_UPDATE_SESSION)) + return fetchRobotApi(host, { + method: POST, + path: `${pathPrefix}/cancel`, + }).pipe( + map(cancelResp => { + return cancelResp.ok + ? createSession(host, path) + : unexpectedRobotUpdateError(UNABLE_TO_START_UPDATE_SESSION) + }) + ) }) ) } @@ -241,12 +262,12 @@ export const statusPollEpic: Epic = (action$, state$) => { state$.pipe( filter(state => { const session = getRobotUpdateSession(state) - return ( + const willReturn = session?.stage === READY_FOR_RESTART || // @ts-expect-error TODO: `session?.error === true` always returns false, remove it? session?.error === true || session === null - ) + return willReturn }) ) ), @@ -277,8 +298,6 @@ const passActiveSession = (props: Partial) => ( return ( robot !== null && !session?.error && - typeof session?.pathPrefix === 'string' && - typeof session?.token === 'string' && every( props, (value, key) => session?.[key as keyof RobotUpdateSession] === value @@ -375,8 +394,7 @@ export const finishAfterRestartEpic: Epic = (action$, state$) => { const session = getRobotUpdateSession(state) const robot = getRobotUpdateRobot(state) const restartDone = - action.payload.restartStatus === RESTART_SUCCEEDED_STATUS || - action.payload.restartStatus === RESTART_TIMED_OUT_STATUS + action.payload.restartStatus === RESTART_SUCCEEDED_STATUS return ( restartDone && @@ -393,7 +411,6 @@ export const finishAfterRestartEpic: Epic = (action$, state$) => { ) const robotVersion = getRobotApiVersion(robot) - const timedOut = action.payload.restartStatus === RESTART_TIMED_OUT_STATUS const actual = robotVersion ?? UNKNOWN const expected = targetVersion ?? UNKNOWN let finishAction @@ -404,10 +421,6 @@ export const finishAfterRestartEpic: Epic = (action$, state$) => { robotVersion === targetVersion ) { finishAction = setRobotUpdateSessionStep(FINISHED) - } else if (timedOut) { - finishAction = unexpectedRobotUpdateError( - `${ROBOT_DID_NOT_RECONNECT}. ${CHECK_TO_VERIFY_UPDATE}.` - ) } else { finishAction = unexpectedRobotUpdateError( `${ROBOT_RECONNECTED_WITH_VERSION} ${actual}, ${BUT_WE_EXPECTED} ${expected}. ${CHECK_TO_VERIFY_UPDATE}.` @@ -448,6 +461,7 @@ export const removeMigratedRobotsEpic: Epic = (_, state$) => { export const robotUpdateEpic = combineEpics( startUpdateEpic, + startUpdateAfterFileDownload, retryAfterPremigrationEpic, startSessionAfterFileInfoEpic, createSessionEpic, diff --git a/app/src/redux/robot-update/hooks.ts b/app/src/redux/robot-update/hooks.ts new file mode 100644 index 00000000000..69f4b0a60c0 --- /dev/null +++ b/app/src/redux/robot-update/hooks.ts @@ -0,0 +1,23 @@ +import { useDispatch } from 'react-redux' +import { startRobotUpdate, clearRobotUpdateSession } from './actions' +import type { Dispatch } from '../types' + +type DispatchStartRobotUpdate = ( + robotName: string, + systemFile?: string | undefined +) => void + +// Safely start a robot update. +export function useDispatchStartRobotUpdate(): DispatchStartRobotUpdate { + const dispatch = useDispatch() + + function dispatchStartRobotUpdate( + robotName: string, + systemFile?: string + ): void { + dispatch(clearRobotUpdateSession()) + dispatch(startRobotUpdate(robotName, systemFile)) + } + + return dispatchStartRobotUpdate +} diff --git a/app/src/redux/robot-update/reducer.ts b/app/src/redux/robot-update/reducer.ts index 53e58d3154c..50c00c411e2 100644 --- a/app/src/redux/robot-update/reducer.ts +++ b/app/src/redux/robot-update/reducer.ts @@ -10,18 +10,20 @@ export const INITIAL_STATE: RobotUpdateState = { releaseNotes: null, downloadProgress: null, downloadError: null, + force: false, }, ot2: { version: null, releaseNotes: null, downloadProgress: null, downloadError: null, + force: false, }, session: null, } export const initialSession = ( - robotName: string, + robotName: string | null, session: RobotUpdateSession | null ): RobotUpdateSession => ({ robotName, @@ -46,6 +48,7 @@ export const robotUpdateReducer: Reducer = ( [action.payload.target]: { ...state[action.payload.target], version: action.payload.version, + force: action.payload?.force ?? false, }, }, } @@ -64,6 +67,21 @@ export const robotUpdateReducer: Reducer = ( } } + case Constants.ROBOTUPDATE_CHECKING_FOR_UPDATE: { + const session = state.session as RobotUpdateSession + const target = action.payload + + return { + ...state, + session: { + ...session, + step: Constants.DOWNLOAD_FILE, + stage: Constants.WRITING, + target, + }, + } + } + case Constants.ROBOTUPDATE_DOWNLOAD_PROGRESS: { return { ...state, @@ -76,6 +94,24 @@ export const robotUpdateReducer: Reducer = ( } } + case Constants.ROBOTUPDATE_DOWNLOAD_DONE: { + if (!state.session) return state + + const { target, ...session } = state.session + const isThisRobotDownloadDone = + session?.step === Constants.DOWNLOAD_FILE && target === action.payload + + return isThisRobotDownloadDone + ? { + ...state, + session: { + ...session, + stage: Constants.DONE, + }, + } + : state + } + case Constants.ROBOTUPDATE_DOWNLOAD_ERROR: { return { ...state, @@ -101,7 +137,12 @@ export const robotUpdateReducer: Reducer = ( return { ...state, - session: { ...session, step: Constants.GET_TOKEN }, + session: { + ...session, + robotName: host.name, + step: Constants.GET_TOKEN, + stage: null, + }, } } @@ -196,6 +237,17 @@ export const robotUpdateReducer: Reducer = ( } : state } + case Constants.ROBOTUPDATE_FILE_UPLOAD_PROGRESS: { + return state.session + ? { + ...state, + session: { + ...state.session, + progress: Math.round(action.payload * 100), + }, + } + : state + } } return state diff --git a/app/src/redux/robot-update/selectors.ts b/app/src/redux/robot-update/selectors.ts index fcba6c08127..0570a9dd2c8 100644 --- a/app/src/redux/robot-update/selectors.ts +++ b/app/src/redux/robot-update/selectors.ts @@ -28,14 +28,16 @@ const NO_UPDATE_FILES = 'Unable to retrieve update for this robot. Ensure your computer is connected to the internet and try again later.' const UNAVAILABLE = 'Update unavailable' -export function getRobotUpdateTarget( +export const getRobotUpdateTarget: ( state: State, robotName: string +) => RobotUpdateTarget | null = createSelector(getRobotByName, robot => + robot ? getRobotUpdateTargetForRobot(robot) : null +) + +export function getRobotUpdateTargetForRobot( + robot: ViewableRobot ): RobotUpdateTarget | null { - const robot = getRobotByName(state, robotName) - if (robot === null) { - return null - } const model = robot?.serverHealth?.robotModel ?? null if (model === null) { return 'ot2' @@ -46,6 +48,11 @@ export function getRobotUpdateTarget( return 'flex' } +export function getRobotUpdateForced(state: State, robotName: string): boolean { + const target = getRobotUpdateTarget(state, robotName) + return target ? state.robotUpdate[target]?.force ?? false : false +} + export function getRobotUpdateVersion( state: State, robotName: string @@ -54,13 +61,30 @@ export function getRobotUpdateVersion( return target ? state.robotUpdate[target]?.version ?? null : null } -export function getRobotUpdateInfo( +export const getRobotUpdateInfo: ( state: State, robotName: string +) => RobotUpdateInfo | null = createSelector( + getRobotUpdateTarget, + state => state, + (target, state) => + target ? getRobotUpdateInfoForTarget(state, target) : null +) + +export function getRobotUpdateInfoForRobot( + state: State, + robot: ViewableRobot ): RobotUpdateInfo | null { - const target = getRobotUpdateTarget(state, robotName) - const robotInfo = target ? state.robotUpdate[target] : null - if (target === null || robotInfo === null) { + const target = getRobotUpdateTargetForRobot(robot) + return target ? getRobotUpdateInfoForTarget(state, target) : null +} + +export function getRobotUpdateInfoForTarget( + state: State, + target: RobotUpdateTarget +): RobotUpdateInfo | null { + const robotInfo = state.robotUpdate[target] + if (robotInfo === null) { return null } const { version, releaseNotes } = robotInfo @@ -115,6 +139,10 @@ export function getRobotUpdateSessionRobotName(state: State): string | null { return state.robotUpdate.session?.robotName || null } +export function getRobotSessionIsManualFile(state: State): boolean | null { + return state.robotUpdate.session?.fileInfo?.isManualFile ?? null +} + export const getRobotUpdateRobot: ( state: State ) => ViewableRobot | null = createSelector( @@ -164,8 +192,10 @@ export function getRobotUpdateAvailable( ): RobotUpdateType | null { const currentVersion = getRobotApiVersion(robot) const updateVersion = getRobotUpdateVersion(state, robot.name) - - return getRobotUpdateType(currentVersion, updateVersion) + const isForced = getRobotUpdateForced(state, robot.name) + return isForced + ? Constants.UPGRADE + : getRobotUpdateType(currentVersion, updateVersion) } export const getRobotUpdateDisplayInfo: ( diff --git a/app/src/redux/robot-update/types.ts b/app/src/redux/robot-update/types.ts index 0f75085bd87..c62ec94db4d 100644 --- a/app/src/redux/robot-update/types.ts +++ b/app/src/redux/robot-update/types.ts @@ -7,6 +7,13 @@ export type RobotSystemType = 'ot2-balena' | 'ot2-buildroot' | 'flex' export type RobotUpdateTarget = 'ot2' | 'flex' +export interface RobotUpdateInfoPayload { + version: string | null + target: RobotUpdateTarget + releaseNotes: string | null + force?: boolean +} + export interface RobotUpdateInfo { version: string target: RobotUpdateTarget @@ -16,6 +23,7 @@ export interface RobotUpdateInfo { export interface RobotUpdateFileInfo { systemFile: string version: string + isManualFile: boolean } // stage response from API @@ -32,6 +40,7 @@ export type UpdateSessionStage = export type UpdateSessionStep = | 'premigration' | 'premigrationRestart' + | 'downloadFile' | 'getToken' | 'uploadFile' | 'processFile' @@ -41,7 +50,7 @@ export type UpdateSessionStep = | 'finished' export interface RobotUpdateSession { - robotName: string + robotName: string | null fileInfo: RobotUpdateFileInfo | null token: string | null pathPrefix: string | null @@ -49,6 +58,7 @@ export interface RobotUpdateSession { stage: UpdateSessionStage | null progress: number | null error: string | null + target?: RobotUpdateTarget } export interface PerTargetRobotUpdateState { @@ -56,6 +66,7 @@ export interface PerTargetRobotUpdateState { downloadError: string | null version: string | null releaseNotes: string | null + force: boolean } export type RobotUpdateState = Record< @@ -121,14 +132,16 @@ export interface RobotUpdateDownloadErrorAction { export interface RobotUpdateAvailableAction { type: 'robotUpdate:UPDATE_VERSION' payload: { - version: string + version: string | null target: RobotUpdateTarget + force?: boolean } } export interface RobotUpdateFileInfoAction { type: 'robotUpdate:FILE_INFO' payload: RobotUpdateFileInfo + force?: boolean } export type RobotUpdateAction = @@ -140,7 +153,7 @@ export type RobotUpdateAction = | RobotUpdateDownloadProgressAction | RobotUpdateDownloadErrorAction | RobotUpdateAvailableAction - | { type: 'robotUpdate:UPDATE_INFO'; payload: RobotUpdateInfo } + | { type: 'robotUpdate:UPDATE_INFO'; payload: RobotUpdateInfoPayload } | RobotUpdateFileInfoAction | { type: 'robotUpdate:CHANGELOG_SEEN'; meta: { robotName: string } } | { type: 'robotUpdate:UPDATE_IGNORED'; meta: { robotName: string } } @@ -170,3 +183,6 @@ export type RobotUpdateAction = | { type: 'robotUpdate:SET_SESSION_STEP'; payload: UpdateSessionStep } | { type: 'robotUpdate:CLEAR_SESSION' } | { type: 'robotUpdate:SET_UPDATE_SEEN'; meta: { robotName: string } } + | { type: 'robotUpdate:FILE_UPLOAD_PROGRESS'; payload: number } + | { type: 'robotUpdate:CHECKING_FOR_UPDATE'; payload: RobotUpdateTarget } + | { type: 'robotUpdate:DOWNLOAD_DONE'; payload: RobotUpdateTarget } diff --git a/app/src/redux/sessions/__fixtures__/tip-length-calibration.ts b/app/src/redux/sessions/__fixtures__/tip-length-calibration.ts index 8877b9f1c69..fbb433c063b 100644 --- a/app/src/redux/sessions/__fixtures__/tip-length-calibration.ts +++ b/app/src/redux/sessions/__fixtures__/tip-length-calibration.ts @@ -35,6 +35,7 @@ export const mockTipLengthCalibrationSessionDetails: TipLengthCalibrationSession }, currentStep: 'labwareLoaded', labware: [mockTipLengthTipRack, mockTipLengthCalBlock], + supportedCommands: [], } export const mockTipLengthCalibrationSessionParams: TipLengthCalibrationSessionParams = { diff --git a/app/src/redux/sessions/tip-length-calibration/types.ts b/app/src/redux/sessions/tip-length-calibration/types.ts index 7e9980d6af7..16b5eebb865 100644 --- a/app/src/redux/sessions/tip-length-calibration/types.ts +++ b/app/src/redux/sessions/tip-length-calibration/types.ts @@ -8,7 +8,7 @@ import { TIP_LENGTH_STEP_MEASURING_TIP_OFFSET, TIP_LENGTH_STEP_CALIBRATION_COMPLETE, } from '../constants' -import type { CalibrationLabware } from '../types' +import type { CalibrationLabware, SessionCommandString } from '../types' import type { LabwareDefinition2, PipetteModel } from '@opentrons/shared-data' @@ -40,4 +40,5 @@ export interface TipLengthCalibrationSessionDetails { instrument: TipLengthCalibrationInstrument currentStep: TipLengthCalibrationStep labware: CalibrationLabware[] + supportedCommands: SessionCommandString[] } diff --git a/app/src/redux/shell/__tests__/actions.test.ts b/app/src/redux/shell/__tests__/actions.test.ts index 84d748a58f8..b9b1ef100e1 100644 --- a/app/src/redux/shell/__tests__/actions.test.ts +++ b/app/src/redux/shell/__tests__/actions.test.ts @@ -1,4 +1,13 @@ -import { uiInitialized } from '../actions' +import { + uiInitialized, + notifySubscribeAction, + notifyUnsubscribeAction, +} from '../actions' + +import type { NotifyTopic } from '../types' + +const MOCK_HOSTNAME = 'hostTest' +const MOCK_TOPIC: NotifyTopic = 'robot-server/maintenance_runs/current_run' describe('shell actions', () => { it('should be able to create a UI_INITIALIZED action', () => { @@ -7,4 +16,24 @@ describe('shell actions', () => { meta: { shell: true }, }) }) + it('should be able to create a SUBSCRIBE action', () => { + expect(notifySubscribeAction(MOCK_HOSTNAME, MOCK_TOPIC)).toEqual({ + type: 'shell:NOTIFY_SUBSCRIBE', + payload: { + hostname: MOCK_HOSTNAME, + topic: MOCK_TOPIC, + }, + meta: { shell: true }, + }) + }) + it('should be able to create an UNSUBSCRIBE action', () => { + expect(notifyUnsubscribeAction(MOCK_HOSTNAME, MOCK_TOPIC)).toEqual({ + type: 'shell:NOTIFY_UNSUBSCRIBE', + payload: { + hostname: MOCK_HOSTNAME, + topic: MOCK_TOPIC, + }, + meta: { shell: true }, + }) + }) }) diff --git a/app/src/redux/shell/actions.ts b/app/src/redux/shell/actions.ts index f8bbfbfc4b6..cf910b5c67e 100644 --- a/app/src/redux/shell/actions.ts +++ b/app/src/redux/shell/actions.ts @@ -2,8 +2,15 @@ import type { UiInitializedAction, UsbRequestsAction, AppRestartAction, + ReloadUiAction, SendLogAction, UpdateBrightnessAction, + RobotMassStorageDeviceAdded, + RobotMassStorageDeviceEnumerated, + RobotMassStorageDeviceRemoved, + NotifySubscribeAction, + NotifyUnsubscribeAction, + NotifyTopic, } from './types' export const UI_INITIALIZED: 'shell:UI_INITIALIZED' = 'shell:UI_INITIALIZED' @@ -12,9 +19,20 @@ export const USB_HTTP_REQUESTS_START: 'shell:USB_HTTP_REQUESTS_START' = export const USB_HTTP_REQUESTS_STOP: 'shell:USB_HTTP_REQUESTS_STOP' = 'shell:USB_HTTP_REQUESTS_STOP' export const APP_RESTART: 'shell:APP_RESTART' = 'shell:APP_RESTART' +export const RELOAD_UI: 'shell:RELOAD_UI' = 'shell:RELOAD_UI' export const SEND_LOG: 'shell:SEND_LOG' = 'shell:SEND_LOG' export const UPDATE_BRIGHTNESS: 'shell:UPDATE_BRIGHTNESS' = 'shell:UPDATE_BRIGHTNESS' +export const ROBOT_MASS_STORAGE_DEVICE_ADDED: 'shell:ROBOT_MASS_STORAGE_DEVICE_ADDED' = + 'shell:ROBOT_MASS_STORAGE_DEVICE_ADDED' +export const ROBOT_MASS_STORAGE_DEVICE_REMOVED: 'shell:ROBOT_MASS_STORAGE_DEVICE_REMOVED' = + 'shell:ROBOT_MASS_STORAGE_DEVICE_REMOVED' +export const ROBOT_MASS_STORAGE_DEVICE_ENUMERATED: 'shell:ROBOT_MASS_STORAGE_DEVICE_ENUMERATED' = + 'shell:ROBOT_MASS_STORAGE_DEVICE_ENUMERATED' +export const NOTIFY_SUBSCRIBE: 'shell:NOTIFY_SUBSCRIBE' = + 'shell:NOTIFY_SUBSCRIBE' +export const NOTIFY_UNSUBSCRIBE: 'shell:NOTIFY_UNSUBSCRIBE' = + 'shell:NOTIFY_UNSUBSCRIBE' export const uiInitialized = (): UiInitializedAction => ({ type: UI_INITIALIZED, @@ -39,6 +57,14 @@ export const appRestart = (message: string): AppRestartAction => ({ meta: { shell: true }, }) +export const reloadUi = (message: string): ReloadUiAction => ({ + type: RELOAD_UI, + payload: { + message: message, + }, + meta: { shell: true }, +}) + export const sendLog = (message: string): SendLogAction => ({ type: SEND_LOG, payload: { @@ -54,3 +80,59 @@ export const updateBrightness = (message: string): UpdateBrightnessAction => ({ }, meta: { shell: true }, }) + +export const robotMassStorageDeviceRemoved = ( + rootPath: string +): RobotMassStorageDeviceRemoved => ({ + type: ROBOT_MASS_STORAGE_DEVICE_REMOVED, + payload: { + rootPath, + }, + meta: { shell: true }, +}) + +export const robotMassStorageDeviceAdded = ( + rootPath: string +): RobotMassStorageDeviceAdded => ({ + type: ROBOT_MASS_STORAGE_DEVICE_ADDED, + payload: { + rootPath, + }, + meta: { shell: true }, +}) + +export const robotMassStorageDeviceEnumerated = ( + rootPath: string, + filePaths: string[] +): RobotMassStorageDeviceEnumerated => ({ + type: ROBOT_MASS_STORAGE_DEVICE_ENUMERATED, + payload: { + rootPath, + filePaths, + }, + meta: { shell: true }, +}) + +export const notifySubscribeAction = ( + hostname: string, + topic: NotifyTopic +): NotifySubscribeAction => ({ + type: NOTIFY_SUBSCRIBE, + payload: { + hostname, + topic, + }, + meta: { shell: true }, +}) + +export const notifyUnsubscribeAction = ( + hostname: string, + topic: NotifyTopic +): NotifyUnsubscribeAction => ({ + type: NOTIFY_UNSUBSCRIBE, + payload: { + hostname, + topic, + }, + meta: { shell: true }, +}) diff --git a/app/src/redux/shell/remote.ts b/app/src/redux/shell/remote.ts index 7c1198ea1e4..9671f600e5e 100644 --- a/app/src/redux/shell/remote.ts +++ b/app/src/redux/shell/remote.ts @@ -1,9 +1,10 @@ // access main process remote modules via attachments to `global` import assert from 'assert' +import { EventEmitter } from 'events' import type { AxiosRequestConfig } from 'axios' import type { ResponsePromise } from '@opentrons/api-client' -import type { Remote } from './types' +import type { Remote, NotifyTopic } from './types' const emptyRemote: Remote = {} as any @@ -36,3 +37,19 @@ export function appShellRequestor( return remote.ipcRenderer.invoke('usb:request', configProxy) } + +export function appShellListener( + hostname: string | null, + topic: NotifyTopic +): EventEmitter { + const eventEmitter = new EventEmitter() + remote.ipcRenderer.on( + 'notify', + (_, shellHostname, shellTopic, shellMessage) => { + if (hostname === shellHostname && topic === shellTopic) { + eventEmitter.emit('data', shellMessage) + } + } + ) + return eventEmitter +} diff --git a/app/src/redux/shell/types.ts b/app/src/redux/shell/types.ts index 864b029854e..874b98296ef 100644 --- a/app/src/redux/shell/types.ts +++ b/app/src/redux/shell/types.ts @@ -1,3 +1,4 @@ +import type { IpcMainEvent } from 'electron' import type { Error } from '../types' import type { RobotSystemAction } from './is-ready/types' @@ -5,6 +6,16 @@ export interface Remote { ipcRenderer: { invoke: (channel: string, ...args: unknown[]) => Promise send: (channel: string, ...args: unknown[]) => void + on: ( + channel: string, + listener: ( + event: IpcMainEvent, + hostname: string, + topic: NotifyTopic, + message: string | Object, + ...args: unknown[] + ) => void + ) => void } } @@ -63,6 +74,14 @@ export interface AppRestartAction { meta: { shell: true } } +export interface ReloadUiAction { + type: 'shell:RELOAD_UI' + payload: { + message: string + } + meta: { shell: true } +} + export interface SendLogAction { type: 'shell:SEND_LOG' payload: { @@ -79,11 +98,68 @@ export interface UpdateBrightnessAction { meta: { shell: true } } +export interface RobotMassStorageDeviceAdded { + type: 'shell:ROBOT_MASS_STORAGE_DEVICE_ADDED' + payload: { + rootPath: string + } + meta: { shell: true } +} + +export interface RobotMassStorageDeviceEnumerated { + type: 'shell:ROBOT_MASS_STORAGE_DEVICE_ENUMERATED' + payload: { + rootPath: string + filePaths: string[] + } + meta: { shell: true } +} + +export interface RobotMassStorageDeviceRemoved { + type: 'shell:ROBOT_MASS_STORAGE_DEVICE_REMOVED' + payload: { + rootPath: string + } + meta: { shell: true } +} + +export type NotifyTopic = + | 'robot-server/maintenance_runs/current_run' + | 'robot-server/runs/current_command' + | 'robot-server/runs' + | `robot-server/runs/${string}` + +export type NotifyAction = 'subscribe' | 'unsubscribe' + +export interface NotifySubscribeAction { + type: 'shell:NOTIFY_SUBSCRIBE' + payload: { + hostname: string + topic: NotifyTopic + } + meta: { shell: true } +} + +export interface NotifyUnsubscribeAction { + type: 'shell:NOTIFY_UNSUBSCRIBE' + payload: { + hostname: string + topic: NotifyTopic + } + meta: { shell: true } +} + export type ShellAction = | UiInitializedAction | ShellUpdateAction | RobotSystemAction | UsbRequestsAction | AppRestartAction + | ReloadUiAction | SendLogAction | UpdateBrightnessAction + | RobotMassStorageDeviceAdded + | RobotMassStorageDeviceEnumerated + | RobotMassStorageDeviceRemoved + | NotifySubscribeAction + | NotifyUnsubscribeAction diff --git a/app/src/redux/system-info/__fixtures__/index.ts b/app/src/redux/system-info/__fixtures__/index.ts index a7ada073bc2..782321a8ff3 100644 --- a/app/src/redux/system-info/__fixtures__/index.ts +++ b/app/src/redux/system-info/__fixtures__/index.ts @@ -1,39 +1,33 @@ import type { UsbDevice, NetworkInterface } from '../types' export const mockUsbDevice: UsbDevice = { - locationId: 1, // 0x0001 vendorId: 1, // 0x000A productId: 10, - deviceName: 'USB Device', - manufacturer: 'Manufacturer Name', + productName: 'USB Device', + manufacturerName: 'Manufacturer Name', serialNumber: 'Serial Number', - deviceAddress: 5, } export const mockRealtekDevice: UsbDevice = { - locationId: 1, // 0x0BDA vendorId: 3034, // 0x8150 productId: 33104, - deviceName: 'USB 10/100 LAN', - manufacturer: 'Realtek', + productName: 'USB 10/100 LAN', + manufacturerName: 'Realtek', serialNumber: 'Serial Number', - deviceAddress: 5, } export const mockWindowsRealtekDevice: UsbDevice = { - locationId: 1, // 0x0BDA vendorId: 3034, // 0x8150 productId: 33104, - deviceName: 'Realtek USB FE Family Controller', - manufacturer: 'Realtek', + productName: 'Realtek USB FE Family Controller', + manufacturerName: 'Realtek', serialNumber: 'Serial Number', - deviceAddress: 5, windowsDriverVersion: '1.2.3', } diff --git a/app/src/redux/system-info/__tests__/selectors.test.ts b/app/src/redux/system-info/__tests__/selectors.test.ts index 7d2139729e1..843df8ac5f0 100644 --- a/app/src/redux/system-info/__tests__/selectors.test.ts +++ b/app/src/redux/system-info/__tests__/selectors.test.ts @@ -94,8 +94,8 @@ describe('robot controls selectors', () => { 'U2E Vendor ID': Fixtures.mockRealtekDevice.vendorId, 'U2E Product ID': Fixtures.mockRealtekDevice.productId, 'U2E Serial Number': Fixtures.mockRealtekDevice.serialNumber, - 'U2E Device Name': Fixtures.mockRealtekDevice.deviceName, - 'U2E Manufacturer': Fixtures.mockRealtekDevice.manufacturer, + 'U2E Device Name': Fixtures.mockRealtekDevice.productName, + 'U2E Manufacturer': Fixtures.mockRealtekDevice.manufacturerName, }) }) diff --git a/app/src/redux/system-info/selectors.ts b/app/src/redux/system-info/selectors.ts index d263d91fe17..fe7840fd628 100644 --- a/app/src/redux/system-info/selectors.ts +++ b/app/src/redux/system-info/selectors.ts @@ -27,8 +27,8 @@ export const getU2EDeviceAnalyticsProps: ( 'U2E Vendor ID': device.vendorId, 'U2E Product ID': device.productId, 'U2E Serial Number': device.serialNumber, - 'U2E Manufacturer': device.manufacturer, - 'U2E Device Name': device.deviceName, + 'U2E Manufacturer': device.manufacturerName, + 'U2E Device Name': device.productName, } if (device.windowsDriverVersion) { diff --git a/app/src/redux/system-info/types.ts b/app/src/redux/system-info/types.ts index e54dd5fc077..0ea770269a2 100644 --- a/app/src/redux/system-info/types.ts +++ b/app/src/redux/system-info/types.ts @@ -12,13 +12,11 @@ import { } from './constants' export interface UsbDevice { - locationId: number vendorId: number productId: number - deviceName: string - manufacturer: string - serialNumber: string - deviceAddress: number + productName?: string + manufacturerName?: string + serialNumber?: string windowsDriverVersion?: string | null } @@ -43,9 +41,9 @@ export type DriverStatus = export interface U2EAnalyticsProps { 'U2E Vendor ID': number 'U2E Product ID': number - 'U2E Serial Number': string - 'U2E Device Name': string - 'U2E Manufacturer': string + 'U2E Serial Number'?: string + 'U2E Device Name'?: string + 'U2E Manufacturer'?: string 'U2E Windows Driver Version'?: string | null [key: string]: string | number | null | undefined } diff --git a/app/src/redux/types.ts b/app/src/redux/types.ts index d05a9d509f2..2082ee25f25 100644 --- a/app/src/redux/types.ts +++ b/app/src/redux/types.ts @@ -26,20 +26,14 @@ import type { CustomLabwareState, CustomLabwareAction, } from './custom-labware/types' - import type { RobotSettingsState, RobotSettingsAction, } from './robot-settings/types' - import type { CalibrationState, CalibrationAction } from './calibration/types' - import type { SystemInfoState, SystemInfoAction } from './system-info/types' - import type { AlertsState, AlertsAction } from './alerts/types' - import type { SessionState, SessionsAction } from './sessions/types' - import type { AnalyticsTriggerAction } from './analytics/types' export interface State { diff --git a/app/src/resources/deck_configuration/__tests__/hooks.test.ts b/app/src/resources/deck_configuration/__tests__/hooks.test.ts new file mode 100644 index 00000000000..5a37005074e --- /dev/null +++ b/app/src/resources/deck_configuration/__tests__/hooks.test.ts @@ -0,0 +1,67 @@ +import { when, resetAllWhenMocks } from 'jest-when' + +import { useDeckConfigurationQuery } from '@opentrons/react-api-client' +import { + SINGLE_LEFT_SLOT_FIXTURE, + SINGLE_RIGHT_SLOT_FIXTURE, + STAGING_AREA_RIGHT_SLOT_FIXTURE, + TRASH_BIN_ADAPTER_FIXTURE, + WASTE_CHUTE_RIGHT_ADAPTER_COVERED_FIXTURE, +} from '@opentrons/shared-data' + +import type { UseQueryResult } from 'react-query' +import type { DeckConfiguration } from '@opentrons/shared-data' + +jest.mock('@opentrons/react-api-client') + +const mockUseDeckConfigurationQuery = useDeckConfigurationQuery as jest.MockedFunction< + typeof useDeckConfigurationQuery +> + +const MOCK_DECK_CONFIG: DeckConfiguration = [ + { + cutoutId: 'cutoutA1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutB1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutD1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutA3', + cutoutFixtureId: TRASH_BIN_ADAPTER_FIXTURE, + }, + { + cutoutId: 'cutoutB3', + cutoutFixtureId: SINGLE_RIGHT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC3', + cutoutFixtureId: STAGING_AREA_RIGHT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutD3', + cutoutFixtureId: WASTE_CHUTE_RIGHT_ADAPTER_COVERED_FIXTURE, + }, +] + +describe('useDeckConfigurationCompatibility', () => { + beforeEach(() => { + when(mockUseDeckConfigurationQuery) + .calledWith() + .mockReturnValue({ + data: MOCK_DECK_CONFIG, + } as UseQueryResult) + }) + afterEach(() => resetAllWhenMocks()) + + it('returns configured status if fixture is configured at location', () => {}) +}) diff --git a/app/src/resources/deck_configuration/hooks.ts b/app/src/resources/deck_configuration/hooks.ts new file mode 100644 index 00000000000..b939696c5c6 --- /dev/null +++ b/app/src/resources/deck_configuration/hooks.ts @@ -0,0 +1,118 @@ +import { getTopMostLabwareInSlots } from '@opentrons/components' +import { useDeckConfigurationQuery } from '@opentrons/react-api-client' +import { + FLEX_ROBOT_TYPE, + getAddressableAreasInProtocol, + getCutoutFixturesForCutoutId, + getCutoutIdForAddressableArea, + getDeckDefFromRobotType, + getLabwareDisplayName, + SINGLE_LEFT_SLOT_FIXTURE, + SINGLE_SLOT_FIXTURES, + THERMOCYCLER_MODULE_TYPE, +} from '@opentrons/shared-data' + +import { getProtocolModulesInfo } from '../../organisms/Devices/ProtocolRun/utils/getProtocolModulesInfo' + +import type { + CompletedProtocolAnalysis, + CutoutConfigProtocolSpec, + CutoutFixtureId, + ProtocolAnalysisOutput, + RobotType, +} from '@opentrons/shared-data' + +const DECK_CONFIG_REFETCH_INTERVAL = 5000 + +export interface CutoutConfigAndCompatibility extends CutoutConfigProtocolSpec { + compatibleCutoutFixtureIds: CutoutFixtureId[] + // the missing on-deck labware display name for a single slot cutout + missingLabwareDisplayName: string | null +} +export function useDeckConfigurationCompatibility( + robotType: RobotType, + protocolAnalysis: CompletedProtocolAnalysis | ProtocolAnalysisOutput | null +): CutoutConfigAndCompatibility[] { + const deckConfig = + useDeckConfigurationQuery({ refetchInterval: DECK_CONFIG_REFETCH_INTERVAL }) + .data ?? [] + if (robotType !== FLEX_ROBOT_TYPE) return [] + const deckDef = getDeckDefFromRobotType(robotType) + const allAddressableAreas = + protocolAnalysis != null + ? getAddressableAreasInProtocol(protocolAnalysis, deckDef) + : [] + const labwareInSlots = + protocolAnalysis != null ? getTopMostLabwareInSlots(protocolAnalysis) : [] + + const protocolModulesInfo = + protocolAnalysis != null + ? getProtocolModulesInfo(protocolAnalysis, deckDef) + : [] + + const hasThermocycler = + protocolModulesInfo.find( + protocolMod => + protocolMod.moduleDef.moduleType === THERMOCYCLER_MODULE_TYPE + ) != null + + return deckConfig.reduce( + (acc, { cutoutId, cutoutFixtureId }) => { + const fixturesThatMountToCutoutId = getCutoutFixturesForCutoutId( + cutoutId, + deckDef.cutoutFixtures + ) + const requiredAddressableAreasForCutoutId = allAddressableAreas.filter( + aa => + getCutoutIdForAddressableArea(aa, fixturesThatMountToCutoutId) === + cutoutId + ) + + const compatibleCutoutFixtureIds = fixturesThatMountToCutoutId + .filter(cf => + requiredAddressableAreasForCutoutId.every(aa => + cf.providesAddressableAreas[cutoutId].includes(aa) + ) + ) + .map(cf => cf.id) + + // get the on-deck labware name for a missing single-slot addressable area + const missingSingleSlotLabware = + cutoutFixtureId != null && + // fixture mismatch + !compatibleCutoutFixtureIds.includes(cutoutFixtureId) && + compatibleCutoutFixtureIds[0] != null && + // compatible fixture is single-slot + SINGLE_SLOT_FIXTURES.includes(compatibleCutoutFixtureIds[0]) + ? labwareInSlots.find( + ({ location }) => + // match the addressable area to an on-deck labware + requiredAddressableAreasForCutoutId[0] === location.slotName + ) + : null + + const missingLabwareDisplayName = + missingSingleSlotLabware != null + ? missingSingleSlotLabware.labwareNickName ?? + getLabwareDisplayName(missingSingleSlotLabware.labwareDef) ?? + null + : null + + return [ + ...acc, + { + cutoutId, + cutoutFixtureId, + requiredAddressableAreas: requiredAddressableAreasForCutoutId, + // Thermocycler requires an "empty" (single slot) fixture in A1 that is not referenced directly in protocol + compatibleCutoutFixtureIds: + hasThermocycler && cutoutId === 'cutoutA1' + ? [SINGLE_LEFT_SLOT_FIXTURE] + : compatibleCutoutFixtureIds, + missingLabwareDisplayName, + }, + ] + }, + [] + ) +} diff --git a/app/src/resources/deck_configuration/types.ts b/app/src/resources/deck_configuration/types.ts new file mode 100644 index 00000000000..2929de72deb --- /dev/null +++ b/app/src/resources/deck_configuration/types.ts @@ -0,0 +1,11 @@ +import type { + CutoutId, + CutoutFixtureId, + AddressableAreaName, +} from '@opentrons/shared-data' + +export interface CutoutConfig { + cutoutId: CutoutId + cutoutFixtureId: CutoutFixtureId + requiredAddressableAreas: AddressableAreaName[] +} diff --git a/app/src/resources/deck_configuration/utils.ts b/app/src/resources/deck_configuration/utils.ts new file mode 100644 index 00000000000..9efaeea3a57 --- /dev/null +++ b/app/src/resources/deck_configuration/utils.ts @@ -0,0 +1,42 @@ +import { FLEX_SINGLE_SLOT_ADDRESSABLE_AREAS } from '@opentrons/shared-data' + +import type { CutoutFixtureId } from '@opentrons/shared-data' +import type { CutoutConfigAndCompatibility } from './hooks' + +export function getRequiredDeckConfig( + deckConfigProtocolSpec: CutoutConfigAndCompatibility[] +): CutoutConfigAndCompatibility[] { + const nonSingleSlotDeckConfigCompatibility = deckConfigProtocolSpec.filter( + ({ missingLabwareDisplayName, requiredAddressableAreas }) => + // required AA list includes a non-single-slot AA or a missing labware display name + !requiredAddressableAreas.every(aa => + FLEX_SINGLE_SLOT_ADDRESSABLE_AREAS.includes(aa) + ) || missingLabwareDisplayName != null + ) + // fixture includes at least 1 required AA + const requiredDeckConfigProtocolSpec = nonSingleSlotDeckConfigCompatibility.filter( + fixture => fixture.requiredAddressableAreas.length > 0 + ) + + return requiredDeckConfigProtocolSpec +} + +export function getIsFixtureMismatch( + deckConfigProtocolSpec: CutoutConfigAndCompatibility[] +): boolean { + const isFixtureMismatch = !deckConfigProtocolSpec.every( + ({ cutoutFixtureId, compatibleCutoutFixtureIds }) => + isMatchedFixture(cutoutFixtureId, compatibleCutoutFixtureIds) + ) + return isFixtureMismatch +} + +function isMatchedFixture( + cutoutFixtureId: CutoutFixtureId | null, + compatibleCutoutFixtureIds: CutoutFixtureId[] +): boolean { + return ( + cutoutFixtureId == null || + compatibleCutoutFixtureIds.includes(cutoutFixtureId) + ) +} diff --git a/app/src/resources/devices/__tests__/useIsEstopNotDisengaged.test.tsx b/app/src/resources/devices/__tests__/useIsEstopNotDisengaged.test.tsx new file mode 100644 index 00000000000..2107df52711 --- /dev/null +++ b/app/src/resources/devices/__tests__/useIsEstopNotDisengaged.test.tsx @@ -0,0 +1,95 @@ +import { when, resetAllWhenMocks } from 'jest-when' + +import { useIsFlex } from '../../../organisms/Devices/hooks' +import { useEstopQuery } from '@opentrons/react-api-client' +import { + DISENGAGED, + NOT_PRESENT, + PHYSICALLY_ENGAGED, + LOGICALLY_ENGAGED, +} from '../../../organisms/EmergencyStop' +import { useIsEstopNotDisengaged } from '../hooks/useIsEstopNotDisengaged' + +jest.mock('@opentrons/react-api-client') +jest.mock('../../../organisms/Devices/hooks') + +const mockUseIsFlex = useIsFlex as jest.MockedFunction +const mockUseEstopQuery = useEstopQuery as jest.MockedFunction< + typeof useEstopQuery +> + +const ROBOT_NAME = 'mockRobot' +const mockEstopStatus = { + data: { + status: DISENGAGED, + leftEstopPhysicalStatus: DISENGAGED, + rightEstopPhysicalStatus: NOT_PRESENT, + }, +} +const mockPhysicallyEngagedStatus = { + data: { + ...mockEstopStatus.data, + status: PHYSICALLY_ENGAGED, + }, +} +const mockLogicallyEngagedStatus = { + data: { + ...mockEstopStatus.data, + status: LOGICALLY_ENGAGED, + }, +} +const mockNotPresentStatus = { + data: { + ...mockEstopStatus.data, + status: NOT_PRESENT, + }, +} + +describe('useIsEstopNotDisengaged', () => { + beforeEach(() => { + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(true) + mockUseEstopQuery.mockReturnValue({ + data: mockEstopStatus, + error: null, + } as any) + }) + + afterAll(() => { + resetAllWhenMocks() + jest.clearAllMocks() + }) + + it('should return false when e-stop status is disengaged', () => { + const isEstopNotDisengaged = useIsEstopNotDisengaged(ROBOT_NAME) + expect(isEstopNotDisengaged).toBe(false) + }) + + it('should return true when e-stop status is physically engaged', () => { + mockUseEstopQuery.mockReturnValue({ + data: mockPhysicallyEngagedStatus, + } as any) + const isEstopNotDisengaged = useIsEstopNotDisengaged(ROBOT_NAME) + expect(isEstopNotDisengaged).toBe(true) + }) + + it('should return true when e-stop status is logically engaged', () => { + mockUseEstopQuery.mockReturnValue({ + data: mockLogicallyEngagedStatus, + } as any) + const isEstopNotDisengaged = useIsEstopNotDisengaged(ROBOT_NAME) + expect(isEstopNotDisengaged).toBe(true) + }) + it('should return true when e-stop status is not present', () => { + mockUseEstopQuery.mockReturnValue({ data: mockNotPresentStatus } as any) + const isEstopNotDisengaged = useIsEstopNotDisengaged(ROBOT_NAME) + expect(isEstopNotDisengaged).toBe(true) + }) + it('should return false when a robot is OT-2', () => { + when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(false) + mockUseEstopQuery.mockReturnValue({ + data: mockPhysicallyEngagedStatus, + } as any) + const isEstopNotDisengaged = useIsEstopNotDisengaged(ROBOT_NAME) + expect(isEstopNotDisengaged).toBe(false) + }) +}) diff --git a/app/src/resources/devices/hooks/useIsEstopNotDisengaged.ts b/app/src/resources/devices/hooks/useIsEstopNotDisengaged.ts new file mode 100644 index 00000000000..0897c16084c --- /dev/null +++ b/app/src/resources/devices/hooks/useIsEstopNotDisengaged.ts @@ -0,0 +1,26 @@ +import { useEstopQuery } from '@opentrons/react-api-client' +import { useIsFlex } from '../../../organisms/Devices/hooks' +import { DISENGAGED } from '../../../organisms/EmergencyStop' + +/** + * Checks if the emergency stop is not disengaged. + * + * @param {string} robotName - The name of the robot. + * @returns {boolean} Returns true if the emergency stop is not disengaged, false otherwise. + * not disengaged cases are physically engaged, logically engaged, and not present(unplugged) + * For OT-2, the return is always false + * + * @example + * const isNotDisengaged = useIsEstopNotDisengaged('Robot1'); + */ + +export const useIsEstopNotDisengaged = (robotName: string): boolean => { + const isFlex = useIsFlex(robotName) + const { data: estopStatus, error: estopError } = useEstopQuery({ + enabled: isFlex, + }) + + return isFlex + ? estopStatus?.data.status !== DISENGAGED || estopError !== null + : false +} diff --git a/app/src/resources/maintenance_runs/useNotifyCurrentMaintenanceRun.ts b/app/src/resources/maintenance_runs/useNotifyCurrentMaintenanceRun.ts new file mode 100644 index 00000000000..9cc84e6c3d5 --- /dev/null +++ b/app/src/resources/maintenance_runs/useNotifyCurrentMaintenanceRun.ts @@ -0,0 +1,38 @@ +import * as React from 'react' + +import { useHost, useCurrentMaintenanceRun } from '@opentrons/react-api-client' + +import { useNotifyService } from '../useNotifyService' + +import type { UseQueryResult } from 'react-query' +import type { MaintenanceRun } from '@opentrons/api-client' +import type { QueryOptionsWithPolling } from '../useNotifyService' + +export function useNotifyCurrentMaintenanceRun( + options?: QueryOptionsWithPolling +): UseQueryResult | UseQueryResult { + const host = useHost() + const [refetchUsingHTTP, setRefetchUsingHTTP] = React.useState(false) + + const { isNotifyError } = useNotifyService({ + topic: 'robot-server/maintenance_runs/current_run', + refetchUsingHTTP: () => setRefetchUsingHTTP(true), + options: { + ...options, + enabled: host !== null && options?.enabled !== false, + }, + }) + + const isNotifyEnabled = !isNotifyError && !options?.forceHttpPolling + if (!isNotifyEnabled && !refetchUsingHTTP) setRefetchUsingHTTP(true) + const isHTTPEnabled = + host !== null && options?.enabled !== false && refetchUsingHTTP + + const httpQueryResult = useCurrentMaintenanceRun({ + ...options, + enabled: isHTTPEnabled, + onSettled: isNotifyEnabled ? () => setRefetchUsingHTTP(false) : undefined, + }) + + return httpQueryResult +} diff --git a/app/src/resources/networking/__tests__/useCanDisconnect.test.tsx b/app/src/resources/networking/__tests__/useCanDisconnect.test.tsx index 71799730bd2..bbb9580c461 100644 --- a/app/src/resources/networking/__tests__/useCanDisconnect.test.tsx +++ b/app/src/resources/networking/__tests__/useCanDisconnect.test.tsx @@ -2,10 +2,10 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' import { createStore } from 'redux' import { Provider } from 'react-redux' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { getRobotApiVersionByName } from '../../../redux/discovery' -import { useIsOT3 } from '../../../organisms/Devices/hooks' +import { useIsFlex } from '../../../organisms/Devices/hooks' import { useCanDisconnect } from '../hooks/useCanDisconnect' import { useWifiList } from '../hooks/useWifiList' @@ -20,13 +20,13 @@ jest.mock('../../../redux/discovery') const mockGetRobotApiVersionByName = getRobotApiVersionByName as jest.MockedFunction< typeof getRobotApiVersionByName > -const mockUseIsOT3 = useIsOT3 as jest.MockedFunction +const mockUseIsFlex = useIsFlex as jest.MockedFunction const store: Store = createStore(state => state, {}) -const wrapper: React.FunctionComponent<{}> = ({ children }) => ( - {children} -) +const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ + children, +}) => {children} const mockWifiNetwork: WifiNetwork = { ssid: 'linksys', @@ -39,7 +39,7 @@ const mockWifiNetwork: WifiNetwork = { describe('useCanDisconnect', () => { beforeEach(() => { when(useWifiList).calledWith('otie').mockReturnValue([]) - when(mockUseIsOT3).calledWith('otie').mockReturnValue(false) + when(mockUseIsFlex).calledWith('otie').mockReturnValue(false) }) afterEach(() => resetAllWhenMocks()) @@ -93,7 +93,7 @@ describe('useCanDisconnect', () => { expect(result.current).toBe(false) }) - it('useCanDisconnect returns true for an OT-3', () => { + it('useCanDisconnect returns true for a Flex', () => { when(useWifiList) .calledWith('otie') .mockReturnValue([{ ...mockWifiNetwork, active: true }]) @@ -102,7 +102,7 @@ describe('useCanDisconnect', () => { .calledWith({} as any, 'otie') .mockReturnValue('0.22.999-gamma.1') - when(mockUseIsOT3).calledWith('otie').mockReturnValue(true) + when(mockUseIsFlex).calledWith('otie').mockReturnValue(true) const { result } = renderHook(() => useCanDisconnect('otie'), { wrapper }) expect(result.current).toBe(true) diff --git a/app/src/pages/OnDeviceDisplay/hooks/__tests__/useNetworkConnection.test.tsx b/app/src/resources/networking/__tests__/useNetworkConnection.test.tsx similarity index 88% rename from app/src/pages/OnDeviceDisplay/hooks/__tests__/useNetworkConnection.test.tsx rename to app/src/resources/networking/__tests__/useNetworkConnection.test.tsx index a07ca1312c0..88e28ee6b84 100644 --- a/app/src/pages/OnDeviceDisplay/hooks/__tests__/useNetworkConnection.test.tsx +++ b/app/src/resources/networking/__tests__/useNetworkConnection.test.tsx @@ -3,18 +3,18 @@ import * as React from 'react' import { when, resetAllWhenMocks } from 'jest-when' import { Provider } from 'react-redux' import { createStore, Store } from 'redux' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' -import { i18n } from '../../../../i18n' -import { useWifiList } from '../../../../resources/networking/hooks' -import * as Networking from '../../../../redux/networking' -import * as Fixtures from '../../../../redux/networking/__fixtures__' +import { i18n } from '../../../i18n' +import { useWifiList } from '../../../resources/networking/hooks' +import * as Networking from '../../../redux/networking' +import * as Fixtures from '../../../redux/networking/__fixtures__' -import { useNetworkConnection } from '..' +import { useNetworkConnection } from '../hooks/useNetworkConnection' -jest.mock('../../../../resources/networking/hooks') -jest.mock('../../../../redux/networking/selectors') +jest.mock('../../../resources/networking/hooks') +jest.mock('../../../redux/networking/selectors') const mockRobotName = 'robot-name' const mockWifiList = [ @@ -50,7 +50,7 @@ const store: Store = createStore(jest.fn(), {}) // ToDo (kj:0202/2023) USB test cases will be added when USB is out describe('useNetworkConnection', () => { - let wrapper: React.FunctionComponent<{}> + let wrapper: React.FunctionComponent<{ children: React.ReactNode }> beforeEach(() => { wrapper = ({ children }) => ( diff --git a/app/src/resources/networking/hooks/useCanDisconnect.ts b/app/src/resources/networking/hooks/useCanDisconnect.ts index e2b417f3521..0c0110250ae 100644 --- a/app/src/resources/networking/hooks/useCanDisconnect.ts +++ b/app/src/resources/networking/hooks/useCanDisconnect.ts @@ -1,6 +1,6 @@ import { useSelector } from 'react-redux' import Semver from 'semver' -import { useIsOT3 } from '../../../organisms/Devices/hooks' +import { useIsFlex } from '../../../organisms/Devices/hooks' import { getRobotApiVersionByName } from '../../../redux/discovery' import { useWifiList } from './useWifiList' @@ -9,7 +9,7 @@ import type { State } from '../../../redux/types' const API_MIN_DISCONNECT_VERSION = '3.17.0-alpha.0' export const useCanDisconnect = (robotName: string): boolean => { - const isOT3 = useIsOT3(robotName) + const isFlex = useIsFlex(robotName) const wifiList = useWifiList(robotName) const apiVersion = useSelector((state: State) => { return getRobotApiVersionByName(state, robotName) @@ -17,7 +17,7 @@ export const useCanDisconnect = (robotName: string): boolean => { const active = wifiList.some(nw => nw.active) const supportsDisconnect = Semver.valid(apiVersion) - ? isOT3 || Semver.gte(apiVersion as string, API_MIN_DISCONNECT_VERSION) + ? isFlex || Semver.gte(apiVersion as string, API_MIN_DISCONNECT_VERSION) : false return Boolean(active && supportsDisconnect) diff --git a/app/src/pages/OnDeviceDisplay/hooks/useNetworkConnection.ts b/app/src/resources/networking/hooks/useNetworkConnection.ts similarity index 97% rename from app/src/pages/OnDeviceDisplay/hooks/useNetworkConnection.ts rename to app/src/resources/networking/hooks/useNetworkConnection.ts index f10cc0f2a5a..6588a687334 100644 --- a/app/src/pages/OnDeviceDisplay/hooks/useNetworkConnection.ts +++ b/app/src/resources/networking/hooks/useNetworkConnection.ts @@ -17,7 +17,7 @@ export interface NetworkConnection { icon?: IconName } -const CONNECTION_POLL_MS = 10000 // Note: (kj:02/02/2023) temp value +const CONNECTION_POLL_MS = 10000 export function useNetworkConnection(robotName: string): NetworkConnection { const { t } = useTranslation('device_settings') diff --git a/app/src/resources/runs/hooks.ts b/app/src/resources/runs/hooks.ts index deca198c4f2..528219776a4 100644 --- a/app/src/resources/runs/hooks.ts +++ b/app/src/resources/runs/hooks.ts @@ -150,7 +150,7 @@ export function useCreateTargetedMaintenanceRunMutation( .then(res => { if (isOnDevice) setOddRunIds({ currentRunId: res.data.id, oddRunId: res.data.id }) - return res + return Promise.resolve(res) }) .catch(error => error), } diff --git a/app/src/resources/runs/useNotifyAllRunsQuery.ts b/app/src/resources/runs/useNotifyAllRunsQuery.ts new file mode 100644 index 00000000000..f8631582495 --- /dev/null +++ b/app/src/resources/runs/useNotifyAllRunsQuery.ts @@ -0,0 +1,44 @@ +import * as React from 'react' + +import { useAllRunsQuery } from '@opentrons/react-api-client' + +import { useNotifyService } from '../useNotifyService' + +import type { UseQueryResult } from 'react-query' +import type { AxiosError } from 'axios' +import type { HostConfig, GetRunsParams, Runs } from '@opentrons/api-client' +import type { UseAllRunsQueryOptions } from '@opentrons/react-api-client/src/runs/useAllRunsQuery' +import type { QueryOptionsWithPolling } from '../useNotifyService' + +export function useNotifyAllRunsQuery( + params: GetRunsParams = {}, + options: QueryOptionsWithPolling = {}, + hostOverride?: HostConfig | null +): UseQueryResult { + const [refetchUsingHTTP, setRefetchUsingHTTP] = React.useState(false) + + const { isNotifyError } = useNotifyService< + UseAllRunsQueryOptions, + AxiosError + >({ + topic: 'robot-server/runs', + refetchUsingHTTP: () => setRefetchUsingHTTP(true), + options, + }) + + const isNotifyEnabled = !isNotifyError && !options?.forceHttpPolling + if (!isNotifyEnabled && !refetchUsingHTTP) setRefetchUsingHTTP(true) + const isHTTPEnabled = options?.enabled !== false && refetchUsingHTTP + + const httpResponse = useAllRunsQuery( + params, + { + ...(options as UseAllRunsQueryOptions), + enabled: isHTTPEnabled, + onSettled: isNotifyEnabled ? () => setRefetchUsingHTTP(false) : undefined, + }, + hostOverride + ) + + return httpResponse +} diff --git a/app/src/resources/runs/useNotifyLastRunCommandKey.ts b/app/src/resources/runs/useNotifyLastRunCommandKey.ts new file mode 100644 index 00000000000..cf7a0ec650f --- /dev/null +++ b/app/src/resources/runs/useNotifyLastRunCommandKey.ts @@ -0,0 +1,32 @@ +import * as React from 'react' + +import { useNotifyService } from '../useNotifyService' +import { useLastRunCommandKey } from '../../organisms/Devices/hooks/useLastRunCommandKey' + +import type { CommandsData } from '@opentrons/api-client' +import type { QueryOptionsWithPolling } from '../useNotifyService' + +export function useNotifyLastRunCommandKey( + runId: string, + options?: QueryOptionsWithPolling +): string | null { + const [refetchUsingHTTP, setRefetchUsingHTTP] = React.useState(false) + + const { isNotifyError } = useNotifyService({ + topic: 'robot-server/runs/current_command', + refetchUsingHTTP: () => setRefetchUsingHTTP(true), + options: options != null ? options : {}, + }) + + const isNotifyEnabled = !isNotifyError && !options?.forceHttpPolling + if (!isNotifyEnabled && !refetchUsingHTTP) setRefetchUsingHTTP(true) + const isHTTPEnabled = options?.enabled !== false && refetchUsingHTTP + + const httpResponse = useLastRunCommandKey(runId, { + ...options, + enabled: isHTTPEnabled, + onSettled: isNotifyEnabled ? () => setRefetchUsingHTTP(false) : undefined, + }) + + return httpResponse +} diff --git a/app/src/resources/runs/useNotifyRunQuery.ts b/app/src/resources/runs/useNotifyRunQuery.ts new file mode 100644 index 00000000000..901c3c70b9e --- /dev/null +++ b/app/src/resources/runs/useNotifyRunQuery.ts @@ -0,0 +1,40 @@ +import * as React from 'react' + +import { useRunQuery, useHost } from '@opentrons/react-api-client' + +import { useNotifyService } from '../useNotifyService' + +import type { UseQueryResult } from 'react-query' +import type { Run } from '@opentrons/api-client' +import type { QueryOptionsWithPolling } from '../useNotifyService' +import type { NotifyTopic } from '../../redux/shell/types' + +export function useNotifyRunQuery( + runId: string | null, + options: QueryOptionsWithPolling = {} +): UseQueryResult { + const host = useHost() + const [refetchUsingHTTP, setRefetchUsingHTTP] = React.useState(false) + + const { isNotifyError } = useNotifyService({ + topic: `robot-server/runs/${runId}` as NotifyTopic, + refetchUsingHTTP: () => setRefetchUsingHTTP(true), + options, + }) + + const isNotifyEnabled = !isNotifyError && !options?.forceHttpPolling + if (!isNotifyEnabled && !refetchUsingHTTP) setRefetchUsingHTTP(true) + const isHTTPEnabled = + options?.enabled !== false && + refetchUsingHTTP && + host !== null && + runId != null + + const httpResponse = useRunQuery(runId, { + ...options, + enabled: isHTTPEnabled, + onSettled: isNotifyEnabled ? () => setRefetchUsingHTTP(false) : undefined, + }) + + return httpResponse +} diff --git a/app/src/resources/useNotifyService.ts b/app/src/resources/useNotifyService.ts new file mode 100644 index 00000000000..895ebb58ac0 --- /dev/null +++ b/app/src/resources/useNotifyService.ts @@ -0,0 +1,93 @@ +import * as React from 'react' + +import { useDispatch } from 'react-redux' + +import { useHost } from '@opentrons/react-api-client' + +import { appShellListener } from '../redux/shell/remote' +import { notifySubscribeAction, notifyUnsubscribeAction } from '../redux/shell' +import { + useTrackEvent, + ANALYTICS_NOTIFICATION_PORT_BLOCK_ERROR, +} from '../redux/analytics' + +import type { UseQueryOptions } from 'react-query' +import type { NotifyTopic } from '../redux/shell/types' + +export interface QueryOptionsWithPolling + extends UseQueryOptions { + forceHttpPolling?: boolean +} + +interface NotifyRefetchData { + refetchUsingHTTP: boolean + statusCode: never +} + +export type NotifyNetworkError = 'ECONNFAILED' | 'ECONNREFUSED' + +type NotifyResponseData = NotifyRefetchData | NotifyNetworkError + +interface UseNotifyServiceProps { + topic: NotifyTopic + refetchUsingHTTP: () => void + options: QueryOptionsWithPolling +} + +export function useNotifyService({ + topic, + refetchUsingHTTP, + options, +}: UseNotifyServiceProps): { isNotifyError: boolean } { + const dispatch = useDispatch() + const host = useHost() + const isNotifyError = React.useRef(false) + const doTrackEvent = useTrackEvent() + const { enabled, refetchInterval, forceHttpPolling } = options + const isRefetchEnabled = + refetchInterval !== undefined && refetchInterval !== false + + React.useEffect(() => { + // Always fetch on initial mount. + refetchUsingHTTP() + if (!forceHttpPolling && isRefetchEnabled && enabled !== false) { + const hostname = host?.hostname ?? null + const eventEmitter = appShellListener(hostname, topic) + + eventEmitter.on('data', onDataListener) + + if (hostname != null) { + dispatch(notifySubscribeAction(hostname, topic)) + } else { + console.error('NotifyService expected hostname, received null.') + } + + return () => { + eventEmitter.off('data', onDataListener) + if (hostname != null) { + dispatch(notifyUnsubscribeAction(hostname, topic)) + } + } + } + }, [topic]) + + return { isNotifyError: isNotifyError.current } + + function onDataListener(data: NotifyResponseData): void { + if (!isNotifyError.current) { + if (data === 'ECONNFAILED' || data === 'ECONNREFUSED') { + isNotifyError.current = true + if (data === 'ECONNREFUSED') { + doTrackEvent({ + name: ANALYTICS_NOTIFICATION_PORT_BLOCK_ERROR, + properties: {}, + }) + } + } else if ('refetchUsingHTTP' in data) { + refetchUsingHTTP() + } else { + console.log('Unexpected data received from notify service.') + } + } + } +} diff --git a/babel.config.js b/babel.config.js index a927176a44e..6d6efea1848 100644 --- a/babel.config.js +++ b/babel.config.js @@ -8,7 +8,7 @@ module.exports = { plugins: ['babel-plugin-styled-components', 'babel-plugin-unassert'], }, development: { - plugins: ['babel-plugin-styled-components', 'react-hot-loader/babel'], + plugins: ['babel-plugin-styled-components'], }, test: { plugins: [ @@ -53,17 +53,14 @@ module.exports = { }, { test: 'app-shell/**/*', - plugins: [['react-hot-loader/babel', false]], presets: [['@babel/preset-env', { targets: { electron: '6' } }]], }, { test: 'app-shell-odd/**/*', - plugins: [['react-hot-loader/babel', false]], presets: [['@babel/preset-env', { targets: { electron: '6' } }]], }, { test: ['discovery-client/**/*'], - plugins: [['react-hot-loader/babel', false]], presets: [['@babel/preset-env', { targets: { node: '8' } }]], }, // apps that should be polyfilled diff --git a/components/.npmignore b/components/.npmignore new file mode 100644 index 00000000000..b8cffed3c08 --- /dev/null +++ b/components/.npmignore @@ -0,0 +1,3 @@ +src +dist +*.tgz diff --git a/components/Makefile b/components/Makefile index 828cc6e84f5..e56a59cd680 100644 --- a/components/Makefile +++ b/components/Makefile @@ -3,6 +3,15 @@ # dev server port port ?= 6060 +# These variables can be overriden when make is invoked to customize the +# behavior of jest +tests ?= +cov_opts ?= --coverage=true --ci=true --collectCoverageFrom='components/src/**/*.(js|ts|tsx)' +test_opts ?= + +# override webpack's default hashing algorithm for node 18: https://github.com/webpack/webpack/issues/14532 +export NODE_OPTIONS := --openssl-legacy-provider + # standard targets ##################################################################### @@ -20,9 +29,22 @@ clean: dist: yarn --cwd .. build-storybook +.PHONY: lib +lib: export NODE_ENV := production +lib: + yarn webpack + # development ##################################################################### .PHONY: dev dev: yarn --cwd .. start-storybook --port $(port) + +.PHONY: test +test: + $(MAKE) -C .. test-js-components tests="$(tests)" test_opts="$(test_opts)" + +.PHONY: test-cov +test-cov: + make -C .. test-js-components tests=$(tests) test_opts="$(test_opts)" cov_opts="$(cov_opts)" diff --git a/components/README.md b/components/README.md index 45d4fb5350c..9c4cc4cb0c0 100644 --- a/components/README.md +++ b/components/README.md @@ -68,20 +68,3 @@ Unit tests live in a `__tests__` directory in the same directory as the module u [jest-snapshots]: https://facebook.github.io/jest/docs/en/snapshot-testing.html [contributing]: ../CONTRIBUTING.md - -### Flow definitions - -While the components library is written in TypeScript, some dependents of the components library are not yet converted. To ease the conversion effort, `components/flow-types` contains automatically generated Flow type definitions from the TypeScript typings generated by `tsc`. - -To generate these definitions - -```shell -# ensure all TypeScript definitions are built -make build-ts - -# build flow definitions (this may take a while!) -make -C components flow-types - -# you can also build individual files if you're testing out small changes -make -C components flow-types/buttons/Button.js.flow -``` diff --git a/components/package.json b/components/package.json index 4570691b889..cb3595c7e23 100644 --- a/components/package.json +++ b/components/package.json @@ -5,6 +5,8 @@ "source": "src/index.ts", "types": "lib/index.d.ts", "style": "src/index.css", + "main": "lib/opentrons-components.js", + "module": "src/index.ts", "repository": { "type": "git", "url": "git+https://github.com/Opentrons/opentrons.git" @@ -16,8 +18,10 @@ }, "homepage": "https://github.com/Opentrons/opentrons#readme", "peerDependencies": { - "react": "17.0.1", - "react-router-dom": "5.1.1" + "react": "18.2.0", + "react-dom": "18.2.0", + "react-router-dom": "5.3.4", + "@types/react-router-dom": "5.3.3" }, "dependencies": { "@opentrons/shared-data": "link:../shared-data", @@ -26,8 +30,6 @@ "@react-spring/web": "9.6.1", "@types/classnames": "2.2.5", "@types/lodash": "^4.14.191", - "@types/react": "^17.0.1", - "@types/react-router-dom": "^5.1.7", "@types/styled-components": "^5.1.26", "@types/webpack-env": "^1.16.0", "classnames": "2.2.5", diff --git a/components/src/__tests__/__snapshots__/alerts.test.tsx.snap b/components/src/__tests__/__snapshots__/alerts.test.tsx.snap deleted file mode 100644 index 8f0d6b2f57a..00000000000 --- a/components/src/__tests__/__snapshots__/alerts.test.tsx.snap +++ /dev/null @@ -1,194 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`alerts success alert renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
-
- - - good job! - -
-
-`; - -exports[`alerts warning alert onCloseClick renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
-
- - - warning - - -
-
-`; - -exports[`alerts warning alert renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
-
- - - warning - -
-
-`; - -exports[`alerts warning alert with message body renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
-
- - - warning - - -
-
-

- Title -

-
-
-`; diff --git a/components/src/__tests__/__snapshots__/buttons.test.tsx.snap b/components/src/__tests__/__snapshots__/buttons.test.tsx.snap deleted file mode 100644 index 254d5788e41..00000000000 --- a/components/src/__tests__/__snapshots__/buttons.test.tsx.snap +++ /dev/null @@ -1,215 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`buttons Button renders correctly 1`] = ` - -`; - -exports[`buttons Button with iconName renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`buttons DeprecatedPrimaryButton renders correctly 1`] = ` - -`; - -exports[`buttons DeprecatedPrimaryButton with iconName renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`buttons FlatButton renders correctly 1`] = ` - -`; - -exports[`buttons FlatButton with iconName renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`buttons IconButton renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`buttons Inverted OutlineButton renders correctly 1`] = ` - -`; - -exports[`buttons OutlineButton renders correctly 1`] = ` - -`; - -exports[`buttons OutlineButton with iconName renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; diff --git a/components/src/__tests__/__snapshots__/forms.test.tsx.snap b/components/src/__tests__/__snapshots__/forms.test.tsx.snap deleted file mode 100644 index 3aa523d04f1..00000000000 --- a/components/src/__tests__/__snapshots__/forms.test.tsx.snap +++ /dev/null @@ -1,649 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`DeprecatedCheckboxField renders correctly when checked 1`] = ` -.c0 { - width: 100%; -} - -.c1.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`DeprecatedCheckboxField renders correctly when unchecked 1`] = ` -.c0 { - width: 100%; -} - -.c1.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`DropdownField renders correctly with a falsey value 1`] = ` -.c0 { - width: 100%; -} - -.c1.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
-
- -
- -
-
-
- -
-
-`; - -exports[`DropdownField renders correctly with a value 1`] = ` -.c0 { - width: 100%; -} - -.c1.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
-
- -
- -
-
-
- -
-
-`; - -exports[`FormGroup renders correctly 1`] = ` -
-
- This is the label -
-
- Hey test here -
-
- More test here -
-
-`; - -exports[`InputField renders correctly 1`] = ` - -`; - -exports[`RadioGroup renders correctly inline 1`] = ` -.c0 { - width: 100%; -} - -.c1.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
- - - -
-`; - -exports[`RadioGroup renders correctly with checked value 1`] = ` -.c0 { - width: 100%; -} - -.c1.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
- - - -
-`; - -exports[`RadioGroup renders correctly with no checked value 1`] = ` -.c0 { - width: 100%; -} - -.c1.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
- - - -
-`; diff --git a/components/src/__tests__/__snapshots__/icons.test.tsx.snap b/components/src/__tests__/__snapshots__/icons.test.tsx.snap deleted file mode 100644 index e61d81cc8a5..00000000000 --- a/components/src/__tests__/__snapshots__/icons.test.tsx.snap +++ /dev/null @@ -1,3478 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Notification Icon NotificationIcon renders correctly 1`] = ` -.c1 { - color: #e28200; -} - -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons alert renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons alert-circle renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons arrow-down renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons arrow-left renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons arrow-right renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons arrow-up renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons back renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons book-open-page-variant renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons brightness renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons build renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons caret-right renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons check renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons check-circle renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons check-decagram renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons checkbox-blank-circle-outline renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons checkbox-blank-outline renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons checkbox-marked renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons checkbox-multiple-marked-outline renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons chevron-down renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons chevron-left renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons chevron-right renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons chevron-up renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons circle renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons clockwise-arrow renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons close renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons close-circle renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons close-icon renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons closed-locked renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons comment renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons connection-status renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons content-copy renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons copy-text renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons counter-clockwise-arrow renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons cursor-move renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons deck-map renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons delete renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons dots-horizontal renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons dots-vertical renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons download renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ethernet renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons eye renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons eye-slash renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons flask-outline renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons flex-robot renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons folder-open renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons gantry-homing renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons gear renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons help-circle renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons home-gantry renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons horizontal-plane renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons info renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons information renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons jump-size renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons latch-closed renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons latch-open renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons light renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons lock renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons menu renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons menu-down renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons minus renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons minus-box renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons more renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons move-xy renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons move-xy-circle renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons open-in-new renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-alert renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-arrow-down renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-arrow-left renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-arrow-right renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-arrow-up renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-calibrate renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-check renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-checkbox renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-click-and-drag renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-close renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-close-thick renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-connect renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-consolidate renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-copy-text renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-design renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-distribute renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-file renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-flat-bottom renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-heater-shaker renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-hot-to-touch renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-logo renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-magnet renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-magnet-v2 renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-mix renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-run renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-spinner renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-temperature renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-temperature-v2 renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-thermocycler renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-toggle-field-off renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-toggle-field-on renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-toggle-input-off renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-toggle-input-on renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-toggle-switch-off renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-toggle-switch-on renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-transfer renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-u-bottom renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-v-bottom renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-water-outline renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-wifi-0 renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-wifi-1 renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-wifi-2 renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons ot-wifi-3 renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons overflow-btn-touchscreen renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons pause renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons pause-circle renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons pause-icon renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons pen renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons pencil renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons pin renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons play renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons play-circle renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons play-icon renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons play-round-corners renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons plus renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons privacy renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons question-mark-circle renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons radiobox-blank renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons radiobox-marked renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons refresh renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons reset renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons restart renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons reticle renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons settings renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons sleep renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons swap-horizontal renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons text-size renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons trash renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons unfold-less-horizontal renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons unfold-more-horizontal renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons union renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons update renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons update-channel renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons upload renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons usb renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons vertical-plane renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons water renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; - -exports[`icons wifi renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - -`; diff --git a/components/src/__tests__/__snapshots__/instrument-diagram.test.tsx.snap b/components/src/__tests__/__snapshots__/instrument-diagram.test.tsx.snap deleted file mode 100644 index d0093db3092..00000000000 --- a/components/src/__tests__/__snapshots__/instrument-diagram.test.tsx.snap +++ /dev/null @@ -1,224 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`InstrumentDiagram 96-channel GEN1 renders correctly 1`] = ` -.c0 { - min-width: 0; -} - -
- -
-`; - -exports[`InstrumentDiagram Multi-channel GEN2 renders correctly 1`] = ` -.c0 { - min-width: 0; - -webkit-transform: scaleX(-1); - -ms-transform: scaleX(-1); - transform: scaleX(-1); - -webkit-filter: FlipH; - filter: FlipH; -} - -
- -
-`; - -exports[`InstrumentDiagram Multi-channel renders correctly 1`] = ` -.c0 { - min-width: 0; -} - -
- -
-`; - -exports[`InstrumentDiagram Single-channel GEN2 renders correctly 1`] = ` -.c0 { - min-width: 0; - -webkit-transform: scaleX(-1); - -ms-transform: scaleX(-1); - transform: scaleX(-1); - -webkit-filter: FlipH; - filter: FlipH; -} - -
- -
-`; - -exports[`InstrumentDiagram Single-channel renders correctly 1`] = ` -.c0 { - min-width: 0; -} - -
- -
-`; - -exports[`InstrumentDiagram eight-channel FLEX renders correctly 1`] = ` -.c0 { - min-width: 0; - -webkit-transform: scaleX(-1); - -ms-transform: scaleX(-1); - transform: scaleX(-1); - -webkit-filter: FlipH; - filter: FlipH; -} - -
- -
-`; - -exports[`InstrumentDiagram single-channel FLEX renders correctly 1`] = ` -.c0 { - min-width: 0; - -webkit-transform: scaleX(-1); - -ms-transform: scaleX(-1); - transform: scaleX(-1); - -webkit-filter: FlipH; - filter: FlipH; -} - -
- -
-`; - -exports[`InstrumentGroup Renders correctly 1`] = ` -.c2 { - min-width: 0; -} - -.c3 { - min-width: 0; - -webkit-transform: scaleX(-1); - -ms-transform: scaleX(-1); - transform: scaleX(-1); - -webkit-filter: FlipH; - filter: FlipH; -} - -.c0 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - grid-gap: 1rem; -} - -.c1 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; -} - -
-
-
-
-

- pipette -

- - p300 8-Channel - -
-
-
- -
-
-
-
- -
-
-
-

- pipette -

- - p10 Single - -
-
-
-
-`; diff --git a/components/src/__tests__/__snapshots__/lists.test.tsx.snap b/components/src/__tests__/__snapshots__/lists.test.tsx.snap deleted file mode 100644 index 8e2ee5f2257..00000000000 --- a/components/src/__tests__/__snapshots__/lists.test.tsx.snap +++ /dev/null @@ -1,302 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ListItem Disabled Side Panel Group renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
-
- -

- title -

-
- children -
-`; - -exports[`ListItem Side Panel Group renders correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
-
- -

- title -

-
- children -
-`; - -exports[`ListItem renders ListItem with icon correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
  • - -
  • -`; - -exports[`ListItem renders ListItem without icon correctly 1`] = ` -
  • Woop
  • - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders TitledList with onMouseEnter & onMouseLeave correctly', () => { - const noop = (): void => {} - - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders TitledList with optional icon correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders expanded TitledList correctly', () => { - const tree = Renderer.create( - {}} - description={Description} - > -
  • 1
  • -
  • 2
  • -
    - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders collapsed TitledList correctly', () => { - const tree = Renderer.create( - {}} - description={Description} - collapsed - > -
  • 1
  • -
  • 2
  • -
    - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) - -describe('ListItem', () => { - it('creates a linked list item from props', () => { - const linkItemProps = { - url: '/foo/bar', - isDisabled: false, - } - - const root = Renderer.create( - - foo - - ).root - - const link = root.findByType('a') - expect(link.props.href).toBe(linkItemProps.url) - }) - - it('adds an optional svg icon as child', () => { - const icon = Renderer.create( - - ).root.findByType('svg') - - expect(icon).toBeDefined() - }) - - it('renders ListItem with icon correctly', () => { - const tree = Renderer.create().toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders ListItem without icon correctly', () => { - const tree = Renderer.create().toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('Side Panel Group renders correctly', () => { - const tree = Renderer.create( - - children - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('Disabled Side Panel Group renders correctly', () => { - const tree = Renderer.create( - - children - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) diff --git a/components/src/__tests__/modals.test.tsx b/components/src/__tests__/modals.test.tsx deleted file mode 100644 index cac3fe59b9e..00000000000 --- a/components/src/__tests__/modals.test.tsx +++ /dev/null @@ -1,163 +0,0 @@ -// modal component tests -import React from 'react' -import Renderer from 'react-test-renderer' - -import { - Modal, - AlertModal, - ContinueModal, - ModalPage, - SpinnerModalPage, - Overlay, -} from '..' - -describe('modals', () => { - it('Modal has a clickable overlay', () => { - const onCloseClick = jest.fn() - const root = Renderer.create( - children - ).root - - const overlay = root.findByProps({ - backgroundColor: 'rgba(0, 0, 0, 0.9)', - }) - overlay.props.onClick() - - expect(onCloseClick).toHaveBeenCalled() - }) - - it('ContinueModal has continue and cancel buttons', () => { - const onCancelClick = jest.fn() - const onContinueClick = jest.fn() - const root = Renderer.create( - - children - - ).root - - const cancelButton = root.findByProps({ title: 'Cancel' }) - const continueButton = root.findByProps({ title: 'Continue' }) - - cancelButton.props.onClick() - expect(onCancelClick).toHaveBeenCalled() - - continueButton.props.onClick() - expect(onContinueClick).toHaveBeenCalled() - }) - - it('ContinueModal calls onCancelClick on overlay click', () => { - const onCancelClick = jest.fn() - const onContinueClick = jest.fn() - const root = Renderer.create( - - children - - ).root - - const overlay = root.findByProps({ - backgroundColor: 'rgba(0, 0, 0, 0.9)', - }) - - overlay.props.onClick() - expect(onCancelClick).toHaveBeenCalled() - }) - - it('Modal renders correctly', () => { - const tree = Renderer.create( - {}} className="foo"> - children - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('Modal renders correctly with optional heading', () => { - const tree = Renderer.create( - {}} - className="foo" - heading={'Heading Visible'} - > - children - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('AlertModal renders correctly', () => { - const tree = Renderer.create( - {}} - buttons={[ - { onClick: () => {}, children: 'a' }, - { onClick: () => {}, children: 'b' }, - ]} - > - children - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('ContinueModal renders correctly', () => { - const tree = Renderer.create( - {}} onContinueClick={() => {}}> - children - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('Overlay renders correctly', () => { - const tree = Renderer.create( {}} />).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('ModalPage renders correctly', () => { - const tree = Renderer.create( - alert('back button clicked'), - }, - }} - > - children - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('SpinnerModalPage renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) diff --git a/components/src/__tests__/nav.test.tsx b/components/src/__tests__/nav.test.tsx deleted file mode 100644 index dfa6a9aa887..00000000000 --- a/components/src/__tests__/nav.test.tsx +++ /dev/null @@ -1,22 +0,0 @@ -// navigation components tests -import React from 'react' -import Renderer from 'react-test-renderer' - -import { SidePanel } from '..' - -describe('SidePanel', () => { - it('renders sidebar with title', () => { - const heading = Renderer.create( - - ).root.findByType('h2') - - expect(heading).toBeDefined() - expect(heading.children).toEqual(['title']) - }) - - it('renders sidebar without title', () => { - const headings = Renderer.create().root.findAllByType('h2') - - expect(headings).toHaveLength(0) - }) -}) diff --git a/components/src/__tests__/slotmap.test.tsx b/components/src/__tests__/slotmap.test.tsx deleted file mode 100644 index 1400385c716..00000000000 --- a/components/src/__tests__/slotmap.test.tsx +++ /dev/null @@ -1,36 +0,0 @@ -// slot map component tests -import React from 'react' -import Renderer from 'react-test-renderer' -import { SlotMap } from '..' - -describe('SlotMap', () => { - it('renders correctly without collision warnings or errors', () => { - const tree = Renderer.create().toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders correctly with collision warning', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders correctly with error', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders correctly with error and collision warning', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) diff --git a/components/src/__tests__/structure.test.tsx b/components/src/__tests__/structure.test.tsx deleted file mode 100644 index f47c6a956ec..00000000000 --- a/components/src/__tests__/structure.test.tsx +++ /dev/null @@ -1,190 +0,0 @@ -// structure components tests -import React from 'react' -import { MemoryRouter } from 'react-router-dom' -import Renderer from 'react-test-renderer' - -import { PageTabs, TitleBar, Card, LabeledValue, Splash, Pill } from '..' - -describe('TitleBar', () => { - it('adds an h1 with the title', () => { - const heading = Renderer.create().root.findByType( - 'h1' - ) - - expect(heading).toBeDefined() - expect(heading.children).toEqual(['hello']) - }) - - it('adds an optional h2 with the subtitle', () => { - const heading = Renderer.create( - - ).root.findByType('h2') - - expect(heading).toBeDefined() - expect(heading.children).toEqual(['world']) - }) - - it('add optional back button', () => { - const onBackClick = jest.fn() - const button = Renderer.create( - - ).root.findByType('button') - - button.props.onClick() - expect(onBackClick).toHaveBeenCalled() - }) - - it('renders TitleBar without subtitle correctly', () => { - const tree = Renderer.create().toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders TitleBar with subtitle correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders TitleBar with back button correctly', () => { - const tree = Renderer.create( - {}} /> - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders TitleBar with rightNode and its ReactNode as a string', () => { - const rightNode = 'foo bar' - const tree = Renderer.create() - - expect(tree).toMatchSnapshot() - }) -}) - -describe('PageTabs', () => { - it('renders h3 links for each page', () => { - const pages = [ - { title: 'Page1', href: '/page1', isActive: false, isDisabled: false }, - { title: 'Page2', href: '/page2', isActive: false, isDisabled: false }, - ] - - const root = Renderer.create( - - - - ).root - - const links = root.findAllByType('a') - expect(links).toHaveLength(2) - - links.forEach((link, index) => { - const { title, href } = pages[index] - expect(link.props.href).toBe(href) - expect(link.findByType('h3').children).toEqual([title]) - }) - }) - - it('does not create a link if disabled', () => { - const pages = [ - { title: 'Page1', href: '/page1', isActive: false, isDisabled: true }, - ] - - const notLink = Renderer.create( - - - - ).root.findByType('span') - - expect(notLink.findByType('h3').children).toEqual([pages[0].title]) - }) - - it('adds active class if active', () => { - const pages = [ - { title: 'Page1', href: '/page1', isActive: true, isDisabled: false }, - ] - - const link = Renderer.create( - - - - ).root.findByType('a') - - expect(link.props.className).toMatch(/active/) - }) - - it('renders PageTabs correctly', () => { - const pages = [ - { title: 'Page1', href: '/page1', isActive: true, isDisabled: false }, - { title: 'Page2', href: '/page2', isActive: false, isDisabled: true }, - ] - - const tree = Renderer.create( - - - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) - -describe('Card', () => { - it('renders Card correctly', () => { - const tree = Renderer.create( - children children children - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) - -describe('LabeledValue', () => { - it('renders LabeledValue correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) - -describe('Splash', () => { - it('renders correctly with no props', () => { - const tree = Renderer.create().toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders correctly with custom props', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) - -describe('Pill', () => { - it('renders Pill correctly', () => { - const tree = Renderer.create( - - Blue - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders Pill correctly with inverted text', () => { - const tree = Renderer.create( - - Blue - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) diff --git a/components/src/alerts/AlertItem.tsx b/components/src/alerts/AlertItem.tsx index 0a39a28dbbf..15bd4a7f176 100644 --- a/components/src/alerts/AlertItem.tsx +++ b/components/src/alerts/AlertItem.tsx @@ -68,7 +68,9 @@ export function AlertItem(props: AlertItemProps): JSX.Element {
    - {props.title} + + {props.title} + {props.onCloseClick && ( { // INNER_STYLE_NO_VALUE expect(checkBoxIcon).toHaveStyle(`width: 1.25rem`) expect(checkBoxIcon).toHaveStyle(`min-width: 1.25rem`) - expect(checkBoxIcon).toHaveStyle(`color: ${String(COLORS.darkGreyEnabled)}`) + expect(checkBoxIcon).toHaveStyle(`color: ${String(COLORS.grey50)}`) expect(checkBoxIcon).toHaveStyle(`display: flex`) expect(checkBoxIcon).toHaveStyle(`border-radius: 1px`) expect(checkBoxIcon).toHaveStyle( @@ -49,39 +51,27 @@ describe('CheckboxField', () => { expect(checkBoxIcon).toHaveStyleRule('cursor', 'pointer', { modifier: ':hover', }) - expect(checkBoxIcon).toHaveStyleRule( - 'color', - `${String(COLORS.darkGreyHover)}`, - { - modifier: ':hover', - } - ) - expect(checkBoxIcon).toHaveStyleRule( - 'color', - `${String(COLORS.darkGreyPressed)}`, - { - modifier: ':active', - } - ) + expect(checkBoxIcon).toHaveStyleRule('color', `${String(COLORS.grey60)}`, { + modifier: ':hover', + }) + expect(checkBoxIcon).toHaveStyleRule('color', `${String(COLORS.grey60)}`, { + modifier: ':active', + }) expect(checkBoxIcon).toHaveStyleRule( 'box-shadow', - `0 0 0 3px ${String(COLORS.fundamentalsFocus)}`, + `0 0 0 3px ${String(COLORS.blue50)}`, { modifier: ':focus' } ) - expect(checkBoxIcon).toHaveStyleRule( - 'color', - `${String(COLORS.darkGreyPressed)}`, - { - modifier: ':disabled', - } - ) + expect(checkBoxIcon).toHaveStyleRule('color', `${String(COLORS.grey60)}`, { + modifier: ':disabled', + }) // TODO: kj 09/15/2022 This part will be update later OUTER_STYLE // const checkBoxLabel = getByTestId('CheckboxField_label') // expect(checkBoxLabel).toHaveStyle('@apply --font-form-default') // expect(checkBoxLabel).toHaveStyle('font-size: 0.75rem') // expect(checkBoxLabel).toHaveStyle('font-weight: 400') - // expect(checkBoxLabel).toHaveStyle(`color: ${COLORS.darkBlackEnabled}`) + // expect(checkBoxLabel).toHaveStyle(`color: ${COLORS.black90}`) // expect(checkBoxLabel).toHaveStyle('display: flex') // expect(checkBoxLabel).toHaveStyle(`align-items: ${ALIGN_CENTER}`) // expect(checkBoxLabel).toHaveStyle('line-height: 1') @@ -104,9 +94,7 @@ describe('CheckboxField', () => { expect(checkBoxFieldBox).toHaveStyle( `font-weight: ${String(TYPOGRAPHY.fontWeightRegular)}` ) - expect(checkBoxFieldBox).toHaveStyle( - `color: ${String(COLORS.darkBlackEnabled)}` - ) + expect(checkBoxFieldBox).toHaveStyle(`color: ${String(COLORS.black90)}`) expect(checkBoxFieldBox).toHaveStyle(`flex: 0 0 auto`) expect(checkBoxFieldBox).toHaveStyle( `padding: ${SPACING.spacing8} ${SPACING.spacing8}` @@ -123,7 +111,7 @@ describe('CheckboxField', () => { const checkBoxIcon = getByTestId('CheckboxField_icon') expect(checkBoxIcon).toHaveStyle(`width: 1.25rem`) expect(checkBoxIcon).toHaveStyle(`min-width: 1.25rem`) - expect(checkBoxIcon).toHaveStyle(`color: ${String(COLORS.blueEnabled)}`) + expect(checkBoxIcon).toHaveStyle(`color: ${String(COLORS.blue50)}`) expect(checkBoxIcon).toHaveStyle(`display: flex`) expect(checkBoxIcon).toHaveStyle(`border-radius: 1px`) expect(checkBoxIcon).toHaveStyle( @@ -138,7 +126,7 @@ describe('CheckboxField', () => { const checkBoxIcon = getByTestId('CheckboxField_icon') expect(checkBoxIcon).toHaveStyle(`width: 1.25rem`) expect(checkBoxIcon).toHaveStyle(`min-width: 1.25rem`) - expect(checkBoxIcon).toHaveStyle(`color: ${String(COLORS.darkGreyEnabled)}`) + expect(checkBoxIcon).toHaveStyle(`color: ${String(COLORS.grey50)}`) expect(checkBoxIcon).toHaveStyle(`display: flex`) expect(checkBoxIcon).toHaveStyle(`border-radius: 1px`) expect(checkBoxIcon).toHaveStyle( diff --git a/components/src/atoms/CheckboxField/index.tsx b/components/src/atoms/CheckboxField/index.tsx index 0f10c9ec596..d11abd36ea0 100644 --- a/components/src/atoms/CheckboxField/index.tsx +++ b/components/src/atoms/CheckboxField/index.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import { css } from 'styled-components' -import { COLORS, SPACING, TYPOGRAPHY } from '../../ui-style-constants' +import { SPACING, TYPOGRAPHY } from '../../ui-style-constants' +import { COLORS } from '../../helix-design-system' import { Flex, Box } from '../../primitives' import { Icon } from '../../icons' import { ALIGN_CENTER, JUSTIFY_CENTER, SIZE_1 } from '../../styles' @@ -45,7 +46,7 @@ const OUTER_STYLE = css` const INNER_STYLE_VALUE = css` width: ${SPACING.spacing20}; min-width: ${SPACING.spacing20}; - color: ${COLORS.blueEnabled}; + color: ${COLORS.blue50}; display: flex; border-radius: 1px; justify-content: ${JUSTIFY_CENTER}; @@ -53,25 +54,25 @@ const INNER_STYLE_VALUE = css` &:hover { cursor: pointer; - color: ${COLORS.blueHover}; + color: ${COLORS.blue55}; } &:active { - color: ${COLORS.bluePressed}; + color: ${COLORS.blue60}; } &:focus { - box-shadow: 0 0 0 3px ${COLORS.fundamentalsFocus}; + box-shadow: 0 0 0 3px ${COLORS.blue50}; } &:disabled { - color: ${COLORS.bluePressed}; + color: ${COLORS.blue60}; } ` const INNER_STYLE_NO_VALUE = css` width: ${SPACING.spacing20}; min-width: ${SPACING.spacing20}; - color: ${COLORS.darkGreyEnabled}; + color: ${COLORS.grey50}; display: flex; border-radius: 1px; justify-content: ${JUSTIFY_CENTER}; @@ -79,26 +80,26 @@ const INNER_STYLE_NO_VALUE = css` &:hover { cursor: pointer; - color: ${COLORS.darkGreyHover}; + color: ${COLORS.grey60}; } &:active { - color: ${COLORS.darkGreyPressed}; + color: ${COLORS.grey60}; } &:focus { - box-shadow: 0 0 0 3px ${COLORS.fundamentalsFocus}; + box-shadow: 0 0 0 3px ${COLORS.blue50}; } &:disabled { - color: ${COLORS.darkGreyPressed}; + color: ${COLORS.grey60}; } ` const LABEL_TEXT_STYLE = css` font-size: ${TYPOGRAPHY.fontSizeP}; font-weight: ${TYPOGRAPHY.fontWeightRegular}; - color: ${COLORS.darkBlackEnabled}; + color: ${COLORS.black90}; flex: 0 0 auto; padding: ${SPACING.spacing8} ${SPACING.spacing8}; @@ -126,13 +127,13 @@ export function CheckboxField(props: CheckboxFieldProps): JSX.Element { alignItems={ALIGN_CENTER} justifyContent={JUSTIFY_CENTER} borderRadius="2px" - backgroundColor={COLORS.darkGreyDisabled} + backgroundColor={COLORS.grey30} size={SIZE_1} > ) : ( diff --git a/components/src/atoms/StepMeter/index.tsx b/components/src/atoms/StepMeter/index.tsx index 1dddf1b1299..14bbf48c6ca 100644 --- a/components/src/atoms/StepMeter/index.tsx +++ b/components/src/atoms/StepMeter/index.tsx @@ -1,7 +1,8 @@ import * as React from 'react' import { css } from 'styled-components' import { Box } from '../../primitives' -import { COLORS, RESPONSIVENESS, SPACING } from '../../ui-style-constants' +import { RESPONSIVENESS, SPACING } from '../../ui-style-constants' +import { COLORS } from '../../helix-design-system' import { POSITION_ABSOLUTE, POSITION_RELATIVE } from '../../styles' interface StepMeterProps { @@ -22,7 +23,7 @@ export const StepMeter = (props: StepMeterProps): JSX.Element => { const StepMeterContainer = css` position: ${POSITION_RELATIVE}; height: ${SPACING.spacing4}; - background-color: ${COLORS.medGreyEnabled}; + background-color: ${COLORS.grey30}; @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { height: ${SPACING.spacing12}; } @@ -31,7 +32,7 @@ export const StepMeter = (props: StepMeterProps): JSX.Element => { position: ${POSITION_ABSOLUTE}; top: 0; height: 100%; - background-color: ${COLORS.blueEnabled}; + background-color: ${COLORS.blue50}; width: ${percentComplete}; webkit-transition: width 0.5s ease-in-out; moz-transition: width 0.5s ease-in-out; diff --git a/components/src/atoms/buttons/AlertPrimaryButton.tsx b/components/src/atoms/buttons/AlertPrimaryButton.tsx index 143f13ca391..4fd8f2ec845 100644 --- a/components/src/atoms/buttons/AlertPrimaryButton.tsx +++ b/components/src/atoms/buttons/AlertPrimaryButton.tsx @@ -1,9 +1,10 @@ import styled from 'styled-components' -import { COLORS, BORDERS, TYPOGRAPHY, SPACING } from '../../ui-style-constants' +import { BORDERS, TYPOGRAPHY, SPACING } from '../../ui-style-constants' +import { COLORS } from '../../helix-design-system' import { NewAlertPrimaryBtn, styleProps } from '../../primitives' export const AlertPrimaryButton = styled(NewAlertPrimaryBtn)` - background-color: ${COLORS.errorEnabled}; + background-color: ${COLORS.red50}; border-radius: ${BORDERS.radiusSoftCorners}; padding-left: ${SPACING.spacing16}; padding-right: ${SPACING.spacing16}; @@ -18,7 +19,7 @@ export const AlertPrimaryButton = styled(NewAlertPrimaryBtn)` } &:disabled { - background-color: ${COLORS.darkGreyDisabled}; - color: ${COLORS.errorDisabled}; + background-color: ${COLORS.grey30}; + color: ${COLORS.grey40}; } ` diff --git a/components/src/atoms/buttons/PrimaryButton.tsx b/components/src/atoms/buttons/PrimaryButton.tsx index 2ddd9df94d3..b45107640e7 100644 --- a/components/src/atoms/buttons/PrimaryButton.tsx +++ b/components/src/atoms/buttons/PrimaryButton.tsx @@ -1,9 +1,10 @@ import styled from 'styled-components' -import { COLORS, BORDERS, TYPOGRAPHY, SPACING } from '../../ui-style-constants' +import { BORDERS, TYPOGRAPHY, SPACING } from '../../ui-style-constants' +import { COLORS } from '../../helix-design-system' import { NewPrimaryBtn, styleProps } from '../../primitives' export const PrimaryButton = styled(NewPrimaryBtn)` - background-color: ${COLORS.blueEnabled}; + background-color: ${COLORS.blue50}; border-radius: ${BORDERS.radiusSoftCorners}; box-shadow: none; padding-left: ${SPACING.spacing16}; @@ -16,20 +17,20 @@ export const PrimaryButton = styled(NewPrimaryBtn)` &:hover, &:focus { - background-color: ${COLORS.blueHover}; + background-color: ${COLORS.blue55}; box-shadow: none; } &:focus-visible { - box-shadow: 0 0 0 3px ${COLORS.warningEnabled}; + box-shadow: 0 0 0 3px ${COLORS.yellow50}; } &:active { - background-color: ${COLORS.bluePressed}; + background-color: ${COLORS.blue60}; } &:disabled { - background-color: ${COLORS.darkGreyDisabled}; - color: ${COLORS.errorDisabled}; + background-color: ${COLORS.grey30}; + color: ${COLORS.grey50}; } ` diff --git a/components/src/atoms/buttons/SecondaryButton.tsx b/components/src/atoms/buttons/SecondaryButton.tsx index 5f071aa117e..5b624e60363 100644 --- a/components/src/atoms/buttons/SecondaryButton.tsx +++ b/components/src/atoms/buttons/SecondaryButton.tsx @@ -1,7 +1,7 @@ import styled from 'styled-components' -import { COLORS, BORDERS, TYPOGRAPHY, SPACING } from '../../ui-style-constants' +import { BORDERS, TYPOGRAPHY, SPACING } from '../../ui-style-constants' import { isntStyleProp, styleProps } from '../../primitives' - +import { COLORS } from '../../helix-design-system' import type { StyleProps } from '../../index' interface SecondaryButtonProps extends StyleProps { @@ -13,11 +13,9 @@ export const SecondaryButton = styled.button.withConfig({ })` appearance: none; cursor: pointer; - color: ${props => - props.isDangerous ? COLORS.errorText : COLORS.blueEnabled}; + color: ${props => (props.isDangerous ? COLORS.red60 : COLORS.blue50)}; border: ${BORDERS.lineBorder}; - border-color: ${props => - props.isDangerous ? COLORS.errorEnabled : 'initial'}; + border-color: ${props => (props.isDangerous ? COLORS.red50 : 'initial')}; border-radius: ${BORDERS.radiusSoftCorners}; padding: ${SPACING.spacing8} ${SPACING.spacing16}; text-transform: ${TYPOGRAPHY.textTransformNone}; @@ -30,23 +28,31 @@ export const SecondaryButton = styled.button.withConfig({ } &:hover { - opacity: 70%; + color: ${props => (props.isDangerous ? COLORS.red60 : COLORS.blue60)}; + border-color: ${props => + props.isDangerous ? COLORS.red50 : COLORS.blue55}; box-shadow: 0 0 0; } &:focus-visible { - box-shadow: 0 0 0 3px ${COLORS.fundamentalsFocus}; + color: ${props => (props.isDangerous ? COLORS.red60 : COLORS.blue60)}; + border-color: ${props => + props.isDangerous ? COLORS.red50 : COLORS.blue60}; + box-shadow: 0 0 0 3px ${COLORS.yellow50}; } &:active { box-shadow: none; + color: ${props => (props.isDangerous ? COLORS.red60 : COLORS.blue55)}; + border-color: ${props => + props.isDangerous ? COLORS.red50 : COLORS.blue55}; } &:disabled, &.disabled { box-shadow: none; - opacity: 50%; - cursor: default; + border-color: ${COLORS.grey30}; + color: ${COLORS.grey40}; } ${styleProps} diff --git a/components/src/atoms/buttons/__tests__/AlertPrimaryButton.test.tsx b/components/src/atoms/buttons/__tests__/AlertPrimaryButton.test.tsx index ae09ca1a2ec..c3d909c6eb4 100644 --- a/components/src/atoms/buttons/__tests__/AlertPrimaryButton.test.tsx +++ b/components/src/atoms/buttons/__tests__/AlertPrimaryButton.test.tsx @@ -1,11 +1,8 @@ +import 'jest-styled-components' import * as React from 'react' import { renderWithProviders } from '../../../testing/utils' -import { - COLORS, - BORDERS, - TYPOGRAPHY, - SPACING, -} from '../../../ui-style-constants' +import { COLORS } from '../../../helix-design-system' +import { BORDERS, TYPOGRAPHY, SPACING } from '../../../ui-style-constants' import { AlertPrimaryButton } from '../AlertPrimaryButton' @@ -25,7 +22,7 @@ describe('AlertPrimaryButton', () => { it('renders alert primary button with text', () => { const { getByText } = render(props) const button = getByText('alert primary button') - expect(button).toHaveStyle(`background-color: ${COLORS.errorEnabled}`) + expect(button).toHaveStyle(`background-color: ${COLORS.red50}`) expect(button).toHaveStyle( `padding: ${SPACING.spacing8} ${SPACING.spacing16} ${SPACING.spacing8} ${SPACING.spacing16}` ) diff --git a/components/src/atoms/buttons/__tests__/PrimaryButton.test.tsx b/components/src/atoms/buttons/__tests__/PrimaryButton.test.tsx index 45d0e69c506..dc2604a6dab 100644 --- a/components/src/atoms/buttons/__tests__/PrimaryButton.test.tsx +++ b/components/src/atoms/buttons/__tests__/PrimaryButton.test.tsx @@ -1,11 +1,8 @@ +import 'jest-styled-components' import * as React from 'react' import { renderWithProviders } from '../../../testing/utils' -import { - COLORS, - BORDERS, - TYPOGRAPHY, - SPACING, -} from '../../../ui-style-constants' +import { COLORS } from '../../../helix-design-system' +import { BORDERS, TYPOGRAPHY, SPACING } from '../../../ui-style-constants' import { PrimaryButton } from '../PrimaryButton' const render = (props: React.ComponentProps) => { @@ -24,7 +21,7 @@ describe('PrimaryButton', () => { it('renders primary button with text', () => { const { getByText } = render(props) const button = getByText('primary button') - expect(button).toHaveStyle(`background-color: ${COLORS.blueEnabled}`) + expect(button).toHaveStyle(`background-color: ${COLORS.blue50}`) expect(button).toHaveStyle( `padding: ${SPACING.spacing8} ${SPACING.spacing16} ${SPACING.spacing8} ${SPACING.spacing16}` ) @@ -44,14 +41,14 @@ describe('PrimaryButton', () => { const { getByText } = render(props) const button = getByText('primary button') expect(button).toBeDisabled() - expect(button).toHaveStyle(`background-color: ${COLORS.darkGreyDisabled}`) - expect(button).toHaveStyle(`color: ${COLORS.errorDisabled}`) + expect(button).toHaveStyle(`background-color: ${COLORS.grey30}`) + expect(button).toHaveStyle(`color: ${COLORS.grey50}`) }) it('applies the correct states to the button - focus', () => { const { getByText } = render(props) const button = getByText('primary button') - expect(button).toHaveStyleRule('background-color', `${COLORS.blueHover}`, { + expect(button).toHaveStyleRule('background-color', `${COLORS.blue55}`, { modifier: ':focus', }) }) @@ -59,7 +56,7 @@ describe('PrimaryButton', () => { it('applies the correct states to the button - hover', () => { const { getByText } = render(props) const button = getByText('primary button') - expect(button).toHaveStyleRule('background-color', `${COLORS.blueHover}`, { + expect(button).toHaveStyleRule('background-color', `${COLORS.blue55}`, { modifier: ':hover', }) }) @@ -67,13 +64,9 @@ describe('PrimaryButton', () => { it('applies the correct states to the button - active', () => { const { getByText } = render(props) const button = getByText('primary button') - expect(button).toHaveStyleRule( - 'background-color', - `${COLORS.bluePressed}`, - { - modifier: ':active', - } - ) + expect(button).toHaveStyleRule('background-color', `${COLORS.blue60}`, { + modifier: ':active', + }) }) it('applies the correct states to the button - focus-visible', () => { @@ -81,7 +74,7 @@ describe('PrimaryButton', () => { const button = getByText('primary button') expect(button).toHaveStyleRule( 'box-shadow', - `0 0 0 3px ${COLORS.warningEnabled}`, + `0 0 0 3px ${COLORS.yellow50}`, { modifier: ':focus-visible', } @@ -89,10 +82,10 @@ describe('PrimaryButton', () => { }) it('renders primary button with text and different background color', () => { - props.backgroundColor = COLORS.errorEnabled + props.backgroundColor = COLORS.red50 const { getByText } = render(props) const button = getByText('primary button') - expect(button).toHaveStyle(`background-color: ${COLORS.errorEnabled}`) + expect(button).toHaveStyle(`background-color: ${COLORS.red50}`) expect(button).toHaveStyle(`color: ${COLORS.white}`) }) }) diff --git a/components/src/atoms/buttons/__tests__/SecondaryButton.test.tsx b/components/src/atoms/buttons/__tests__/SecondaryButton.test.tsx index 3f31693360e..2fb1f4079c5 100644 --- a/components/src/atoms/buttons/__tests__/SecondaryButton.test.tsx +++ b/components/src/atoms/buttons/__tests__/SecondaryButton.test.tsx @@ -1,11 +1,8 @@ +import 'jest-styled-components' import * as React from 'react' import { renderWithProviders } from '../../../testing/utils' -import { - COLORS, - BORDERS, - TYPOGRAPHY, - SPACING, -} from '../../../ui-style-constants' +import { BORDERS, TYPOGRAPHY, SPACING } from '../../../ui-style-constants' +import { COLORS } from '../../../helix-design-system' import { SecondaryButton } from '../SecondaryButton' @@ -36,7 +33,7 @@ describe('SecondaryButton', () => { expect(button).toHaveStyle( `text-transform: ${TYPOGRAPHY.textTransformNone}` ) - expect(button).toHaveStyle(`color: ${COLORS.blueEnabled}`) + expect(button).toHaveStyle(`color: ${COLORS.blue50}`) }) it('renders secondary button with text and disabled', () => { @@ -44,15 +41,11 @@ describe('SecondaryButton', () => { const { getByText } = render(props) const button = getByText('secondary button') expect(button).toBeDisabled() - expect(button).toHaveStyle(`opacity: 50%`) }) it('applies the correct states to the button - hover', () => { const { getByText } = render(props) const button = getByText('secondary button') - expect(button).toHaveStyleRule('opacity', '70%', { - modifier: ':hover', - }) expect(button).toHaveStyleRule('box-shadow', '0 0 0', { modifier: ':hover', }) @@ -63,7 +56,7 @@ describe('SecondaryButton', () => { const button = getByText('secondary button') expect(button).toHaveStyleRule( 'box-shadow', - `0 0 0 3px ${COLORS.warningEnabled}`, + `0 0 0 3px ${COLORS.yellow50}`, { modifier: ':focus-visible', } @@ -71,9 +64,9 @@ describe('SecondaryButton', () => { }) it('renders secondary button with text and different background color', () => { - props.color = COLORS.errorEnabled + props.color = COLORS.red50 const { getByText } = render(props) const button = getByText('secondary button') - expect(button).toHaveStyle(`color: ${COLORS.errorEnabled}`) + expect(button).toHaveStyle(`color: ${COLORS.red50}`) }) }) diff --git a/components/src/barrel.ts b/components/src/barrel.ts new file mode 100644 index 00000000000..9cc9c435ad4 --- /dev/null +++ b/components/src/barrel.ts @@ -0,0 +1,10 @@ +// TODO(BC, 2024-01-04): This is intentionally a subset of the exports from +// index.ts. Once the cruft is removed from index.ts, these two files should probably converge + +// opentrons components library package + +export * from './hardware-sim' + +export * from './primitives' + +export * from './ui-style-constants' diff --git a/components/src/constants.ts b/components/src/constants.ts deleted file mode 100644 index 6b55cfbee7b..00000000000 --- a/components/src/constants.ts +++ /dev/null @@ -1,9 +0,0 @@ -// ========= SPECIAL SELECTORS ======== - -// This classname is used to find collisions with SelectionRect in Protocol Designer -export const SELECTABLE_WELL_CLASS = 'ot-selectable-well' -// ^^^ TODO Ian 2017-12-18: use a data- attribute instead of a class, and factor this out, -// probably into SelectionRect which isn't in complib yet - -export const LEFT: 'left' = 'left' -export const RIGHT: 'right' = 'right' diff --git a/components/src/forms/__tests__/DeprecatedCheckboxField.test.tsx b/components/src/forms/__tests__/DeprecatedCheckboxField.test.tsx index ad3cf28c408..caa4206ba43 100644 --- a/components/src/forms/__tests__/DeprecatedCheckboxField.test.tsx +++ b/components/src/forms/__tests__/DeprecatedCheckboxField.test.tsx @@ -1,79 +1,3 @@ -import * as React from 'react' -import { mount } from 'enzyme' - -import { DeprecatedCheckboxField } from '../DeprecatedCheckboxField' -import { Icon } from '../../icons' - describe('DeprecatedCheckboxField', () => { - describe('DeprecatedCheckboxField', () => { - it('renders a checked icon when value === true', () => { - const wrapper = mount( - - ) - const icon = wrapper.find(Icon) - - expect(icon.prop('name')).toEqual('checkbox-marked') - }) - - it('sets input checked attribute to true when value === true', () => { - const wrapper = mount( - - ) - - const input = wrapper.find('input') - expect(input.prop('checked')).toBe(true) - }) - - it('renders an unchecked icon when value === false', () => { - const wrapper = mount( - - ) - const icon = wrapper.find(Icon) - - expect(icon.prop('name')).toEqual('checkbox-blank-outline') - }) - - it('sets input checked attribute to false when value === false', () => { - const wrapper = mount( - - ) - - const input = wrapper.find('input') - expect(input.prop('checked')).toBe(false) - }) - - it('renders an unchecked icon when no value prop', () => { - const wrapper = mount() - const icon = wrapper.find(Icon) - - expect(icon).toBeDefined() - expect(icon.prop('name')).toEqual('checkbox-blank-outline') - }) - - it('sets input checked attribute to false when no value prop', () => { - const wrapper = mount() - - const input = wrapper.find('input') - expect(input.prop('checked')).toBe(false) - }) - }) - - describe('indeterminate DeprecatedCheckboxField', () => { - it(' renders a minux box icon', () => { - const wrapper = mount( - - ) - const icon = wrapper.find(Icon) - expect(icon.prop('name')).toEqual('minus-box') - }) - - it('passes isIndeterimate prop and adds input indeterminate attribute', () => { - const wrapper = mount( - - ) - - const input = wrapper.find('input') - expect(input.prop('indeterminate')).toBeTruthy() - }) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/forms/__tests__/DropdownField.test.tsx b/components/src/forms/__tests__/DropdownField.test.tsx index 55f11c035d4..3137327e6c1 100644 --- a/components/src/forms/__tests__/DropdownField.test.tsx +++ b/components/src/forms/__tests__/DropdownField.test.tsx @@ -1,57 +1,3 @@ -import * as React from 'react' -import { mount } from 'enzyme' - -import { DropdownField } from '../DropdownField' - describe('DropdownField', () => { - it('populates the dropdown with value when present', () => { - const wrapper = mount( - - ) - const select = wrapper.find('select') - expect(select.prop('value')).toBe('dna') - }) - - it('populates and selects the dropdown with blank option when value is null ', () => { - const wrapper = mount( - - ) - const select = wrapper.find('select') - expect(select.prop('value')).toBe('') - expect(select.find('option').first().text()).toBe('') - }) - - it('populates and selects the dropdown with disabled option when isIndeterminate === true ', () => { - const wrapper = mount( - - ) - const select = wrapper.find('select') - expect(select.prop('value')).toBe('') - expect(select.find('option').first().text()).toBe('-') - expect(select.find('option').first().prop('disabled')).toBeTruthy() - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/forms/__tests__/InputField.test.tsx b/components/src/forms/__tests__/InputField.test.tsx index 9fe856262e8..34f85779a3e 100644 --- a/components/src/forms/__tests__/InputField.test.tsx +++ b/components/src/forms/__tests__/InputField.test.tsx @@ -1,32 +1,3 @@ -import * as React from 'react' -import { mount } from 'enzyme' - -import { InputField } from '../InputField' - describe('InputField', () => { - it('clears out value when isIndeterminate === true', () => { - const wrapper = mount( - - ) - const input = wrapper.find('input') - expect(input.prop('value')).toBe('') - }) - - it('overrides placeholder prop when isIndeterminate === true', () => { - const wrapper = mount( - - ) - const input = wrapper.find('input') - expect(input.prop('placeholder')).toBe('-') - }) - - it('sets value to an empty string when no value prop present', () => { - const wrapper = mount() - const input = wrapper.find('input') - expect(input.prop('value')).toBe('') - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/forms/__tests__/Select.test.tsx b/components/src/forms/__tests__/Select.test.tsx index faaf9def3f0..a4f66e143b4 100644 --- a/components/src/forms/__tests__/Select.test.tsx +++ b/components/src/forms/__tests__/Select.test.tsx @@ -1,52 +1,3 @@ -import * as React from 'react' -import ReactSelect from 'react-select' -import { shallow } from 'enzyme' - -import { Select } from '../Select' - describe('Select', () => { - it('component renders a ReactSelect', () => { - const wrapper = shallow( - ) - - expect(wrapper.find(ReactSelect).props()).toMatchObject({ - options, - value, - name, - onChange, - onBlur, - }) - }) - - it('merges in className prop', () => { - const wrapperDefault = shallow( - ) - - const defaultCx = wrapperDefault.find(ReactSelect).prop('className') - const withClassCx = wrapperWithClass.find(ReactSelect).prop('className') - - expect(withClassCx).toContain('something_else') - expect(withClassCx).toContain(defaultCx) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/forms/__tests__/SelectField.test.tsx b/components/src/forms/__tests__/SelectField.test.tsx index 12b4909021d..2516876fd0d 100644 --- a/components/src/forms/__tests__/SelectField.test.tsx +++ b/components/src/forms/__tests__/SelectField.test.tsx @@ -1,110 +1,3 @@ -import * as React from 'react' -import { shallow } from 'enzyme' - -import { SelectField } from '../SelectField' -import { Select } from '../Select' -import type { SelectOption, SelectProps } from '../Select' - describe('SelectField', () => { - it('renders a Select', () => { - const wrapper = shallow( - - ) - - expect(wrapper.find(Select)).toHaveLength(1) - }) - - it('renders caption', () => { - const wrapper = shallow( - hello there} - /> - ) - - expect(wrapper.find('[data-hook="caption"]')).toHaveLength(1) - }) - - it('passes props to Select', () => { - const id = 'id' - const name = 'name' - const options = [{ value: 'foo' }, { value: 'bar' }] - const value = 'bar' - const disabled = false - const placeholder = 'hello there' - const menuPosition = 'absolute' - const formatOptionLabel = (opt: SelectOption): string => - opt.label || opt.value - const className = 'class' - - const wrapper = shallow( - - ) - - expect(wrapper.find(Select).props()).toMatchObject({ - id, - name, - options, - placeholder, - menuPosition, - formatOptionLabel, - isDisabled: disabled, - className: expect.stringContaining(className), - value: options[1], - }) - }) - - it('passes disabled to isDisabled when disabled=true', () => { - const name = 'name' - const options = [{ value: 'foo' }, { value: 'bar' }] - const value = 'bar' - const disabled = true - - const wrapper = shallow( - - ) - - expect(wrapper.find(Select).props()).toMatchObject({ - isDisabled: disabled, - }) - }) - - it('handles onChange and onBlur from Select', () => { - const handleValueChange = jest.fn() - const handleLoseFocus = jest.fn() - const options = [{ value: 'foo' }, { value: 'bar' }] - const selectWrapper = shallow( - - ).find(Select) - - selectWrapper.invoke('onChange')?.(options[1], {} as any) - expect(handleValueChange).toHaveBeenCalledWith('field', 'bar', {}) - selectWrapper.invoke('onBlur')?.({} as any) - expect(handleLoseFocus).toHaveBeenCalledWith('field') - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/forms/__tests__/ToggleField.test.tsx b/components/src/forms/__tests__/ToggleField.test.tsx index 699efbdbc75..96cb7e5ec77 100644 --- a/components/src/forms/__tests__/ToggleField.test.tsx +++ b/components/src/forms/__tests__/ToggleField.test.tsx @@ -1,60 +1,3 @@ -import * as React from 'react' -import { shallow, mount } from 'enzyme' - -import { ToggleField } from '../ToggleField' -import { Icon } from '../../icons' - describe('ToggleField', () => { - it('renders an Icon', () => { - const wrapper = shallow( - - ) - - expect(wrapper.find(Icon)).toHaveLength(1) - }) - - it('renders label conditional labels', () => { - const labelOnText = 'Toggled On' - const labelOffText = 'Toggled Off' - - const wrapperOn = mount( - - ) - - const wrapperOff = mount( - - ) - - expect(wrapperOn.text()).toEqual(labelOnText) - expect(wrapperOff.text()).toEqual(labelOffText) - }) - - it('passes disabled prop', () => { - const wrapper = mount( - - ) - - expect(wrapper.props().disabled).toEqual(true) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/hardware-sim/BaseDeck/BaseDeck.stories.tsx b/components/src/hardware-sim/BaseDeck/BaseDeck.stories.tsx index 76d8598cabd..92b41dbed62 100644 --- a/components/src/hardware-sim/BaseDeck/BaseDeck.stories.tsx +++ b/components/src/hardware-sim/BaseDeck/BaseDeck.stories.tsx @@ -1,31 +1,57 @@ import * as React from 'react' import fixture_96_plate from '@opentrons/shared-data/labware/fixtures/2/fixture_96_plate.json' import fixture_tiprack_1000_ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_1000_ul.json' -import { FLEX_ROBOT_TYPE, LabwareDefinition2 } from '@opentrons/shared-data' - -import type { Meta, StoryObj } from '@storybook/react' -import { BaseDeck as BaseDeckComponent } from './' import { + FLEX_ROBOT_TYPE, HEATERSHAKER_MODULE_V1, MAGNETIC_BLOCK_V1, TEMPERATURE_MODULE_V2, THERMOCYCLER_MODULE_V2, -} from '@opentrons/shared-data/js' +} from '@opentrons/shared-data' + +import { + EXTENDED_DECK_CONFIG_FIXTURE, + STANDARD_SLOT_DECK_CONFIG_FIXTURE, + WASTE_CHUTE_DECK_CONFIG_FIXTURE, +} from './__fixtures__' +import { BaseDeck as BaseDeckComponent } from './BaseDeck' + +import type { Meta, StoryObj } from '@storybook/react' +import type { + DeckConfiguration, + LabwareDefinition2, +} from '@opentrons/shared-data' const meta: Meta> = { component: BaseDeckComponent, title: 'Library/Molecules/Simulation/BaseDeck', + argTypes: { + deckConfig: { + options: ['single slot deck', 'staging area deck', 'waste chute deck'], + control: { type: 'radio' }, + }, + }, } as Meta export default meta type Story = StoryObj> +const getDeckConfig = (args: any): DeckConfiguration => { + switch (args.deckConfig) { + case 'staging area deck': + return EXTENDED_DECK_CONFIG_FIXTURE + case 'waste chute deck': + return WASTE_CHUTE_DECK_CONFIG_FIXTURE + default: + return STANDARD_SLOT_DECK_CONFIG_FIXTURE + } +} + export const BaseDeck: Story = { - render: args => , args: { robotType: FLEX_ROBOT_TYPE, - trashSlotName: 'A3', - labwareLocations: [ + deckConfig: EXTENDED_DECK_CONFIG_FIXTURE, + labwareOnDeck: [ { labwareLocation: { slotName: 'C2' }, definition: fixture_96_plate as LabwareDefinition2, @@ -35,7 +61,7 @@ export const BaseDeck: Story = { definition: fixture_tiprack_1000_ul as LabwareDefinition2, }, ], - moduleLocations: [ + modulesOnDeck: [ { moduleLocation: { slotName: 'B1' }, moduleModel: THERMOCYCLER_MODULE_V2, @@ -48,7 +74,7 @@ export const BaseDeck: Story = { nestedLabwareDef: fixture_96_plate as LabwareDefinition2, }, { - moduleLocation: { slotName: 'D3' }, + moduleLocation: { slotName: 'B3' }, moduleModel: HEATERSHAKER_MODULE_V1, nestedLabwareDef: fixture_96_plate as LabwareDefinition2, }, @@ -61,4 +87,8 @@ export const BaseDeck: Story = { darkFill: 'rebeccapurple', lightFill: 'lavender', }, + render: args => { + const deckConfig = getDeckConfig(args) + return + }, } diff --git a/components/src/hardware-sim/BaseDeck/BaseDeck.tsx b/components/src/hardware-sim/BaseDeck/BaseDeck.tsx new file mode 100644 index 00000000000..4dfa57cd821 --- /dev/null +++ b/components/src/hardware-sim/BaseDeck/BaseDeck.tsx @@ -0,0 +1,306 @@ +import * as React from 'react' + +import { + getDeckDefFromRobotType, + getModuleDef2, + getPositionFromSlotId, + inferModuleOrientationFromXCoordinate, + OT2_ROBOT_TYPE, + MOVABLE_TRASH_CUTOUTS, + SINGLE_SLOT_FIXTURES, + STAGING_AREA_CUTOUTS, + STAGING_AREA_RIGHT_SLOT_FIXTURE, + TRASH_BIN_ADAPTER_FIXTURE, + WASTE_CHUTE_CUTOUT, + WASTE_CHUTE_ONLY_FIXTURES, + WASTE_CHUTE_STAGING_AREA_FIXTURES, + HEATERSHAKER_MODULE_V1, +} from '@opentrons/shared-data' + +import { RobotCoordinateSpace } from '../RobotCoordinateSpace' +import { Module } from '../Module' +import { LabwareRender } from '../Labware' +import { FlexTrash } from '../Deck/FlexTrash' +import { DeckFromLayers } from '../Deck/DeckFromLayers' +import { SlotLabels } from '../Deck' +import { COLORS } from '../../helix-design-system' + +import { Svg } from '../../primitives' +import { SingleSlotFixture } from './SingleSlotFixture' +import { StagingAreaFixture } from './StagingAreaFixture' +import { WasteChuteFixture } from './WasteChuteFixture' +import { WasteChuteStagingAreaFixture } from './WasteChuteStagingAreaFixture' + +import type { + DeckConfiguration, + LabwareDefinition2, + LabwareLocation, + ModuleLocation, + ModuleModel, + RobotType, +} from '@opentrons/shared-data' +import type { TrashCutoutId } from '../Deck/FlexTrash' +import type { StagingAreaLocation } from './StagingAreaFixture' +import type { WellFill } from '../Labware' + +export interface LabwareOnDeck { + labwareLocation: LabwareLocation + definition: LabwareDefinition2 + wellFill?: WellFill + /** generic prop to render self-positioned children for each labware */ + labwareChildren?: React.ReactNode + onLabwareClick?: () => void +} + +export interface ModuleOnDeck { + moduleModel: ModuleModel + moduleLocation: ModuleLocation + nestedLabwareDef?: LabwareDefinition2 | null + nestedLabwareWellFill?: WellFill + innerProps?: React.ComponentProps['innerProps'] + /** generic prop to render self-positioned children for each module */ + moduleChildren?: React.ReactNode + onLabwareClick?: () => void +} +interface BaseDeckProps { + deckConfig: DeckConfiguration + robotType: RobotType + labwareOnDeck?: LabwareOnDeck[] + modulesOnDeck?: ModuleOnDeck[] + deckLayerBlocklist?: string[] + showExpansion?: boolean + lightFill?: string + mediumFill?: string + darkFill?: string + children?: React.ReactNode + showSlotLabels?: boolean + /** whether to make wrapping svg tag animatable via @react-spring/web, defaults to false */ + animatedSVG?: boolean + /** extra props to pass to svg tag */ + svgProps?: React.ComponentProps +} + +export function BaseDeck(props: BaseDeckProps): JSX.Element { + const { + robotType, + modulesOnDeck = [], + labwareOnDeck = [], + lightFill = COLORS.grey35, + mediumFill = COLORS.grey50, + darkFill = COLORS.grey60, + deckLayerBlocklist = [], + deckConfig, + showExpansion = true, + children, + showSlotLabels = true, + animatedSVG = false, + svgProps = {}, + } = props + const deckDef = getDeckDefFromRobotType(robotType) + + const singleSlotFixtures = deckConfig.filter( + fixture => + fixture.cutoutFixtureId != null && + SINGLE_SLOT_FIXTURES.includes(fixture.cutoutFixtureId) + ) + const stagingAreaFixtures = deckConfig.filter( + fixture => + fixture.cutoutFixtureId === STAGING_AREA_RIGHT_SLOT_FIXTURE && + STAGING_AREA_CUTOUTS.includes(fixture.cutoutId) + ) + const trashBinFixtures = deckConfig.filter( + fixture => + fixture.cutoutFixtureId === TRASH_BIN_ADAPTER_FIXTURE && + MOVABLE_TRASH_CUTOUTS.includes(fixture.cutoutId) + ) + const wasteChuteOnlyFixtures = deckConfig.filter( + fixture => + fixture.cutoutFixtureId != null && + WASTE_CHUTE_ONLY_FIXTURES.includes(fixture.cutoutFixtureId) && + fixture.cutoutId === WASTE_CHUTE_CUTOUT + ) + const wasteChuteStagingAreaFixtures = deckConfig.filter( + fixture => + fixture.cutoutFixtureId != null && + WASTE_CHUTE_STAGING_AREA_FIXTURES.includes(fixture.cutoutFixtureId) && + fixture.cutoutId === WASTE_CHUTE_CUTOUT + ) + + return ( + + {robotType === OT2_ROBOT_TYPE ? ( + + ) : ( + <> + {showSlotLabels ? ( + 0 || + wasteChuteStagingAreaFixtures.length > 0 + } + /> + ) : null} + {singleSlotFixtures.map(fixture => ( + + ))} + {stagingAreaFixtures.map(fixture => ( + + ))} + {trashBinFixtures.map(fixture => ( + + + + + ))} + {wasteChuteOnlyFixtures.map(fixture => { + if (fixture.cutoutId === WASTE_CHUTE_CUTOUT) { + return ( + + ) + } else { + return null + } + })} + {wasteChuteStagingAreaFixtures.map(fixture => { + if (fixture.cutoutId === WASTE_CHUTE_CUTOUT) { + return ( + + ) + } else { + return null + } + })} + + )} + <> + {modulesOnDeck.map( + ({ + moduleModel, + moduleLocation, + nestedLabwareDef, + nestedLabwareWellFill, + innerProps, + moduleChildren, + onLabwareClick, + }) => { + const slotPosition = getPositionFromSlotId( + moduleLocation.slotName, + deckDef + ) + const moduleDef = getModuleDef2(moduleModel) + return slotPosition != null ? ( + + {nestedLabwareDef != null ? ( + + ) : null} + {moduleChildren} + + ) : null + } + )} + {labwareOnDeck.map( + ({ + labwareLocation, + definition, + labwareChildren, + wellFill, + onLabwareClick, + }) => { + if ( + labwareLocation === 'offDeck' || + !('slotName' in labwareLocation) || + // for legacy protocols that list fixed trash as a labware, do not render + definition.parameters.loadName === + 'opentrons_1_trash_3200ml_fixed' + ) { + return null + } + + const slotPosition = getPositionFromSlotId( + labwareLocation.slotName, + deckDef + ) + + return slotPosition != null ? ( + + + {labwareChildren} + + ) : null + } + )} + + {children} + + ) +} diff --git a/components/src/hardware-sim/BaseDeck/SingleSlotFixture.tsx b/components/src/hardware-sim/BaseDeck/SingleSlotFixture.tsx new file mode 100644 index 00000000000..0fe3ff526e6 --- /dev/null +++ b/components/src/hardware-sim/BaseDeck/SingleSlotFixture.tsx @@ -0,0 +1,199 @@ +import * as React from 'react' + +import { SlotBase } from './SlotBase' +import { SlotClip } from './SlotClip' + +import type { + CutoutId, + DeckDefinition, + ModuleType, +} from '@opentrons/shared-data' + +interface SingleSlotFixtureProps extends React.SVGProps { + cutoutId: CutoutId + deckDefinition: DeckDefinition + moduleType?: ModuleType + fixtureBaseColor?: React.SVGProps['fill'] + slotClipColor?: React.SVGProps['stroke'] + showExpansion?: boolean +} + +export function SingleSlotFixture( + props: SingleSlotFixtureProps +): JSX.Element | null { + const { + cutoutId, + deckDefinition, + fixtureBaseColor, + slotClipColor, + showExpansion = false, + ...restProps + } = props + + const cutoutDef = deckDefinition?.locations.cutouts.find( + s => s.id === cutoutId + ) + if (cutoutDef == null) { + console.warn( + `cannot render SingleSlotFixture, no cutout named: ${cutoutDef} in deck def ${deckDefinition?.otId}` + ) + return null + } + + const contentsByCutoutLocation: { + [cutoutId in CutoutId]: JSX.Element + } = { + cutoutA1: ( + <> + {showExpansion ? ( + + ) : null} + + + + + + + ), + cutoutA2: ( + <> + + , + , + , + + + ), + cutoutA3: ( + <> + + , + , + , + + + ), + cutoutB1: ( + <> + + , + , + , + + + ), + cutoutB2: ( + <> + + , + , + , + + + ), + cutoutB3: ( + <> + + , + , + , + + + ), + cutoutC1: ( + <> + + + + + + + ), + cutoutC2: ( + <> + + , + , + , + + + ), + cutoutC3: ( + <> + + , + , + , + + + ), + cutoutD1: ( + <> + + + + + + + ), + cutoutD2: ( + <> + + + + + + + ), + cutoutD3: ( + <> + + + + + + + ), + } + + return {contentsByCutoutLocation[cutoutId]} +} diff --git a/components/src/hardware-sim/BaseDeck/SlotBase.tsx b/components/src/hardware-sim/BaseDeck/SlotBase.tsx new file mode 100644 index 00000000000..5c8b7eb6100 --- /dev/null +++ b/components/src/hardware-sim/BaseDeck/SlotBase.tsx @@ -0,0 +1,5 @@ +import * as React from 'react' + +export function SlotBase(props: React.SVGProps): JSX.Element { + return +} diff --git a/components/src/hardware-sim/BaseDeck/SlotClip.tsx b/components/src/hardware-sim/BaseDeck/SlotClip.tsx new file mode 100644 index 00000000000..cd17d13c735 --- /dev/null +++ b/components/src/hardware-sim/BaseDeck/SlotClip.tsx @@ -0,0 +1,15 @@ +import * as React from 'react' + +import { COLORS } from '../../helix-design-system' + +export function SlotClip(props: React.SVGProps): JSX.Element { + return ( + + ) +} diff --git a/components/src/hardware-sim/BaseDeck/StagingAreaFixture.tsx b/components/src/hardware-sim/BaseDeck/StagingAreaFixture.tsx new file mode 100644 index 00000000000..600d4bfbd6f --- /dev/null +++ b/components/src/hardware-sim/BaseDeck/StagingAreaFixture.tsx @@ -0,0 +1,114 @@ +import * as React from 'react' + +import { SlotBase } from './SlotBase' +import { SlotClip } from './SlotClip' + +import type { DeckDefinition, ModuleType } from '@opentrons/shared-data' + +export type StagingAreaLocation = + | 'cutoutA3' + | 'cutoutB3' + | 'cutoutC3' + | 'cutoutD3' + +interface StagingAreaFixtureProps extends React.SVGProps { + cutoutId: StagingAreaLocation + deckDefinition: DeckDefinition + moduleType?: ModuleType + fixtureBaseColor?: React.SVGProps['fill'] + slotClipColor?: React.SVGProps['stroke'] + showExtensions?: boolean +} + +export function StagingAreaFixture( + props: StagingAreaFixtureProps +): JSX.Element | null { + const { + cutoutId, + deckDefinition, + fixtureBaseColor, + slotClipColor, + ...restProps + } = props + + const cutoutDef = deckDefinition?.locations.cutouts.find( + s => s.id === cutoutId + ) + if (cutoutDef == null) { + console.warn( + `cannot render StagingAreaFixture, no cutout named: ${cutoutDef} in deck def ${deckDefinition?.otId}` + ) + return null + } + + const contentsByCutoutLocation: { + [cutoutId in StagingAreaLocation]: JSX.Element + } = { + cutoutA3: ( + <> + + , + , + , + + , + , + , + + + ), + cutoutB3: ( + <> + + , + , + , + + , + , + , + + + ), + cutoutC3: ( + <> + + , + , + , + + , + , + , + + + ), + cutoutD3: ( + <> + + + + + + , + , + , + + + ), + } + + return {contentsByCutoutLocation[cutoutId]} +} diff --git a/components/src/hardware-sim/BaseDeck/WasteChuteFixture.tsx b/components/src/hardware-sim/BaseDeck/WasteChuteFixture.tsx new file mode 100644 index 00000000000..6db439eba57 --- /dev/null +++ b/components/src/hardware-sim/BaseDeck/WasteChuteFixture.tsx @@ -0,0 +1,113 @@ +import * as React from 'react' + +import { WASTE_CHUTE_CUTOUT } from '@opentrons/shared-data' + +import { Icon } from '../../icons' +import { Flex, Text } from '../../primitives' +import { + ALIGN_CENTER, + DIRECTION_COLUMN, + JUSTIFY_CENTER, + TEXT_ALIGN_CENTER, +} from '../../styles' +import { SPACING, TYPOGRAPHY } from '../../ui-style-constants' +import { COLORS } from '../../helix-design-system' +import { RobotCoordsForeignObject } from '../Deck/RobotCoordsForeignObject' +import { SlotBase } from './SlotBase' + +import type { DeckDefinition, ModuleType } from '@opentrons/shared-data' + +interface WasteChuteFixtureProps extends React.SVGProps { + cutoutId: typeof WASTE_CHUTE_CUTOUT + deckDefinition: DeckDefinition + moduleType?: ModuleType + fixtureBaseColor?: React.SVGProps['fill'] + wasteChuteColor?: string + showExtensions?: boolean +} + +export function WasteChuteFixture( + props: WasteChuteFixtureProps +): JSX.Element | null { + const { + cutoutId, + deckDefinition, + fixtureBaseColor = COLORS.grey35, + wasteChuteColor = COLORS.grey50, + ...restProps + } = props + + if (cutoutId !== 'cutoutD3') { + console.warn( + `cannot render WasteChuteFixture in given cutout location ${cutoutId}` + ) + return null + } + + const cutoutDef = deckDefinition?.locations.cutouts.find( + s => s.id === cutoutId + ) + if (cutoutDef == null) { + console.warn( + `cannot render WasteChuteFixture, no cutout named: ${cutoutDef} in deck def ${deckDefinition?.otId}` + ) + return null + } + + return ( + + + + + ) +} + +interface WasteChuteProps { + wasteIconColor: string + backgroundColor: string +} + +/** + * a deck map foreign object representing the physical location of the waste chute connected to the deck + */ +export function WasteChute(props: WasteChuteProps): JSX.Element { + const { wasteIconColor, backgroundColor } = props + + return ( + + + + + Waste chute + + + + ) +} diff --git a/components/src/hardware-sim/BaseDeck/WasteChuteStagingAreaFixture.tsx b/components/src/hardware-sim/BaseDeck/WasteChuteStagingAreaFixture.tsx new file mode 100644 index 00000000000..a417263fddc --- /dev/null +++ b/components/src/hardware-sim/BaseDeck/WasteChuteStagingAreaFixture.tsx @@ -0,0 +1,68 @@ +import * as React from 'react' + +import { WASTE_CHUTE_CUTOUT } from '@opentrons/shared-data' + +import { COLORS } from '../../helix-design-system' +import { SlotBase } from './SlotBase' +import { SlotClip } from './SlotClip' +import { WasteChute } from './WasteChuteFixture' + +import type { DeckDefinition, ModuleType } from '@opentrons/shared-data' + +interface WasteChuteStagingAreaFixtureProps + extends React.SVGProps { + cutoutId: typeof WASTE_CHUTE_CUTOUT + deckDefinition: DeckDefinition + moduleType?: ModuleType + fixtureBaseColor?: React.SVGProps['fill'] + slotClipColor?: React.SVGProps['stroke'] + wasteChuteColor?: string + showExtensions?: boolean +} + +export function WasteChuteStagingAreaFixture( + props: WasteChuteStagingAreaFixtureProps +): JSX.Element | null { + const { + cutoutId, + deckDefinition, + fixtureBaseColor = COLORS.grey35, + slotClipColor = COLORS.grey60, + wasteChuteColor = COLORS.grey50, + ...restProps + } = props + + if (cutoutId !== WASTE_CHUTE_CUTOUT) { + console.warn( + `cannot render WasteChuteStagingAreaFixture in given cutout location ${cutoutId}` + ) + return null + } + + const cutoutDef = deckDefinition?.locations.cutouts.find( + s => s.id === cutoutId + ) + if (cutoutDef == null) { + console.warn( + `cannot render WasteChuteStagingAreaFixture, no cutout named: ${cutoutDef} in deck def ${deckDefinition?.otId}` + ) + return null + } + + return ( + + + , + , + , + + + + ) +} diff --git a/components/src/hardware-sim/BaseDeck/__fixtures__/index.ts b/components/src/hardware-sim/BaseDeck/__fixtures__/index.ts new file mode 100644 index 00000000000..08c91cf53f9 --- /dev/null +++ b/components/src/hardware-sim/BaseDeck/__fixtures__/index.ts @@ -0,0 +1,165 @@ +import { + SINGLE_LEFT_SLOT_FIXTURE, + SINGLE_CENTER_SLOT_FIXTURE, + TRASH_BIN_ADAPTER_FIXTURE, + SINGLE_RIGHT_SLOT_FIXTURE, + STAGING_AREA_RIGHT_SLOT_FIXTURE, + WASTE_CHUTE_RIGHT_ADAPTER_COVERED_FIXTURE, +} from '@opentrons/shared-data' + +import type { DeckConfiguration } from '@opentrons/shared-data' + +export const STANDARD_SLOT_DECK_CONFIG_FIXTURE: DeckConfiguration = [ + { + cutoutId: 'cutoutA1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutB1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutD1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutA2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutB2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutD2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutA3', + cutoutFixtureId: TRASH_BIN_ADAPTER_FIXTURE, + }, + { + cutoutId: 'cutoutB3', + cutoutFixtureId: SINGLE_RIGHT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC3', + cutoutFixtureId: SINGLE_RIGHT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutD3', + cutoutFixtureId: SINGLE_RIGHT_SLOT_FIXTURE, + }, +] + +// contains staging area fixtures +export const EXTENDED_DECK_CONFIG_FIXTURE: DeckConfiguration = [ + { + cutoutId: 'cutoutA1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutB1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutD1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutA2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutB2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutD2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutA3', + cutoutFixtureId: TRASH_BIN_ADAPTER_FIXTURE, + }, + { + cutoutId: 'cutoutB3', + cutoutFixtureId: STAGING_AREA_RIGHT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC3', + cutoutFixtureId: STAGING_AREA_RIGHT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutD3', + cutoutFixtureId: STAGING_AREA_RIGHT_SLOT_FIXTURE, + }, +] + +// contains waste chute fixture +export const WASTE_CHUTE_DECK_CONFIG_FIXTURE: DeckConfiguration = [ + { + cutoutId: 'cutoutA1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutB1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC1', + cutoutFixtureId: TRASH_BIN_ADAPTER_FIXTURE, + }, + { + cutoutId: 'cutoutD1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutA2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutB2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutD2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutA3', + cutoutFixtureId: SINGLE_RIGHT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutB3', + cutoutFixtureId: STAGING_AREA_RIGHT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC3', + cutoutFixtureId: STAGING_AREA_RIGHT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutD3', + cutoutFixtureId: WASTE_CHUTE_RIGHT_ADAPTER_COVERED_FIXTURE, + }, +] diff --git a/components/src/hardware-sim/BaseDeck/index.ts b/components/src/hardware-sim/BaseDeck/index.ts new file mode 100644 index 00000000000..a37887401df --- /dev/null +++ b/components/src/hardware-sim/BaseDeck/index.ts @@ -0,0 +1,5 @@ +export * from './BaseDeck' +export * from './SingleSlotFixture' +export * from './StagingAreaFixture' +export * from './WasteChuteFixture' +export * from './WasteChuteStagingAreaFixture' diff --git a/components/src/hardware-sim/BaseDeck/index.tsx b/components/src/hardware-sim/BaseDeck/index.tsx deleted file mode 100644 index bac8b365482..00000000000 --- a/components/src/hardware-sim/BaseDeck/index.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import * as React from 'react' -import { - DeckSlot, - RobotType, - getDeckDefFromRobotType, - ModuleModel, - ModuleLocation, - getModuleDef2, - LabwareDefinition2, - inferModuleOrientationFromXCoordinate, - LabwareLocation, - OT2_ROBOT_TYPE, -} from '@opentrons/shared-data' -import { RobotCoordinateSpace } from '../RobotCoordinateSpace' -import { Module } from '../Module' -import { LabwareRender } from '../Labware' -import { FlexTrash } from '../Deck/FlexTrash' -import { DeckSlotLocation } from '../DeckSlotLocation' -import { DeckFromData } from '../Deck/DeckFromData' -import { SlotLabels } from '../Deck' -import { COLORS } from '../../ui-style-constants' - -interface BaseDeckProps { - robotType: RobotType - labwareLocations: Array<{ - labwareLocation: LabwareLocation - definition: LabwareDefinition2 - }> - moduleLocations: Array<{ - moduleModel: ModuleModel - moduleLocation: ModuleLocation - nestedLabwareDef?: LabwareDefinition2 - innerProps?: React.ComponentProps['innerProps'] - }> - lightFill?: string - darkFill?: string - trashSlotName?: DeckSlot['id'] - children?: React.ReactNode -} - -export function BaseDeck(props: BaseDeckProps): JSX.Element { - const { - robotType, - trashSlotName, - moduleLocations, - labwareLocations, - lightFill = COLORS.light1, - darkFill = COLORS.darkGreyEnabled, - children, - } = props - const deckDef = getDeckDefFromRobotType(robotType) - return ( - - {robotType === OT2_ROBOT_TYPE ? ( - - ) : ( - deckDef.locations.orderedSlots.map(slotDef => ( - <> - - {slotDef.id === trashSlotName ? ( - - ) : null} - - )) - )} - {moduleLocations.map( - ({ moduleModel, moduleLocation, nestedLabwareDef, innerProps }) => { - const slotDef = deckDef.locations.orderedSlots.find( - s => s.id === moduleLocation.slotName - ) - return slotDef != null ? ( - - {nestedLabwareDef != null ? ( - - ) : null} - - ) : null - } - )} - {labwareLocations.map(({ labwareLocation, definition }) => { - const slotDef = deckDef.locations.orderedSlots.find( - s => - labwareLocation !== 'offDeck' && - 'slotName' in labwareLocation && - s.id === labwareLocation.slotName - ) - return slotDef != null ? ( - - - - ) : null - })} - - {children} - - ) -} diff --git a/components/src/hardware-sim/Deck/Deck.css b/components/src/hardware-sim/Deck/Deck.css deleted file mode 100644 index 69e103274e3..00000000000 --- a/components/src/hardware-sim/Deck/Deck.css +++ /dev/null @@ -1,58 +0,0 @@ -@import '../..'; - -:root { - --deck-element: { - fill: #fff; - stroke: var(--c-plate-bg); - } -} - -.deck { - overflow: visible; -} - -.deck_outline { - @apply --deck-element; - - width: 100%; - height: 100%; -} - -.trash_outer { - @apply --deck-element; -} - -.trash_inner { - fill: var(--c-plate-bg); -} - -.trash text { - font-size: 3rem; - text-anchor: middle; - fill: white; -} - -.ot2_short_trash, -.ot2_standard { - &.fixed_trash { - fill: var(--c-lightest-gray); - fill-rule: evenodd; - stroke: none; - } - - &.slot_numbers { - fill: var(--c-plate-bg); - fill-rule: evenodd; - stroke: none; - } - - &.slot_ridges { - fill: var(--c-lightest-gray); - fill-rule: evenodd; - stroke: none; - } - - &.removable_deck_outline { - stroke: var(--c-lightest-gray); - } -} diff --git a/components/src/hardware-sim/Deck/DeckFromData.tsx b/components/src/hardware-sim/Deck/DeckFromData.tsx deleted file mode 100644 index 5cd4877a31b..00000000000 --- a/components/src/hardware-sim/Deck/DeckFromData.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import * as React from 'react' -import parseHtml from 'html-react-parser' -import { stringify } from 'svgson' - -import type { INode } from 'svgson' -import type { DeckDefinition } from '@opentrons/shared-data' - -export interface DeckFromDataProps { - def: DeckDefinition - layerBlocklist: string[] -} - -// recursively filter layer and children nodes by blocklist -function filterLayerGroupNodes( - layers: INode[], - layerBlocklist: string[] -): INode[] { - return layers.reduce((acc: INode[], layer) => { - if (layerBlocklist.includes(layer.attributes?.id)) return acc - - const filteredLayerChildren = filterLayerGroupNodes( - layer.children, - layerBlocklist - ) - - return acc.concat({ ...layer, children: filteredLayerChildren }) - }, []) -} - -export function DeckFromData(props: DeckFromDataProps): JSX.Element { - const { def, layerBlocklist = [] } = props - - const layerGroupNodes = filterLayerGroupNodes(def.layers, layerBlocklist) - - const groupNodeWrapper = { - name: 'g', - type: 'element', - value: '', - attributes: { id: 'deckLayers' }, - children: layerGroupNodes, - } - - return ( - <> - {parseHtml( - // TODO(bh, 2023-7-12): use svgson stringify option to apply individual attributes https://github.com/elrumordelaluz/svgson#svgsonstringify - // the goal would be to give more styling control over individual deck map elements - stringify(groupNodeWrapper, { - selfClose: false, - }) - )} - - ) -} diff --git a/components/src/hardware-sim/Deck/DeckFromLayers.tsx b/components/src/hardware-sim/Deck/DeckFromLayers.tsx new file mode 100644 index 00000000000..644545b41bf --- /dev/null +++ b/components/src/hardware-sim/Deck/DeckFromLayers.tsx @@ -0,0 +1,58 @@ +import * as React from 'react' + +import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' +import { + FixedBase, + FixedTrash, + DoorStops, + MetalFrame, + RemovableDeckOutline, + SlotRidges, + SlotNumbers, + CalibrationMarkings, + RemovalHandle, + ScrewHoles, +} from './OT2Layers' + +import type { RobotType } from '@opentrons/shared-data' +import { ALL_OT2_DECK_LAYERS } from './constants' + +export interface DeckFromLayersProps { + robotType: RobotType + layerBlocklist: string[] +} + +const OT2_LAYER_MAP: { + [layer in typeof ALL_OT2_DECK_LAYERS[number]]: JSX.Element +} = { + fixedBase: , + fixedTrash: , + doorStops: , + metalFrame: , + removableDeckOutline: , + slotRidges: , + slotNumbers: , + calibrationMarkings: , + removalHandle: , + screwHoles: , +} + +/** + * a component that renders an OT-2 deck from the V3 deck definition layers property + * takes a robot type prop to protect against an attempted Flex render + */ +export function DeckFromLayers(props: DeckFromLayersProps): JSX.Element | null { + const { robotType, layerBlocklist = [] } = props + + // early return null if not OT-2 + if (robotType !== OT2_ROBOT_TYPE) return null + + return ( + + {ALL_OT2_DECK_LAYERS.reduce((acc, layer) => { + if (layerBlocklist.includes(layer)) return acc + return [...acc, OT2_LAYER_MAP[layer]] + }, [])} + + ) +} diff --git a/components/src/hardware-sim/Deck/FlexTrash.tsx b/components/src/hardware-sim/Deck/FlexTrash.tsx index 87f99b328d3..8d84114cc50 100644 --- a/components/src/hardware-sim/Deck/FlexTrash.tsx +++ b/components/src/hardware-sim/Deck/FlexTrash.tsx @@ -1,32 +1,37 @@ import * as React from 'react' +import { + FLEX_ROBOT_TYPE, + getDeckDefFromRobotType, +} from '@opentrons/shared-data' + import { Icon } from '../../icons' -import { Flex } from '../../primitives' +import { Flex, Text } from '../../primitives' import { ALIGN_CENTER, JUSTIFY_CENTER } from '../../styles' -import { BORDERS } from '../../ui-style-constants' +import { BORDERS, SPACING, TYPOGRAPHY } from '../../ui-style-constants' +import { COLORS } from '../../helix-design-system' import { RobotCoordsForeignObject } from './RobotCoordsForeignObject' -import { getDeckDefFromRobotType } from '@opentrons/shared-data' import trashDef from '@opentrons/shared-data/labware/definitions/2/opentrons_1_trash_3200ml_fixed/1.json' import type { RobotType } from '@opentrons/shared-data' -// only allow edge slots (columns 1 and 3) -export type TrashSlotName = - | 'A1' - | 'B1' - | 'C1' - | 'D1' - | 'A3' - | 'B3' - | 'C3' - | 'D3' +// only allow edge cutout locations (columns 1 and 3) +export type TrashCutoutId = + | 'cutoutA1' + | 'cutoutB1' + | 'cutoutC1' + | 'cutoutD1' + | 'cutoutA3' + | 'cutoutB3' + | 'cutoutC3' + | 'cutoutD3' interface FlexTrashProps { robotType: RobotType trashIconColor: string backgroundColor: string - trashSlotName?: TrashSlotName + trashCutoutId?: TrashCutoutId } /** @@ -37,21 +42,25 @@ export const FlexTrash = ({ robotType, trashIconColor, backgroundColor, - // default Flex trash slot position A3 - trashSlotName = 'A3', + trashCutoutId, }: FlexTrashProps): JSX.Element | null => { // be sure we don't try to render for an OT-2 - if (robotType !== 'OT-3 Standard') return null + if (robotType !== FLEX_ROBOT_TYPE) return null + + const deckDefinition = getDeckDefFromRobotType(robotType) - const deckDef = getDeckDefFromRobotType(robotType) - const trashSlot = deckDef.locations.orderedSlots.find( - slot => slot.id === trashSlotName + const trashCutout = deckDefinition.locations.cutouts.find( + cutout => cutout.id === trashCutoutId ) - // retrieve slot x,y positions and dimensions from deck definition for the given trash slot - const [x = 0, y = 0] = trashSlot?.position ?? [] - const { xDimension: slotXDimension = 0, yDimension: slotYDimension = 0 } = - trashSlot?.boundingBox ?? {} + // retrieve slot x,y positions and dimensions from deck definition for the given trash cutout location + const [x = 0, y = 0] = trashCutout?.position ?? [] + + // a standard addressable area slot bounding box dimension + const { + xDimension: slotXDimension = 0, + yDimension: slotYDimension = 0, + } = deckDefinition.locations.addressableAreas[0].boundingBox // adjust for dimensions from trash definition const { x: xAdjustment, y: yAdjustment } = trashDef.cornerOffsetFromSlot @@ -59,10 +68,10 @@ export const FlexTrash = ({ // rotate trash 180 degrees in column 1 const rotateDegrees = - trashSlotName === 'A1' || - trashSlotName === 'B1' || - trashSlotName === 'C1' || - trashSlotName === 'D1' + trashCutoutId === 'cutoutA1' || + trashCutoutId === 'cutoutB1' || + trashCutoutId === 'cutoutC1' || + trashCutoutId === 'cutoutD1' ? '180' : '0' @@ -85,16 +94,33 @@ export const FlexTrash = ({ backgroundColor={backgroundColor} borderRadius={BORDERS.radiusSoftCorners} justifyContent={JUSTIFY_CENTER} + gridGap={SPACING.spacing8} width="100%" > + {rotateDegrees === '180' ? ( + + Trash bin + + ) : null} + {rotateDegrees === '0' ? ( + + Trash bin + + ) : null} diff --git a/components/src/hardware-sim/Deck/MoveLabwareOnDeck.stories.tsx b/components/src/hardware-sim/Deck/MoveLabwareOnDeck.stories.tsx index ca42a50ebe7..89ddd9fcdb2 100644 --- a/components/src/hardware-sim/Deck/MoveLabwareOnDeck.stories.tsx +++ b/components/src/hardware-sim/Deck/MoveLabwareOnDeck.stories.tsx @@ -1,8 +1,17 @@ import * as React from 'react' import fixture_96_plate from '@opentrons/shared-data/labware/fixtures/2/fixture_96_plate.json' -import { FLEX_ROBOT_TYPE } from '@opentrons/shared-data' +import { + FLEX_ROBOT_TYPE, + SINGLE_CENTER_SLOT_FIXTURE, + SINGLE_LEFT_SLOT_FIXTURE, + SINGLE_RIGHT_SLOT_FIXTURE, + STAGING_AREA_RIGHT_SLOT_FIXTURE, +} from '@opentrons/shared-data' import { MoveLabwareOnDeck as MoveLabwareOnDeckComponent } from './MoveLabwareOnDeck' -import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { + DeckConfiguration, + LabwareDefinition2, +} from '@opentrons/shared-data' import type { Meta, StoryObj } from '@storybook/react' @@ -14,16 +23,70 @@ const meta: Meta> = { export default meta type Story = StoryObj> +const FLEX_SIMPLEST_DECK_CONFIG: DeckConfiguration = [ + { + cutoutId: 'cutoutA1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutB1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutD1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutA2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutB2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutD2', + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutA3', + cutoutFixtureId: SINGLE_RIGHT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutB3', + cutoutFixtureId: SINGLE_RIGHT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC3', + cutoutFixtureId: SINGLE_RIGHT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutD3', + cutoutFixtureId: STAGING_AREA_RIGHT_SLOT_FIXTURE, + }, +] + export const MoveLabwareOnDeck: Story = { render: args => ( ), args: { diff --git a/components/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx b/components/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx index 38adc9e0904..91defab6667 100644 --- a/components/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx +++ b/components/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx @@ -7,40 +7,44 @@ import { LoadedModule, getDeckDefFromRobotType, getModuleDef2, + getPositionFromSlotId, LoadedLabware, } from '@opentrons/shared-data' -import { COLORS } from '../../ui-style-constants' +import { COLORS } from '../../helix-design-system' import { IDENTITY_AFFINE_TRANSFORM, multiplyMatrices } from '../utils' -import { StyledDeck } from './StyledDeck' +import { BaseDeck } from '../BaseDeck' import type { Coordinates, LabwareDefinition2, LabwareLocation, RobotType, - DeckSlot, DeckDefinition, + DeckConfiguration, } from '@opentrons/shared-data' import type { StyleProps } from '../../primitives' -import type { TrashSlotName } from './FlexTrash' const getModulePosition = ( - orderedSlots: DeckSlot[], + deckDef: DeckDefinition, moduleId: string, - loadedModules: LoadedModule[], - deckId: DeckDefinition['otId'] + loadedModules: LoadedModule[] ): Coordinates | null => { const loadedModule = loadedModules.find(m => m.id === moduleId) if (loadedModule == null) return null - const modSlot = orderedSlots.find( + const modSlot = deckDef.locations.addressableAreas.find( s => s.id === loadedModule.location.slotName ) if (modSlot == null) return null - const [modX, modY] = modSlot.position + + const modPosition = getPositionFromSlotId(loadedModule.id, deckDef) + if (modPosition == null) return null + const [modX, modY] = modPosition + const deckSpecificAffineTransform = - getModuleDef2(loadedModule.model).slotTransforms?.[deckId]?.[modSlot.id] - ?.labwareOffset ?? IDENTITY_AFFINE_TRANSFORM + getModuleDef2(loadedModule.model).slotTransforms?.[deckDef.otId]?.[ + modSlot.id + ]?.labwareOffset ?? IDENTITY_AFFINE_TRANSFORM const [[labwareX], [labwareY], [labwareZ]] = multiplyMatrices( [[modX], [modY], [1], [1]], deckSpecificAffineTransform @@ -49,15 +53,13 @@ const getModulePosition = ( } function getLabwareCoordinates({ - orderedSlots, + deckDef, location, - deckId, loadedModules, loadedLabware, }: { - orderedSlots: DeckSlot[] + deckDef: DeckDefinition location: LabwareLocation - deckId: DeckDefinition['otId'] loadedModules: LoadedModule[] loadedLabware: LoadedLabware[] }): Coordinates | null { @@ -76,27 +78,43 @@ function getLabwareCoordinates({ // adapter on module if ('moduleId' in loadedAdapterLocation) { return getModulePosition( - orderedSlots, + deckDef, loadedAdapterLocation.moduleId, - loadedModules, - deckId + loadedModules ) } // adapter on deck - const loadedAdapterSlot = orderedSlots.find( - s => s.id === loadedAdapterLocation.slotName + const loadedAdapterSlotPosition = getPositionFromSlotId( + 'slotName' in loadedAdapterLocation + ? loadedAdapterLocation.slotName + : loadedAdapterLocation.addressableAreaName, + deckDef ) - return loadedAdapterSlot != null + return loadedAdapterSlotPosition != null ? { - x: loadedAdapterSlot.position[0], - y: loadedAdapterSlot.position[1], - z: loadedAdapterSlot.position[2], + x: loadedAdapterSlotPosition[0], + y: loadedAdapterSlotPosition[1], + z: loadedAdapterSlotPosition[2], + } + : null + } else if ('addressableAreaName' in location) { + const slotCoordinateTuple = getPositionFromSlotId( + location.addressableAreaName, + deckDef + ) + return slotCoordinateTuple != null + ? { + x: slotCoordinateTuple[0], + y: slotCoordinateTuple[1], + z: slotCoordinateTuple[2], } : null } else if ('slotName' in location) { - const slotCoordinateTuple = - orderedSlots.find(s => s.id === location.slotName)?.position ?? null + const slotCoordinateTuple = getPositionFromSlotId( + location.slotName, + deckDef + ) return slotCoordinateTuple != null ? { x: slotCoordinateTuple[0], @@ -105,12 +123,7 @@ function getLabwareCoordinates({ } : null } else { - return getModulePosition( - orderedSlots, - location.moduleId, - loadedModules, - deckId - ) + return getModulePosition(deckDef, location.moduleId, loadedModules) } } @@ -124,9 +137,9 @@ interface MoveLabwareOnDeckProps extends StyleProps { finalLabwareLocation: LabwareLocation loadedModules: LoadedModule[] loadedLabware: LoadedLabware[] + deckConfig: DeckConfiguration backgroundItems?: React.ReactNode deckFill?: string - trashSlotName?: TrashSlotName } export function MoveLabwareOnDeck( props: MoveLabwareOnDeckProps @@ -138,17 +151,28 @@ export function MoveLabwareOnDeck( initialLabwareLocation, finalLabwareLocation, loadedModules, + deckConfig, backgroundItems = null, - deckFill = '#e6e6e6', - trashSlotName, ...styleProps } = props const deckDef = React.useMemo(() => getDeckDefFromRobotType(robotType), [ robotType, ]) + const initialSlotId = + initialLabwareLocation === 'offDeck' || + !('slotName' in initialLabwareLocation) + ? deckDef.locations.addressableAreas[1].id + : initialLabwareLocation.slotName + + const slotPosition = getPositionFromSlotId(initialSlotId, deckDef) ?? [ + 0, + 0, + 0, + ] + const offDeckPosition = { - x: deckDef.locations.orderedSlots[1].position[0], + x: slotPosition[0], y: deckDef.cornerOffsetFromOrigin[1] - movedLabwareDef.dimensions.xDimension - @@ -156,18 +180,16 @@ export function MoveLabwareOnDeck( } const initialPosition = getLabwareCoordinates({ - orderedSlots: deckDef.locations.orderedSlots, + deckDef, location: initialLabwareLocation, loadedModules, - deckId: deckDef.otId, loadedLabware, }) ?? offDeckPosition const finalPosition = getLabwareCoordinates({ - orderedSlots: deckDef.locations.orderedSlots, + deckDef, location: finalLabwareLocation, loadedModules, - deckId: deckDef.otId, loadedLabware, }) ?? offDeckPosition @@ -192,26 +214,16 @@ export function MoveLabwareOnDeck( if (deckDef == null) return null - const [viewBoxOriginX, viewBoxOriginY] = deckDef.cornerOffsetFromOrigin - const [deckXDimension, deckYDimension] = deckDef.dimensions - const wholeDeckViewBox = `${viewBoxOriginX} ${viewBoxOriginY} ${deckXDimension} ${deckYDimension}` - return ( - - {deckDef != null && ( - - )} {backgroundItems} - + ) } @@ -260,7 +272,6 @@ export function MoveLabwareOnDeck( * These animated components needs to be split out because react-spring and styled-components don't play nice * @see https://github.com/pmndrs/react-spring/issues/1515 */ const AnimatedG = styled(animated.g)`` -const AnimatedSvg = styled(animated.svg)`` interface WellProps { wellDef: LabwareWell @@ -272,7 +283,7 @@ function Well(props: WellProps): JSX.Element { return wellDef.shape === 'rectangular' ? ( + + + ) +} + +export function FixedTrash(): JSX.Element { + return ( + + + + ) +} +export function DoorStops(): JSX.Element { + return ( + + + + ) +} + +export function MetalFrame(): JSX.Element { + return ( + + + + ) +} + +export function RemovableDeckOutline(): JSX.Element { + return ( + + + + ) +} + +export function SlotRidges(): JSX.Element { + return ( + + + + ) +} +export function SlotNumbers(): JSX.Element { + return ( + + + + ) +} +export function CalibrationMarkings(): JSX.Element { + return ( + + + + ) +} +export function RemovalHandle(): JSX.Element { + return ( + + + + ) +} +export function ScrewHoles(): JSX.Element { + return ( + + + + ) +} diff --git a/components/src/hardware-sim/Deck/RobotCoordsForeignDiv.tsx b/components/src/hardware-sim/Deck/RobotCoordsForeignDiv.tsx index 3f0614c1220..b402ff43069 100644 --- a/components/src/hardware-sim/Deck/RobotCoordsForeignDiv.tsx +++ b/components/src/hardware-sim/Deck/RobotCoordsForeignDiv.tsx @@ -7,7 +7,7 @@ export interface RobotCoordsForeignDivProps { x?: string | number y?: string | number children?: React.ReactNode - className?: string + outerProps?: any innerDivProps?: React.ComponentProps transformWithSVG?: boolean extraTransform?: string @@ -22,7 +22,7 @@ export const RobotCoordsForeignDiv = ( y = 0, height = '100%', width = '100%', - className, + outerProps, innerDivProps, transformWithSVG = false, extraTransform = '', @@ -31,7 +31,7 @@ export const RobotCoordsForeignDiv = ( const transform = `scale(1, -1) ${extraTransform}` return ( { - return layers.reduce((acc, layer) => { - if (layer.attributes.id) { - return [...acc, layer.attributes.id] - } - return [] - }, []) -} - -export default { - title: 'Library/Molecules/Simulation/Deck', -} as Meta - -const Template: Story> = ({ - deckDef, - ...args -}) => { - const deckLoadName: unknown = deckDef - const resolvedDef: typeof deckDef = allDeckDefs[deckLoadName as string] - return -} -export const Deck = Template.bind({}) -Deck.argTypes = { - deckDef: { - options: Object.keys(allDeckDefs), - control: { - type: 'select', - }, - defaultValue: 'ot2_standard', - }, - deckLayerBlocklist: { - options: [ - ...getLayerIds(allDeckDefs.ot2_standard.layers), - ...getLayerIds(allDeckDefs.ot3_standard.layers), - ], - control: { - type: 'check', - }, - defaultValue: '', - }, -} -Deck.args = { - children: ({ deckSlotsById }) => { - const divSlot = Object.values(deckSlotsById)[2] as any - const moduleSlot = Object.values(deckSlotsById)[0] as any - return ( - <> - - - - - - - ) - }, -} - -const SlotLabelTemplate: Story< - React.ComponentProps & { hasSlotLabels: boolean } -> = ({ hasSlotLabels }) => { - return ( - - {({ deckSlotsById }) => { - const divSlot = Object.values(deckSlotsById)[2] as any - const moduleSlot = Object.values(deckSlotsById)[0] as any - return ( - <> - - - - - - {hasSlotLabels ? ( - - ) : null} - - ) - }} - - ) -} - -export const FlexDeckWithSlotLabels = SlotLabelTemplate.bind({}) -FlexDeckWithSlotLabels.argTypes = { - hasSlotLabels: { - control: { - type: 'boolean', - }, - defaultValue: true, - }, -} diff --git a/components/src/hardware-sim/Deck/RobotWorkSpace.tsx b/components/src/hardware-sim/Deck/RobotWorkSpace.tsx index 360e1ba8c9a..34c780f569f 100644 --- a/components/src/hardware-sim/Deck/RobotWorkSpace.tsx +++ b/components/src/hardware-sim/Deck/RobotWorkSpace.tsx @@ -1,9 +1,9 @@ import * as React from 'react' +import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' import { StyleProps, Svg } from '../../primitives' -import { StyledDeck } from './StyledDeck' +import { DeckFromLayers } from './DeckFromLayers' import type { DeckDefinition, DeckSlot } from '@opentrons/shared-data' -import type { TrashSlotName } from './FlexTrash' export interface RobotWorkSpaceRenderProps { deckSlotsById: { [slotId: string]: DeckSlot } @@ -17,10 +17,9 @@ export interface RobotWorkSpaceProps extends StyleProps { deckDef?: DeckDefinition viewBox?: string | null children?: (props: RobotWorkSpaceRenderProps) => React.ReactNode - deckFill?: string deckLayerBlocklist?: string[] - trashSlotName?: TrashSlotName - trashColor?: string + // optional boolean to show the OT-2 deck from deck defintion layers + showDeckLayers?: boolean id?: string } @@ -30,11 +29,9 @@ export function RobotWorkSpace(props: RobotWorkSpaceProps): JSX.Element | null { const { children, deckDef, - deckFill = '#CCCCCC', deckLayerBlocklist = [], - trashSlotName, + showDeckLayers = false, viewBox, - trashColor, id, ...styleProps } = props @@ -64,7 +61,7 @@ export function RobotWorkSpace(props: RobotWorkSpaceProps): JSX.Element | null { const [viewBoxOriginX, viewBoxOriginY] = deckDef.cornerOffsetFromOrigin const [deckXDimension, deckYDimension] = deckDef.dimensions - deckSlotsById = deckDef.locations.orderedSlots.reduce( + deckSlotsById = deckDef.locations.addressableAreas.reduce( (acc, deckSlot) => ({ ...acc, [deckSlot.id]: deckSlot }), {} ) @@ -79,15 +76,12 @@ export function RobotWorkSpace(props: RobotWorkSpaceProps): JSX.Element | null { transform="scale(1, -1)" {...styleProps} > - {deckDef != null && ( - - )} + ) : null} {children?.({ deckSlotsById, getRobotCoordsFromDOMCoords })} ) diff --git a/components/src/hardware-sim/Deck/SlotLabels.tsx b/components/src/hardware-sim/Deck/SlotLabels.tsx index 4bfe059ed3f..31648cda9c0 100644 --- a/components/src/hardware-sim/Deck/SlotLabels.tsx +++ b/components/src/hardware-sim/Deck/SlotLabels.tsx @@ -10,6 +10,7 @@ import type { RobotType } from '@opentrons/shared-data' interface SlotLabelsProps { robotType: RobotType color?: string + show4thColumn?: boolean } /** @@ -19,7 +20,11 @@ interface SlotLabelsProps { export const SlotLabels = ({ robotType, color, + show4thColumn = false, }: SlotLabelsProps): JSX.Element | null => { + const widthSmallRem = 10.5 + const widthLargeRem = 15.25 + return robotType === FLEX_ROBOT_TYPE ? ( <> + {show4thColumn ? ( + + + + ) : null} diff --git a/components/src/hardware-sim/Deck/StyledDeck.tsx b/components/src/hardware-sim/Deck/StyledDeck.tsx deleted file mode 100644 index 205b0c702ff..00000000000 --- a/components/src/hardware-sim/Deck/StyledDeck.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import * as React from 'react' -import styled from 'styled-components' - -import { DeckFromData } from './DeckFromData' -import { FlexTrash } from './FlexTrash' - -import type { DeckFromDataProps } from './DeckFromData' -import type { TrashSlotName } from './FlexTrash' - -interface StyledDeckProps { - deckFill: string - trashColor?: string - trashSlotName?: TrashSlotName -} - -// apply fill to .SLOT_BASE class from ot3_standard deck definition -const StyledG = styled.g` - .SLOT_BASE { - fill: ${props => props.deckFill}; - } -` - -export function StyledDeck( - props: StyledDeckProps & DeckFromDataProps -): JSX.Element { - const { - deckFill, - trashSlotName, - trashColor = '#757070', - ...deckFromDataProps - } = props - - const robotType = deckFromDataProps.def.robot.model ?? 'OT-2 Standard' - - const trashSlotClipId = - trashSlotName != null ? `SLOT_CLIPS_${trashSlotName}` : null - - const trashLayerBlocklist = - trashSlotClipId != null - ? deckFromDataProps.layerBlocklist.concat(trashSlotClipId) - : deckFromDataProps.layerBlocklist - - return ( - - - {trashSlotName != null ? ( - - ) : null} - - ) -} diff --git a/components/src/hardware-sim/Deck/constants.ts b/components/src/hardware-sim/Deck/constants.ts new file mode 100644 index 00000000000..df8e85199fd --- /dev/null +++ b/components/src/hardware-sim/Deck/constants.ts @@ -0,0 +1,12 @@ +export const ALL_OT2_DECK_LAYERS = [ + 'fixedBase', + 'fixedTrash', + 'doorStops', + 'metalFrame', + 'removableDeckOutline', + 'slotRidges', + 'slotNumbers', + 'calibrationMarkings', + 'removalHandle', + 'screwHoles', +] as const diff --git a/components/src/hardware-sim/Deck/getDeckDefinitions.ts b/components/src/hardware-sim/Deck/getDeckDefinitions.ts index 0d440a4188e..b0be5266015 100644 --- a/components/src/hardware-sim/Deck/getDeckDefinitions.ts +++ b/components/src/hardware-sim/Deck/getDeckDefinitions.ts @@ -6,7 +6,7 @@ import type { DeckDefinition } from '@opentrons/shared-data' // and SD is not webpacked const deckDefinitionsContext = require.context( - '@opentrons/shared-data/deck/definitions/3', + '@opentrons/shared-data/deck/definitions/4', true, // traverse subdirectories /\.json$/, // import filter 'sync' // load every definition into one synchronous chunk diff --git a/components/src/hardware-sim/Deck/index.tsx b/components/src/hardware-sim/Deck/index.tsx index 088db85ecf0..1d2b9b8fec7 100644 --- a/components/src/hardware-sim/Deck/index.tsx +++ b/components/src/hardware-sim/Deck/index.tsx @@ -1,8 +1,9 @@ -export * from './RobotWorkSpace' +export * from './DeckFromLayers' +export * from './FlexTrash' +export * from './getDeckDefinitions' +export * from './MoveLabwareOnDeck' export * from './RobotCoordsForeignDiv' export * from './RobotCoordsForeignObject' export * from './RobotCoordsText' +export * from './RobotWorkSpace' export * from './SlotLabels' -export * from './FlexTrash' -export * from './getDeckDefinitions' -export * from './MoveLabwareOnDeck' diff --git a/components/src/hardware-sim/DeckConfigurator/DeckConfigurator.stories.tsx b/components/src/hardware-sim/DeckConfigurator/DeckConfigurator.stories.tsx new file mode 100644 index 00000000000..dc900541fd6 --- /dev/null +++ b/components/src/hardware-sim/DeckConfigurator/DeckConfigurator.stories.tsx @@ -0,0 +1,87 @@ +import * as React from 'react' + +import { + SINGLE_CENTER_SLOT_FIXTURE, + SINGLE_LEFT_SLOT_FIXTURE, + STAGING_AREA_RIGHT_SLOT_FIXTURE, + TRASH_BIN_ADAPTER_FIXTURE, + WASTE_CHUTE_RIGHT_ADAPTER_COVERED_FIXTURE, +} from '@opentrons/shared-data' + +import { DeckConfigurator } from '.' + +import type { Story, Meta } from '@storybook/react' +import type { CutoutConfig } from '@opentrons/shared-data' + +export default { + title: 'Library/Molecules/Simulation/DeckConfigurator', +} as Meta + +const Template: Story> = args => ( + +) +const deckConfig: CutoutConfig[] = [ + { + cutoutId: 'cutoutA1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutB1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutD1', + cutoutFixtureId: SINGLE_LEFT_SLOT_FIXTURE, + }, + { + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + cutoutId: 'cutoutA2', + }, + { + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + cutoutId: 'cutoutB2', + }, + { + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + cutoutId: 'cutoutC2', + }, + { + cutoutFixtureId: SINGLE_CENTER_SLOT_FIXTURE, + cutoutId: 'cutoutD2', + }, + { + cutoutId: 'cutoutA3', + cutoutFixtureId: TRASH_BIN_ADAPTER_FIXTURE, + }, + { + cutoutId: 'cutoutB3', + cutoutFixtureId: STAGING_AREA_RIGHT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutC3', + cutoutFixtureId: STAGING_AREA_RIGHT_SLOT_FIXTURE, + }, + { + cutoutId: 'cutoutD3', + cutoutFixtureId: WASTE_CHUTE_RIGHT_ADAPTER_COVERED_FIXTURE, + }, +] + +export const Default = Template.bind({}) +Default.args = { + deckConfig, + handleClickAdd: cutoutId => console.log(`add at ${cutoutId}`), + handleClickRemove: cutoutId => console.log(`remove at ${cutoutId}`), +} + +export const ReadOnly = Template.bind({}) +ReadOnly.args = { + deckConfig, + handleClickAdd: cutoutId => console.log(`add at ${cutoutId}`), + handleClickRemove: cutoutId => console.log(`remove at ${cutoutId}`), + readOnly: true, +} diff --git a/components/src/hardware-sim/DeckConfigurator/EmptyConfigFixture.tsx b/components/src/hardware-sim/DeckConfigurator/EmptyConfigFixture.tsx new file mode 100644 index 00000000000..62853fcab16 --- /dev/null +++ b/components/src/hardware-sim/DeckConfigurator/EmptyConfigFixture.tsx @@ -0,0 +1,109 @@ +import * as React from 'react' +import { css } from 'styled-components' + +import { Icon } from '../../icons' +import { Btn } from '../../primitives' +import { ALIGN_CENTER, DISPLAY_FLEX, JUSTIFY_CENTER } from '../../styles' +import { BORDERS, RESPONSIVENESS } from '../../ui-style-constants' +import { COLORS } from '../../helix-design-system' +import { RobotCoordsForeignObject } from '../Deck/RobotCoordsForeignObject' +import { + COLUMN_1_X_ADJUSTMENT, + COLUMN_3_X_ADJUSTMENT, + FIXTURE_HEIGHT, + SINGLE_SLOT_FIXTURE_WIDTH, + Y_ADJUSTMENT, +} from './constants' + +import type { CutoutId, DeckDefinition } from '@opentrons/shared-data' + +interface EmptyConfigFixtureProps { + deckDefinition: DeckDefinition + fixtureLocation: CutoutId + handleClickAdd: (fixtureLocation: CutoutId) => void +} + +export function EmptyConfigFixture( + props: EmptyConfigFixtureProps +): JSX.Element { + const { deckDefinition, handleClickAdd, fixtureLocation } = props + + const standardSlotCutout = deckDefinition.locations.cutouts.find( + cutout => cutout.id === fixtureLocation + ) + + /** + * deck definition cutout position is the position of the single slot located within that cutout + * so, to get the position of the cutout itself we must add an adjustment to the slot position + * the adjustment for x is different for right side/left side + */ + const [xSlotPosition = 0, ySlotPosition = 0] = + standardSlotCutout?.position ?? [] + + const isColumnOne = + fixtureLocation === 'cutoutA1' || + fixtureLocation === 'cutoutB1' || + fixtureLocation === 'cutoutC1' || + fixtureLocation === 'cutoutD1' + const xAdjustment = isColumnOne + ? COLUMN_1_X_ADJUSTMENT + : COLUMN_3_X_ADJUSTMENT + const x = xSlotPosition + xAdjustment + + const y = ySlotPosition + Y_ADJUSTMENT + + return ( + + handleClickAdd(fixtureLocation)} + > + + + + ) +} + +const EMPTY_CONFIG_STYLE = css` + display: ${DISPLAY_FLEX}; + align-items: ${ALIGN_CENTER}; + justify-content: ${JUSTIFY_CENTER}; + background-color: ${COLORS.blue30}; + border: 3px dashed ${COLORS.blue50}; + border-radius: ${BORDERS.radiusSoftCorners}; + width: 100%; + + @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { + background-color: ${COLORS.blue35}; + } + + &:active { + border: 3px solid ${COLORS.blue50}; + background-color: ${COLORS.blue40}; + } + + &:focus { + border: 3px solid ${COLORS.blue50}; + background-color: ${COLORS.blue40}; + } + + &:hover { + background-color: ${COLORS.blue35}; + } + + &:focus-visible { + border: 3px solid ${COLORS.blue50}; + background-color: ${COLORS.blue35}; + + @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { + background-color: ${COLORS.blue40}; + } + } +` diff --git a/components/src/hardware-sim/DeckConfigurator/StagingAreaConfigFixture.tsx b/components/src/hardware-sim/DeckConfigurator/StagingAreaConfigFixture.tsx new file mode 100644 index 00000000000..d1cd3af27d0 --- /dev/null +++ b/components/src/hardware-sim/DeckConfigurator/StagingAreaConfigFixture.tsx @@ -0,0 +1,76 @@ +import * as React from 'react' + +import { Icon } from '../../icons' +import { Btn, Text } from '../../primitives' +import { TYPOGRAPHY } from '../../ui-style-constants' +import { COLORS } from '../../helix-design-system' +import { RobotCoordsForeignObject } from '../Deck/RobotCoordsForeignObject' +import { + COLUMN_3_X_ADJUSTMENT, + CONFIG_STYLE_EDITABLE, + CONFIG_STYLE_READ_ONLY, + FIXTURE_HEIGHT, + STAGING_AREA_DISPLAY_NAME, + STAGING_AREA_FIXTURE_WIDTH, + Y_ADJUSTMENT, +} from './constants' + +import type { CutoutId, DeckDefinition } from '@opentrons/shared-data' + +interface StagingAreaConfigFixtureProps { + deckDefinition: DeckDefinition + fixtureLocation: CutoutId + handleClickRemove?: (fixtureLocation: CutoutId) => void +} + +export function StagingAreaConfigFixture( + props: StagingAreaConfigFixtureProps +): JSX.Element { + const { deckDefinition, handleClickRemove, fixtureLocation } = props + + const stagingAreaCutout = deckDefinition.locations.cutouts.find( + cutout => cutout.id === fixtureLocation + ) + + /** + * deck definition cutout position is the position of the single slot located within that cutout + * so, to get the position of the cutout itself we must add an adjustment to the slot position + */ + const [xSlotPosition = 0, ySlotPosition = 0] = + stagingAreaCutout?.position ?? [] + + const x = xSlotPosition + COLUMN_3_X_ADJUSTMENT + const y = ySlotPosition + Y_ADJUSTMENT + + return ( + + handleClickRemove(fixtureLocation) + : () => {} + } + > + + {STAGING_AREA_DISPLAY_NAME} + + {handleClickRemove != null ? ( + + ) : null} + + + ) +} diff --git a/components/src/hardware-sim/DeckConfigurator/TrashBinConfigFixture.tsx b/components/src/hardware-sim/DeckConfigurator/TrashBinConfigFixture.tsx new file mode 100644 index 00000000000..9a9a100d92f --- /dev/null +++ b/components/src/hardware-sim/DeckConfigurator/TrashBinConfigFixture.tsx @@ -0,0 +1,86 @@ +import * as React from 'react' + +import { Icon } from '../../icons' +import { Btn, Text } from '../../primitives' +import { TYPOGRAPHY } from '../../ui-style-constants' +import { COLORS } from '../../helix-design-system' +import { RobotCoordsForeignObject } from '../Deck/RobotCoordsForeignObject' +import { + COLUMN_1_X_ADJUSTMENT, + COLUMN_3_X_ADJUSTMENT, + CONFIG_STYLE_EDITABLE, + CONFIG_STYLE_READ_ONLY, + FIXTURE_HEIGHT, + SINGLE_SLOT_FIXTURE_WIDTH, + TRASH_BIN_DISPLAY_NAME, + Y_ADJUSTMENT, +} from './constants' + +import type { CutoutId, DeckDefinition } from '@opentrons/shared-data' + +interface TrashBinConfigFixtureProps { + deckDefinition: DeckDefinition + fixtureLocation: CutoutId + handleClickRemove?: (fixtureLocation: CutoutId) => void +} + +export function TrashBinConfigFixture( + props: TrashBinConfigFixtureProps +): JSX.Element { + const { deckDefinition, handleClickRemove, fixtureLocation } = props + + const trashBinCutout = deckDefinition.locations.cutouts.find( + cutout => cutout.id === fixtureLocation + ) + + /** + * deck definition cutout position is the position of the single slot located within that cutout + * so, to get the position of the cutout itself we must add an adjustment to the slot position + * the adjustment for x is different for right side/left side + */ + const [xSlotPosition = 0, ySlotPosition = 0] = trashBinCutout?.position ?? [] + + const isColumnOne = + fixtureLocation === 'cutoutA1' || + fixtureLocation === 'cutoutB1' || + fixtureLocation === 'cutoutC1' || + fixtureLocation === 'cutoutD1' + const xAdjustment = isColumnOne + ? COLUMN_1_X_ADJUSTMENT + : COLUMN_3_X_ADJUSTMENT + const x = xSlotPosition + xAdjustment + + const y = ySlotPosition + Y_ADJUSTMENT + + return ( + + handleClickRemove(fixtureLocation) + : () => {} + } + > + + {TRASH_BIN_DISPLAY_NAME} + + {handleClickRemove != null ? ( + + ) : null} + + + ) +} diff --git a/components/src/hardware-sim/DeckConfigurator/WasteChuteConfigFixture.tsx b/components/src/hardware-sim/DeckConfigurator/WasteChuteConfigFixture.tsx new file mode 100644 index 00000000000..1932fe3674b --- /dev/null +++ b/components/src/hardware-sim/DeckConfigurator/WasteChuteConfigFixture.tsx @@ -0,0 +1,85 @@ +import * as React from 'react' + +import { Icon } from '../../icons' +import { Btn, Text } from '../../primitives' +import { TYPOGRAPHY } from '../../ui-style-constants' +import { COLORS } from '../../helix-design-system' +import { RobotCoordsForeignObject } from '../Deck/RobotCoordsForeignObject' +import { + COLUMN_3_X_ADJUSTMENT, + CONFIG_STYLE_EDITABLE, + CONFIG_STYLE_READ_ONLY, + FIXTURE_HEIGHT, + STAGING_AREA_FIXTURE_WIDTH, + SINGLE_SLOT_FIXTURE_WIDTH, + WASTE_CHUTE_DISPLAY_NAME, + Y_ADJUSTMENT, +} from './constants' + +import type { CutoutId, DeckDefinition } from '@opentrons/shared-data' + +interface WasteChuteConfigFixtureProps { + deckDefinition: DeckDefinition + fixtureLocation: CutoutId + handleClickRemove?: (fixtureLocation: CutoutId) => void + hasStagingAreas?: boolean +} + +export function WasteChuteConfigFixture( + props: WasteChuteConfigFixtureProps +): JSX.Element { + const { + deckDefinition, + handleClickRemove, + fixtureLocation, + hasStagingAreas = false, + } = props + + const wasteChuteCutout = deckDefinition.locations.cutouts.find( + cutout => cutout.id === fixtureLocation + ) + + /** + * deck definition cutout position is the position of the single slot located within that cutout + * so, to get the position of the cutout itself we must add an adjustment to the slot position + */ + const [xSlotPosition = 0, ySlotPosition = 0] = + wasteChuteCutout?.position ?? [] + + const x = xSlotPosition + COLUMN_3_X_ADJUSTMENT + const y = ySlotPosition + Y_ADJUSTMENT + + return ( + + handleClickRemove(fixtureLocation) + : () => {} + } + > + + {WASTE_CHUTE_DISPLAY_NAME} + + {handleClickRemove != null ? ( + + ) : null} + + + ) +} diff --git a/components/src/hardware-sim/DeckConfigurator/constants.ts b/components/src/hardware-sim/DeckConfigurator/constants.ts new file mode 100644 index 00000000000..e2994e29ba2 --- /dev/null +++ b/components/src/hardware-sim/DeckConfigurator/constants.ts @@ -0,0 +1,56 @@ +import { css } from 'styled-components' + +import { COLORS } from '../../helix-design-system' +import { ALIGN_CENTER, DISPLAY_FLEX, JUSTIFY_CENTER } from '../../styles' +import { BORDERS, RESPONSIVENESS, SPACING } from '../../ui-style-constants' + +/** + * These are Flex deck configurator-only values to position a foreign object + * Position is relative to deck definition slot positions and a custom stroke applied to the single slot fixture SVG + */ +export const FIXTURE_HEIGHT = 102.0 +export const SINGLE_SLOT_FIXTURE_WIDTH = 243.5 +export const STAGING_AREA_FIXTURE_WIDTH = 314.5 + +export const COLUMN_1_X_ADJUSTMENT = -100 +export const COLUMN_3_X_ADJUSTMENT = -15.5 +export const Y_ADJUSTMENT = -8 + +export const STAGING_AREA_DISPLAY_NAME = 'Staging area' +export const TRASH_BIN_DISPLAY_NAME = 'Trash bin' +export const WASTE_CHUTE_DISPLAY_NAME = 'Waste chute' + +// common config styles for staging area, trash bin, waste chute +export const CONFIG_STYLE_READ_ONLY = css` + display: ${DISPLAY_FLEX}; + align-items: ${ALIGN_CENTER}; + background-color: ${COLORS.grey50}; + border-radius: ${BORDERS.borderRadiusSize1}; + color: ${COLORS.white}; + grid-gap: ${SPACING.spacing8}; + justify-content: ${JUSTIFY_CENTER}; + width: 100%; + @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { + background-color: ${COLORS.grey55}; + } +` + +export const CONFIG_STYLE_EDITABLE = css` + ${CONFIG_STYLE_READ_ONLY} + + &:active { + background-color: ${COLORS.grey60}; + } + + &:hover { + background-color: ${COLORS.grey55}; + } + + &:focus-visible { + border: 3px solid ${COLORS.yellow50}; + background-color: ${COLORS.grey55}; + @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { + background-color: ${COLORS.grey60}; + } + } +` diff --git a/components/src/hardware-sim/DeckConfigurator/index.tsx b/components/src/hardware-sim/DeckConfigurator/index.tsx new file mode 100644 index 00000000000..9378471d8e0 --- /dev/null +++ b/components/src/hardware-sim/DeckConfigurator/index.tsx @@ -0,0 +1,157 @@ +import * as React from 'react' + +import { + getDeckDefFromRobotType, + FLEX_ROBOT_TYPE, + SINGLE_SLOT_FIXTURES, + STAGING_AREA_RIGHT_SLOT_FIXTURE, + TRASH_BIN_ADAPTER_FIXTURE, + WASTE_CHUTE_ONLY_FIXTURES, + WASTE_CHUTE_STAGING_AREA_FIXTURES, +} from '@opentrons/shared-data' + +import { COLORS } from '../../helix-design-system' +import { SingleSlotFixture } from '../BaseDeck/SingleSlotFixture' +import { SlotLabels } from '../Deck' +import { RobotCoordinateSpace } from '../RobotCoordinateSpace' +import { EmptyConfigFixture } from './EmptyConfigFixture' +import { StagingAreaConfigFixture } from './StagingAreaConfigFixture' +import { TrashBinConfigFixture } from './TrashBinConfigFixture' +import { WasteChuteConfigFixture } from './WasteChuteConfigFixture' + +import type { CutoutId, DeckConfiguration } from '@opentrons/shared-data' + +interface DeckConfiguratorProps { + deckConfig: DeckConfiguration + handleClickAdd: (cutoutId: CutoutId) => void + handleClickRemove: (cutoutId: CutoutId) => void + lightFill?: string + darkFill?: string + readOnly?: boolean + showExpansion?: boolean + children?: React.ReactNode +} + +export function DeckConfigurator(props: DeckConfiguratorProps): JSX.Element { + const { + deckConfig, + handleClickAdd, + handleClickRemove, + lightFill = COLORS.grey35, + darkFill = COLORS.black90, + readOnly = false, + showExpansion = true, + children, + } = props + const deckDef = getDeckDefFromRobotType(FLEX_ROBOT_TYPE) + + // restrict configuration to certain locations + const configurableFixtureLocations: CutoutId[] = [ + 'cutoutA1', + 'cutoutB1', + 'cutoutC1', + 'cutoutD1', + 'cutoutA3', + 'cutoutB3', + 'cutoutC3', + 'cutoutD3', + ] + const configurableDeckConfig = deckConfig.filter(({ cutoutId }) => + configurableFixtureLocations.includes(cutoutId) + ) + + const stagingAreaFixtures = configurableDeckConfig.filter( + ({ cutoutFixtureId }) => cutoutFixtureId === STAGING_AREA_RIGHT_SLOT_FIXTURE + ) + const wasteChuteFixtures = configurableDeckConfig.filter( + ({ cutoutFixtureId }) => + cutoutFixtureId != null && + WASTE_CHUTE_ONLY_FIXTURES.includes(cutoutFixtureId) + ) + const wasteChuteStagingAreaFixtures = configurableDeckConfig.filter( + ({ cutoutFixtureId }) => + cutoutFixtureId != null && + WASTE_CHUTE_STAGING_AREA_FIXTURES.includes(cutoutFixtureId) + ) + const emptyFixtures = readOnly + ? [] + : configurableDeckConfig.filter( + ({ cutoutFixtureId }) => + cutoutFixtureId != null && + SINGLE_SLOT_FIXTURES.includes(cutoutFixtureId) + ) + const trashBinFixtures = configurableDeckConfig.filter( + ({ cutoutFixtureId }) => cutoutFixtureId === TRASH_BIN_ADAPTER_FIXTURE + ) + + return ( + + {deckDef.locations.cutouts.map(cutout => ( + // give the outside of the base fixture svgs a stroke for extra spacing + + + + ))} + {stagingAreaFixtures.map(({ cutoutId }) => ( + + ))} + {emptyFixtures.map(({ cutoutId }) => ( + + ))} + {wasteChuteFixtures.map(({ cutoutId }) => ( + + ))} + {wasteChuteStagingAreaFixtures.map(({ cutoutId }) => ( + + ))} + {trashBinFixtures.map(({ cutoutId }) => ( + + ))} + 0 || + wasteChuteStagingAreaFixtures.length > 0 + } + /> + {children} + + ) +} diff --git a/components/src/hardware-sim/DeckSlotLocation/index.tsx b/components/src/hardware-sim/DeckSlotLocation/index.tsx index c098128210d..1bd5091aae9 100644 --- a/components/src/hardware-sim/DeckSlotLocation/index.tsx +++ b/components/src/hardware-sim/DeckSlotLocation/index.tsx @@ -1,206 +1,83 @@ import * as React from 'react' -import { DeckDefinition, DeckSlot, ModuleType } from '@opentrons/shared-data' +import { getPositionFromSlotId, OT2_ROBOT_TYPE } from '@opentrons/shared-data' +import ot2DeckDefV4 from '@opentrons/shared-data/deck/definitions/4/ot2_standard.json' -// TODO(BC, 8/2/2023): as soon as the deck definitions have a concept of base locations, use their -// identity to key this mapping instead of slotNames -interface DeckSlotLocationProps extends React.SVGProps { +import { SlotBase } from '../BaseDeck/SlotBase' + +import type { + DeckDefinition, + DeckSlot, + RobotType, +} from '@opentrons/shared-data' + +interface LegacyDeckSlotLocationProps extends React.SVGProps { + robotType: RobotType slotName: DeckSlot['id'] - deckDefinition: DeckDefinition - moduleType?: ModuleType slotBaseColor?: React.SVGProps['fill'] slotClipColor?: React.SVGProps['stroke'] - showExtensions?: boolean } -export function DeckSlotLocation( - props: DeckSlotLocationProps +// dimensions of the OT-2 fixed trash, not in deck definition +export const OT2_FIXED_TRASH_X_DIMENSION = 172.86 +export const OT2_FIXED_TRASH_Y_DIMENSION = 165.86 + +/** + * This is a legacy component for rendering an OT-2 deck slot by reference to the V4 deck definition + */ +export function LegacyDeckSlotLocation( + props: LegacyDeckSlotLocationProps ): JSX.Element | null { const { + robotType, slotName, - deckDefinition, slotBaseColor, slotClipColor, - showExtensions = false, ...restProps } = props - const slotDef = deckDefinition?.locations.orderedSlots.find( + if (robotType !== OT2_ROBOT_TYPE) return null + + const slotDef = ot2DeckDefV4.locations.addressableAreas.find( s => s.id === slotName ) if (slotDef == null) { console.warn( - `cannot render DeckSlotLocation, no deck slot named: ${slotName} in deck def ${deckDefinition?.otId}` + `cannot render DeckSlotLocation, no deck slot named: ${slotName} in OT-2 deck definition` ) return null } - const contentsBySlotName: { [slotName: string]: JSX.Element } = { - A1: ( - <> - {showExtensions ? ( - - ) : null} - - - - - - - ), - A2: ( - <> - - , - , - , - - - ), - A3: ( - <> - - , - , - , - - - ), - B1: ( - <> - - , - , - , - - - ), - B2: ( - <> - - , - , - , - - - ), - B3: ( - <> - - , - , - , - - - ), - C1: ( - <> - - - - - - - ), - C2: ( - <> - - , - , - , - - - ), - C3: ( - <> - - , - , - , - - - ), - D1: ( - <> - - - - - - - ), - D2: ( - <> - - - - - - - ), - D3: ( - <> - - - - - - - ), - } + const slotPosition = getPositionFromSlotId( + slotName, + (ot2DeckDefV4 as unknown) as DeckDefinition + ) - return {contentsBySlotName[slotName]} -} + const isFixedTrash = slotName === 'fixedTrash' + + const [xPosition, yPosition] = slotPosition ?? [0, 0] + const { xDimension, yDimension } = isFixedTrash + ? { + xDimension: OT2_FIXED_TRASH_X_DIMENSION, + yDimension: OT2_FIXED_TRASH_Y_DIMENSION, + } + : slotDef.boundingBox + const [xOffset, yOffset] = slotDef.offsetFromCutoutFixture + + // adjust the fixed trash position and dimension to fit inside deck SVG + const fixedTrashPositionAdjustment = isFixedTrash ? 7 : 0 + const fixedTrashDimensionAdjustment = isFixedTrash ? -9 : 0 + + const adjustedXPosition = xPosition + fixedTrashPositionAdjustment - xOffset + const adjustedYPosition = yPosition + fixedTrashPositionAdjustment - yOffset + const adjustedXDimension = xDimension + fixedTrashDimensionAdjustment + const adjustedYDimension = yDimension + fixedTrashDimensionAdjustment -function SlotBase(props: React.SVGProps): JSX.Element { - return -} -function SlotClip(props: React.SVGProps): JSX.Element { return ( - + + + ) } diff --git a/components/src/hardware-sim/Labware/LabwareAdapter/Opentrons96DeepWellAdapter.tsx b/components/src/hardware-sim/Labware/LabwareAdapter/Opentrons96DeepWellAdapter.tsx new file mode 100644 index 00000000000..9c89739aee7 --- /dev/null +++ b/components/src/hardware-sim/Labware/LabwareAdapter/Opentrons96DeepWellAdapter.tsx @@ -0,0 +1,24 @@ +import * as React from 'react' +import { COLORS } from '../../../helix-design-system' + +export function Opentrons96DeepWellAdapter(): JSX.Element { + return ( + + + + + + ) +} diff --git a/components/src/hardware-sim/Labware/LabwareAdapter/Opentrons96FlatBottomAdapter.tsx b/components/src/hardware-sim/Labware/LabwareAdapter/Opentrons96FlatBottomAdapter.tsx new file mode 100644 index 00000000000..c9e331b3496 --- /dev/null +++ b/components/src/hardware-sim/Labware/LabwareAdapter/Opentrons96FlatBottomAdapter.tsx @@ -0,0 +1,9 @@ +import * as React from 'react' + +export function Opentrons96FlatBottomAdapter(): JSX.Element { + return ( + + + + ) +} diff --git a/components/src/hardware-sim/Labware/LabwareAdapter/OpentronsAluminumFlatBottomPlate.tsx b/components/src/hardware-sim/Labware/LabwareAdapter/OpentronsAluminumFlatBottomPlate.tsx new file mode 100644 index 00000000000..a3e05d3406b --- /dev/null +++ b/components/src/hardware-sim/Labware/LabwareAdapter/OpentronsAluminumFlatBottomPlate.tsx @@ -0,0 +1,14 @@ +import * as React from 'react' +import { COLORS } from '../../../helix-design-system' + +export function OpentronsAluminumFlatBottomPlate(): JSX.Element { + return ( + + + + ) +} diff --git a/components/src/hardware-sim/Labware/LabwareAdapter/OpentronsFlex96TiprackAdapter.tsx b/components/src/hardware-sim/Labware/LabwareAdapter/OpentronsFlex96TiprackAdapter.tsx new file mode 100644 index 00000000000..04c8b5696ce --- /dev/null +++ b/components/src/hardware-sim/Labware/LabwareAdapter/OpentronsFlex96TiprackAdapter.tsx @@ -0,0 +1,14 @@ +import * as React from 'react' +import { COLORS } from '../../../helix-design-system' + +export function OpentronsFlex96TiprackAdapter(): JSX.Element { + return ( + + + + ) +} diff --git a/components/src/hardware-sim/Labware/LabwareAdapter/OpentronsUniversalFlatAdapter.tsx b/components/src/hardware-sim/Labware/LabwareAdapter/OpentronsUniversalFlatAdapter.tsx new file mode 100644 index 00000000000..d0ee517ac74 --- /dev/null +++ b/components/src/hardware-sim/Labware/LabwareAdapter/OpentronsUniversalFlatAdapter.tsx @@ -0,0 +1,14 @@ +import * as React from 'react' +import { COLORS } from '../../../helix-design-system' + +export function OpentronsUniversalFlatAdapter(): JSX.Element { + return ( + + + + ) +} diff --git a/components/src/hardware-sim/Labware/LabwareAdapter/index.tsx b/components/src/hardware-sim/Labware/LabwareAdapter/index.tsx new file mode 100644 index 00000000000..978fb7cbea3 --- /dev/null +++ b/components/src/hardware-sim/Labware/LabwareAdapter/index.tsx @@ -0,0 +1,32 @@ +import * as React from 'react' +import { Opentrons96DeepWellAdapter } from './Opentrons96DeepWellAdapter' +import { Opentrons96FlatBottomAdapter } from './Opentrons96FlatBottomAdapter' +import { OpentronsUniversalFlatAdapter } from './OpentronsUniversalFlatAdapter' +import { OpentronsAluminumFlatBottomPlate } from './OpentronsAluminumFlatBottomPlate' +import { OpentronsFlex96TiprackAdapter } from './OpentronsFlex96TiprackAdapter' + +const LABWARE_ADAPTER_LOADNAME_PATHS = { + opentrons_96_deep_well_adapter: Opentrons96DeepWellAdapter, + opentrons_96_flat_bottom_adapter: Opentrons96FlatBottomAdapter, + opentrons_aluminum_flat_bottom_plate: OpentronsAluminumFlatBottomPlate, + opentrons_flex_96_tiprack_adapter: OpentronsFlex96TiprackAdapter, + opentrons_universal_flat_adapter: OpentronsUniversalFlatAdapter, +} + +export type LabwareAdapterLoadName = keyof typeof LABWARE_ADAPTER_LOADNAME_PATHS +export const labwareAdapterLoadNames = Object.keys( + LABWARE_ADAPTER_LOADNAME_PATHS +) + +export interface LabwareAdapterProps { + labwareLoadName: LabwareAdapterLoadName +} + +export const LabwareAdapter = ( + props: LabwareAdapterProps +): JSX.Element | null => { + const { labwareLoadName } = props + const SVGElement = LABWARE_ADAPTER_LOADNAME_PATHS[labwareLoadName] + + return +} diff --git a/components/src/hardware-sim/Labware/LabwareRender.css b/components/src/hardware-sim/Labware/LabwareRender.css deleted file mode 100644 index 38f57e93289..00000000000 --- a/components/src/hardware-sim/Labware/LabwareRender.css +++ /dev/null @@ -1,21 +0,0 @@ -@import '../..'; - -.highlighted_well { - stroke: var(--c-blue-enabled); - fill: color-mod(var(--c-blue-enabled) alpha(20%)); -} - -.disabled_well { - stroke: var(--c-light-grey-hover); - fill: color-mod(var(--c-lightest-gray) alpha(80%)); -} - -.selected_well { - stroke: var(--c-blue-enabled); - fill: transparent; -} - -.missing_tip { - stroke: var(--c-near-black); - fill: var(--c-light-gray); -} diff --git a/components/src/hardware-sim/Labware/LabwareRender.tsx b/components/src/hardware-sim/Labware/LabwareRender.tsx index ba515c73b94..b3133fe1813 100644 --- a/components/src/hardware-sim/Labware/LabwareRender.tsx +++ b/components/src/hardware-sim/Labware/LabwareRender.tsx @@ -6,8 +6,11 @@ import { StrokedWells, StaticLabware, } from './labwareInternals' -import styles from './LabwareRender.css' - +import { + LabwareAdapter, + LabwareAdapterLoadName, + labwareAdapterLoadNames, +} from './LabwareAdapter' import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { HighlightedWellLabels, @@ -17,7 +20,6 @@ import type { WellGroup, } from './labwareInternals/types' import type { CSSProperties } from 'styled-components' - export const WELL_LABEL_OPTIONS = { SHOW_LABEL_INSIDE: 'SHOW_LABEL_INSIDE', SHOW_LABEL_OUTSIDE: 'SHOW_LABEL_OUTSIDE', @@ -28,6 +30,8 @@ export type WellLabelOption = keyof typeof WELL_LABEL_OPTIONS export interface LabwareRenderProps { /** Labware definition to render */ definition: LabwareDefinition2 + /** Opional Prop for labware on heater shakers sitting on right side of the deck */ + shouldRotateAdapterOrientation?: boolean /** option to show well labels inside or outside of labware outline */ wellLabelOption?: WellLabelOption /** wells to highlight */ @@ -46,23 +50,45 @@ export interface LabwareRenderProps { wellStroke?: WellStroke /** CSS color to stroke the labware outline */ labwareStroke?: CSSProperties['stroke'] + /** adds thicker blue border with blur to labware */ + highlight?: boolean /** Optional callback, called with WellMouseEvent args onMouseEnter */ onMouseEnterWell?: (e: WellMouseEvent) => unknown /** Optional callback, called with WellMouseEvent args onMouseLeave */ onMouseLeaveWell?: (e: WellMouseEvent) => unknown - /** Special class which, together with 'data-wellname' on the well elements, - allows drag-to-select behavior */ - selectableWellClass?: string gRef?: React.RefObject - // adds blue border with drop shadow to labware - hover?: boolean onLabwareClick?: () => void - highlightLabware?: boolean } export const LabwareRender = (props: LabwareRenderProps): JSX.Element => { - const { gRef } = props - const cornerOffsetFromSlot = props.definition.cornerOffsetFromSlot + const { gRef, definition } = props + + const cornerOffsetFromSlot = definition.cornerOffsetFromSlot + const labwareLoadName = definition.parameters.loadName + + if (labwareAdapterLoadNames.includes(labwareLoadName)) { + const { shouldRotateAdapterOrientation } = props + const { xDimension, yDimension } = props.definition.dimensions + + return ( + + + + + + ) + } return ( { definition={props.definition} onMouseEnterWell={props.onMouseEnterWell} onMouseLeaveWell={props.onMouseLeaveWell} - selectableWellClass={props.selectableWellClass} - hover={props.hover} onLabwareClick={props.onLabwareClick} - highlightLabware={props.highlightLabware} + highlight={props.highlight} /> - {props.wellStroke && ( + {props.wellStroke != null ? ( - )} - {props.wellFill && ( + ) : null} + {props.wellFill != null ? ( - )} + ) : null} {props.disabledWells != null ? props.disabledWells.map((well, index) => ( )) : null} - {props.highlightedWells && ( + {props.highlightedWells != null ? ( - )} - {props.selectedWells && ( + ) : null} + {props.selectedWells != null ? ( - )} - {props.missingTips && ( + ) : null} + {props.missingTips != null ? ( - )} - {props.wellLabelOption && - props.definition.metadata.displayCategory !== 'adapter' && ( - - )} + ) : null} + {props.wellLabelOption != null && + props.definition.metadata.displayCategory !== 'adapter' ? ( + + ) : null} ) } diff --git a/components/src/hardware-sim/Labware/labwareInternals/FilledWells.tsx b/components/src/hardware-sim/Labware/labwareInternals/FilledWells.tsx index 506b5986389..8db868edb9f 100644 --- a/components/src/hardware-sim/Labware/labwareInternals/FilledWells.tsx +++ b/components/src/hardware-sim/Labware/labwareInternals/FilledWells.tsx @@ -1,5 +1,6 @@ import * as React from 'react' import map from 'lodash/map' +import { COLORS } from '../../../helix-design-system' import { Well } from './Well' import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { CSSProperties } from 'styled-components' @@ -22,6 +23,8 @@ function FilledWellsComponent(props: FilledWellsProps): JSX.Element { wellName={wellName} well={definition.wells[wellName]} fill={color} + stroke={COLORS.black90} + strokeWidth="0.6" /> ) } diff --git a/components/src/hardware-sim/Labware/labwareInternals/LabwareOutline.css b/components/src/hardware-sim/Labware/labwareInternals/LabwareOutline.css deleted file mode 100644 index b1170cbe7d8..00000000000 --- a/components/src/hardware-sim/Labware/labwareInternals/LabwareOutline.css +++ /dev/null @@ -1,21 +0,0 @@ -@import '../../..'; - -.labware_outline { - fill: var(--c-white); - stroke: var(--c-black); -} - -.labware_outline_highlight { - fill: var(--c-white); - stroke: var(--c-blue-enabled); - stroke-width: 3.57; -} - -.tiprack_outline { - fill: var(--c-plate-bg); - stroke: var(--c-charcoal); -} - -.hover_outline { - stroke: #006cfa; -} diff --git a/components/src/hardware-sim/Labware/labwareInternals/LabwareOutline.tsx b/components/src/hardware-sim/Labware/labwareInternals/LabwareOutline.tsx index 307de80c595..ffd6e85ce55 100644 --- a/components/src/hardware-sim/Labware/labwareInternals/LabwareOutline.tsx +++ b/components/src/hardware-sim/Labware/labwareInternals/LabwareOutline.tsx @@ -1,19 +1,23 @@ import * as React from 'react' -import cx from 'classnames' import { SLOT_RENDER_WIDTH, SLOT_RENDER_HEIGHT } from '@opentrons/shared-data' -import styles from './LabwareOutline.css' +import { COLORS } from '../../../helix-design-system' import type { CSSProperties } from 'styled-components' import type { LabwareDefinition2 } from '@opentrons/shared-data' export interface LabwareOutlineProps { + /** Labware definition to outline */ definition?: LabwareDefinition2 + /** x dimension in mm of this labware, used if definition doesn't supply dimensions, defaults to 127.76 */ width?: number + /** y dimension in mm of this labware, used if definition doesn't supply dimensions, defaults to 85.48 */ height?: number + /** if this labware is a tip rack, darken background and lighten borderx dimension in mm of this labware, used if definition doesn't supply dimensions, defaults to false */ isTiprack?: boolean - hover?: boolean - stroke?: CSSProperties['stroke'] + /** adds thicker blue border with blur to labware, defaults to false */ highlight?: boolean + /** [legacy] override the border color */ + stroke?: CSSProperties['stroke'] } const OUTLINE_THICKNESS_MM = 1 @@ -23,32 +27,73 @@ export function LabwareOutline(props: LabwareOutlineProps): JSX.Element { definition, width = SLOT_RENDER_WIDTH, height = SLOT_RENDER_HEIGHT, - isTiprack, + isTiprack = false, + highlight = false, stroke, - hover, - highlight, } = props const { parameters = { isTiprack }, dimensions = { xDimension: width, yDimension: height }, - } = definition || {} + } = definition ?? {} + const backgroundFill = parameters.isTiprack ? '#CCCCCC' : COLORS.white return ( <> - + {highlight ? ( + <> + + + + + + + + + ) : ( + + )} ) } + +interface LabwareBorderProps extends React.SVGProps { + borderThickness: number + xDimension: number + yDimension: number +} +function LabwareBorder(props: LabwareBorderProps): JSX.Element { + const { borderThickness, xDimension, yDimension, ...svgProps } = props + return ( + + ) +} diff --git a/components/src/hardware-sim/Labware/labwareInternals/StaticLabware.css b/components/src/hardware-sim/Labware/labwareInternals/StaticLabware.css deleted file mode 100644 index f13a508f142..00000000000 --- a/components/src/hardware-sim/Labware/labwareInternals/StaticLabware.css +++ /dev/null @@ -1,23 +0,0 @@ -@import '../../..'; - -.labware_detail_group { - fill: none; - stroke: var(--c-black); - stroke-width: 1; -} - -.labware_outline { - fill: var(--c-white); - stroke: var(--c-black); -} - -.tiprack_outline { - fill: var(--c-plate-bg); - stroke: var(--c-charcoal); -} - -.tip { - fill: var(--c-white); - stroke: var(--c-near-black); - stroke-width: 0.6; -} diff --git a/components/src/hardware-sim/Labware/labwareInternals/StaticLabware.tsx b/components/src/hardware-sim/Labware/labwareInternals/StaticLabware.tsx index 0e7994969a6..3f15b3a19c4 100644 --- a/components/src/hardware-sim/Labware/labwareInternals/StaticLabware.tsx +++ b/components/src/hardware-sim/Labware/labwareInternals/StaticLabware.tsx @@ -1,53 +1,63 @@ // Render labware definition to SVG. XY is in robot coordinates. -import assert from 'assert' import * as React from 'react' +import styled from 'styled-components' import flatMap from 'lodash/flatMap' import { LabwareOutline } from './LabwareOutline' import { Well } from './Well' -import styles from './StaticLabware.css' import type { LabwareDefinition2, LabwareWell } from '@opentrons/shared-data' import type { WellMouseEvent } from './types' +import { STYLE_BY_WELL_CONTENTS } from './StyledWells' +import { COLORS } from '../../../helix-design-system' export interface StaticLabwareProps { + /** Labware definition to render */ definition: LabwareDefinition2 - selectableWellClass?: string + /** Add thicker blurred blue border to labware, defaults to false */ + highlight?: boolean + /** Optional callback to be executed when entire labware element is clicked */ + onLabwareClick?: () => void + /** Optional callback to be executed when mouse enters a well element */ onMouseEnterWell?: (e: WellMouseEvent) => unknown + /** Optional callback to be executed when mouse leaves a well element */ onMouseLeaveWell?: (e: WellMouseEvent) => unknown - hover?: boolean - onLabwareClick?: () => void - highlightLabware?: boolean } const TipDecoration = React.memo(function TipDecoration(props: { well: LabwareWell }) { const { well } = props - // @ts-expect-error(mc, 2021-04-27): refine well type before accessing `diameter` - if (well.diameter) { - // @ts-expect-error(mc, 2021-04-27): refine well type before accessing `diameter` + if (well.shape === 'circular') { const radius = well.diameter / 2 return ( - + ) } - assert(false, `TipDecoration expects a circular well with a diameter`) return null }) +const LabwareDetailGroup = styled.g` + fill: none; + stroke: ${COLORS.black90}; + stroke-width: 1; +` + export function StaticLabwareComponent(props: StaticLabwareProps): JSX.Element { const { isTiprack } = props.definition.parameters - return ( - + - + {flatMap( props.definition.ordering, @@ -56,19 +66,18 @@ export function StaticLabwareComponent(props: StaticLabwareProps): JSX.Element { return ( - {/* Tip inner circle decoration. - TODO: Ian 2019-05-03 SOMEDAY, use WellDecoration and include decorations in the def */} - {isTiprack && ( + {isTiprack ? ( - )} + ) : null} ) }) diff --git a/components/src/hardware-sim/Labware/labwareInternals/StrokedWells.tsx b/components/src/hardware-sim/Labware/labwareInternals/StrokedWells.tsx index 25f25863cc4..2db4d61da33 100644 --- a/components/src/hardware-sim/Labware/labwareInternals/StrokedWells.tsx +++ b/components/src/hardware-sim/Labware/labwareInternals/StrokedWells.tsx @@ -3,6 +3,7 @@ import map from 'lodash/map' import { Well } from './Well' import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { CSSProperties } from 'styled-components' +import { COLORS } from '../../../helix-design-system' export interface StrokedWellProps { definition: LabwareDefinition2 @@ -22,6 +23,8 @@ export function StrokedWellsComponent(props: StrokedWellProps): JSX.Element { wellName={wellName} well={definition.wells[wellName]} stroke={color} + fill={COLORS.white} + strokeWidth="0.6" /> ) } diff --git a/components/src/hardware-sim/Labware/labwareInternals/StyledWells.tsx b/components/src/hardware-sim/Labware/labwareInternals/StyledWells.tsx index d986adfcaf7..c19b29f4a52 100644 --- a/components/src/hardware-sim/Labware/labwareInternals/StyledWells.tsx +++ b/components/src/hardware-sim/Labware/labwareInternals/StyledWells.tsx @@ -1,16 +1,63 @@ import * as React from 'react' import { Well } from './Well' +import { COLORS } from '../../../helix-design-system' import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { WellGroup } from './types' +type WellContents = + | 'tipPresent' + | 'tipMissing' + | 'defaultWell' + | 'disabledWell' + | 'highlightedWell' + | 'selectedWell' export interface StyledWellProps { - className: string + wellContents: WellContents definition: LabwareDefinition2 wells: WellGroup } +export const STYLE_BY_WELL_CONTENTS: { + [wellContents in WellContents]: { + stroke: React.CSSProperties['stroke'] + fill: React.CSSProperties['fill'] + strokeWidth: React.CSSProperties['strokeWidth'] + } +} = { + highlightedWell: { + stroke: COLORS.blue50, + fill: `${COLORS.blue50}33`, // 20% opacity + strokeWidth: 1, + }, + disabledWell: { + stroke: '#C6C6C6', // LEGACY --light-grey-hover + fill: '#EDEDEDCC', // LEGACY --lightest-gray + 80% opacity + strokeWidth: 0.6, + }, + selectedWell: { + stroke: COLORS.blue50, + fill: COLORS.transparent, + strokeWidth: 1, + }, + tipMissing: { + stroke: '#A4A4A4', // LEGACY --c-near-black + fill: '#E5E2E2', // LEGACY --c-light-gray + strokeWidth: 0.6, + }, + tipPresent: { + fill: COLORS.white, + stroke: '#A4A4A4', // LEGACY --c-near-black + strokeWidth: 0.6, + }, + defaultWell: { + fill: COLORS.white, + stroke: COLORS.black90, + strokeWidth: 0.6, + }, +} + function StyledWellsComponent(props: StyledWellProps): JSX.Element { - const { className, definition, wells } = props + const { definition, wells, wellContents } = props return ( <> {Object.keys(wells).map((wellName: string) => ( @@ -18,7 +65,7 @@ function StyledWellsComponent(props: StyledWellProps): JSX.Element { key={wellName} wellName={wellName} well={definition.wells[wellName]} - className={className} + {...STYLE_BY_WELL_CONTENTS[wellContents]} /> ))} diff --git a/components/src/hardware-sim/Labware/labwareInternals/Well.css b/components/src/hardware-sim/Labware/labwareInternals/Well.css deleted file mode 100644 index 0b676ad5f72..00000000000 --- a/components/src/hardware-sim/Labware/labwareInternals/Well.css +++ /dev/null @@ -1,13 +0,0 @@ -@import '../../..'; - -.default_well { - fill: var(--c-white); - stroke: var(--c-black); - - /* - * TODO(mc, 2019-03-28): align this value with components library; 0.4 looks - * a little too small on retina at labware library sizes and especially too - * small in the thumbnails - */ - stroke-width: 0.6; -} diff --git a/components/src/hardware-sim/Labware/labwareInternals/Well.tsx b/components/src/hardware-sim/Labware/labwareInternals/Well.tsx index 0c8d6d876cb..12c9182465c 100644 --- a/components/src/hardware-sim/Labware/labwareInternals/Well.tsx +++ b/components/src/hardware-sim/Labware/labwareInternals/Well.tsx @@ -1,72 +1,53 @@ -import assert from 'assert' import * as React from 'react' -import cx from 'classnames' -import styles from './Well.css' + +import { COLORS } from '../../../helix-design-system' import type { LabwareWell } from '@opentrons/shared-data' -import type { CSSProperties } from 'styled-components' import type { WellMouseEvent } from './types' +import type { StyleProps } from '../../../primitives' -export interface WellProps { - /** if included, overrides the default classname */ - className?: string | null | undefined - /** fill inline style */ - fill?: CSSProperties['fill'] - /** stroke inline style */ - stroke?: CSSProperties['stroke'] +export const INTERACTIVE_WELL_DATA_ATTRIBUTE = 'data-wellname' +export interface WellProps extends StyleProps { /** Well Name (eg 'A1') */ wellName: string /** well object from labware definition */ well: LabwareWell - /** special class used for drag-to-select functionality. Should not be used for styling */ - selectableWellClass?: string + stroke: React.CSSProperties['stroke'] + strokeWidth: React.CSSProperties['strokeWidth'] + fill: React.CSSProperties['fill'] /** Optional callback, called with WellMouseEvent args onMouseOver */ onMouseEnterWell?: (e: WellMouseEvent) => unknown onMouseLeaveWell?: (e: WellMouseEvent) => unknown } -export function WellComponent(props: WellProps): JSX.Element | null { +export function WellComponent(props: WellProps): JSX.Element { const { well, wellName, - fill, - stroke, + stroke = COLORS.black90, + strokeWidth = 1, + fill = COLORS.white, onMouseEnterWell, onMouseLeaveWell, } = props - assert(well, `expected 'well' prop for well "${wellName}"`) - if (!well) return null const { x, y } = well - const baseClassName = props.className || styles.default_well - const className = cx(baseClassName, props.selectableWellClass) - - const _mouseInteractionProps = { - className, - style: { fill, stroke }, - 'data-wellname': wellName, - onMouseEnter: onMouseEnterWell - ? ((event => - onMouseEnterWell({ wellName, event })) as React.MouseEventHandler) - : undefined, - onMouseLeave: onMouseLeaveWell - ? ((event => - onMouseLeaveWell({ wellName, event })) as React.MouseEventHandler) - : undefined, - } - const _noMouseProps = { - className: baseClassName, - style: { - fill, - stroke, - pointerEvents: 'none' as CSSProperties['pointerEvents'], - }, + const isInteractive = onMouseEnterWell != null || onMouseLeaveWell != null + const pointerEvents: React.CSSProperties['pointerEvents'] = isInteractive + ? 'auto' + : 'none' + const commonProps = { + [INTERACTIVE_WELL_DATA_ATTRIBUTE]: isInteractive ? wellName : undefined, + onMouseEnter: + onMouseEnterWell != null + ? (event: React.MouseEvent) => onMouseEnterWell({ wellName, event }) + : undefined, + onMouseLeave: + onMouseLeaveWell != null + ? (event: React.MouseEvent) => onMouseLeaveWell({ wellName, event }) + : undefined, + style: { pointerEvents, stroke, strokeWidth, fill }, } - // exclude all mouse interactivity props if no event handler props provided - const commonProps = - onMouseEnterWell || onMouseLeaveWell - ? _mouseInteractionProps - : _noMouseProps if (well.shape === 'circular') { const { diameter } = well @@ -74,21 +55,16 @@ export function WellComponent(props: WellProps): JSX.Element | null { return } - if (well.shape === 'rectangular') { - const { xDimension, yDimension } = well - return ( - - ) - } - - console.warn('Invalid well', well) - return null + const { xDimension, yDimension } = well + return ( + + ) } export const Well: React.MemoExoticComponent = React.memo( diff --git a/components/src/hardware-sim/Labware/labwareInternals/WellLabels.css b/components/src/hardware-sim/Labware/labwareInternals/WellLabels.css deleted file mode 100644 index 4ce1637e4e6..00000000000 --- a/components/src/hardware-sim/Labware/labwareInternals/WellLabels.css +++ /dev/null @@ -1,11 +0,0 @@ -@import '@opentrons/components'; - -.label_text { - color: var(--c-font-dark); - font-size: var(--fs-micro); - text-anchor: middle; -} - -.letter_column { - dominant-baseline: middle; -} diff --git a/components/src/hardware-sim/Labware/labwareInternals/WellLabels.tsx b/components/src/hardware-sim/Labware/labwareInternals/WellLabels.tsx index 7f50feef8d3..f3f044f04bd 100644 --- a/components/src/hardware-sim/Labware/labwareInternals/WellLabels.tsx +++ b/components/src/hardware-sim/Labware/labwareInternals/WellLabels.tsx @@ -1,9 +1,8 @@ import * as React from 'react' -import cx from 'classnames' import { C_BLACK, C_BLUE } from '../../../styles/colors' import { RobotCoordsText } from '../../Deck' import { WellLabelOption, WELL_LABEL_OPTIONS } from '../LabwareRender' -import styles from './WellLabels.css' +import { COLORS } from '../../../helix-design-system' import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { HighlightedWellLabels } from './types' @@ -54,23 +53,29 @@ const Labels = (props: { ? 'WellsLabels_show_inside' : 'WellsLabels_show_outside' } - x={props.isLetterColumn ? LETTER_COLUMN_X : well.x} + x={props.isLetterColumn === true ? LETTER_COLUMN_X : well.x} y={ - props.isLetterColumn + props.isLetterColumn === true ? well.y : props.definition.dimensions.yDimension - NUMBER_COLUMN_Y_FROM_TOP } - className={cx(styles.label_text, { - [styles.letter_column]: props.isLetterColumn, - })} + style={{ + color: COLORS.grey50, // LEGACY --c-font-dark + fontSize: '0.2rem', // LEGACY --fs-micro + textAnchor: 'middle', + dominantBaseline: + props.isLetterColumn === true ? 'middle' : 'auto', + }} fill={ - highlightedWellLabels?.wells.includes(wellName) + highlightedWellLabels?.wells.includes(wellName) ?? false ? highlightColor : fillColor } > - {(props.isLetterColumn ? /[A-Z]+/g : /\d+/g).exec(wellName)} + {(props.isLetterColumn === true ? /[A-Z]+/g : /\d+/g).exec( + wellName + )} ) })} @@ -86,8 +91,7 @@ export function WellLabelsComponent(props: WellLabelsProps): JSX.Element { wellLabelColor, } = props const letterColumn = definition.ordering[0] ?? [] - // TODO(bc, 2021-03-08): replace types here with real ones once shared data is in TS - const numberRow = definition.ordering.map((wellCol: any[]) => wellCol[0]) + const numberRow = definition.ordering.map(wellCol => wellCol[0]) return ( diff --git a/components/src/hardware-sim/Module/HeaterShaker.tsx b/components/src/hardware-sim/Module/HeaterShaker.tsx index a2779c045ee..0cd3d2e3114 100644 --- a/components/src/hardware-sim/Module/HeaterShaker.tsx +++ b/components/src/hardware-sim/Module/HeaterShaker.tsx @@ -1,10 +1,6 @@ import * as React from 'react' -import { getModuleDef2, HEATERSHAKER_MODULE_V1 } from '@opentrons/shared-data' - -import { COLORS } from '../../ui-style-constants' -import { RobotCoordsForeignDiv } from '../Deck' -import { ModuleFromDef } from './ModuleFromDef' +import { COLORS } from '../../helix-design-system' export interface HeaterShakerVizProps { targetTemp: number | null @@ -12,29 +8,78 @@ export interface HeaterShakerVizProps { export function HeaterShaker(props: HeaterShakerVizProps): JSX.Element { const { targetTemp } = props - const def = getModuleDef2(HEATERSHAKER_MODULE_V1) - let ledLightOverlay: JSX.Element | null = null - if (targetTemp != null) { - ledLightOverlay = ( - - ) - } + let ledLightColor: string = COLORS.white + if (targetTemp != null) ledLightColor = COLORS.red30 return ( - <> - - {ledLightOverlay} - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) } diff --git a/components/src/hardware-sim/Module/MagneticBlock.stories.tsx b/components/src/hardware-sim/Module/MagneticBlock.stories.tsx deleted file mode 100644 index cc0801207ae..00000000000 --- a/components/src/hardware-sim/Module/MagneticBlock.stories.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import * as React from 'react' -import { RobotWorkSpace } from '../Deck/RobotWorkSpace' -import { getDeckDefinitions } from '../Deck/getDeckDefinitions' - -import { Module } from './' - -import type { RobotWorkSpaceRenderProps } from '../Deck' -import type { Story, Meta } from '@storybook/react' -import { MAGNETIC_BLOCK_V1, getModuleDef2 } from '@opentrons/shared-data' - -const slots = ['1', '3', '4', '6', '7', '9', '10'] - -export default { - title: 'Library/Molecules/Simulation/Modules/Magnetic Block', -} as Meta - -const Template: Story<{ slot: string; layerBlocklist: string[] }> = args => { - return ( - - {({ deckSlotsById }: RobotWorkSpaceRenderProps) => { - const slot = deckSlotsById[args.slot] - return ( - - ) - }} - - ) -} -export const MagneticBlock = Template.bind({}) -MagneticBlock.argTypes = { - slot: { - control: { - type: 'select', - options: slots, - }, - defaultValue: slots[slots.length - 1], - }, - layerBlocklist: { - control: { - type: 'check', - }, - defaultValue: '', - options: getModuleDef2(MAGNETIC_BLOCK_V1) - .twoDimensionalRendering.children.map(({ attributes }) => attributes.id) - .filter(id => id != null), - }, -} diff --git a/components/src/hardware-sim/Module/MagneticBlock.tsx b/components/src/hardware-sim/Module/MagneticBlock.tsx new file mode 100644 index 00000000000..db856e174f2 --- /dev/null +++ b/components/src/hardware-sim/Module/MagneticBlock.tsx @@ -0,0 +1,50 @@ +import * as React from 'react' +import { COLORS } from '../../helix-design-system' + +export function MagneticBlock(): JSX.Element { + return ( + + + + + + + + + + + + ) +} diff --git a/components/src/hardware-sim/Module/MagneticModule.stories.tsx b/components/src/hardware-sim/Module/MagneticModule.stories.tsx deleted file mode 100644 index 50b2678d182..00000000000 --- a/components/src/hardware-sim/Module/MagneticModule.stories.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import * as React from 'react' -import { RobotWorkSpace } from '../Deck/RobotWorkSpace' -import { getDeckDefinitions } from '../Deck/getDeckDefinitions' - -import { Module } from './' - -import type { RobotWorkSpaceRenderProps } from '../Deck' -import type { Story, Meta } from '@storybook/react' -import { MAGNETIC_MODULE_V2, getModuleDef2 } from '@opentrons/shared-data' - -const slots = ['1', '3', '4', '6', '7', '9', '10'] - -export default { - title: 'Library/Molecules/Simulation/Modules/Magnetic Module', -} as Meta - -const Template: Story<{ slot: string }> = args => { - return ( - - {({ deckSlotsById }: RobotWorkSpaceRenderProps) => { - const slot = deckSlotsById[args.slot] - return ( - - ) - }} - - ) -} -export const MagneticModule = Template.bind({}) -MagneticModule.argTypes = { - slot: { - control: { - type: 'select', - options: slots, - }, - defaultValue: slots[slots.length - 1], - }, -} diff --git a/components/src/hardware-sim/Module/MagneticModule.tsx b/components/src/hardware-sim/Module/MagneticModule.tsx new file mode 100644 index 00000000000..512db86e9b6 --- /dev/null +++ b/components/src/hardware-sim/Module/MagneticModule.tsx @@ -0,0 +1,53 @@ +import * as React from 'react' + +export function MagneticModule(): JSX.Element { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} diff --git a/components/src/hardware-sim/Module/Module.stories.tsx b/components/src/hardware-sim/Module/Module.stories.tsx index d2a46dff8bb..f5e07259e55 100644 --- a/components/src/hardware-sim/Module/Module.stories.tsx +++ b/components/src/hardware-sim/Module/Module.stories.tsx @@ -5,25 +5,20 @@ import { MAGNETIC_MODULE_V1, MAGNETIC_MODULE_V2, ModuleModel, - OT2_STANDARD_DECKID, - OT3_STANDARD_DECKID, TEMPERATURE_MODULE_V1, TEMPERATURE_MODULE_V2, THERMOCYCLER_MODULE_V1, THERMOCYCLER_MODULE_V2, + HEATERSHAKER_MODULE_V1, + MAGNETIC_BLOCK_V1, } from '@opentrons/shared-data' import fixture_96_plate from '@opentrons/shared-data/labware/fixtures/2/fixture_96_plate.json' -import { RobotWorkSpace } from '../Deck/RobotWorkSpace' -import { getDeckDefinitions } from '../Deck/getDeckDefinitions' - import { LabwareRender } from '../Labware' +import { RobotCoordinateSpace } from '../RobotCoordinateSpace' import { Module as ModuleComponent } from './' -import type { RobotWorkSpaceRenderProps } from '../Deck' import type { Story, Meta } from '@storybook/react' -const slots = ['1', '3', '4', '6', '7', '9', '10'] - const moduleModels: ModuleModel[] = [ TEMPERATURE_MODULE_V2, TEMPERATURE_MODULE_V1, @@ -31,51 +26,38 @@ const moduleModels: ModuleModel[] = [ THERMOCYCLER_MODULE_V2, MAGNETIC_MODULE_V1, MAGNETIC_MODULE_V2, + HEATERSHAKER_MODULE_V1, + MAGNETIC_BLOCK_V1, ] export default { - title: 'Library/Molecules/Simulation/Modules/Module', + title: 'Library/Molecules/Simulation/Module', } as Meta const Template: Story<{ - slot: string model: ModuleModel orientation: 'left' | 'right' hasLabware: boolean - deckType: typeof OT2_STANDARD_DECKID | typeof OT3_STANDARD_DECKID + innerProps: {} }> = args => { return ( - - {({ deckSlotsById }: RobotWorkSpaceRenderProps) => { - const slot = deckSlotsById[args.slot] - return ( - - {args.hasLabware ? ( - - ) : null} - - ) - }} - + + + {args.hasLabware ? ( + + ) : null} + + ) } export const Module = Template.bind({}) Module.argTypes = { - slot: { - control: { - type: 'select', - options: slots, - }, - defaultValue: slots[slots.length - 1], - }, model: { control: { type: 'select', @@ -96,11 +78,15 @@ Module.argTypes = { }, defaultValue: false, }, - deckType: { + innerProps: { control: { - type: 'select', - options: [OT2_STANDARD_DECKID, OT3_STANDARD_DECKID], + type: 'object', + }, + defaultValue: { + lidMotorState: 'open', + blockTargetTemp: 90, + targetTemperature: 4, + targetTemp: 40, }, - defaultValue: 'left', }, } diff --git a/components/src/hardware-sim/Module/ModuleFromDef.tsx b/components/src/hardware-sim/Module/ModuleFromDef.tsx deleted file mode 100644 index e2eb78d0457..00000000000 --- a/components/src/hardware-sim/Module/ModuleFromDef.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import * as React from 'react' -import parseHtml from 'html-react-parser' -import { stringify } from 'svgson' - -import { ModuleDefinition } from '@opentrons/shared-data' - -export interface ModuleFromDataProps { - def: ModuleDefinition - layerBlocklist?: string[] - standaloneSVG?: boolean // default is false (wrapping tag is ), if true wrapping tag will be -} - -export function ModuleFromDef(props: ModuleFromDataProps): JSX.Element { - const { def, layerBlocklist = [], standaloneSVG = false } = props - - const layerGroupNodes = def.twoDimensionalRendering.children.filter( - g => !layerBlocklist.includes(g.attributes?.id) - ) - const groupNodeWrapper = { - name: 'g', - type: 'element', - value: '', - attributes: { id: 'moduleVisualization' }, - children: layerGroupNodes, - } - const filteredSVGWrapper = { - ...def.twoDimensionalRendering, - children: layerGroupNodes, - } - - return ( - - {parseHtml( - stringify(standaloneSVG ? filteredSVGWrapper : groupNodeWrapper, { - selfClose: false, - }) - )} - - ) -} diff --git a/components/src/hardware-sim/Module/Temperature.tsx b/components/src/hardware-sim/Module/Temperature.tsx index 5f977459a69..b6d3667c9e7 100644 --- a/components/src/hardware-sim/Module/Temperature.tsx +++ b/components/src/hardware-sim/Module/Temperature.tsx @@ -1,10 +1,5 @@ import * as React from 'react' - -import { getModuleDef2, TEMPERATURE_MODULE_V1 } from '@opentrons/shared-data' - -import { COLORS } from '../../ui-style-constants' -import { RobotCoordsForeignDiv } from '../Deck' -import { ModuleFromDef } from './ModuleFromDef' +import { COLORS } from '../../helix-design-system' export interface TemperatureVizProps { targetTemperature: number | null @@ -14,32 +9,47 @@ const ROOM_TEMPERATURE_C = 23 export function Temperature(props: TemperatureVizProps): JSX.Element { const { targetTemperature } = props - const def = getModuleDef2(TEMPERATURE_MODULE_V1) - let ledLightOverlay: JSX.Element | null = null + let ledLightColor = COLORS.transparent if (targetTemperature != null) { - ledLightOverlay = ( - - ) + ledLightColor = + targetTemperature <= ROOM_TEMPERATURE_C ? COLORS.blue35 : COLORS.red30 } return ( <> - - {ledLightOverlay} + + + + + + + + + + + + + + + + + + + + + ) } diff --git a/components/src/hardware-sim/Module/TemperatureModule.stories.tsx b/components/src/hardware-sim/Module/TemperatureModule.stories.tsx deleted file mode 100644 index 79a20480037..00000000000 --- a/components/src/hardware-sim/Module/TemperatureModule.stories.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import * as React from 'react' -import { RobotWorkSpace } from '../Deck/RobotWorkSpace' -import { getDeckDefinitions } from '../Deck/getDeckDefinitions' - -import { Module } from './' - -import type { RobotWorkSpaceRenderProps } from '../Deck' -import type { Story, Meta } from '@storybook/react' -import { TEMPERATURE_MODULE_V2, getModuleDef2 } from '@opentrons/shared-data' - -const slots = ['1', '3', '4', '6', '7', '9', '10'] - -export default { - title: 'Library/Molecules/Simulation/Modules/Temperature Module', -} as Meta - -const Template: Story<{ slot: string; standaloneSVG: boolean }> = args => { - return ( - - {({ deckSlotsById }: RobotWorkSpaceRenderProps) => { - const slot = deckSlotsById[args.slot] - return ( - - ) - }} - - ) -} -export const TemperatureModule = Template.bind({}) -TemperatureModule.argTypes = { - slot: { - control: { - type: 'select', - options: slots, - }, - defaultValue: slots[slots.length - 1], - }, - standaloneSVG: { - control: { - type: 'boolean', - }, - defaultValue: false, - }, -} diff --git a/components/src/hardware-sim/Module/Thermocycler.stories.tsx b/components/src/hardware-sim/Module/Thermocycler.stories.tsx deleted file mode 100644 index 4bee5242090..00000000000 --- a/components/src/hardware-sim/Module/Thermocycler.stories.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import * as React from 'react' -import { - THERMOCYCLER_MODULE_MODELS, - getModuleDef2, -} from '@opentrons/shared-data' -import { RobotWorkSpace } from '../Deck/RobotWorkSpace' -import { getDeckDefinitions } from '../Deck/getDeckDefinitions' - -import { Module } from './' - -import type { ThermocyclerVizProps } from './Thermocycler' -import type { RobotWorkSpaceRenderProps } from '../Deck/RobotWorkSpace' -import type { Story, Meta } from '@storybook/react' - -const lidMotorStates = ['open', 'closed', 'unknown'] - -export default { - title: 'Library/Molecules/Simulation/Modules/Thermocycler', -} as Meta - -const Template: Story = args => { - return ( - - {({ deckSlotsById }: RobotWorkSpaceRenderProps) => { - const slot = deckSlotsById['7'] - const [x, y] = slot.position - return ( - - ) - }} - - ) -} -export const Thermocycler = Template.bind({}) -Thermocycler.argTypes = { - lidMotorState: { - control: { - type: 'select', - options: lidMotorStates, - }, - defaultValue: lidMotorStates[0], - }, - model: { - control: { - type: 'select', - options: THERMOCYCLER_MODULE_MODELS, - }, - defaultValue: THERMOCYCLER_MODULE_MODELS[0], - }, -} diff --git a/components/src/hardware-sim/Module/Thermocycler.tsx b/components/src/hardware-sim/Module/Thermocycler.tsx deleted file mode 100644 index 88524446840..00000000000 --- a/components/src/hardware-sim/Module/Thermocycler.tsx +++ /dev/null @@ -1,105 +0,0 @@ -// TODO: BC 2021-08-03 we should migrate to only using the ModuleFromData -// component; once legacy Module viz is removed, we should rename it Module - -import * as React from 'react' - -import { - ModuleDefinition, - THERMOCYCLER_MODULE_V1, - ThermocyclerModuleModel, - getModuleDef2, -} from '@opentrons/shared-data' - -import { C_MED_LIGHT_GRAY } from '../../styles' -import { COLORS, BORDERS } from '../../ui-style-constants' - -import { RobotCoordsForeignDiv } from '../Deck' -import { ModuleFromDef } from './ModuleFromDef' - -const ROOM_TEMPERATURE_C = 23 // value taken from TC firmware -export interface ThermocyclerVizProps { - lidMotorState?: 'open' | 'closed' | 'unknown' - blockTargetTemp?: number | null - model: ThermocyclerModuleModel -} - -const getLayerBlockList = ( - def: ModuleDefinition, - lidMotorState: ThermocyclerVizProps['lidMotorState'] -): string[] => { - if (def.model === THERMOCYCLER_MODULE_V1) { - return def.twoDimensionalRendering.children.reduce( - (layerBlockList, layer) => { - const { id } = layer.attributes - if (id?.startsWith(lidMotorState === 'open' ? 'closed' : 'open')) { - return [...layerBlockList, id] - } - return layerBlockList - }, - [] - ) - } - - return def.twoDimensionalRendering.children.reduce( - (layerBlockList, layer) => { - const { id } = layer.attributes - if (id != null && lidMotorState === 'closed' && id === 'open') { - return [...layerBlockList, id] - } - return layerBlockList - }, - [] - ) -} - -export function Thermocycler(props: ThermocyclerVizProps): JSX.Element { - const { lidMotorState, blockTargetTemp, model } = props - const def = getModuleDef2(model) - if (lidMotorState === 'unknown') { - // just a rectangle if we don't know the state of the lid - return ( - - ) - } - - let ledLightOverlay = null - if (blockTargetTemp != null) { - ledLightOverlay = ( - - ) - } - - return ( - <> - - {ledLightOverlay} - - ) -} diff --git a/components/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN1.tsx b/components/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN1.tsx new file mode 100644 index 00000000000..8b2282cde38 --- /dev/null +++ b/components/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN1.tsx @@ -0,0 +1,249 @@ +import * as React from 'react' +import { COLORS } from '../../../helix-design-system' +interface ThermocyclerGEN1Props { + lidMotorState: 'open' | 'closed' + ledLightColor: string +} + +export function ThermocyclerGEN1(props: ThermocyclerGEN1Props): JSX.Element { + return ( + + {props.lidMotorState === 'open' ? ( + + ) : ( + + )} + + + + + + + + + + + ) +} + +function ClosedThermocyclerGEN1Layers(): JSX.Element { + return ( + + + + + + + + + + + + + + + + + + + + ) +} + +function OpenThermocyclerGEN1Layers(): JSX.Element { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} diff --git a/components/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN2.tsx b/components/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN2.tsx new file mode 100644 index 00000000000..5218428ee09 --- /dev/null +++ b/components/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN2.tsx @@ -0,0 +1,288 @@ +import * as React from 'react' + +import { COLORS } from '../../../helix-design-system' + +interface ThermocyclerGEN2Props { + lidMotorState: 'open' | 'closed' + ledLightColor: string +} + +export function ThermocyclerGEN2(props: ThermocyclerGEN2Props): JSX.Element { + return ( + + + + + + + + + + + + {props.lidMotorState === 'open' ? : null} + + ) +} + +function ClosedThermocyclerGEN2Layers(props: { + ledLightColor: string +}): JSX.Element { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +function OpenThermocyclerGEN2Layers(): JSX.Element { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} diff --git a/components/src/hardware-sim/Module/Thermocycler/index.tsx b/components/src/hardware-sim/Module/Thermocycler/index.tsx new file mode 100644 index 00000000000..dde2a21136a --- /dev/null +++ b/components/src/hardware-sim/Module/Thermocycler/index.tsx @@ -0,0 +1,55 @@ +import * as React from 'react' + +import { + THERMOCYCLER_MODULE_V1, + ThermocyclerModuleModel, + getModuleDef2, +} from '@opentrons/shared-data' + +import { C_MED_LIGHT_GRAY } from '../../../styles' +import { BORDERS } from '../../../ui-style-constants' +import { COLORS } from '../../../helix-design-system' + +import { RobotCoordsForeignDiv } from '../../Deck' +import { ThermocyclerGEN1 } from './ThermocyclerGEN1' +import { ThermocyclerGEN2 } from './ThermocyclerGEN2' + +const ROOM_TEMPERATURE_C = 23 // value taken from TC firmware +export interface ThermocyclerVizProps { + lidMotorState: 'open' | 'closed' | 'unknown' + blockTargetTemp?: number | null + model: ThermocyclerModuleModel +} + +export function Thermocycler(props: ThermocyclerVizProps): JSX.Element { + const { lidMotorState, blockTargetTemp, model } = props + const def = getModuleDef2(model) + if (lidMotorState === 'unknown') { + // just a rectangle if we don't know the state of the lid + return ( + + ) + } + + let ledLightColor = COLORS.transparent + if (blockTargetTemp != null) { + ledLightColor = + blockTargetTemp <= ROOM_TEMPERATURE_C ? COLORS.blue35 : COLORS.red30 + } + + return model === THERMOCYCLER_MODULE_V1 ? ( + + ) : ( + + ) +} diff --git a/components/src/hardware-sim/Module/index.tsx b/components/src/hardware-sim/Module/index.tsx index ec810d85699..e2d865329b2 100644 --- a/components/src/hardware-sim/Module/index.tsx +++ b/components/src/hardware-sim/Module/index.tsx @@ -3,6 +3,7 @@ import { getModuleType, HEATERSHAKER_MODULE_TYPE, MAGNETIC_BLOCK_TYPE, + MAGNETIC_MODULE_TYPE, ModuleDefinition, OT2_STANDARD_DECKID, TEMPERATURE_MODULE_TYPE, @@ -22,12 +23,12 @@ import { import { RobotCoordsForeignObject } from '../Deck' import { multiplyMatrices } from '../utils' import { Thermocycler } from './Thermocycler' -import { ModuleFromDef } from './ModuleFromDef' import { HeaterShaker } from './HeaterShaker' import { Temperature } from './Temperature' +import { MagneticBlock } from './MagneticBlock' +import { MagneticModule } from './MagneticModule' export * from './Thermocycler' -export * from './ModuleFromDef' const LABWARE_OFFSET_DISPLAY_THRESHOLD = 2 @@ -38,7 +39,6 @@ interface Props { orientation?: 'left' | 'right' innerProps?: | React.ComponentProps - | React.ComponentProps | React.ComponentProps | React.ComponentProps | {} @@ -178,21 +178,14 @@ export const Module = (props: Props): JSX.Element => { ) } - const magneticBlockLayerBlockList = ['Module_Title', 'Well_Labels', 'Wells'] - - let moduleViz: JSX.Element = ( - )} - def={def} - /> - ) - if (moduleType === THERMOCYCLER_MODULE_TYPE) { + let moduleViz: JSX.Element | null = null + if (moduleType === MAGNETIC_BLOCK_TYPE) { + moduleViz = + } else if (moduleType === MAGNETIC_MODULE_TYPE) { + moduleViz = + } else if (moduleType === THERMOCYCLER_MODULE_TYPE) { const thermocyclerProps = { + lidMotorState: 'open' as const, ...innerProps, model: def.model as ThermocyclerModuleModel, } diff --git a/components/src/hardware-sim/Pipette/EmanatingNozzle.tsx b/components/src/hardware-sim/Pipette/EmanatingNozzle.tsx index 57a84d9744a..9ed0c2eaf86 100644 --- a/components/src/hardware-sim/Pipette/EmanatingNozzle.tsx +++ b/components/src/hardware-sim/Pipette/EmanatingNozzle.tsx @@ -27,7 +27,7 @@ export const EmanatingNozzle = (props: { fill={C_TRANSPARENT} > { - const { labwareDef, pipetteName } = props + const { labwareDef, pipetteName, usingMetalProbe = false } = props const channels = getPipetteNameSpecs(pipetteName)?.channels const cx = channels === 1 @@ -38,21 +38,33 @@ export const PipetteRender = (props: PipetteRenderProps): JSX.Element => { const x = labwareDef.wells.A1.x - cx const y = channels === 1 ? labwareDef.wells.A1.y - cy : MULTI_CHANNEL_Y_OFFSET + let boxWidth: number + let probeOffsetX: number = 0 + let probeOffsetY: number = 0 + if (channels === 1) { + boxWidth = SINGLE_CHANNEL_PIPETTE_WIDTH + } else if (channels === 8) { + boxWidth = MULTI_CHANNEL_PIPETTE_WIDTH + probeOffsetY = 63 + } else { + boxWidth = NINETY_SIX_CHANNEL_PIPETTE_WIDTH + probeOffsetY = 63 + if (Object.keys(labwareDef.wells).length === 1) { + probeOffsetX = 99 / 2 + } + } + return ( { }} > - {channels === 1 ? ( - + {channels === 1 || usingMetalProbe ? ( + ) : ( - + )} diff --git a/components/src/hardware-sim/Pipette/__tests__/EmanatingNozzle.test.tsx b/components/src/hardware-sim/Pipette/__tests__/EmanatingNozzle.test.tsx index cb45e9e50f6..31479495620 100644 --- a/components/src/hardware-sim/Pipette/__tests__/EmanatingNozzle.test.tsx +++ b/components/src/hardware-sim/Pipette/__tests__/EmanatingNozzle.test.tsx @@ -37,8 +37,7 @@ describe('EmanatingNozzle', () => { ) - const animations = getByTestId('emanating_circle').children - const radiusAnimation = animations[0] + const radiusAnimation = getByTestId('radius_animation') expect(radiusAnimation).toHaveAttribute('attributeName', 'r') expect(radiusAnimation).toHaveAttribute('from', '5') expect(radiusAnimation).toHaveAttribute( @@ -56,8 +55,7 @@ describe('EmanatingNozzle', () => { ) - const animations = getByTestId('emanating_circle').children - const opacityAnimation = animations[1] + const opacityAnimation = getByTestId('opacity_animation') expect(opacityAnimation).toHaveAttribute('attributeName', 'opacity') expect(opacityAnimation).toHaveAttribute('from', '0.7') expect(opacityAnimation).toHaveAttribute('to', '0') diff --git a/components/src/hardware-sim/Pipette/constants.ts b/components/src/hardware-sim/Pipette/constants.ts index 700361531fe..95480b39d0c 100644 --- a/components/src/hardware-sim/Pipette/constants.ts +++ b/components/src/hardware-sim/Pipette/constants.ts @@ -1,8 +1,10 @@ +// These constants are used only in pipette render in LPC. The values do not necessarily reflect physical pipette dimensions. export const SINGLE_CHANNEL_PIPETTE_WIDTH = 18.7 export const SINGLE_CHANNEL_PIPETTE_HEIGHT = 30.5 export const MULTI_CHANNEL_PIPETTE_WIDTH = 18.7 export const MULTI_CHANNEL_PIPETTE_HEIGHT = 90.3 +export const NINETY_SIX_CHANNEL_PIPETTE_WIDTH = 117.7 export const MULTI_CHANNEL_CENTER_Y_NOZZLE = 13.3 export const MULTI_CHANNEL_Y_OFFSET = -2.5 diff --git a/components/src/hardware-sim/Pipette/styles.css b/components/src/hardware-sim/Pipette/styles.css deleted file mode 100644 index 368992440af..00000000000 --- a/components/src/hardware-sim/Pipette/styles.css +++ /dev/null @@ -1,3 +0,0 @@ -.overflow { - overflow: visible; -} diff --git a/components/src/hardware-sim/ProtocolDeck/LabwareInfo.tsx b/components/src/hardware-sim/ProtocolDeck/LabwareInfo.tsx new file mode 100644 index 00000000000..2aacdab6737 --- /dev/null +++ b/components/src/hardware-sim/ProtocolDeck/LabwareInfo.tsx @@ -0,0 +1,68 @@ +import * as React from 'react' +import { css } from 'styled-components' + +import { LabwareDefinition2 } from '@opentrons/shared-data' +import { RobotCoordsForeignDiv } from '../Deck' +import { + DISPLAY_FLEX, + DIRECTION_COLUMN, + DIRECTION_ROW, + JUSTIFY_FLEX_END, + JUSTIFY_SPACE_BETWEEN, + ALIGN_FLEX_START, +} from '../../styles' +import { Box, Flex, Text } from '../../primitives' +import { TYPOGRAPHY, SPACING } from '../../ui-style-constants' +import { COLORS } from '../../helix-design-system' + +const labwareDisplayNameStyle = css` + ${TYPOGRAPHY.labelSemiBold} + overflow: hidden; + white-space: initial; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +` +export function LabwareInfo(props: { + def: LabwareDefinition2 + children: React.ReactNode +}): JSX.Element { + const width = props.def.dimensions.xDimension + const height = props.def.dimensions.yDimension + return ( + + + + + {props.children} + + + + + ) +} diff --git a/components/src/hardware-sim/ProtocolDeck/ProtocolDeck.stories.tsx b/components/src/hardware-sim/ProtocolDeck/ProtocolDeck.stories.tsx new file mode 100644 index 00000000000..6563bc0a12f --- /dev/null +++ b/components/src/hardware-sim/ProtocolDeck/ProtocolDeck.stories.tsx @@ -0,0 +1,25 @@ +import * as React from 'react' +import analysisFileFixture from './__fixtures__/analysis_QIAseqFX24xv4_8.json' + +import { ProtocolDeck as ProtocolDeckComponent } from './' + +import type { Meta, StoryObj } from '@storybook/react' +import type { ProtocolAnalysisOutput } from '@opentrons/shared-data' + +const meta: Meta> = { + component: ProtocolDeckComponent, + title: 'Library/Molecules/Simulation/ProtocolDeck', +} as Meta + +export default meta +type Story = StoryObj> + +export const ProtocolDeck: Story = { + args: { + // @ts-expect-error typescript can't import JSON as const + protocolAnalysis: analysisFileFixture as ProtocolAnalysisOutput, + }, + render: args => { + return + }, +} diff --git a/components/src/hardware-sim/ProtocolDeck/__fixtures__/analysis_QIAseqFX24xv4_8.json b/components/src/hardware-sim/ProtocolDeck/__fixtures__/analysis_QIAseqFX24xv4_8.json new file mode 100644 index 00000000000..2359e6e775c --- /dev/null +++ b/components/src/hardware-sim/ProtocolDeck/__fixtures__/analysis_QIAseqFX24xv4_8.json @@ -0,0 +1,47145 @@ +{ + "createdAt": "2023-11-29T20:18:37.007659+00:00", + "files": [ + { "name": "QIASeq FX 24x v4.8.py", "role": "main" }, + { "name": "2_25_wellplate_100ul.json", "role": "labware" }, + { "name": "cpx_4_tuberack_100ul (1).json", "role": "labware" }, + { "name": "grkjhbgf_4_reservoir_12ul.json", "role": "labware" }, + { "name": "opentrons_flex_96_tiprack_1000ul_rss.json", "role": "labware" }, + { "name": "opentrons_flex_96_tiprack_200ul_rss.json", "role": "labware" }, + { "name": "opentrons_flex_96_tiprack_50ul_rss.json", "role": "labware" }, + { + "name": "opentrons_ot3_96_tiprack_50ul_temporary_adapter.json", + "role": "labware" + }, + { "name": "radwag_pipette_calibration_vial.json", "role": "labware" }, + { "name": "ultima_pip_e_8channel_trough_v1.json", "role": "labware" } + ], + "config": { "protocolType": "python", "apiVersion": [2, 15] }, + "metadata": { + "protocolName": "QIAseq FX 24x v4.8", + "author": "Opentrons ", + "source": "Protocol Library" + }, + "robotType": "OT-3 Standard", + "commands": [ + { + "id": "6dd03c91-e359-4853-99ad-e9349231b4a8", + "createdAt": "2023-11-29T20:18:30.361548+00:00", + "commandType": "home", + "key": "50c7ae73a4e3f7129874f39dfb514803", + "status": "succeeded", + "params": {}, + "result": {}, + "startedAt": "2023-11-29T20:18:30.362012+00:00", + "completedAt": "2023-11-29T20:18:30.364882+00:00" + }, + { + "id": "41d9af53-1501-4ca4-824e-011ed22dd8a6", + "createdAt": "2023-11-29T20:18:30.363609+00:00", + "commandType": "custom", + "key": "bd9ce9b80c066bced0590df4883764bb", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "THIS IS A REACTION RUN" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.365069+00:00", + "completedAt": "2023-11-29T20:18:30.365141+00:00" + }, + { + "id": "dc6e9e49-7e58-42bf-9423-b138ec9caf6c", + "createdAt": "2023-11-29T20:18:30.365785+00:00", + "commandType": "custom", + "key": "16bcbf66dca9a48301f48b6496b460ed", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "USED TIPS WILL GO IN TRASH" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.365865+00:00", + "completedAt": "2023-11-29T20:18:30.365924+00:00" + }, + { + "id": "30b9369e-ff74-4d4b-8a94-eff4c9503ae6", + "createdAt": "2023-11-29T20:18:30.366303+00:00", + "commandType": "loadModule", + "key": "51b25bafbb4c5f2558ed0bba47da2e6a", + "status": "succeeded", + "params": { + "model": "heaterShakerModuleV1", + "location": { "slotName": "D1" } + }, + "result": { + "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5", + "definition": { + "otSharedSchema": "module/schemas/2", + "moduleType": "heaterShakerModuleType", + "model": "heaterShakerModuleV1", + "labwareOffset": { "x": -0.125, "y": 1.125, "z": 68.275 }, + "dimensions": { "bareOverallHeight": 82.0, "overLabwareHeight": 0.0 }, + "calibrationPoint": { "x": 12.0, "y": 8.75, "z": 68.275 }, + "displayName": "Heater-Shaker Module GEN1", + "quirks": [], + "slotTransforms": { + "ot2_standard": { + "3": { + "labwareOffset": [ + [-1, 0, 0, 0], + [0, -1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1] + ] + }, + "6": { + "labwareOffset": [ + [-1, 0, 0, 0], + [0, -1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1] + ] + }, + "9": { + "labwareOffset": [ + [-1, 0, 0, 0], + [0, -1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1] + ] + } + }, + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [-1, 0, 0, 0], + [0, -1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1] + ] + }, + "6": { + "labwareOffset": [ + [-1, 0, 0, 0], + [0, -1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1] + ] + }, + "9": { + "labwareOffset": [ + [-1, 0, 0, 0], + [0, -1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1] + ] + } + }, + "ot3_standard": { + "D1": { + "labwareOffset": [ + [1, 0, 0, 0.125], + [0, 1, 0, -1.125], + [0, 0, 1, -49.325], + [0, 0, 0, 1] + ] + }, + "C1": { + "labwareOffset": [ + [1, 0, 0, 0.125], + [0, 1, 0, -1.125], + [0, 0, 1, -49.325], + [0, 0, 0, 1] + ] + }, + "B1": { + "labwareOffset": [ + [1, 0, 0, 0.125], + [0, 1, 0, -1.125], + [0, 0, 1, -49.325], + [0, 0, 0, 1] + ] + }, + "A1": { + "labwareOffset": [ + [1, 0, 0, 0.125], + [0, 1, 0, -1.125], + [0, 0, 1, -49.325], + [0, 0, 0, 1] + ] + }, + "D3": { + "labwareOffset": [ + [1, 0, 0, 0.125], + [0, 1, 0, -1.125], + [0, 0, 1, -49.325], + [0, 0, 0, 1] + ] + }, + "C3": { + "labwareOffset": [ + [1, 0, 0, 0.125], + [0, 1, 0, -1.125], + [0, 0, 1, -49.325], + [0, 0, 0, 1] + ] + }, + "B3": { + "labwareOffset": [ + [1, 0, 0, 0.125], + [0, 1, 0, -1.125], + [0, 0, 1, -49.325], + [0, 0, 0, 1] + ] + } + } + }, + "compatibleWith": [], + "gripperOffsets": { + "default": { + "pickUpOffset": { "x": 0.0, "y": 0.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": 0.0, "z": 1.0 } + } + } + }, + "model": "heaterShakerModuleV1", + "serialNumber": "fake-serial-number-f36dcc9a-6276-42c2-a8f3-1b0ff29e4505" + }, + "startedAt": "2023-11-29T20:18:30.366360+00:00", + "completedAt": "2023-11-29T20:18:30.367572+00:00" + }, + { + "id": "adf35698-5d48-4ddb-a16d-c708c21bcb37", + "createdAt": "2023-11-29T20:18:30.368649+00:00", + "commandType": "loadLabware", + "key": "77ff705d6a929dc6e1fac4bc1656946d", + "status": "succeeded", + "params": { + "location": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "loadName": "opentrons_96_pcr_adapter", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "labwareId": "3787af65-0305-4b08-bf02-a2c6596a10e5", + "definition": { + "schemaVersion": 2, + "version": 1, + "namespace": "opentrons", + "metadata": { + "displayName": "Opentrons 96 PCR Heater-Shaker Adapter", + "displayCategory": "adapter", + "displayVolumeUnits": "\u00b5L", + "tags": [] + }, + "brand": { "brand": "Opentrons", "brandId": [] }, + "parameters": { + "format": "96Standard", + "quirks": [], + "isTiprack": false, + "loadName": "opentrons_96_pcr_adapter", + "isMagneticModuleCompatible": false + }, + "ordering": [ + ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], + ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], + ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], + ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], + ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], + ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], + ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], + ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], + ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"], + ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], + ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] + ], + "cornerOffsetFromSlot": { "x": 8.5, "y": 5.5, "z": 0 }, + "dimensions": { + "yDimension": 75, + "zDimension": 13.85, + "xDimension": 111 + }, + "wells": { + "A1": { + "depth": 12, + "x": 6, + "y": 69, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "B1": { + "depth": 12, + "x": 6, + "y": 60, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "C1": { + "depth": 12, + "x": 6, + "y": 51, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "D1": { + "depth": 12, + "x": 6, + "y": 42, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "E1": { + "depth": 12, + "x": 6, + "y": 33, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "F1": { + "depth": 12, + "x": 6, + "y": 24, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "G1": { + "depth": 12, + "x": 6, + "y": 15, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "H1": { + "depth": 12, + "x": 6, + "y": 6, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "A2": { + "depth": 12, + "x": 15, + "y": 69, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "B2": { + "depth": 12, + "x": 15, + "y": 60, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "C2": { + "depth": 12, + "x": 15, + "y": 51, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "D2": { + "depth": 12, + "x": 15, + "y": 42, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "E2": { + "depth": 12, + "x": 15, + "y": 33, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "F2": { + "depth": 12, + "x": 15, + "y": 24, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "G2": { + "depth": 12, + "x": 15, + "y": 15, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "H2": { + "depth": 12, + "x": 15, + "y": 6, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "A3": { + "depth": 12, + "x": 24, + "y": 69, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "B3": { + "depth": 12, + "x": 24, + "y": 60, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "C3": { + "depth": 12, + "x": 24, + "y": 51, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "D3": { + "depth": 12, + "x": 24, + "y": 42, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "E3": { + "depth": 12, + "x": 24, + "y": 33, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "F3": { + "depth": 12, + "x": 24, + "y": 24, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "G3": { + "depth": 12, + "x": 24, + "y": 15, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "H3": { + "depth": 12, + "x": 24, + "y": 6, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "A4": { + "depth": 12, + "x": 33, + "y": 69, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "B4": { + "depth": 12, + "x": 33, + "y": 60, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "C4": { + "depth": 12, + "x": 33, + "y": 51, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "D4": { + "depth": 12, + "x": 33, + "y": 42, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "E4": { + "depth": 12, + "x": 33, + "y": 33, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "F4": { + "depth": 12, + "x": 33, + "y": 24, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "G4": { + "depth": 12, + "x": 33, + "y": 15, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "H4": { + "depth": 12, + "x": 33, + "y": 6, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "A5": { + "depth": 12, + "x": 42, + "y": 69, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "B5": { + "depth": 12, + "x": 42, + "y": 60, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "C5": { + "depth": 12, + "x": 42, + "y": 51, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "D5": { + "depth": 12, + "x": 42, + "y": 42, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "E5": { + "depth": 12, + "x": 42, + "y": 33, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "F5": { + "depth": 12, + "x": 42, + "y": 24, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "G5": { + "depth": 12, + "x": 42, + "y": 15, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "H5": { + "depth": 12, + "x": 42, + "y": 6, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "A6": { + "depth": 12, + "x": 51, + "y": 69, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "B6": { + "depth": 12, + "x": 51, + "y": 60, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "C6": { + "depth": 12, + "x": 51, + "y": 51, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "D6": { + "depth": 12, + "x": 51, + "y": 42, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "E6": { + "depth": 12, + "x": 51, + "y": 33, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "F6": { + "depth": 12, + "x": 51, + "y": 24, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "G6": { + "depth": 12, + "x": 51, + "y": 15, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "H6": { + "depth": 12, + "x": 51, + "y": 6, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "A7": { + "depth": 12, + "x": 60, + "y": 69, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "B7": { + "depth": 12, + "x": 60, + "y": 60, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "C7": { + "depth": 12, + "x": 60, + "y": 51, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "D7": { + "depth": 12, + "x": 60, + "y": 42, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "E7": { + "depth": 12, + "x": 60, + "y": 33, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "F7": { + "depth": 12, + "x": 60, + "y": 24, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "G7": { + "depth": 12, + "x": 60, + "y": 15, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "H7": { + "depth": 12, + "x": 60, + "y": 6, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "A8": { + "depth": 12, + "x": 69, + "y": 69, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "B8": { + "depth": 12, + "x": 69, + "y": 60, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "C8": { + "depth": 12, + "x": 69, + "y": 51, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "D8": { + "depth": 12, + "x": 69, + "y": 42, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "E8": { + "depth": 12, + "x": 69, + "y": 33, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "F8": { + "depth": 12, + "x": 69, + "y": 24, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "G8": { + "depth": 12, + "x": 69, + "y": 15, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "H8": { + "depth": 12, + "x": 69, + "y": 6, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "A9": { + "depth": 12, + "x": 78, + "y": 69, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "B9": { + "depth": 12, + "x": 78, + "y": 60, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "C9": { + "depth": 12, + "x": 78, + "y": 51, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "D9": { + "depth": 12, + "x": 78, + "y": 42, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "E9": { + "depth": 12, + "x": 78, + "y": 33, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "F9": { + "depth": 12, + "x": 78, + "y": 24, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "G9": { + "depth": 12, + "x": 78, + "y": 15, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "H9": { + "depth": 12, + "x": 78, + "y": 6, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "A10": { + "depth": 12, + "x": 87, + "y": 69, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "B10": { + "depth": 12, + "x": 87, + "y": 60, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "C10": { + "depth": 12, + "x": 87, + "y": 51, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "D10": { + "depth": 12, + "x": 87, + "y": 42, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "E10": { + "depth": 12, + "x": 87, + "y": 33, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "F10": { + "depth": 12, + "x": 87, + "y": 24, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "G10": { + "depth": 12, + "x": 87, + "y": 15, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "H10": { + "depth": 12, + "x": 87, + "y": 6, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "A11": { + "depth": 12, + "x": 96, + "y": 69, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "B11": { + "depth": 12, + "x": 96, + "y": 60, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "C11": { + "depth": 12, + "x": 96, + "y": 51, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "D11": { + "depth": 12, + "x": 96, + "y": 42, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "E11": { + "depth": 12, + "x": 96, + "y": 33, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "F11": { + "depth": 12, + "x": 96, + "y": 24, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "G11": { + "depth": 12, + "x": 96, + "y": 15, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "H11": { + "depth": 12, + "x": 96, + "y": 6, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "A12": { + "depth": 12, + "x": 105, + "y": 69, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "B12": { + "depth": 12, + "x": 105, + "y": 60, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "C12": { + "depth": 12, + "x": 105, + "y": 51, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "D12": { + "depth": 12, + "x": 105, + "y": 42, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "E12": { + "depth": 12, + "x": 105, + "y": 33, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "F12": { + "depth": 12, + "x": 105, + "y": 24, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "G12": { + "depth": 12, + "x": 105, + "y": 15, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + }, + "H12": { + "depth": 12, + "x": 105, + "y": 6, + "z": 1.85, + "totalLiquidVolume": 0, + "diameter": 5.64, + "shape": "circular" + } + }, + "groups": [ + { + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + "metadata": { "wellBottomShape": "v" } + } + ], + "allowedRoles": ["adapter"], + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "gripperOffsets": { + "default": { + "pickUpOffset": { "x": 0, "y": 0, "z": 0 }, + "dropOffset": { "x": 0, "y": 0, "z": 1.0 } + } + } + } + }, + "startedAt": "2023-11-29T20:18:30.368713+00:00", + "completedAt": "2023-11-29T20:18:30.372343+00:00" + }, + { + "id": "740f473b-3039-483c-a449-63d2c20bc147", + "createdAt": "2023-11-29T20:18:30.373143+00:00", + "commandType": "loadLabware", + "key": "64b16f44d9e7b0bbbec643bde2661ffb", + "status": "succeeded", + "params": { + "location": { "slotName": "D2" }, + "loadName": "nest_12_reservoir_15ml", + "namespace": "opentrons", + "version": 1, + "displayName": "Reservoir" + }, + "result": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "definition": { + "schemaVersion": 2, + "version": 1, + "namespace": "opentrons", + "metadata": { + "displayName": "NEST 12 Well Reservoir 15 mL", + "displayCategory": "reservoir", + "displayVolumeUnits": "mL", + "tags": [] + }, + "brand": { + "brand": "NEST", + "brandId": ["360102"], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors/59178414.html" + ] + }, + "parameters": { + "format": "trough", + "quirks": ["centerMultichannelOnWells", "touchTipDisabled"], + "isTiprack": false, + "loadName": "nest_12_reservoir_15ml", + "isMagneticModuleCompatible": false + }, + "ordering": [ + ["A1"], + ["A2"], + ["A3"], + ["A4"], + ["A5"], + ["A6"], + ["A7"], + ["A8"], + ["A9"], + ["A10"], + ["A11"], + ["A12"] + ], + "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "dimensions": { + "yDimension": 85.48, + "zDimension": 31.4, + "xDimension": 127.76 + }, + "wells": { + "A1": { + "depth": 26.85, + "x": 14.38, + "y": 42.78, + "z": 4.55, + "totalLiquidVolume": 15000, + "xDimension": 8.2, + "yDimension": 71.2, + "shape": "rectangular" + }, + "A2": { + "depth": 26.85, + "x": 23.38, + "y": 42.78, + "z": 4.55, + "totalLiquidVolume": 15000, + "xDimension": 8.2, + "yDimension": 71.2, + "shape": "rectangular" + }, + "A3": { + "depth": 26.85, + "x": 32.38, + "y": 42.78, + "z": 4.55, + "totalLiquidVolume": 15000, + "xDimension": 8.2, + "yDimension": 71.2, + "shape": "rectangular" + }, + "A4": { + "depth": 26.85, + "x": 41.38, + "y": 42.78, + "z": 4.55, + "totalLiquidVolume": 15000, + "xDimension": 8.2, + "yDimension": 71.2, + "shape": "rectangular" + }, + "A5": { + "depth": 26.85, + "x": 50.38, + "y": 42.78, + "z": 4.55, + "totalLiquidVolume": 15000, + "xDimension": 8.2, + "yDimension": 71.2, + "shape": "rectangular" + }, + "A6": { + "depth": 26.85, + "x": 59.38, + "y": 42.78, + "z": 4.55, + "totalLiquidVolume": 15000, + "xDimension": 8.2, + "yDimension": 71.2, + "shape": "rectangular" + }, + "A7": { + "depth": 26.85, + "x": 68.38, + "y": 42.78, + "z": 4.55, + "totalLiquidVolume": 15000, + "xDimension": 8.2, + "yDimension": 71.2, + "shape": "rectangular" + }, + "A8": { + "depth": 26.85, + "x": 77.38, + "y": 42.78, + "z": 4.55, + "totalLiquidVolume": 15000, + "xDimension": 8.2, + "yDimension": 71.2, + "shape": "rectangular" + }, + "A9": { + "depth": 26.85, + "x": 86.38, + "y": 42.78, + "z": 4.55, + "totalLiquidVolume": 15000, + "xDimension": 8.2, + "yDimension": 71.2, + "shape": "rectangular" + }, + "A10": { + "depth": 26.85, + "x": 95.38, + "y": 42.78, + "z": 4.55, + "totalLiquidVolume": 15000, + "xDimension": 8.2, + "yDimension": 71.2, + "shape": "rectangular" + }, + "A11": { + "depth": 26.85, + "x": 104.38, + "y": 42.78, + "z": 4.55, + "totalLiquidVolume": 15000, + "xDimension": 8.2, + "yDimension": 71.2, + "shape": "rectangular" + }, + "A12": { + "depth": 26.85, + "x": 113.38, + "y": 42.78, + "z": 4.55, + "totalLiquidVolume": 15000, + "xDimension": 8.2, + "yDimension": 71.2, + "shape": "rectangular" + } + }, + "groups": [ + { + "wells": [ + "A1", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "A10", + "A11", + "A12" + ], + "metadata": { "wellBottomShape": "v" } + } + ], + "allowedRoles": [], + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "gripperOffsets": {} + } + }, + "startedAt": "2023-11-29T20:18:30.373220+00:00", + "completedAt": "2023-11-29T20:18:30.374269+00:00" + }, + { + "id": "11791e95-acab-4c67-857c-091339d823a1", + "createdAt": "2023-11-29T20:18:30.374934+00:00", + "commandType": "loadModule", + "key": "d41c78c326df62be644b3b19f3d9119e", + "status": "succeeded", + "params": { + "model": "temperatureModuleV2", + "location": { "slotName": "D3" } + }, + "result": { + "moduleId": "dc893184-0c7b-4c95-80f1-627932a49ab0", + "definition": { + "otSharedSchema": "module/schemas/2", + "moduleType": "temperatureModuleType", + "model": "temperatureModuleV2", + "labwareOffset": { "x": -1.45, "y": -0.15, "z": 80.09 }, + "dimensions": { "bareOverallHeight": 84.0, "overLabwareHeight": 0.0 }, + "calibrationPoint": { "x": 11.7, "y": 8.75, "z": 80.09 }, + "displayName": "Temperature Module GEN2", + "quirks": [], + "slotTransforms": { + "ot2_standard": { + "3": { + "labwareOffset": [ + [-1, 0, 0, -0.3], + [0, 1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1] + ] + }, + "6": { + "labwareOffset": [ + [-1, 0, 0, -0.3], + [0, 1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1] + ] + }, + "9": { + "labwareOffset": [ + [-1, 0, 0, -0.3], + [0, 1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1] + ] + } + }, + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [-1, 0, 0, -0.15], + [0, 1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1] + ] + }, + "6": { + "labwareOffset": [ + [-1, 0, 0, -0.15], + [0, 1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1] + ] + }, + "9": { + "labwareOffset": [ + [-1, 0, 0, -0.15], + [0, 1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1] + ] + } + }, + "ot3_standard": { + "D1": { + "labwareOffset": [ + [1, 0, 0, 1.45], + [0, 1, 0, 0.15], + [0, 0, 1, -71.09], + [0, 0, 0, 1] + ] + }, + "C1": { + "labwareOffset": [ + [1, 0, 0, 1.45], + [0, 1, 0, 0.15], + [0, 0, 1, -71.09], + [0, 0, 0, 1] + ] + }, + "B1": { + "labwareOffset": [ + [1, 0, 0, 1.45], + [0, 1, 0, 0.15], + [0, 0, 1, -71.09], + [0, 0, 0, 1] + ] + }, + "A1": { + "labwareOffset": [ + [1, 0, 0, 1.45], + [0, 1, 0, 0.15], + [0, 0, 1, -71.09], + [0, 0, 0, 1] + ] + }, + "D3": { + "labwareOffset": [ + [1, 0, 0, 1.45], + [0, 1, 0, 0.15], + [0, 0, 1, -71.09], + [0, 0, 0, 1] + ] + }, + "C3": { + "labwareOffset": [ + [1, 0, 0, 1.45], + [0, 1, 0, 0.15], + [0, 0, 1, -71.09], + [0, 0, 0, 1] + ] + }, + "B3": { + "labwareOffset": [ + [1, 0, 0, 1.45], + [0, 1, 0, 0.15], + [0, 0, 1, -71.09], + [0, 0, 0, 1] + ] + } + } + }, + "compatibleWith": ["temperatureModuleV1"], + "gripperOffsets": { + "default": { + "pickUpOffset": { "x": 0.0, "y": 0.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": 0.0, "z": 1.0 } + } + } + }, + "model": "temperatureModuleV2", + "serialNumber": "fake-serial-number-4ca7a615-156c-465d-a57a-0fb90878cb41" + }, + "startedAt": "2023-11-29T20:18:30.374996+00:00", + "completedAt": "2023-11-29T20:18:30.375340+00:00" + }, + { + "id": "49db578b-d0bb-48a4-a86d-93f91aa23826", + "createdAt": "2023-11-29T20:18:30.376465+00:00", + "commandType": "loadLabware", + "key": "8943199c0a946ab2e43103f7a59fb390", + "status": "succeeded", + "params": { + "location": { "moduleId": "dc893184-0c7b-4c95-80f1-627932a49ab0" }, + "loadName": "opentrons_96_well_aluminum_block", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "labwareId": "50546a91-b698-445c-a00a-e710416ede38", + "definition": { + "schemaVersion": 2, + "version": 1, + "namespace": "opentrons", + "metadata": { + "displayName": "Opentrons 96 Well Aluminum Block", + "displayCategory": "adapter", + "displayVolumeUnits": "\u00b5L", + "tags": [] + }, + "brand": { "brand": "Opentrons", "brandId": [] }, + "parameters": { + "format": "96Standard", + "quirks": [], + "isTiprack": false, + "loadName": "opentrons_96_well_aluminum_block", + "isMagneticModuleCompatible": false + }, + "ordering": [ + ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], + ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], + ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], + ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], + ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], + ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], + ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], + ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], + ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"], + ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], + ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] + ], + "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "dimensions": { + "yDimension": 85.48, + "zDimension": 18.16, + "xDimension": 127.76 + }, + "wells": { + "A1": { + "depth": 14.78, + "x": 14.38, + "y": 74.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "B1": { + "depth": 14.78, + "x": 14.38, + "y": 65.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "C1": { + "depth": 14.78, + "x": 14.38, + "y": 56.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "D1": { + "depth": 14.78, + "x": 14.38, + "y": 47.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "E1": { + "depth": 14.78, + "x": 14.38, + "y": 38.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "F1": { + "depth": 14.78, + "x": 14.38, + "y": 29.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "G1": { + "depth": 14.78, + "x": 14.38, + "y": 20.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "H1": { + "depth": 14.78, + "x": 14.38, + "y": 11.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "A2": { + "depth": 14.78, + "x": 23.38, + "y": 74.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "B2": { + "depth": 14.78, + "x": 23.38, + "y": 65.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "C2": { + "depth": 14.78, + "x": 23.38, + "y": 56.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "D2": { + "depth": 14.78, + "x": 23.38, + "y": 47.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "E2": { + "depth": 14.78, + "x": 23.38, + "y": 38.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "F2": { + "depth": 14.78, + "x": 23.38, + "y": 29.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "G2": { + "depth": 14.78, + "x": 23.38, + "y": 20.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "H2": { + "depth": 14.78, + "x": 23.38, + "y": 11.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "A3": { + "depth": 14.78, + "x": 32.38, + "y": 74.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "B3": { + "depth": 14.78, + "x": 32.38, + "y": 65.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "C3": { + "depth": 14.78, + "x": 32.38, + "y": 56.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "D3": { + "depth": 14.78, + "x": 32.38, + "y": 47.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "E3": { + "depth": 14.78, + "x": 32.38, + "y": 38.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "F3": { + "depth": 14.78, + "x": 32.38, + "y": 29.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "G3": { + "depth": 14.78, + "x": 32.38, + "y": 20.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "H3": { + "depth": 14.78, + "x": 32.38, + "y": 11.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "A4": { + "depth": 14.78, + "x": 41.38, + "y": 74.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "B4": { + "depth": 14.78, + "x": 41.38, + "y": 65.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "C4": { + "depth": 14.78, + "x": 41.38, + "y": 56.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "D4": { + "depth": 14.78, + "x": 41.38, + "y": 47.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "E4": { + "depth": 14.78, + "x": 41.38, + "y": 38.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "F4": { + "depth": 14.78, + "x": 41.38, + "y": 29.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "G4": { + "depth": 14.78, + "x": 41.38, + "y": 20.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "H4": { + "depth": 14.78, + "x": 41.38, + "y": 11.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "A5": { + "depth": 14.78, + "x": 50.38, + "y": 74.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "B5": { + "depth": 14.78, + "x": 50.38, + "y": 65.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "C5": { + "depth": 14.78, + "x": 50.38, + "y": 56.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "D5": { + "depth": 14.78, + "x": 50.38, + "y": 47.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "E5": { + "depth": 14.78, + "x": 50.38, + "y": 38.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "F5": { + "depth": 14.78, + "x": 50.38, + "y": 29.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "G5": { + "depth": 14.78, + "x": 50.38, + "y": 20.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "H5": { + "depth": 14.78, + "x": 50.38, + "y": 11.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "A6": { + "depth": 14.78, + "x": 59.38, + "y": 74.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "B6": { + "depth": 14.78, + "x": 59.38, + "y": 65.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "C6": { + "depth": 14.78, + "x": 59.38, + "y": 56.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "D6": { + "depth": 14.78, + "x": 59.38, + "y": 47.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "E6": { + "depth": 14.78, + "x": 59.38, + "y": 38.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "F6": { + "depth": 14.78, + "x": 59.38, + "y": 29.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "G6": { + "depth": 14.78, + "x": 59.38, + "y": 20.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "H6": { + "depth": 14.78, + "x": 59.38, + "y": 11.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "A7": { + "depth": 14.78, + "x": 68.38, + "y": 74.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "B7": { + "depth": 14.78, + "x": 68.38, + "y": 65.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "C7": { + "depth": 14.78, + "x": 68.38, + "y": 56.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "D7": { + "depth": 14.78, + "x": 68.38, + "y": 47.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "E7": { + "depth": 14.78, + "x": 68.38, + "y": 38.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "F7": { + "depth": 14.78, + "x": 68.38, + "y": 29.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "G7": { + "depth": 14.78, + "x": 68.38, + "y": 20.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "H7": { + "depth": 14.78, + "x": 68.38, + "y": 11.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "A8": { + "depth": 14.78, + "x": 77.38, + "y": 74.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "B8": { + "depth": 14.78, + "x": 77.38, + "y": 65.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "C8": { + "depth": 14.78, + "x": 77.38, + "y": 56.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "D8": { + "depth": 14.78, + "x": 77.38, + "y": 47.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "E8": { + "depth": 14.78, + "x": 77.38, + "y": 38.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "F8": { + "depth": 14.78, + "x": 77.38, + "y": 29.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "G8": { + "depth": 14.78, + "x": 77.38, + "y": 20.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "H8": { + "depth": 14.78, + "x": 77.38, + "y": 11.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "A9": { + "depth": 14.78, + "x": 86.38, + "y": 74.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "B9": { + "depth": 14.78, + "x": 86.38, + "y": 65.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "C9": { + "depth": 14.78, + "x": 86.38, + "y": 56.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "D9": { + "depth": 14.78, + "x": 86.38, + "y": 47.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "E9": { + "depth": 14.78, + "x": 86.38, + "y": 38.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "F9": { + "depth": 14.78, + "x": 86.38, + "y": 29.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "G9": { + "depth": 14.78, + "x": 86.38, + "y": 20.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "H9": { + "depth": 14.78, + "x": 86.38, + "y": 11.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "A10": { + "depth": 14.78, + "x": 95.38, + "y": 74.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "B10": { + "depth": 14.78, + "x": 95.38, + "y": 65.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "C10": { + "depth": 14.78, + "x": 95.38, + "y": 56.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "D10": { + "depth": 14.78, + "x": 95.38, + "y": 47.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "E10": { + "depth": 14.78, + "x": 95.38, + "y": 38.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "F10": { + "depth": 14.78, + "x": 95.38, + "y": 29.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "G10": { + "depth": 14.78, + "x": 95.38, + "y": 20.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "H10": { + "depth": 14.78, + "x": 95.38, + "y": 11.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "A11": { + "depth": 14.78, + "x": 104.38, + "y": 74.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "B11": { + "depth": 14.78, + "x": 104.38, + "y": 65.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "C11": { + "depth": 14.78, + "x": 104.38, + "y": 56.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "D11": { + "depth": 14.78, + "x": 104.38, + "y": 47.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "E11": { + "depth": 14.78, + "x": 104.38, + "y": 38.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "F11": { + "depth": 14.78, + "x": 104.38, + "y": 29.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "G11": { + "depth": 14.78, + "x": 104.38, + "y": 20.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "H11": { + "depth": 14.78, + "x": 104.38, + "y": 11.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "A12": { + "depth": 14.78, + "x": 113.38, + "y": 74.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "B12": { + "depth": 14.78, + "x": 113.38, + "y": 65.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "C12": { + "depth": 14.78, + "x": 113.38, + "y": 56.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "D12": { + "depth": 14.78, + "x": 113.38, + "y": 47.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "E12": { + "depth": 14.78, + "x": 113.38, + "y": 38.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "F12": { + "depth": 14.78, + "x": 113.38, + "y": 29.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "G12": { + "depth": 14.78, + "x": 113.38, + "y": 20.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + }, + "H12": { + "depth": 14.78, + "x": 113.38, + "y": 11.24, + "z": 3.38, + "totalLiquidVolume": 0, + "diameter": 5.34, + "shape": "circular" + } + }, + "groups": [ + { + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + "metadata": { "wellBottomShape": "v" } + } + ], + "allowedRoles": ["adapter"], + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "gripperOffsets": { + "default": { + "pickUpOffset": { "x": 0, "y": 0, "z": 0 }, + "dropOffset": { "x": 0, "y": 0, "z": 1.0 } + } + } + } + }, + "startedAt": "2023-11-29T20:18:30.376527+00:00", + "completedAt": "2023-11-29T20:18:30.380935+00:00" + }, + { + "id": "5a45f032-711a-4164-9a30-df9259dbbb2d", + "createdAt": "2023-11-29T20:18:30.381810+00:00", + "commandType": "loadLabware", + "key": "a09866bd81661ec1a1a4c33cc7c1c91b", + "status": "succeeded", + "params": { + "location": { "labwareId": "50546a91-b698-445c-a00a-e710416ede38" }, + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "namespace": "opentrons", + "version": 2, + "displayName": "Reagent Plate" + }, + "result": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "definition": { + "schemaVersion": 2, + "version": 2, + "namespace": "opentrons", + "metadata": { + "displayName": "Armadillo 96 Well Plate 200 \u00b5L PCR Full Skirt", + "displayCategory": "wellPlate", + "displayVolumeUnits": "\u00b5L", + "tags": [] + }, + "brand": { + "brand": "Thermo Scientific", + "brandId": ["AB2396"], + "links": [ + "https://www.fishersci.com/shop/products/armadillo-96-well-pcr-plate-1/AB2396" + ] + }, + "parameters": { + "format": "96Standard", + "isTiprack": false, + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "isMagneticModuleCompatible": true + }, + "ordering": [ + ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], + ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], + ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], + ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], + ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], + ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], + ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], + ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], + ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"], + ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], + ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] + ], + "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "dimensions": { + "yDimension": 85.48, + "zDimension": 16.0, + "xDimension": 127.76 + }, + "wells": { + "A1": { + "depth": 14.95, + "x": 14.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B1": { + "depth": 14.95, + "x": 14.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C1": { + "depth": 14.95, + "x": 14.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D1": { + "depth": 14.95, + "x": 14.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E1": { + "depth": 14.95, + "x": 14.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F1": { + "depth": 14.95, + "x": 14.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G1": { + "depth": 14.95, + "x": 14.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H1": { + "depth": 14.95, + "x": 14.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A2": { + "depth": 14.95, + "x": 23.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B2": { + "depth": 14.95, + "x": 23.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C2": { + "depth": 14.95, + "x": 23.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D2": { + "depth": 14.95, + "x": 23.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E2": { + "depth": 14.95, + "x": 23.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F2": { + "depth": 14.95, + "x": 23.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G2": { + "depth": 14.95, + "x": 23.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H2": { + "depth": 14.95, + "x": 23.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A3": { + "depth": 14.95, + "x": 32.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B3": { + "depth": 14.95, + "x": 32.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C3": { + "depth": 14.95, + "x": 32.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D3": { + "depth": 14.95, + "x": 32.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E3": { + "depth": 14.95, + "x": 32.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F3": { + "depth": 14.95, + "x": 32.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G3": { + "depth": 14.95, + "x": 32.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H3": { + "depth": 14.95, + "x": 32.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A4": { + "depth": 14.95, + "x": 41.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B4": { + "depth": 14.95, + "x": 41.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C4": { + "depth": 14.95, + "x": 41.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D4": { + "depth": 14.95, + "x": 41.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E4": { + "depth": 14.95, + "x": 41.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F4": { + "depth": 14.95, + "x": 41.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G4": { + "depth": 14.95, + "x": 41.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H4": { + "depth": 14.95, + "x": 41.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A5": { + "depth": 14.95, + "x": 50.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B5": { + "depth": 14.95, + "x": 50.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C5": { + "depth": 14.95, + "x": 50.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D5": { + "depth": 14.95, + "x": 50.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E5": { + "depth": 14.95, + "x": 50.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F5": { + "depth": 14.95, + "x": 50.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G5": { + "depth": 14.95, + "x": 50.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H5": { + "depth": 14.95, + "x": 50.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A6": { + "depth": 14.95, + "x": 59.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B6": { + "depth": 14.95, + "x": 59.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C6": { + "depth": 14.95, + "x": 59.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D6": { + "depth": 14.95, + "x": 59.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E6": { + "depth": 14.95, + "x": 59.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F6": { + "depth": 14.95, + "x": 59.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G6": { + "depth": 14.95, + "x": 59.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H6": { + "depth": 14.95, + "x": 59.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A7": { + "depth": 14.95, + "x": 68.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B7": { + "depth": 14.95, + "x": 68.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C7": { + "depth": 14.95, + "x": 68.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D7": { + "depth": 14.95, + "x": 68.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E7": { + "depth": 14.95, + "x": 68.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F7": { + "depth": 14.95, + "x": 68.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G7": { + "depth": 14.95, + "x": 68.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H7": { + "depth": 14.95, + "x": 68.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A8": { + "depth": 14.95, + "x": 77.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B8": { + "depth": 14.95, + "x": 77.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C8": { + "depth": 14.95, + "x": 77.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D8": { + "depth": 14.95, + "x": 77.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E8": { + "depth": 14.95, + "x": 77.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F8": { + "depth": 14.95, + "x": 77.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G8": { + "depth": 14.95, + "x": 77.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H8": { + "depth": 14.95, + "x": 77.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A9": { + "depth": 14.95, + "x": 86.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B9": { + "depth": 14.95, + "x": 86.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C9": { + "depth": 14.95, + "x": 86.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D9": { + "depth": 14.95, + "x": 86.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E9": { + "depth": 14.95, + "x": 86.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F9": { + "depth": 14.95, + "x": 86.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G9": { + "depth": 14.95, + "x": 86.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H9": { + "depth": 14.95, + "x": 86.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A10": { + "depth": 14.95, + "x": 95.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B10": { + "depth": 14.95, + "x": 95.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C10": { + "depth": 14.95, + "x": 95.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D10": { + "depth": 14.95, + "x": 95.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E10": { + "depth": 14.95, + "x": 95.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F10": { + "depth": 14.95, + "x": 95.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G10": { + "depth": 14.95, + "x": 95.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H10": { + "depth": 14.95, + "x": 95.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A11": { + "depth": 14.95, + "x": 104.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B11": { + "depth": 14.95, + "x": 104.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C11": { + "depth": 14.95, + "x": 104.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D11": { + "depth": 14.95, + "x": 104.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E11": { + "depth": 14.95, + "x": 104.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F11": { + "depth": 14.95, + "x": 104.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G11": { + "depth": 14.95, + "x": 104.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H11": { + "depth": 14.95, + "x": 104.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A12": { + "depth": 14.95, + "x": 113.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B12": { + "depth": 14.95, + "x": 113.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C12": { + "depth": 14.95, + "x": 113.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D12": { + "depth": 14.95, + "x": 113.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E12": { + "depth": 14.95, + "x": 113.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F12": { + "depth": 14.95, + "x": 113.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G12": { + "depth": 14.95, + "x": 113.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H12": { + "depth": 14.95, + "x": 113.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + } + }, + "groups": [ + { + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + "metadata": { "wellBottomShape": "v" } + } + ], + "allowedRoles": [], + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { "x": 0, "y": 0, "z": 10.95 }, + "opentrons_96_well_aluminum_block": { "x": 0, "y": 0, "z": 11.91 } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { "x": 0, "y": 0, "z": 3.54 }, + "thermocyclerModuleV2": { "x": 0, "y": 0, "z": 10.7 } + }, + "gripperOffsets": {}, + "gripHeightFromLabwareBottom": 10.0, + "gripForce": 9.0 + } + }, + "startedAt": "2023-11-29T20:18:30.381892+00:00", + "completedAt": "2023-11-29T20:18:30.386176+00:00" + }, + { + "id": "e2a3db1d-de53-45e0-869d-9b4548d92779", + "createdAt": "2023-11-29T20:18:30.386848+00:00", + "commandType": "loadModule", + "key": "1e6309efe859d5fca3cb5447d72d300e", + "status": "succeeded", + "params": { + "model": "magneticBlockV1", + "location": { "slotName": "C1" } + }, + "result": { + "moduleId": "dc2de112-b2b7-4811-9cf5-501f1fee6878", + "definition": { + "otSharedSchema": "module/schemas/2", + "moduleType": "magneticBlockType", + "model": "magneticBlockV1", + "labwareOffset": { "x": 0.0, "y": 0.0, "z": 38.0 }, + "dimensions": { "bareOverallHeight": 45.0, "overLabwareHeight": 0.0 }, + "calibrationPoint": { "x": 0.0, "y": 0.0, "z": 0.0 }, + "displayName": "Magnetic Block GEN1", + "quirks": [], + "slotTransforms": { + "ot2_standard": {}, + "ot2_short_trash": {}, + "ot3_standard": {} + }, + "compatibleWith": [], + "gripperOffsets": { + "default": { + "pickUpOffset": { "x": 0.0, "y": 0.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": 0.0, "z": 1.0 } + } + } + }, + "model": "magneticBlockV1" + }, + "startedAt": "2023-11-29T20:18:30.386949+00:00", + "completedAt": "2023-11-29T20:18:30.387566+00:00" + }, + { + "id": "9449461d-700d-4695-a1ee-0203c906e053", + "createdAt": "2023-11-29T20:18:30.388409+00:00", + "commandType": "loadLabware", + "key": "baedb322d7c51cc72846c6d1c9fce6fd", + "status": "succeeded", + "params": { + "location": { "slotName": "C2" }, + "loadName": "opentrons_flex_96_tiprack_50ul", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "labwareId": "e5b35230-f2df-4afa-b7c1-3b15c174733f", + "definition": { + "schemaVersion": 2, + "version": 1, + "namespace": "opentrons", + "metadata": { + "displayName": "Opentrons Flex 96 Tip Rack 50 \u00b5L", + "displayCategory": "tipRack", + "displayVolumeUnits": "\u00b5L", + "tags": [] + }, + "brand": { "brand": "Opentrons", "brandId": [] }, + "parameters": { + "format": "96Standard", + "quirks": [], + "isTiprack": true, + "tipLength": 57.9, + "tipOverlap": 10.5, + "loadName": "opentrons_flex_96_tiprack_50ul", + "isMagneticModuleCompatible": false + }, + "ordering": [ + ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], + ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], + ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], + ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], + ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], + ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], + ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], + ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], + ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"], + ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], + ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] + ], + "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "dimensions": { + "yDimension": 85.75, + "zDimension": 99, + "xDimension": 127.75 + }, + "wells": { + "A1": { + "depth": 97.5, + "x": 14.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B1": { + "depth": 97.5, + "x": 14.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C1": { + "depth": 97.5, + "x": 14.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D1": { + "depth": 97.5, + "x": 14.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E1": { + "depth": 97.5, + "x": 14.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F1": { + "depth": 97.5, + "x": 14.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G1": { + "depth": 97.5, + "x": 14.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H1": { + "depth": 97.5, + "x": 14.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A2": { + "depth": 97.5, + "x": 23.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B2": { + "depth": 97.5, + "x": 23.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C2": { + "depth": 97.5, + "x": 23.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D2": { + "depth": 97.5, + "x": 23.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E2": { + "depth": 97.5, + "x": 23.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F2": { + "depth": 97.5, + "x": 23.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G2": { + "depth": 97.5, + "x": 23.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H2": { + "depth": 97.5, + "x": 23.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A3": { + "depth": 97.5, + "x": 32.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B3": { + "depth": 97.5, + "x": 32.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C3": { + "depth": 97.5, + "x": 32.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D3": { + "depth": 97.5, + "x": 32.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E3": { + "depth": 97.5, + "x": 32.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F3": { + "depth": 97.5, + "x": 32.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G3": { + "depth": 97.5, + "x": 32.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H3": { + "depth": 97.5, + "x": 32.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A4": { + "depth": 97.5, + "x": 41.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B4": { + "depth": 97.5, + "x": 41.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C4": { + "depth": 97.5, + "x": 41.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D4": { + "depth": 97.5, + "x": 41.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E4": { + "depth": 97.5, + "x": 41.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F4": { + "depth": 97.5, + "x": 41.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G4": { + "depth": 97.5, + "x": 41.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H4": { + "depth": 97.5, + "x": 41.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A5": { + "depth": 97.5, + "x": 50.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B5": { + "depth": 97.5, + "x": 50.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C5": { + "depth": 97.5, + "x": 50.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D5": { + "depth": 97.5, + "x": 50.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E5": { + "depth": 97.5, + "x": 50.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F5": { + "depth": 97.5, + "x": 50.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G5": { + "depth": 97.5, + "x": 50.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H5": { + "depth": 97.5, + "x": 50.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A6": { + "depth": 97.5, + "x": 59.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B6": { + "depth": 97.5, + "x": 59.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C6": { + "depth": 97.5, + "x": 59.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D6": { + "depth": 97.5, + "x": 59.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E6": { + "depth": 97.5, + "x": 59.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F6": { + "depth": 97.5, + "x": 59.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G6": { + "depth": 97.5, + "x": 59.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H6": { + "depth": 97.5, + "x": 59.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A7": { + "depth": 97.5, + "x": 68.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B7": { + "depth": 97.5, + "x": 68.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C7": { + "depth": 97.5, + "x": 68.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D7": { + "depth": 97.5, + "x": 68.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E7": { + "depth": 97.5, + "x": 68.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F7": { + "depth": 97.5, + "x": 68.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G7": { + "depth": 97.5, + "x": 68.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H7": { + "depth": 97.5, + "x": 68.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A8": { + "depth": 97.5, + "x": 77.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B8": { + "depth": 97.5, + "x": 77.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C8": { + "depth": 97.5, + "x": 77.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D8": { + "depth": 97.5, + "x": 77.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E8": { + "depth": 97.5, + "x": 77.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F8": { + "depth": 97.5, + "x": 77.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G8": { + "depth": 97.5, + "x": 77.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H8": { + "depth": 97.5, + "x": 77.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A9": { + "depth": 97.5, + "x": 86.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B9": { + "depth": 97.5, + "x": 86.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C9": { + "depth": 97.5, + "x": 86.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D9": { + "depth": 97.5, + "x": 86.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E9": { + "depth": 97.5, + "x": 86.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F9": { + "depth": 97.5, + "x": 86.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G9": { + "depth": 97.5, + "x": 86.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H9": { + "depth": 97.5, + "x": 86.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A10": { + "depth": 97.5, + "x": 95.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B10": { + "depth": 97.5, + "x": 95.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C10": { + "depth": 97.5, + "x": 95.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D10": { + "depth": 97.5, + "x": 95.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E10": { + "depth": 97.5, + "x": 95.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F10": { + "depth": 97.5, + "x": 95.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G10": { + "depth": 97.5, + "x": 95.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H10": { + "depth": 97.5, + "x": 95.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A11": { + "depth": 97.5, + "x": 104.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B11": { + "depth": 97.5, + "x": 104.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C11": { + "depth": 97.5, + "x": 104.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D11": { + "depth": 97.5, + "x": 104.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E11": { + "depth": 97.5, + "x": 104.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F11": { + "depth": 97.5, + "x": 104.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G11": { + "depth": 97.5, + "x": 104.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H11": { + "depth": 97.5, + "x": 104.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A12": { + "depth": 97.5, + "x": 113.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B12": { + "depth": 97.5, + "x": 113.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C12": { + "depth": 97.5, + "x": 113.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D12": { + "depth": 97.5, + "x": 113.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E12": { + "depth": 97.5, + "x": 113.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F12": { + "depth": 97.5, + "x": 113.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G12": { + "depth": 97.5, + "x": 113.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H12": { + "depth": 97.5, + "x": 113.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + } + }, + "groups": [ + { + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + "metadata": {} + } + ], + "allowedRoles": [], + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { "x": 0, "y": 0, "z": 121 } + }, + "stackingOffsetWithModule": {}, + "gripperOffsets": {}, + "gripHeightFromLabwareBottom": 23.9, + "gripForce": 16.0 + } + }, + "startedAt": "2023-11-29T20:18:30.388479+00:00", + "completedAt": "2023-11-29T20:18:30.392702+00:00" + }, + { + "id": "8efc8f26-2e35-41ba-9a4f-005cba2f6472", + "createdAt": "2023-11-29T20:18:30.393855+00:00", + "commandType": "loadLabware", + "key": "d682f75533eeb4480a3f22f6e535858b", + "status": "succeeded", + "params": { + "location": { "slotName": "C3" }, + "loadName": "opentrons_flex_96_tiprack_50ul", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "labwareId": "d743c482-b98f-4d7f-8b1f-8193eff63a00", + "definition": { + "schemaVersion": 2, + "version": 1, + "namespace": "opentrons", + "metadata": { + "displayName": "Opentrons Flex 96 Tip Rack 50 \u00b5L", + "displayCategory": "tipRack", + "displayVolumeUnits": "\u00b5L", + "tags": [] + }, + "brand": { "brand": "Opentrons", "brandId": [] }, + "parameters": { + "format": "96Standard", + "quirks": [], + "isTiprack": true, + "tipLength": 57.9, + "tipOverlap": 10.5, + "loadName": "opentrons_flex_96_tiprack_50ul", + "isMagneticModuleCompatible": false + }, + "ordering": [ + ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], + ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], + ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], + ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], + ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], + ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], + ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], + ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], + ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"], + ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], + ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] + ], + "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "dimensions": { + "yDimension": 85.75, + "zDimension": 99, + "xDimension": 127.75 + }, + "wells": { + "A1": { + "depth": 97.5, + "x": 14.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B1": { + "depth": 97.5, + "x": 14.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C1": { + "depth": 97.5, + "x": 14.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D1": { + "depth": 97.5, + "x": 14.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E1": { + "depth": 97.5, + "x": 14.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F1": { + "depth": 97.5, + "x": 14.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G1": { + "depth": 97.5, + "x": 14.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H1": { + "depth": 97.5, + "x": 14.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A2": { + "depth": 97.5, + "x": 23.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B2": { + "depth": 97.5, + "x": 23.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C2": { + "depth": 97.5, + "x": 23.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D2": { + "depth": 97.5, + "x": 23.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E2": { + "depth": 97.5, + "x": 23.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F2": { + "depth": 97.5, + "x": 23.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G2": { + "depth": 97.5, + "x": 23.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H2": { + "depth": 97.5, + "x": 23.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A3": { + "depth": 97.5, + "x": 32.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B3": { + "depth": 97.5, + "x": 32.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C3": { + "depth": 97.5, + "x": 32.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D3": { + "depth": 97.5, + "x": 32.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E3": { + "depth": 97.5, + "x": 32.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F3": { + "depth": 97.5, + "x": 32.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G3": { + "depth": 97.5, + "x": 32.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H3": { + "depth": 97.5, + "x": 32.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A4": { + "depth": 97.5, + "x": 41.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B4": { + "depth": 97.5, + "x": 41.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C4": { + "depth": 97.5, + "x": 41.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D4": { + "depth": 97.5, + "x": 41.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E4": { + "depth": 97.5, + "x": 41.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F4": { + "depth": 97.5, + "x": 41.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G4": { + "depth": 97.5, + "x": 41.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H4": { + "depth": 97.5, + "x": 41.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A5": { + "depth": 97.5, + "x": 50.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B5": { + "depth": 97.5, + "x": 50.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C5": { + "depth": 97.5, + "x": 50.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D5": { + "depth": 97.5, + "x": 50.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E5": { + "depth": 97.5, + "x": 50.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F5": { + "depth": 97.5, + "x": 50.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G5": { + "depth": 97.5, + "x": 50.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H5": { + "depth": 97.5, + "x": 50.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A6": { + "depth": 97.5, + "x": 59.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B6": { + "depth": 97.5, + "x": 59.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C6": { + "depth": 97.5, + "x": 59.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D6": { + "depth": 97.5, + "x": 59.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E6": { + "depth": 97.5, + "x": 59.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F6": { + "depth": 97.5, + "x": 59.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G6": { + "depth": 97.5, + "x": 59.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H6": { + "depth": 97.5, + "x": 59.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A7": { + "depth": 97.5, + "x": 68.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B7": { + "depth": 97.5, + "x": 68.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C7": { + "depth": 97.5, + "x": 68.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D7": { + "depth": 97.5, + "x": 68.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E7": { + "depth": 97.5, + "x": 68.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F7": { + "depth": 97.5, + "x": 68.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G7": { + "depth": 97.5, + "x": 68.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H7": { + "depth": 97.5, + "x": 68.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A8": { + "depth": 97.5, + "x": 77.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B8": { + "depth": 97.5, + "x": 77.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C8": { + "depth": 97.5, + "x": 77.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D8": { + "depth": 97.5, + "x": 77.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E8": { + "depth": 97.5, + "x": 77.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F8": { + "depth": 97.5, + "x": 77.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G8": { + "depth": 97.5, + "x": 77.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H8": { + "depth": 97.5, + "x": 77.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A9": { + "depth": 97.5, + "x": 86.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B9": { + "depth": 97.5, + "x": 86.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C9": { + "depth": 97.5, + "x": 86.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D9": { + "depth": 97.5, + "x": 86.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E9": { + "depth": 97.5, + "x": 86.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F9": { + "depth": 97.5, + "x": 86.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G9": { + "depth": 97.5, + "x": 86.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H9": { + "depth": 97.5, + "x": 86.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A10": { + "depth": 97.5, + "x": 95.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B10": { + "depth": 97.5, + "x": 95.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C10": { + "depth": 97.5, + "x": 95.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D10": { + "depth": 97.5, + "x": 95.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E10": { + "depth": 97.5, + "x": 95.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F10": { + "depth": 97.5, + "x": 95.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G10": { + "depth": 97.5, + "x": 95.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H10": { + "depth": 97.5, + "x": 95.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A11": { + "depth": 97.5, + "x": 104.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B11": { + "depth": 97.5, + "x": 104.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C11": { + "depth": 97.5, + "x": 104.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D11": { + "depth": 97.5, + "x": 104.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E11": { + "depth": 97.5, + "x": 104.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F11": { + "depth": 97.5, + "x": 104.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G11": { + "depth": 97.5, + "x": 104.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H11": { + "depth": 97.5, + "x": 104.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "A12": { + "depth": 97.5, + "x": 113.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "B12": { + "depth": 97.5, + "x": 113.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "C12": { + "depth": 97.5, + "x": 113.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "D12": { + "depth": 97.5, + "x": 113.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "E12": { + "depth": 97.5, + "x": 113.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "F12": { + "depth": 97.5, + "x": 113.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "G12": { + "depth": 97.5, + "x": 113.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + }, + "H12": { + "depth": 97.5, + "x": 113.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 50, + "diameter": 5.58, + "shape": "circular" + } + }, + "groups": [ + { + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + "metadata": {} + } + ], + "allowedRoles": [], + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { "x": 0, "y": 0, "z": 121 } + }, + "stackingOffsetWithModule": {}, + "gripperOffsets": {}, + "gripHeightFromLabwareBottom": 23.9, + "gripForce": 16.0 + } + }, + "startedAt": "2023-11-29T20:18:30.393929+00:00", + "completedAt": "2023-11-29T20:18:30.394094+00:00" + }, + { + "id": "d2d879a6-c96c-4f6f-9086-f75527024e10", + "createdAt": "2023-11-29T20:18:30.395392+00:00", + "commandType": "loadModule", + "key": "67b07053ccbb15460592661e580d37bf", + "status": "succeeded", + "params": { + "model": "thermocyclerModuleV2", + "location": { "slotName": "B1" } + }, + "result": { + "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3", + "definition": { + "otSharedSchema": "module/schemas/2", + "moduleType": "thermocyclerModuleType", + "model": "thermocyclerModuleV2", + "labwareOffset": { "x": 0.0, "y": 68.8, "z": 108.96 }, + "dimensions": { + "bareOverallHeight": 98.0, + "overLabwareHeight": 0.0, + "lidHeight": 61.7 + }, + "calibrationPoint": { "x": 14.4, "y": 64.93, "z": 97.8 }, + "displayName": "Thermocycler Module GEN2", + "quirks": [], + "slotTransforms": { + "ot3_standard": { + "B1": { + "labwareOffset": [ + [1, 0, 0, -20.005], + [0, 1, 0, -0.84], + [0, 0, 1, -98], + [0, 0, 0, 1] + ], + "cornerOffsetFromSlot": [ + [1, 0, 0, -20.005], + [0, 1, 0, -0.84], + [0, 0, 1, -98], + [0, 0, 0, 1] + ] + } + } + }, + "compatibleWith": [], + "gripperOffsets": { + "default": { + "pickUpOffset": { "x": 0.0, "y": 0.0, "z": 4.6 }, + "dropOffset": { "x": 0.0, "y": 0.0, "z": 5.6 } + } + } + }, + "model": "thermocyclerModuleV2", + "serialNumber": "fake-serial-number-81cba3a2-6db2-4feb-85f3-c85417936919" + }, + "startedAt": "2023-11-29T20:18:30.395462+00:00", + "completedAt": "2023-11-29T20:18:30.396406+00:00" + }, + { + "id": "84d8cfd2-c65f-48a3-b3a6-2212c5f084c0", + "createdAt": "2023-11-29T20:18:30.397832+00:00", + "commandType": "loadLabware", + "key": "2379ae1633e4ad45e7448491cd31ebf6", + "status": "succeeded", + "params": { + "location": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "namespace": "opentrons", + "version": 2, + "displayName": "Sample Plate" + }, + "result": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "definition": { + "schemaVersion": 2, + "version": 2, + "namespace": "opentrons", + "metadata": { + "displayName": "Armadillo 96 Well Plate 200 \u00b5L PCR Full Skirt", + "displayCategory": "wellPlate", + "displayVolumeUnits": "\u00b5L", + "tags": [] + }, + "brand": { + "brand": "Thermo Scientific", + "brandId": ["AB2396"], + "links": [ + "https://www.fishersci.com/shop/products/armadillo-96-well-pcr-plate-1/AB2396" + ] + }, + "parameters": { + "format": "96Standard", + "isTiprack": false, + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "isMagneticModuleCompatible": true + }, + "ordering": [ + ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], + ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], + ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], + ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], + ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], + ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], + ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], + ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], + ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"], + ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], + ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] + ], + "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "dimensions": { + "yDimension": 85.48, + "zDimension": 16.0, + "xDimension": 127.76 + }, + "wells": { + "A1": { + "depth": 14.95, + "x": 14.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B1": { + "depth": 14.95, + "x": 14.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C1": { + "depth": 14.95, + "x": 14.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D1": { + "depth": 14.95, + "x": 14.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E1": { + "depth": 14.95, + "x": 14.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F1": { + "depth": 14.95, + "x": 14.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G1": { + "depth": 14.95, + "x": 14.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H1": { + "depth": 14.95, + "x": 14.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A2": { + "depth": 14.95, + "x": 23.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B2": { + "depth": 14.95, + "x": 23.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C2": { + "depth": 14.95, + "x": 23.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D2": { + "depth": 14.95, + "x": 23.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E2": { + "depth": 14.95, + "x": 23.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F2": { + "depth": 14.95, + "x": 23.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G2": { + "depth": 14.95, + "x": 23.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H2": { + "depth": 14.95, + "x": 23.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A3": { + "depth": 14.95, + "x": 32.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B3": { + "depth": 14.95, + "x": 32.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C3": { + "depth": 14.95, + "x": 32.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D3": { + "depth": 14.95, + "x": 32.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E3": { + "depth": 14.95, + "x": 32.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F3": { + "depth": 14.95, + "x": 32.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G3": { + "depth": 14.95, + "x": 32.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H3": { + "depth": 14.95, + "x": 32.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A4": { + "depth": 14.95, + "x": 41.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B4": { + "depth": 14.95, + "x": 41.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C4": { + "depth": 14.95, + "x": 41.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D4": { + "depth": 14.95, + "x": 41.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E4": { + "depth": 14.95, + "x": 41.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F4": { + "depth": 14.95, + "x": 41.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G4": { + "depth": 14.95, + "x": 41.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H4": { + "depth": 14.95, + "x": 41.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A5": { + "depth": 14.95, + "x": 50.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B5": { + "depth": 14.95, + "x": 50.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C5": { + "depth": 14.95, + "x": 50.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D5": { + "depth": 14.95, + "x": 50.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E5": { + "depth": 14.95, + "x": 50.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F5": { + "depth": 14.95, + "x": 50.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G5": { + "depth": 14.95, + "x": 50.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H5": { + "depth": 14.95, + "x": 50.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A6": { + "depth": 14.95, + "x": 59.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B6": { + "depth": 14.95, + "x": 59.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C6": { + "depth": 14.95, + "x": 59.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D6": { + "depth": 14.95, + "x": 59.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E6": { + "depth": 14.95, + "x": 59.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F6": { + "depth": 14.95, + "x": 59.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G6": { + "depth": 14.95, + "x": 59.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H6": { + "depth": 14.95, + "x": 59.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A7": { + "depth": 14.95, + "x": 68.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B7": { + "depth": 14.95, + "x": 68.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C7": { + "depth": 14.95, + "x": 68.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D7": { + "depth": 14.95, + "x": 68.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E7": { + "depth": 14.95, + "x": 68.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F7": { + "depth": 14.95, + "x": 68.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G7": { + "depth": 14.95, + "x": 68.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H7": { + "depth": 14.95, + "x": 68.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A8": { + "depth": 14.95, + "x": 77.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B8": { + "depth": 14.95, + "x": 77.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C8": { + "depth": 14.95, + "x": 77.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D8": { + "depth": 14.95, + "x": 77.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E8": { + "depth": 14.95, + "x": 77.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F8": { + "depth": 14.95, + "x": 77.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G8": { + "depth": 14.95, + "x": 77.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H8": { + "depth": 14.95, + "x": 77.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A9": { + "depth": 14.95, + "x": 86.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B9": { + "depth": 14.95, + "x": 86.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C9": { + "depth": 14.95, + "x": 86.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D9": { + "depth": 14.95, + "x": 86.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E9": { + "depth": 14.95, + "x": 86.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F9": { + "depth": 14.95, + "x": 86.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G9": { + "depth": 14.95, + "x": 86.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H9": { + "depth": 14.95, + "x": 86.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A10": { + "depth": 14.95, + "x": 95.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B10": { + "depth": 14.95, + "x": 95.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C10": { + "depth": 14.95, + "x": 95.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D10": { + "depth": 14.95, + "x": 95.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E10": { + "depth": 14.95, + "x": 95.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F10": { + "depth": 14.95, + "x": 95.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G10": { + "depth": 14.95, + "x": 95.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H10": { + "depth": 14.95, + "x": 95.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A11": { + "depth": 14.95, + "x": 104.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B11": { + "depth": 14.95, + "x": 104.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C11": { + "depth": 14.95, + "x": 104.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D11": { + "depth": 14.95, + "x": 104.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E11": { + "depth": 14.95, + "x": 104.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F11": { + "depth": 14.95, + "x": 104.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G11": { + "depth": 14.95, + "x": 104.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H11": { + "depth": 14.95, + "x": 104.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "A12": { + "depth": 14.95, + "x": 113.38, + "y": 74.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "B12": { + "depth": 14.95, + "x": 113.38, + "y": 65.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "C12": { + "depth": 14.95, + "x": 113.38, + "y": 56.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "D12": { + "depth": 14.95, + "x": 113.38, + "y": 47.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "E12": { + "depth": 14.95, + "x": 113.38, + "y": 38.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "F12": { + "depth": 14.95, + "x": 113.38, + "y": 29.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "G12": { + "depth": 14.95, + "x": 113.38, + "y": 20.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + }, + "H12": { + "depth": 14.95, + "x": 113.38, + "y": 11.24, + "z": 1.05, + "totalLiquidVolume": 200, + "diameter": 5.5, + "shape": "circular" + } + }, + "groups": [ + { + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + "metadata": { "wellBottomShape": "v" } + } + ], + "allowedRoles": [], + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { "x": 0, "y": 0, "z": 10.95 }, + "opentrons_96_well_aluminum_block": { "x": 0, "y": 0, "z": 11.91 } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { "x": 0, "y": 0, "z": 3.54 }, + "thermocyclerModuleV2": { "x": 0, "y": 0, "z": 10.7 } + }, + "gripperOffsets": {}, + "gripHeightFromLabwareBottom": 10.0, + "gripForce": 9.0 + } + }, + "startedAt": "2023-11-29T20:18:30.397966+00:00", + "completedAt": "2023-11-29T20:18:30.398167+00:00" + }, + { + "id": "95ac8e03-3298-420b-bd1d-76bdb7a1930a", + "createdAt": "2023-11-29T20:18:30.398913+00:00", + "commandType": "loadLabware", + "key": "ff4ac0edbecb645d4a8c14edd6ed3364", + "status": "succeeded", + "params": { + "location": { "slotName": "B2" }, + "loadName": "opentrons_flex_96_tiprack_200ul", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "definition": { + "schemaVersion": 2, + "version": 1, + "namespace": "opentrons", + "metadata": { + "displayName": "Opentrons Flex 96 Tip Rack 200 \u00b5L", + "displayCategory": "tipRack", + "displayVolumeUnits": "\u00b5L", + "tags": [] + }, + "brand": { "brand": "Opentrons", "brandId": [] }, + "parameters": { + "format": "96Standard", + "quirks": [], + "isTiprack": true, + "tipLength": 58.35, + "tipOverlap": 10.5, + "loadName": "opentrons_flex_96_tiprack_200ul", + "isMagneticModuleCompatible": false + }, + "ordering": [ + ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], + ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], + ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], + ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], + ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], + ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], + ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], + ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], + ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"], + ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], + ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] + ], + "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "dimensions": { + "yDimension": 85.75, + "zDimension": 99, + "xDimension": 127.75 + }, + "wells": { + "A1": { + "depth": 97.5, + "x": 14.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B1": { + "depth": 97.5, + "x": 14.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C1": { + "depth": 97.5, + "x": 14.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D1": { + "depth": 97.5, + "x": 14.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E1": { + "depth": 97.5, + "x": 14.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F1": { + "depth": 97.5, + "x": 14.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G1": { + "depth": 97.5, + "x": 14.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H1": { + "depth": 97.5, + "x": 14.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A2": { + "depth": 97.5, + "x": 23.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B2": { + "depth": 97.5, + "x": 23.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C2": { + "depth": 97.5, + "x": 23.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D2": { + "depth": 97.5, + "x": 23.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E2": { + "depth": 97.5, + "x": 23.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F2": { + "depth": 97.5, + "x": 23.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G2": { + "depth": 97.5, + "x": 23.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H2": { + "depth": 97.5, + "x": 23.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A3": { + "depth": 97.5, + "x": 32.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B3": { + "depth": 97.5, + "x": 32.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C3": { + "depth": 97.5, + "x": 32.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D3": { + "depth": 97.5, + "x": 32.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E3": { + "depth": 97.5, + "x": 32.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F3": { + "depth": 97.5, + "x": 32.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G3": { + "depth": 97.5, + "x": 32.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H3": { + "depth": 97.5, + "x": 32.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A4": { + "depth": 97.5, + "x": 41.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B4": { + "depth": 97.5, + "x": 41.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C4": { + "depth": 97.5, + "x": 41.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D4": { + "depth": 97.5, + "x": 41.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E4": { + "depth": 97.5, + "x": 41.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F4": { + "depth": 97.5, + "x": 41.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G4": { + "depth": 97.5, + "x": 41.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H4": { + "depth": 97.5, + "x": 41.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A5": { + "depth": 97.5, + "x": 50.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B5": { + "depth": 97.5, + "x": 50.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C5": { + "depth": 97.5, + "x": 50.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D5": { + "depth": 97.5, + "x": 50.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E5": { + "depth": 97.5, + "x": 50.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F5": { + "depth": 97.5, + "x": 50.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G5": { + "depth": 97.5, + "x": 50.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H5": { + "depth": 97.5, + "x": 50.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A6": { + "depth": 97.5, + "x": 59.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B6": { + "depth": 97.5, + "x": 59.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C6": { + "depth": 97.5, + "x": 59.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D6": { + "depth": 97.5, + "x": 59.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E6": { + "depth": 97.5, + "x": 59.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F6": { + "depth": 97.5, + "x": 59.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G6": { + "depth": 97.5, + "x": 59.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H6": { + "depth": 97.5, + "x": 59.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A7": { + "depth": 97.5, + "x": 68.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B7": { + "depth": 97.5, + "x": 68.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C7": { + "depth": 97.5, + "x": 68.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D7": { + "depth": 97.5, + "x": 68.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E7": { + "depth": 97.5, + "x": 68.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F7": { + "depth": 97.5, + "x": 68.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G7": { + "depth": 97.5, + "x": 68.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H7": { + "depth": 97.5, + "x": 68.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A8": { + "depth": 97.5, + "x": 77.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B8": { + "depth": 97.5, + "x": 77.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C8": { + "depth": 97.5, + "x": 77.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D8": { + "depth": 97.5, + "x": 77.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E8": { + "depth": 97.5, + "x": 77.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F8": { + "depth": 97.5, + "x": 77.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G8": { + "depth": 97.5, + "x": 77.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H8": { + "depth": 97.5, + "x": 77.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A9": { + "depth": 97.5, + "x": 86.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B9": { + "depth": 97.5, + "x": 86.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C9": { + "depth": 97.5, + "x": 86.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D9": { + "depth": 97.5, + "x": 86.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E9": { + "depth": 97.5, + "x": 86.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F9": { + "depth": 97.5, + "x": 86.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G9": { + "depth": 97.5, + "x": 86.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H9": { + "depth": 97.5, + "x": 86.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A10": { + "depth": 97.5, + "x": 95.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B10": { + "depth": 97.5, + "x": 95.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C10": { + "depth": 97.5, + "x": 95.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D10": { + "depth": 97.5, + "x": 95.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E10": { + "depth": 97.5, + "x": 95.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F10": { + "depth": 97.5, + "x": 95.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G10": { + "depth": 97.5, + "x": 95.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H10": { + "depth": 97.5, + "x": 95.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A11": { + "depth": 97.5, + "x": 104.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B11": { + "depth": 97.5, + "x": 104.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C11": { + "depth": 97.5, + "x": 104.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D11": { + "depth": 97.5, + "x": 104.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E11": { + "depth": 97.5, + "x": 104.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F11": { + "depth": 97.5, + "x": 104.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G11": { + "depth": 97.5, + "x": 104.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H11": { + "depth": 97.5, + "x": 104.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A12": { + "depth": 97.5, + "x": 113.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B12": { + "depth": 97.5, + "x": 113.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C12": { + "depth": 97.5, + "x": 113.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D12": { + "depth": 97.5, + "x": 113.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E12": { + "depth": 97.5, + "x": 113.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F12": { + "depth": 97.5, + "x": 113.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G12": { + "depth": 97.5, + "x": 113.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H12": { + "depth": 97.5, + "x": 113.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + } + }, + "groups": [ + { + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + "metadata": {} + } + ], + "allowedRoles": [], + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { "x": 0, "y": 0, "z": 121 } + }, + "stackingOffsetWithModule": {}, + "gripperOffsets": {}, + "gripHeightFromLabwareBottom": 23.9, + "gripForce": 16.0 + } + }, + "startedAt": "2023-11-29T20:18:30.398982+00:00", + "completedAt": "2023-11-29T20:18:30.403134+00:00" + }, + { + "id": "66e8372d-b94b-41ea-a7c3-df4fbe3cd805", + "createdAt": "2023-11-29T20:18:30.404621+00:00", + "commandType": "loadLabware", + "key": "5863774b2dd06b395876e2a2750a7d51", + "status": "succeeded", + "params": { + "location": { "slotName": "B3" }, + "loadName": "opentrons_flex_96_tiprack_200ul", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "definition": { + "schemaVersion": 2, + "version": 1, + "namespace": "opentrons", + "metadata": { + "displayName": "Opentrons Flex 96 Tip Rack 200 \u00b5L", + "displayCategory": "tipRack", + "displayVolumeUnits": "\u00b5L", + "tags": [] + }, + "brand": { "brand": "Opentrons", "brandId": [] }, + "parameters": { + "format": "96Standard", + "quirks": [], + "isTiprack": true, + "tipLength": 58.35, + "tipOverlap": 10.5, + "loadName": "opentrons_flex_96_tiprack_200ul", + "isMagneticModuleCompatible": false + }, + "ordering": [ + ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], + ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], + ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], + ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], + ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], + ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], + ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], + ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], + ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"], + ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], + ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] + ], + "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "dimensions": { + "yDimension": 85.75, + "zDimension": 99, + "xDimension": 127.75 + }, + "wells": { + "A1": { + "depth": 97.5, + "x": 14.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B1": { + "depth": 97.5, + "x": 14.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C1": { + "depth": 97.5, + "x": 14.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D1": { + "depth": 97.5, + "x": 14.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E1": { + "depth": 97.5, + "x": 14.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F1": { + "depth": 97.5, + "x": 14.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G1": { + "depth": 97.5, + "x": 14.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H1": { + "depth": 97.5, + "x": 14.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A2": { + "depth": 97.5, + "x": 23.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B2": { + "depth": 97.5, + "x": 23.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C2": { + "depth": 97.5, + "x": 23.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D2": { + "depth": 97.5, + "x": 23.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E2": { + "depth": 97.5, + "x": 23.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F2": { + "depth": 97.5, + "x": 23.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G2": { + "depth": 97.5, + "x": 23.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H2": { + "depth": 97.5, + "x": 23.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A3": { + "depth": 97.5, + "x": 32.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B3": { + "depth": 97.5, + "x": 32.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C3": { + "depth": 97.5, + "x": 32.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D3": { + "depth": 97.5, + "x": 32.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E3": { + "depth": 97.5, + "x": 32.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F3": { + "depth": 97.5, + "x": 32.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G3": { + "depth": 97.5, + "x": 32.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H3": { + "depth": 97.5, + "x": 32.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A4": { + "depth": 97.5, + "x": 41.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B4": { + "depth": 97.5, + "x": 41.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C4": { + "depth": 97.5, + "x": 41.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D4": { + "depth": 97.5, + "x": 41.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E4": { + "depth": 97.5, + "x": 41.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F4": { + "depth": 97.5, + "x": 41.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G4": { + "depth": 97.5, + "x": 41.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H4": { + "depth": 97.5, + "x": 41.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A5": { + "depth": 97.5, + "x": 50.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B5": { + "depth": 97.5, + "x": 50.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C5": { + "depth": 97.5, + "x": 50.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D5": { + "depth": 97.5, + "x": 50.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E5": { + "depth": 97.5, + "x": 50.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F5": { + "depth": 97.5, + "x": 50.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G5": { + "depth": 97.5, + "x": 50.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H5": { + "depth": 97.5, + "x": 50.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A6": { + "depth": 97.5, + "x": 59.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B6": { + "depth": 97.5, + "x": 59.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C6": { + "depth": 97.5, + "x": 59.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D6": { + "depth": 97.5, + "x": 59.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E6": { + "depth": 97.5, + "x": 59.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F6": { + "depth": 97.5, + "x": 59.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G6": { + "depth": 97.5, + "x": 59.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H6": { + "depth": 97.5, + "x": 59.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A7": { + "depth": 97.5, + "x": 68.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B7": { + "depth": 97.5, + "x": 68.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C7": { + "depth": 97.5, + "x": 68.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D7": { + "depth": 97.5, + "x": 68.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E7": { + "depth": 97.5, + "x": 68.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F7": { + "depth": 97.5, + "x": 68.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G7": { + "depth": 97.5, + "x": 68.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H7": { + "depth": 97.5, + "x": 68.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A8": { + "depth": 97.5, + "x": 77.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B8": { + "depth": 97.5, + "x": 77.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C8": { + "depth": 97.5, + "x": 77.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D8": { + "depth": 97.5, + "x": 77.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E8": { + "depth": 97.5, + "x": 77.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F8": { + "depth": 97.5, + "x": 77.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G8": { + "depth": 97.5, + "x": 77.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H8": { + "depth": 97.5, + "x": 77.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A9": { + "depth": 97.5, + "x": 86.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B9": { + "depth": 97.5, + "x": 86.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C9": { + "depth": 97.5, + "x": 86.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D9": { + "depth": 97.5, + "x": 86.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E9": { + "depth": 97.5, + "x": 86.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F9": { + "depth": 97.5, + "x": 86.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G9": { + "depth": 97.5, + "x": 86.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H9": { + "depth": 97.5, + "x": 86.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A10": { + "depth": 97.5, + "x": 95.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B10": { + "depth": 97.5, + "x": 95.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C10": { + "depth": 97.5, + "x": 95.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D10": { + "depth": 97.5, + "x": 95.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E10": { + "depth": 97.5, + "x": 95.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F10": { + "depth": 97.5, + "x": 95.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G10": { + "depth": 97.5, + "x": 95.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H10": { + "depth": 97.5, + "x": 95.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A11": { + "depth": 97.5, + "x": 104.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B11": { + "depth": 97.5, + "x": 104.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C11": { + "depth": 97.5, + "x": 104.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D11": { + "depth": 97.5, + "x": 104.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E11": { + "depth": 97.5, + "x": 104.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F11": { + "depth": 97.5, + "x": 104.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G11": { + "depth": 97.5, + "x": 104.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H11": { + "depth": 97.5, + "x": 104.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A12": { + "depth": 97.5, + "x": 113.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B12": { + "depth": 97.5, + "x": 113.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C12": { + "depth": 97.5, + "x": 113.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D12": { + "depth": 97.5, + "x": 113.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E12": { + "depth": 97.5, + "x": 113.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F12": { + "depth": 97.5, + "x": 113.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G12": { + "depth": 97.5, + "x": 113.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H12": { + "depth": 97.5, + "x": 113.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + } + }, + "groups": [ + { + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + "metadata": {} + } + ], + "allowedRoles": [], + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { "x": 0, "y": 0, "z": 121 } + }, + "stackingOffsetWithModule": {}, + "gripperOffsets": {}, + "gripHeightFromLabwareBottom": 23.9, + "gripForce": 16.0 + } + }, + "startedAt": "2023-11-29T20:18:30.404684+00:00", + "completedAt": "2023-11-29T20:18:30.404862+00:00" + }, + { + "id": "7dd9c210-23d5-4ca8-b78b-c963072d43d8", + "createdAt": "2023-11-29T20:18:30.406117+00:00", + "commandType": "loadLabware", + "key": "039bd467544d8943a2a4f206e7be94b0", + "status": "succeeded", + "params": { + "location": { "slotName": "A2" }, + "loadName": "opentrons_flex_96_tiprack_200ul", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "definition": { + "schemaVersion": 2, + "version": 1, + "namespace": "opentrons", + "metadata": { + "displayName": "Opentrons Flex 96 Tip Rack 200 \u00b5L", + "displayCategory": "tipRack", + "displayVolumeUnits": "\u00b5L", + "tags": [] + }, + "brand": { "brand": "Opentrons", "brandId": [] }, + "parameters": { + "format": "96Standard", + "quirks": [], + "isTiprack": true, + "tipLength": 58.35, + "tipOverlap": 10.5, + "loadName": "opentrons_flex_96_tiprack_200ul", + "isMagneticModuleCompatible": false + }, + "ordering": [ + ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], + ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], + ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], + ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], + ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], + ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], + ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], + ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], + ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"], + ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], + ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] + ], + "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "dimensions": { + "yDimension": 85.75, + "zDimension": 99, + "xDimension": 127.75 + }, + "wells": { + "A1": { + "depth": 97.5, + "x": 14.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B1": { + "depth": 97.5, + "x": 14.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C1": { + "depth": 97.5, + "x": 14.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D1": { + "depth": 97.5, + "x": 14.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E1": { + "depth": 97.5, + "x": 14.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F1": { + "depth": 97.5, + "x": 14.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G1": { + "depth": 97.5, + "x": 14.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H1": { + "depth": 97.5, + "x": 14.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A2": { + "depth": 97.5, + "x": 23.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B2": { + "depth": 97.5, + "x": 23.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C2": { + "depth": 97.5, + "x": 23.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D2": { + "depth": 97.5, + "x": 23.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E2": { + "depth": 97.5, + "x": 23.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F2": { + "depth": 97.5, + "x": 23.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G2": { + "depth": 97.5, + "x": 23.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H2": { + "depth": 97.5, + "x": 23.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A3": { + "depth": 97.5, + "x": 32.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B3": { + "depth": 97.5, + "x": 32.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C3": { + "depth": 97.5, + "x": 32.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D3": { + "depth": 97.5, + "x": 32.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E3": { + "depth": 97.5, + "x": 32.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F3": { + "depth": 97.5, + "x": 32.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G3": { + "depth": 97.5, + "x": 32.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H3": { + "depth": 97.5, + "x": 32.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A4": { + "depth": 97.5, + "x": 41.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B4": { + "depth": 97.5, + "x": 41.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C4": { + "depth": 97.5, + "x": 41.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D4": { + "depth": 97.5, + "x": 41.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E4": { + "depth": 97.5, + "x": 41.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F4": { + "depth": 97.5, + "x": 41.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G4": { + "depth": 97.5, + "x": 41.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H4": { + "depth": 97.5, + "x": 41.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A5": { + "depth": 97.5, + "x": 50.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B5": { + "depth": 97.5, + "x": 50.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C5": { + "depth": 97.5, + "x": 50.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D5": { + "depth": 97.5, + "x": 50.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E5": { + "depth": 97.5, + "x": 50.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F5": { + "depth": 97.5, + "x": 50.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G5": { + "depth": 97.5, + "x": 50.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H5": { + "depth": 97.5, + "x": 50.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A6": { + "depth": 97.5, + "x": 59.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B6": { + "depth": 97.5, + "x": 59.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C6": { + "depth": 97.5, + "x": 59.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D6": { + "depth": 97.5, + "x": 59.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E6": { + "depth": 97.5, + "x": 59.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F6": { + "depth": 97.5, + "x": 59.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G6": { + "depth": 97.5, + "x": 59.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H6": { + "depth": 97.5, + "x": 59.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A7": { + "depth": 97.5, + "x": 68.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B7": { + "depth": 97.5, + "x": 68.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C7": { + "depth": 97.5, + "x": 68.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D7": { + "depth": 97.5, + "x": 68.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E7": { + "depth": 97.5, + "x": 68.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F7": { + "depth": 97.5, + "x": 68.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G7": { + "depth": 97.5, + "x": 68.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H7": { + "depth": 97.5, + "x": 68.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A8": { + "depth": 97.5, + "x": 77.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B8": { + "depth": 97.5, + "x": 77.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C8": { + "depth": 97.5, + "x": 77.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D8": { + "depth": 97.5, + "x": 77.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E8": { + "depth": 97.5, + "x": 77.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F8": { + "depth": 97.5, + "x": 77.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G8": { + "depth": 97.5, + "x": 77.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H8": { + "depth": 97.5, + "x": 77.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A9": { + "depth": 97.5, + "x": 86.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B9": { + "depth": 97.5, + "x": 86.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C9": { + "depth": 97.5, + "x": 86.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D9": { + "depth": 97.5, + "x": 86.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E9": { + "depth": 97.5, + "x": 86.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F9": { + "depth": 97.5, + "x": 86.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G9": { + "depth": 97.5, + "x": 86.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H9": { + "depth": 97.5, + "x": 86.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A10": { + "depth": 97.5, + "x": 95.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B10": { + "depth": 97.5, + "x": 95.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C10": { + "depth": 97.5, + "x": 95.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D10": { + "depth": 97.5, + "x": 95.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E10": { + "depth": 97.5, + "x": 95.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F10": { + "depth": 97.5, + "x": 95.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G10": { + "depth": 97.5, + "x": 95.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H10": { + "depth": 97.5, + "x": 95.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A11": { + "depth": 97.5, + "x": 104.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B11": { + "depth": 97.5, + "x": 104.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C11": { + "depth": 97.5, + "x": 104.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D11": { + "depth": 97.5, + "x": 104.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E11": { + "depth": 97.5, + "x": 104.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F11": { + "depth": 97.5, + "x": 104.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G11": { + "depth": 97.5, + "x": 104.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H11": { + "depth": 97.5, + "x": 104.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "A12": { + "depth": 97.5, + "x": 113.38, + "y": 74.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "B12": { + "depth": 97.5, + "x": 113.38, + "y": 65.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "C12": { + "depth": 97.5, + "x": 113.38, + "y": 56.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "D12": { + "depth": 97.5, + "x": 113.38, + "y": 47.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "E12": { + "depth": 97.5, + "x": 113.38, + "y": 38.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "F12": { + "depth": 97.5, + "x": 113.38, + "y": 29.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "G12": { + "depth": 97.5, + "x": 113.38, + "y": 20.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + }, + "H12": { + "depth": 97.5, + "x": 113.38, + "y": 11.38, + "z": 1.5, + "totalLiquidVolume": 200, + "diameter": 5.59, + "shape": "circular" + } + }, + "groups": [ + { + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + "metadata": {} + } + ], + "allowedRoles": [], + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { "x": 0, "y": 0, "z": 121 } + }, + "stackingOffsetWithModule": {}, + "gripperOffsets": {}, + "gripHeightFromLabwareBottom": 23.9, + "gripForce": 16.0 + } + }, + "startedAt": "2023-11-29T20:18:30.406199+00:00", + "completedAt": "2023-11-29T20:18:30.406401+00:00" + }, + { + "id": "27c4612f-2a97-4921-979d-f37cc188bc4a", + "createdAt": "2023-11-29T20:18:30.409253+00:00", + "commandType": "loadLiquid", + "key": "45f32b43846a55a22b19d4039ed53c48", + "status": "succeeded", + "params": { + "liquidId": "0901b8fb-ab54-437d-bce8-669ab9f78186", + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "volumeByWell": { "A1": 594.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.409317+00:00", + "completedAt": "2023-11-29T20:18:30.409389+00:00" + }, + { + "id": "2d02a802-ce12-4f6e-8f3e-753b6bcaf7d7", + "createdAt": "2023-11-29T20:18:30.409639+00:00", + "commandType": "loadLiquid", + "key": "23aeccf28bf334a04605eaedbd1298b9", + "status": "succeeded", + "params": { + "liquidId": "39cb0aae-11c7-40f4-a4d0-f68bed1bc254", + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "volumeByWell": { "A3": 2970.0000000000005 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.409689+00:00", + "completedAt": "2023-11-29T20:18:30.409744+00:00" + }, + { + "id": "d44abdc9-ca5a-4d25-8842-cdf59dde4542", + "createdAt": "2023-11-29T20:18:30.409997+00:00", + "commandType": "loadLiquid", + "key": "861a50519e7f71679135ff61253d35e4", + "status": "succeeded", + "params": { + "liquidId": "39cb0aae-11c7-40f4-a4d0-f68bed1bc254", + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "volumeByWell": { "A4": 2970.0000000000005 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.410072+00:00", + "completedAt": "2023-11-29T20:18:30.410134+00:00" + }, + { + "id": "79e7bdf6-f8ef-4b1e-b6eb-c6e604e450b0", + "createdAt": "2023-11-29T20:18:30.410316+00:00", + "commandType": "loadLiquid", + "key": "f248898932bb9368b5f674d110b0580e", + "status": "succeeded", + "params": { + "liquidId": "39cb0aae-11c7-40f4-a4d0-f68bed1bc254", + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "volumeByWell": { "A5": 2970.0000000000005 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.410366+00:00", + "completedAt": "2023-11-29T20:18:30.410648+00:00" + }, + { + "id": "6b6900dc-b442-47dc-8024-213f390bcb47", + "createdAt": "2023-11-29T20:18:30.410857+00:00", + "commandType": "loadLiquid", + "key": "8104272c85caa8c6ef32a6f741bf6597", + "status": "succeeded", + "params": { + "liquidId": "6d5925a9-c9e8-40d9-bb9a-316c849b1841", + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "volumeByWell": { "A7": 313.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.410916+00:00", + "completedAt": "2023-11-29T20:18:30.410974+00:00" + }, + { + "id": "83f03f8f-099d-4b46-9e82-c433b1502f6c", + "createdAt": "2023-11-29T20:18:30.411144+00:00", + "commandType": "loadLiquid", + "key": "6e7c27bdcf59e553df5a0f0a25439fc9", + "status": "succeeded", + "params": { + "liquidId": "fdc777d0-5c0b-4a15-bb17-c9ed1b5bf6e1", + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "volumeByWell": { "A10": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.411194+00:00", + "completedAt": "2023-11-29T20:18:30.411288+00:00" + }, + { + "id": "c909a328-f6cc-42aa-8ef8-8fd45c958c4b", + "createdAt": "2023-11-29T20:18:30.411569+00:00", + "commandType": "loadLiquid", + "key": "211c9bb762be1128dfcbd2a3ae32156d", + "status": "succeeded", + "params": { + "liquidId": "fdc777d0-5c0b-4a15-bb17-c9ed1b5bf6e1", + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "volumeByWell": { "A11": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.411626+00:00", + "completedAt": "2023-11-29T20:18:30.411690+00:00" + }, + { + "id": "865516ce-a5fd-428b-bb9b-63d94f6ba05b", + "createdAt": "2023-11-29T20:18:30.411925+00:00", + "commandType": "loadLiquid", + "key": "eae14cf4c41f4fad16ea544c8ebacca4", + "status": "succeeded", + "params": { + "liquidId": "fdc777d0-5c0b-4a15-bb17-c9ed1b5bf6e1", + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "volumeByWell": { "A12": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.412021+00:00", + "completedAt": "2023-11-29T20:18:30.412088+00:00" + }, + { + "id": "77edf8bd-8a77-4f9c-ad39-7956a96b21cf", + "createdAt": "2023-11-29T20:18:30.412275+00:00", + "commandType": "loadLiquid", + "key": "b658364d2b17d11fb356a4e7adb6172d", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "A1": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.412327+00:00", + "completedAt": "2023-11-29T20:18:30.412377+00:00" + }, + { + "id": "3c012cb8-5214-42a2-9386-e938136ea0ce", + "createdAt": "2023-11-29T20:18:30.412566+00:00", + "commandType": "loadLiquid", + "key": "7fc36a3ccb4b318cd42ac8522de0fe9c", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "A4": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.412646+00:00", + "completedAt": "2023-11-29T20:18:30.412711+00:00" + }, + { + "id": "908dafc6-c64d-43e7-9ba2-a4217940c615", + "createdAt": "2023-11-29T20:18:30.412895+00:00", + "commandType": "loadLiquid", + "key": "e4bce222df0019b99bf980579712f84b", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "A7": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.412953+00:00", + "completedAt": "2023-11-29T20:18:30.413010+00:00" + }, + { + "id": "67e99086-bcf3-4808-8b07-1ca8a50e499f", + "createdAt": "2023-11-29T20:18:30.413196+00:00", + "commandType": "loadLiquid", + "key": "f1670d48c8ac5910e843e24e9057c949", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "A10": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.413248+00:00", + "completedAt": "2023-11-29T20:18:30.413295+00:00" + }, + { + "id": "a96231b7-6203-4647-a255-439d33f37403", + "createdAt": "2023-11-29T20:18:30.413469+00:00", + "commandType": "loadLiquid", + "key": "c30f3960a3a6012587f45f8d0212fc16", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "A7": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.413516+00:00", + "completedAt": "2023-11-29T20:18:30.413563+00:00" + }, + { + "id": "491a6cc4-eb3e-4426-b901-cbff7a69c646", + "createdAt": "2023-11-29T20:18:30.413723+00:00", + "commandType": "loadLiquid", + "key": "5853f3df5cf647df889db51ce223fc8e", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "B1": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.413768+00:00", + "completedAt": "2023-11-29T20:18:30.413814+00:00" + }, + { + "id": "34f36fb8-2d18-4c6f-a9ce-5b4e8ad3d5ef", + "createdAt": "2023-11-29T20:18:30.414003+00:00", + "commandType": "loadLiquid", + "key": "9dddfb72b16c223df9ee58e09ba75c09", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "B4": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.414113+00:00", + "completedAt": "2023-11-29T20:18:30.414200+00:00" + }, + { + "id": "396bacb3-ad06-4075-bc0c-cedaa805c232", + "createdAt": "2023-11-29T20:18:30.414929+00:00", + "commandType": "loadLiquid", + "key": "a7323bb32c06cfe102c20c6c04683daa", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "B7": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.415041+00:00", + "completedAt": "2023-11-29T20:18:30.415114+00:00" + }, + { + "id": "5622e937-e338-4bdb-9191-660c7e3461df", + "createdAt": "2023-11-29T20:18:30.415434+00:00", + "commandType": "loadLiquid", + "key": "28fe9293183b4634cf921ade99f6bd8b", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "B10": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.415540+00:00", + "completedAt": "2023-11-29T20:18:30.415624+00:00" + }, + { + "id": "14347ce0-2fa8-4d8e-9243-334273c5278a", + "createdAt": "2023-11-29T20:18:30.415866+00:00", + "commandType": "loadLiquid", + "key": "4cb756fb44d151201e46434bead21e29", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "B7": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.415914+00:00", + "completedAt": "2023-11-29T20:18:30.415962+00:00" + }, + { + "id": "7ff50743-a49c-4447-a01b-faf3a6e50ce1", + "createdAt": "2023-11-29T20:18:30.416284+00:00", + "commandType": "loadLiquid", + "key": "c0e145cd3e5e01e48d2f7e5f867e6030", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "C1": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.416362+00:00", + "completedAt": "2023-11-29T20:18:30.416432+00:00" + }, + { + "id": "f85069b9-10ac-47aa-8972-0f3d0f513436", + "createdAt": "2023-11-29T20:18:30.416662+00:00", + "commandType": "loadLiquid", + "key": "971bf0d74e09784d2eaa67f93e230ef5", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "C4": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.416754+00:00", + "completedAt": "2023-11-29T20:18:30.416817+00:00" + }, + { + "id": "bacbc70e-4e27-4454-92e4-5626235dc662", + "createdAt": "2023-11-29T20:18:30.417017+00:00", + "commandType": "loadLiquid", + "key": "e23a5c707af11f54533cf4c7fc7bf2ce", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "C7": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.417077+00:00", + "completedAt": "2023-11-29T20:18:30.417134+00:00" + }, + { + "id": "7db2b6f2-4e86-44de-a483-85dba1dd8f7a", + "createdAt": "2023-11-29T20:18:30.417383+00:00", + "commandType": "loadLiquid", + "key": "97664e8fe1704a4f0e34279fae800301", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "C10": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.417461+00:00", + "completedAt": "2023-11-29T20:18:30.417534+00:00" + }, + { + "id": "d2c6a8db-3105-4f5d-8fba-75a2ee984df1", + "createdAt": "2023-11-29T20:18:30.417810+00:00", + "commandType": "loadLiquid", + "key": "e807f457c0b51f02e93d005e0535e473", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "C7": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.417882+00:00", + "completedAt": "2023-11-29T20:18:30.417948+00:00" + }, + { + "id": "4f523a23-1a5b-4d8a-8d76-0aa3dbd987ad", + "createdAt": "2023-11-29T20:18:30.418189+00:00", + "commandType": "loadLiquid", + "key": "f8bbf436ac07e41f1dcfe394c5c3e710", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "D1": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.418246+00:00", + "completedAt": "2023-11-29T20:18:30.418297+00:00" + }, + { + "id": "d351331f-2aff-4017-9690-5f3152e45992", + "createdAt": "2023-11-29T20:18:30.418515+00:00", + "commandType": "loadLiquid", + "key": "249da4f3b22f06bd2c847c098fb24dd4", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "D4": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.418604+00:00", + "completedAt": "2023-11-29T20:18:30.418673+00:00" + }, + { + "id": "e08570f5-3309-48f0-b9d6-6731f83e78ba", + "createdAt": "2023-11-29T20:18:30.418882+00:00", + "commandType": "loadLiquid", + "key": "ed395c8ad5710f19e0d1900d56597ff5", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "D7": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.418934+00:00", + "completedAt": "2023-11-29T20:18:30.418981+00:00" + }, + { + "id": "93a37eca-1e15-468b-ada7-a8c7a7362a0a", + "createdAt": "2023-11-29T20:18:30.419142+00:00", + "commandType": "loadLiquid", + "key": "f4f32cb5ad69003abc728221b212b394", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "D10": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.419186+00:00", + "completedAt": "2023-11-29T20:18:30.419230+00:00" + }, + { + "id": "dcb67049-1513-4c80-ae88-6be59c96857c", + "createdAt": "2023-11-29T20:18:30.419417+00:00", + "commandType": "loadLiquid", + "key": "49d4d30ba636ab00cc110c2824780d98", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "D7": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.419518+00:00", + "completedAt": "2023-11-29T20:18:30.419587+00:00" + }, + { + "id": "db15701b-8249-4558-8e2c-bede67cd5f29", + "createdAt": "2023-11-29T20:18:30.419784+00:00", + "commandType": "loadLiquid", + "key": "35a833132b726d5e785d1fca3d0decef", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "E1": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.419850+00:00", + "completedAt": "2023-11-29T20:18:30.419900+00:00" + }, + { + "id": "09bbe6cd-841b-47fb-b90a-e54c921db440", + "createdAt": "2023-11-29T20:18:30.420069+00:00", + "commandType": "loadLiquid", + "key": "82947075d3dd69ce731744b317f28e23", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "E4": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.420115+00:00", + "completedAt": "2023-11-29T20:18:30.420165+00:00" + }, + { + "id": "77fe1212-517e-4f4f-9275-5b20f7378327", + "createdAt": "2023-11-29T20:18:30.420321+00:00", + "commandType": "loadLiquid", + "key": "3f71cfff5ef5d82b1ccc56b0b0612090", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "E7": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.420366+00:00", + "completedAt": "2023-11-29T20:18:30.420409+00:00" + }, + { + "id": "38173cb2-f66a-42d3-b279-54e19d96a67f", + "createdAt": "2023-11-29T20:18:30.420561+00:00", + "commandType": "loadLiquid", + "key": "69ad771311b841c0a7f7532b46bdf82c", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "E10": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.420605+00:00", + "completedAt": "2023-11-29T20:18:30.420649+00:00" + }, + { + "id": "f649448f-6370-4d51-aa5f-56708f8c0c31", + "createdAt": "2023-11-29T20:18:30.420815+00:00", + "commandType": "loadLiquid", + "key": "c4654cf88edab7da4ed9ef1025d70de4", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "E7": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.420858+00:00", + "completedAt": "2023-11-29T20:18:30.420900+00:00" + }, + { + "id": "916d0000-2605-4ada-986b-1cffaa8832f1", + "createdAt": "2023-11-29T20:18:30.421054+00:00", + "commandType": "loadLiquid", + "key": "51e353863826f5ee13d0aca7167e7f83", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "F1": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.421098+00:00", + "completedAt": "2023-11-29T20:18:30.421144+00:00" + }, + { + "id": "0a616395-459d-4b2a-a413-d4452fcd01c8", + "createdAt": "2023-11-29T20:18:30.421366+00:00", + "commandType": "loadLiquid", + "key": "e8db439edb386b8636c4d5bced27ab79", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "F4": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.421420+00:00", + "completedAt": "2023-11-29T20:18:30.421469+00:00" + }, + { + "id": "3929fa16-f830-47b9-b4d5-ed4a427b1386", + "createdAt": "2023-11-29T20:18:30.421721+00:00", + "commandType": "loadLiquid", + "key": "2607f5e931b405b4eca1a113269174db", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "F7": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.421798+00:00", + "completedAt": "2023-11-29T20:18:30.421846+00:00" + }, + { + "id": "b8cbb734-f803-4fd7-bc1c-9d9296943ec7", + "createdAt": "2023-11-29T20:18:30.422053+00:00", + "commandType": "loadLiquid", + "key": "73b8038bb2c61d83ee450e397e8996c6", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "F10": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.422122+00:00", + "completedAt": "2023-11-29T20:18:30.422189+00:00" + }, + { + "id": "0aeccc24-3f4d-45b7-8a15-fbd83497e712", + "createdAt": "2023-11-29T20:18:30.422383+00:00", + "commandType": "loadLiquid", + "key": "3205d6a21b6716016b84bd60c70cac88", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "F7": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.422458+00:00", + "completedAt": "2023-11-29T20:18:30.422512+00:00" + }, + { + "id": "191ddd48-6897-48a8-a6b0-313735d8aeed", + "createdAt": "2023-11-29T20:18:30.422753+00:00", + "commandType": "loadLiquid", + "key": "1dd938312b73987d25df9d2d45c03afe", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "G1": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.422817+00:00", + "completedAt": "2023-11-29T20:18:30.422893+00:00" + }, + { + "id": "a24bd9aa-86cb-411c-b1f7-03ac39a25d26", + "createdAt": "2023-11-29T20:18:30.423108+00:00", + "commandType": "loadLiquid", + "key": "0ba02bdc6d08788b48a5780a8226f289", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "G4": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.423160+00:00", + "completedAt": "2023-11-29T20:18:30.423209+00:00" + }, + { + "id": "f5d25cee-7a66-486d-9f67-94e48ad347d7", + "createdAt": "2023-11-29T20:18:30.423424+00:00", + "commandType": "loadLiquid", + "key": "0596309862689258b7ee76c4bbf59995", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "G7": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.423471+00:00", + "completedAt": "2023-11-29T20:18:30.423523+00:00" + }, + { + "id": "874116d4-6fda-4eac-8699-dd0609745121", + "createdAt": "2023-11-29T20:18:30.423785+00:00", + "commandType": "loadLiquid", + "key": "3500230b164ddbdcfeac284d41c40005", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "G10": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.423858+00:00", + "completedAt": "2023-11-29T20:18:30.423933+00:00" + }, + { + "id": "5ed5d541-d174-47f5-81fd-d7d89b5a0237", + "createdAt": "2023-11-29T20:18:30.424243+00:00", + "commandType": "loadLiquid", + "key": "10438ae3782bca00bdd82fe71839fea7", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "G7": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.424301+00:00", + "completedAt": "2023-11-29T20:18:30.424363+00:00" + }, + { + "id": "e42b4166-b24a-4c4f-b804-310ab093c96f", + "createdAt": "2023-11-29T20:18:30.424605+00:00", + "commandType": "loadLiquid", + "key": "43301de62bcc84940384b721984c1c18", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "H1": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.424655+00:00", + "completedAt": "2023-11-29T20:18:30.424707+00:00" + }, + { + "id": "c4854b12-43c6-4eb8-9351-0b23ef1caa87", + "createdAt": "2023-11-29T20:18:30.424879+00:00", + "commandType": "loadLiquid", + "key": "7fa325b2f3264b591fd3953305c1ddcd", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "H4": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.424929+00:00", + "completedAt": "2023-11-29T20:18:30.424975+00:00" + }, + { + "id": "2e1887cb-00e9-4e67-b670-b0091f3083c0", + "createdAt": "2023-11-29T20:18:30.425127+00:00", + "commandType": "loadLiquid", + "key": "d81cbde6fc32f69d1b763565a190de4a", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "H7": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.425169+00:00", + "completedAt": "2023-11-29T20:18:30.425212+00:00" + }, + { + "id": "e3978329-64b7-47d6-b77f-cf2c77246837", + "createdAt": "2023-11-29T20:18:30.425436+00:00", + "commandType": "loadLiquid", + "key": "df639d97d150a50a2f53ec29d82e9582", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "H10": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.425503+00:00", + "completedAt": "2023-11-29T20:18:30.425559+00:00" + }, + { + "id": "7eb9324f-fba7-4811-a387-ac49fd7cc005", + "createdAt": "2023-11-29T20:18:30.425833+00:00", + "commandType": "loadLiquid", + "key": "c5b50147ce24e693d35e5932d2b88fcf", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "H7": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.425897+00:00", + "completedAt": "2023-11-29T20:18:30.425961+00:00" + }, + { + "id": "79de4174-b88f-428f-a177-04981b36fc36", + "createdAt": "2023-11-29T20:18:30.426160+00:00", + "commandType": "loadLiquid", + "key": "d83f6f9631276a47825253355e32b309", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "A2": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.426213+00:00", + "completedAt": "2023-11-29T20:18:30.426260+00:00" + }, + { + "id": "172f545d-a781-4f11-8650-51378c4dfa22", + "createdAt": "2023-11-29T20:18:30.426512+00:00", + "commandType": "loadLiquid", + "key": "afb5592130eb30c32acb6f09db263c50", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "A5": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.426585+00:00", + "completedAt": "2023-11-29T20:18:30.426665+00:00" + }, + { + "id": "03589282-aaed-41a2-9352-6b7ad2eb5278", + "createdAt": "2023-11-29T20:18:30.426870+00:00", + "commandType": "loadLiquid", + "key": "c8ef7111cc5ff151243b4102046a5ada", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "A8": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.426923+00:00", + "completedAt": "2023-11-29T20:18:30.426988+00:00" + }, + { + "id": "a814e2ec-da22-48a0-8b6b-8d0c05f593fd", + "createdAt": "2023-11-29T20:18:30.427149+00:00", + "commandType": "loadLiquid", + "key": "bafdf1ca1c69c8547479365866ebf435", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "A11": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.427192+00:00", + "completedAt": "2023-11-29T20:18:30.427237+00:00" + }, + { + "id": "bfb1c1ad-a936-4165-a309-f45210d03018", + "createdAt": "2023-11-29T20:18:30.427513+00:00", + "commandType": "loadLiquid", + "key": "c66850d34cd552b71cedbaf974fc5e2b", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "A8": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.427591+00:00", + "completedAt": "2023-11-29T20:18:30.427654+00:00" + }, + { + "id": "4928b88c-8d7d-4c3b-b591-71e1c115108c", + "createdAt": "2023-11-29T20:18:30.427840+00:00", + "commandType": "loadLiquid", + "key": "ee1738b55f4fa09767b26bec7372ede2", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "B2": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.427921+00:00", + "completedAt": "2023-11-29T20:18:30.428006+00:00" + }, + { + "id": "51ca7202-69cc-4694-a893-80b2a1fc0914", + "createdAt": "2023-11-29T20:18:30.428233+00:00", + "commandType": "loadLiquid", + "key": "7630a5a8321568b8e92e5d3f527a4734", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "B5": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.428291+00:00", + "completedAt": "2023-11-29T20:18:30.428357+00:00" + }, + { + "id": "14165cdc-b0b4-418f-a22c-9887cae66b7d", + "createdAt": "2023-11-29T20:18:30.428556+00:00", + "commandType": "loadLiquid", + "key": "db5ff716ac07f439734ca73fa1adf475", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "B8": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.428606+00:00", + "completedAt": "2023-11-29T20:18:30.428665+00:00" + }, + { + "id": "fd9aa05e-44a6-4c6e-90d1-1657af5352d3", + "createdAt": "2023-11-29T20:18:30.428825+00:00", + "commandType": "loadLiquid", + "key": "4efd37cbef10047e36a2ac71dbdfb9ee", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "B11": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.428872+00:00", + "completedAt": "2023-11-29T20:18:30.428923+00:00" + }, + { + "id": "b5037866-d186-417f-87fb-e1933dd816cd", + "createdAt": "2023-11-29T20:18:30.429091+00:00", + "commandType": "loadLiquid", + "key": "8dd011ef34cdff8ff415a92bd2901858", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "B8": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.429145+00:00", + "completedAt": "2023-11-29T20:18:30.429196+00:00" + }, + { + "id": "1441dc95-fa42-4534-a076-87a08770d02b", + "createdAt": "2023-11-29T20:18:30.429470+00:00", + "commandType": "loadLiquid", + "key": "3645f3866171c996dd55b0d7e97c77c5", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "C2": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.429553+00:00", + "completedAt": "2023-11-29T20:18:30.429616+00:00" + }, + { + "id": "c591dda3-61b3-48aa-8643-9a4b2aca42a4", + "createdAt": "2023-11-29T20:18:30.429846+00:00", + "commandType": "loadLiquid", + "key": "cc8d8e092a7d0dad672c6e5f8c7f5116", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "C5": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.429902+00:00", + "completedAt": "2023-11-29T20:18:30.429951+00:00" + }, + { + "id": "05827bc2-4e7a-4248-8ab1-b9734a8ced35", + "createdAt": "2023-11-29T20:18:30.430128+00:00", + "commandType": "loadLiquid", + "key": "ee5d668ed2f3c9653df4ac9d69abb81a", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "C8": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.430172+00:00", + "completedAt": "2023-11-29T20:18:30.430227+00:00" + }, + { + "id": "b57df02c-32a3-4a39-bd76-a6d29d52f598", + "createdAt": "2023-11-29T20:18:30.430387+00:00", + "commandType": "loadLiquid", + "key": "522940336d75a4120eba61bf3f0af173", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "C11": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.430442+00:00", + "completedAt": "2023-11-29T20:18:30.430493+00:00" + }, + { + "id": "ad95791b-e534-4e8a-9577-a7ae109062ae", + "createdAt": "2023-11-29T20:18:30.430665+00:00", + "commandType": "loadLiquid", + "key": "0400ebf70dcd4240e89c0cd7abeb36f5", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "C8": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.430710+00:00", + "completedAt": "2023-11-29T20:18:30.430757+00:00" + }, + { + "id": "13789ab2-5937-4106-a640-440cccb0d443", + "createdAt": "2023-11-29T20:18:30.430918+00:00", + "commandType": "loadLiquid", + "key": "845b63676a8899994cec826288287fe9", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "D2": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.430962+00:00", + "completedAt": "2023-11-29T20:18:30.431011+00:00" + }, + { + "id": "2107744b-ddb4-4df0-bf93-e6fec98c6e4a", + "createdAt": "2023-11-29T20:18:30.431162+00:00", + "commandType": "loadLiquid", + "key": "f0ab0522dbff3c4dca7f080b8291baff", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "D5": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.431206+00:00", + "completedAt": "2023-11-29T20:18:30.431318+00:00" + }, + { + "id": "b6ffec60-d908-48d1-8794-627fd269fc5b", + "createdAt": "2023-11-29T20:18:30.431501+00:00", + "commandType": "loadLiquid", + "key": "f71798be9bf3d243cd917c18d040db89", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "D8": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.431599+00:00", + "completedAt": "2023-11-29T20:18:30.431660+00:00" + }, + { + "id": "80397614-d6bd-456e-a612-5b32823cceec", + "createdAt": "2023-11-29T20:18:30.431836+00:00", + "commandType": "loadLiquid", + "key": "e2c6710c885485c53b774e337d5c7f0d", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "D11": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.431887+00:00", + "completedAt": "2023-11-29T20:18:30.431936+00:00" + }, + { + "id": "1285b4b1-14ad-4e8f-98e8-249477b3e73b", + "createdAt": "2023-11-29T20:18:30.432140+00:00", + "commandType": "loadLiquid", + "key": "327403720fdad1ad6daeb265d903a8f4", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "D8": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.432208+00:00", + "completedAt": "2023-11-29T20:18:30.432265+00:00" + }, + { + "id": "c8921e11-f3da-4e8f-a819-71ee51c6213d", + "createdAt": "2023-11-29T20:18:30.432459+00:00", + "commandType": "loadLiquid", + "key": "88b2ccf0a5d8e0822a99173b8076e562", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "E2": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.432511+00:00", + "completedAt": "2023-11-29T20:18:30.432557+00:00" + }, + { + "id": "62c31bcd-921a-490e-bb1d-5ddda5da0b44", + "createdAt": "2023-11-29T20:18:30.432796+00:00", + "commandType": "loadLiquid", + "key": "48adbbd852a34c20e192d145f0474109", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "E5": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.432843+00:00", + "completedAt": "2023-11-29T20:18:30.432894+00:00" + }, + { + "id": "8e71b696-9202-4870-98dd-32cdb73bc682", + "createdAt": "2023-11-29T20:18:30.433066+00:00", + "commandType": "loadLiquid", + "key": "69691a3cb4077f07c22f47504c429e37", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "E8": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.433166+00:00", + "completedAt": "2023-11-29T20:18:30.433212+00:00" + }, + { + "id": "1e516c5f-b3d6-4952-b0fd-577cedd113cc", + "createdAt": "2023-11-29T20:18:30.433376+00:00", + "commandType": "loadLiquid", + "key": "f6c005e602cd36996477c3167e2ffab8", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "E11": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.433424+00:00", + "completedAt": "2023-11-29T20:18:30.433467+00:00" + }, + { + "id": "49cdc2a9-d0c7-48e5-9846-d1b8a2253ccf", + "createdAt": "2023-11-29T20:18:30.433618+00:00", + "commandType": "loadLiquid", + "key": "493c2fa69a9bab3c205e23a89d3fa9cb", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "E8": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.433661+00:00", + "completedAt": "2023-11-29T20:18:30.433704+00:00" + }, + { + "id": "78af56fb-d8c1-4275-9edc-71e494f38cfa", + "createdAt": "2023-11-29T20:18:30.433888+00:00", + "commandType": "loadLiquid", + "key": "6cd6789e13b0e52614a3d326224f129c", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "F2": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.433989+00:00", + "completedAt": "2023-11-29T20:18:30.434052+00:00" + }, + { + "id": "4f8820f4-09e2-4f35-a52d-af14c4b9a470", + "createdAt": "2023-11-29T20:18:30.434295+00:00", + "commandType": "loadLiquid", + "key": "d3191ab57ad0d65b080ebe267d84485a", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "F5": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.434354+00:00", + "completedAt": "2023-11-29T20:18:30.434403+00:00" + }, + { + "id": "cbf93037-daf8-4626-a5c1-f495ca4bdecc", + "createdAt": "2023-11-29T20:18:30.434603+00:00", + "commandType": "loadLiquid", + "key": "fcb324a723ec4b437a0e61a23c32f102", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "F8": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.434651+00:00", + "completedAt": "2023-11-29T20:18:30.434699+00:00" + }, + { + "id": "49440073-70c2-4f34-bed0-7b26d458dec8", + "createdAt": "2023-11-29T20:18:30.434875+00:00", + "commandType": "loadLiquid", + "key": "1829e0ca19ac0d8f9bffa80f5473c0c5", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "F11": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.434921+00:00", + "completedAt": "2023-11-29T20:18:30.434966+00:00" + }, + { + "id": "b33a7d62-bdbf-4041-bb8c-846a4f13b40d", + "createdAt": "2023-11-29T20:18:30.435129+00:00", + "commandType": "loadLiquid", + "key": "4a165363dc2ada109f8d28ecf8a64345", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "F8": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.435175+00:00", + "completedAt": "2023-11-29T20:18:30.435222+00:00" + }, + { + "id": "af77a9d8-251c-404e-a3f4-398907a002ec", + "createdAt": "2023-11-29T20:18:30.435397+00:00", + "commandType": "loadLiquid", + "key": "bcf26dbd23e6d18bf87831df4cf2c489", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "G2": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.435445+00:00", + "completedAt": "2023-11-29T20:18:30.435494+00:00" + }, + { + "id": "4984b7b6-e65c-43f4-a9dd-fba23db7172f", + "createdAt": "2023-11-29T20:18:30.435724+00:00", + "commandType": "loadLiquid", + "key": "ed99ba3cde0ab09e0dcea24f4d961898", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "G5": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.435811+00:00", + "completedAt": "2023-11-29T20:18:30.435928+00:00" + }, + { + "id": "b289a5c1-e4bf-421a-92f4-75184e88d814", + "createdAt": "2023-11-29T20:18:30.436218+00:00", + "commandType": "loadLiquid", + "key": "ed3db5eb8399687023c8b5c6c234747e", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "G8": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.436295+00:00", + "completedAt": "2023-11-29T20:18:30.436361+00:00" + }, + { + "id": "bdd573ff-178a-4aca-8f1b-da015e35b07b", + "createdAt": "2023-11-29T20:18:30.436618+00:00", + "commandType": "loadLiquid", + "key": "bbeb8ee612c677dc5f8b0aadb76ad3b6", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "G11": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.436672+00:00", + "completedAt": "2023-11-29T20:18:30.436733+00:00" + }, + { + "id": "c8b82a43-eb9a-4e83-a407-7987601a0880", + "createdAt": "2023-11-29T20:18:30.436928+00:00", + "commandType": "loadLiquid", + "key": "a1adec2f8841c2cbe7646c46155dcbfe", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "G8": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.436978+00:00", + "completedAt": "2023-11-29T20:18:30.437029+00:00" + }, + { + "id": "8a5d07b0-a677-4b56-bd05-ac6bd250660d", + "createdAt": "2023-11-29T20:18:30.437199+00:00", + "commandType": "loadLiquid", + "key": "ba95bf52ea0796866febc6addefb5b9a", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "H2": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.437246+00:00", + "completedAt": "2023-11-29T20:18:30.437292+00:00" + }, + { + "id": "b90ab8a7-085d-4c2d-ba20-09c4205b53dd", + "createdAt": "2023-11-29T20:18:30.437475+00:00", + "commandType": "loadLiquid", + "key": "98d85c4fbbbb4900958c125e3c8fbf8d", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "H5": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.437536+00:00", + "completedAt": "2023-11-29T20:18:30.437582+00:00" + }, + { + "id": "d4519599-cd1b-4f24-95d6-d3ce892d543e", + "createdAt": "2023-11-29T20:18:30.437759+00:00", + "commandType": "loadLiquid", + "key": "fee993b5d221c2f0f3e9f9ab7453aed4", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "H8": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.437805+00:00", + "completedAt": "2023-11-29T20:18:30.437853+00:00" + }, + { + "id": "6610f8e7-c36f-44df-b1d7-6d9488cef099", + "createdAt": "2023-11-29T20:18:30.438055+00:00", + "commandType": "loadLiquid", + "key": "272a3c159ee9f67f4d2dfbcaf3cea81f", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "H11": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.438103+00:00", + "completedAt": "2023-11-29T20:18:30.438154+00:00" + }, + { + "id": "65c8690f-d063-4852-842e-8c109bbeae16", + "createdAt": "2023-11-29T20:18:30.438315+00:00", + "commandType": "loadLiquid", + "key": "563ab7b336fb36742e41e10a0bb170d2", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "H8": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.438360+00:00", + "completedAt": "2023-11-29T20:18:30.438406+00:00" + }, + { + "id": "bd754676-4ea5-4ed5-8254-38c9c5e57236", + "createdAt": "2023-11-29T20:18:30.438660+00:00", + "commandType": "loadLiquid", + "key": "f66ec5eecd775718b054b72b900b0b56", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "A3": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.438711+00:00", + "completedAt": "2023-11-29T20:18:30.438757+00:00" + }, + { + "id": "22e7f340-db47-48e5-8157-4a9a90b3117e", + "createdAt": "2023-11-29T20:18:30.438977+00:00", + "commandType": "loadLiquid", + "key": "1c25c4bc3522d7e939e7b5ab6d9cd403", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "A6": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.439087+00:00", + "completedAt": "2023-11-29T20:18:30.439158+00:00" + }, + { + "id": "e47344ea-b1d6-4f5a-8de7-427fe8e1e90d", + "createdAt": "2023-11-29T20:18:30.439391+00:00", + "commandType": "loadLiquid", + "key": "bcd2040bdf7251537edd9f613e749966", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "A9": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.439473+00:00", + "completedAt": "2023-11-29T20:18:30.439560+00:00" + }, + { + "id": "75f7b10e-6744-4b2e-ad5c-ca162a28366e", + "createdAt": "2023-11-29T20:18:30.439813+00:00", + "commandType": "loadLiquid", + "key": "b0ba592df21f90ef8db24b0fd5173942", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "A12": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.439878+00:00", + "completedAt": "2023-11-29T20:18:30.439932+00:00" + }, + { + "id": "5985d0a4-7d8c-447f-8441-a3a7e7a0b0c9", + "createdAt": "2023-11-29T20:18:30.440112+00:00", + "commandType": "loadLiquid", + "key": "15901745b0f4e9c45603664cc44ab7fc", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "A9": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.440172+00:00", + "completedAt": "2023-11-29T20:18:30.440225+00:00" + }, + { + "id": "a761cda3-e652-4b24-a469-cc012fff0132", + "createdAt": "2023-11-29T20:18:30.440414+00:00", + "commandType": "loadLiquid", + "key": "43935cd9dfcfc95c06bad0c96b9df8e7", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "B3": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.440463+00:00", + "completedAt": "2023-11-29T20:18:30.440510+00:00" + }, + { + "id": "3bab2782-ee26-4131-990d-76eb533959d9", + "createdAt": "2023-11-29T20:18:30.440675+00:00", + "commandType": "loadLiquid", + "key": "3b9dcd17bf822aaf9d1c2b2189c3e0dc", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "B6": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.440721+00:00", + "completedAt": "2023-11-29T20:18:30.440769+00:00" + }, + { + "id": "197e722f-bed9-40b3-af28-a6e695d18706", + "createdAt": "2023-11-29T20:18:30.440929+00:00", + "commandType": "loadLiquid", + "key": "492ce05b73d176661dee060e4b1827fa", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "B9": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.441001+00:00", + "completedAt": "2023-11-29T20:18:30.441051+00:00" + }, + { + "id": "b599c797-899e-47eb-861f-9f9f409d5e3e", + "createdAt": "2023-11-29T20:18:30.441226+00:00", + "commandType": "loadLiquid", + "key": "7f543e82a6326e4df4fa5f959381fd23", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "B12": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.441276+00:00", + "completedAt": "2023-11-29T20:18:30.441321+00:00" + }, + { + "id": "17580be8-2e3b-45e3-b113-097046a09fc1", + "createdAt": "2023-11-29T20:18:30.441478+00:00", + "commandType": "loadLiquid", + "key": "5bb5ffab46c92fefd38db42a94413991", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "B9": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.441524+00:00", + "completedAt": "2023-11-29T20:18:30.441569+00:00" + }, + { + "id": "942513b6-51a1-4aa3-8b89-80aba9bcb52c", + "createdAt": "2023-11-29T20:18:30.441729+00:00", + "commandType": "loadLiquid", + "key": "417c977b360213e8c017781d9286feac", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "C3": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.441773+00:00", + "completedAt": "2023-11-29T20:18:30.441819+00:00" + }, + { + "id": "87a348ce-31f2-43e7-ba2d-c07df89dcdb1", + "createdAt": "2023-11-29T20:18:30.442042+00:00", + "commandType": "loadLiquid", + "key": "ab7632ac5da8980467c7891387899b4c", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "C6": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.442114+00:00", + "completedAt": "2023-11-29T20:18:30.442161+00:00" + }, + { + "id": "9c324292-61f2-4417-8961-fa1e7bb73566", + "createdAt": "2023-11-29T20:18:30.442340+00:00", + "commandType": "loadLiquid", + "key": "835f40d795c1fd038d71b9e49d004cc0", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "C9": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.442461+00:00", + "completedAt": "2023-11-29T20:18:30.442518+00:00" + }, + { + "id": "db8cbe97-1878-4936-9ba6-2709c7901701", + "createdAt": "2023-11-29T20:18:30.442711+00:00", + "commandType": "loadLiquid", + "key": "371ab6005e81b95c0e5444f62bbd65f2", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "C12": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.442765+00:00", + "completedAt": "2023-11-29T20:18:30.442812+00:00" + }, + { + "id": "8562c3b3-62ef-4924-be88-1e98b3de71ca", + "createdAt": "2023-11-29T20:18:30.443097+00:00", + "commandType": "loadLiquid", + "key": "4a671b33536d9be7eb1616b2e13f7465", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "C9": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.443150+00:00", + "completedAt": "2023-11-29T20:18:30.443204+00:00" + }, + { + "id": "a6f164fc-2da0-4ac8-bdce-2701e9e3b0c2", + "createdAt": "2023-11-29T20:18:30.443405+00:00", + "commandType": "loadLiquid", + "key": "fcf477eb96f1068ad390101bca837f5a", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "D3": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.443450+00:00", + "completedAt": "2023-11-29T20:18:30.443496+00:00" + }, + { + "id": "ef4e6647-5a08-479c-99f0-47b458de1e84", + "createdAt": "2023-11-29T20:18:30.443701+00:00", + "commandType": "loadLiquid", + "key": "a6f1fd5bd7785d82d214ff89124fb663", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "D6": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.443747+00:00", + "completedAt": "2023-11-29T20:18:30.443792+00:00" + }, + { + "id": "af5b8da2-a219-4135-bca5-c262ca974a1e", + "createdAt": "2023-11-29T20:18:30.443994+00:00", + "commandType": "loadLiquid", + "key": "a956c537c5cff6c02959dfe30c0f081e", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "D9": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.444077+00:00", + "completedAt": "2023-11-29T20:18:30.444180+00:00" + }, + { + "id": "ac577afe-6b02-4aa7-b33e-c79a29c34eed", + "createdAt": "2023-11-29T20:18:30.444607+00:00", + "commandType": "loadLiquid", + "key": "bf7c9df45c4965caa5d32d72954f8de3", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "D12": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.444672+00:00", + "completedAt": "2023-11-29T20:18:30.444777+00:00" + }, + { + "id": "cf8b2f1d-d285-4e81-a6a1-d8fad8369f91", + "createdAt": "2023-11-29T20:18:30.444997+00:00", + "commandType": "loadLiquid", + "key": "a01e3bf7e4ff1bc67417200eae7c1f7a", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "D9": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.445047+00:00", + "completedAt": "2023-11-29T20:18:30.445103+00:00" + }, + { + "id": "9a6569bc-aebc-465a-ad6d-62354d0297ff", + "createdAt": "2023-11-29T20:18:30.445309+00:00", + "commandType": "loadLiquid", + "key": "4777b27373352ede780de4d3718669f4", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "E3": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.445356+00:00", + "completedAt": "2023-11-29T20:18:30.445400+00:00" + }, + { + "id": "7de998de-de5c-4b6d-a2d8-2f3f05a0672e", + "createdAt": "2023-11-29T20:18:30.445583+00:00", + "commandType": "loadLiquid", + "key": "d832f358914f55ab81db917b5c0f6331", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "E6": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.445634+00:00", + "completedAt": "2023-11-29T20:18:30.445688+00:00" + }, + { + "id": "1fb5bbc8-48ee-4f15-a71c-ec4102171522", + "createdAt": "2023-11-29T20:18:30.445850+00:00", + "commandType": "loadLiquid", + "key": "0915e03776597cbb4a12f9da6384d002", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "E9": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.445894+00:00", + "completedAt": "2023-11-29T20:18:30.445939+00:00" + }, + { + "id": "7fcb9dea-27c2-4b4c-867e-4253668cc2f3", + "createdAt": "2023-11-29T20:18:30.446109+00:00", + "commandType": "loadLiquid", + "key": "88a6b6780e7e59bd2d362a743c782c7e", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "E12": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.446154+00:00", + "completedAt": "2023-11-29T20:18:30.446197+00:00" + }, + { + "id": "7ab77bdd-e8cf-4883-9c19-a088be4a12bc", + "createdAt": "2023-11-29T20:18:30.446346+00:00", + "commandType": "loadLiquid", + "key": "90284b830a9890d9c0340bbed12a16e0", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "E9": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.446393+00:00", + "completedAt": "2023-11-29T20:18:30.446437+00:00" + }, + { + "id": "fdec19f6-04e8-4975-bacd-1c03ad0f5d43", + "createdAt": "2023-11-29T20:18:30.446601+00:00", + "commandType": "loadLiquid", + "key": "690a951421031c375145e3aa2c4a5a6c", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "F3": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.446645+00:00", + "completedAt": "2023-11-29T20:18:30.446688+00:00" + }, + { + "id": "4b43d873-8f02-4e1f-af7f-ac65c2c04e20", + "createdAt": "2023-11-29T20:18:30.446857+00:00", + "commandType": "loadLiquid", + "key": "b595dc843e817f0984eccf2554760719", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "F6": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.446903+00:00", + "completedAt": "2023-11-29T20:18:30.446951+00:00" + }, + { + "id": "2e44f86a-a2b5-428d-af23-d1c4eb26ef3a", + "createdAt": "2023-11-29T20:18:30.447111+00:00", + "commandType": "loadLiquid", + "key": "bca7ea018878fb171c6ff02939d7bde3", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "F9": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.447155+00:00", + "completedAt": "2023-11-29T20:18:30.447203+00:00" + }, + { + "id": "623f47c4-36ac-4388-a263-91c958099d68", + "createdAt": "2023-11-29T20:18:30.447361+00:00", + "commandType": "loadLiquid", + "key": "b5c652a95973d4ac22691114e4ff1939", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "F12": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.447403+00:00", + "completedAt": "2023-11-29T20:18:30.447447+00:00" + }, + { + "id": "2c970db7-22e4-4b3f-aeab-d0b73b27648a", + "createdAt": "2023-11-29T20:18:30.447614+00:00", + "commandType": "loadLiquid", + "key": "3ee1171725d6cf26030877f2aa9d50e1", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "F9": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.447659+00:00", + "completedAt": "2023-11-29T20:18:30.447704+00:00" + }, + { + "id": "aa9c2b29-0a00-404c-bbf2-c12d06b4bcf6", + "createdAt": "2023-11-29T20:18:30.447850+00:00", + "commandType": "loadLiquid", + "key": "e40a53e3e2061cf43dff82e5f6b52188", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "G3": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.447893+00:00", + "completedAt": "2023-11-29T20:18:30.447935+00:00" + }, + { + "id": "2af7d09f-b5f7-4d90-9d55-05ab9b891578", + "createdAt": "2023-11-29T20:18:30.448079+00:00", + "commandType": "loadLiquid", + "key": "cebdf407f37fee31f737c66f12740560", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "G6": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.448120+00:00", + "completedAt": "2023-11-29T20:18:30.448162+00:00" + }, + { + "id": "0cd336e4-aaf1-49fc-b371-7d8a55cafb20", + "createdAt": "2023-11-29T20:18:30.448328+00:00", + "commandType": "loadLiquid", + "key": "959624d65ab20bc60da46c8e25ed96fa", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "G9": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.448371+00:00", + "completedAt": "2023-11-29T20:18:30.448415+00:00" + }, + { + "id": "d2ea16e3-21c1-413f-83a4-72cbdf8bb2ec", + "createdAt": "2023-11-29T20:18:30.448592+00:00", + "commandType": "loadLiquid", + "key": "078984c1d072f4c624e9de68fb388d22", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "G12": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.448663+00:00", + "completedAt": "2023-11-29T20:18:30.448767+00:00" + }, + { + "id": "f15f2378-e7c0-43c9-91c1-eb9e4861c0d2", + "createdAt": "2023-11-29T20:18:30.448934+00:00", + "commandType": "loadLiquid", + "key": "d1311abd5705e469ca20f397f829ec65", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "G9": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.448982+00:00", + "completedAt": "2023-11-29T20:18:30.449027+00:00" + }, + { + "id": "215f226d-b718-4e11-ba7f-4bfe34b6dfd1", + "createdAt": "2023-11-29T20:18:30.449354+00:00", + "commandType": "loadLiquid", + "key": "b4bf749ab039425caa4dff7633c44e96", + "status": "succeeded", + "params": { + "liquidId": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "H3": 40.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.449447+00:00", + "completedAt": "2023-11-29T20:18:30.449511+00:00" + }, + { + "id": "ab57084f-b736-4999-88da-6dc92043d533", + "createdAt": "2023-11-29T20:18:30.449752+00:00", + "commandType": "loadLiquid", + "key": "f4c87a22427cfe5c0a9ed8cb7f4ef153", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "H6": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.449829+00:00", + "completedAt": "2023-11-29T20:18:30.449920+00:00" + }, + { + "id": "1f8de4e3-3425-4f45-a634-a629553e63d7", + "createdAt": "2023-11-29T20:18:30.450132+00:00", + "commandType": "loadLiquid", + "key": "30405a1b5e843b9dc78608b402d88752", + "status": "succeeded", + "params": { + "liquidId": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "H9": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.450190+00:00", + "completedAt": "2023-11-29T20:18:30.450254+00:00" + }, + { + "id": "852ae3fc-f7aa-4247-afad-47e98086e06c", + "createdAt": "2023-11-29T20:18:30.450522+00:00", + "commandType": "loadLiquid", + "key": "95dc6c1da421963a9e7d3d44bbbe4170", + "status": "succeeded", + "params": { + "liquidId": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "volumeByWell": { "H12": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.450570+00:00", + "completedAt": "2023-11-29T20:18:30.450621+00:00" + }, + { + "id": "7f03e511-1dd2-4542-bcfb-b6b5a46ef1e5", + "createdAt": "2023-11-29T20:18:30.450820+00:00", + "commandType": "loadLiquid", + "key": "71fa4dcf989e458ce6d5b8eab880df57", + "status": "succeeded", + "params": { + "liquidId": "3b372f14-b824-4892-a685-747a7ced9d87", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "H9": 5.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.450864+00:00", + "completedAt": "2023-11-29T20:18:30.450909+00:00" + }, + { + "id": "3a20aeba-3119-46e7-8a80-b9c0c3651dd6", + "createdAt": "2023-11-29T20:18:30.451073+00:00", + "commandType": "loadLiquid", + "key": "cd8e1673bbeadbb7fa725fa38892ae00", + "status": "succeeded", + "params": { + "liquidId": "265760c3-6cba-4360-9797-8cf293cb3172", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "A1": 33.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.451119+00:00", + "completedAt": "2023-11-29T20:18:30.451165+00:00" + }, + { + "id": "a72b5eae-3a9d-4c8a-a934-4f94f9e4f44d", + "createdAt": "2023-11-29T20:18:30.451423+00:00", + "commandType": "loadLiquid", + "key": "6762adb77ca086a5e171a88955e2946c", + "status": "succeeded", + "params": { + "liquidId": "2cb7adb4-3b25-417d-af95-ee52a75ea27d", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "A2": 148.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.451509+00:00", + "completedAt": "2023-11-29T20:18:30.451591+00:00" + }, + { + "id": "95e02b89-fd0e-4440-afd0-2fc25b6f4371", + "createdAt": "2023-11-29T20:18:30.451877+00:00", + "commandType": "loadLiquid", + "key": "1a5a92224934fd376d40124652fb1a07", + "status": "succeeded", + "params": { + "liquidId": "1272fe89-7b30-4dcd-af7f-be50204227f7", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "A3": 16.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.451935+00:00", + "completedAt": "2023-11-29T20:18:30.452002+00:00" + }, + { + "id": "0eb6535c-3dc1-48a1-bce6-8e7aacc7544d", + "createdAt": "2023-11-29T20:18:30.452193+00:00", + "commandType": "loadLiquid", + "key": "79736f44397db151b1c5f1d62f402e22", + "status": "succeeded", + "params": { + "liquidId": "d4394fca-54e0-4482-8df8-f363da968fd3", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "A4": 82.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.452251+00:00", + "completedAt": "2023-11-29T20:18:30.452299+00:00" + }, + { + "id": "70ca0438-ae6d-4d1c-8269-411b7b74b952", + "createdAt": "2023-11-29T20:18:30.452534+00:00", + "commandType": "loadLiquid", + "key": "8768acb116b325b0a4de92873d0dee09", + "status": "succeeded", + "params": { + "liquidId": "265760c3-6cba-4360-9797-8cf293cb3172", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "B1": 33.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.452636+00:00", + "completedAt": "2023-11-29T20:18:30.452695+00:00" + }, + { + "id": "afdebc0e-4dea-4d87-a244-4686cc7b51b6", + "createdAt": "2023-11-29T20:18:30.452890+00:00", + "commandType": "loadLiquid", + "key": "d738663bc699ebf64cf7e5257502b697", + "status": "succeeded", + "params": { + "liquidId": "2cb7adb4-3b25-417d-af95-ee52a75ea27d", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "B2": 148.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.452948+00:00", + "completedAt": "2023-11-29T20:18:30.453006+00:00" + }, + { + "id": "de25df59-7ba6-4c3f-8ab1-5bf2d7e35a7b", + "createdAt": "2023-11-29T20:18:30.453270+00:00", + "commandType": "loadLiquid", + "key": "7f4c97e4a7db5d7b5a544e3b55a8b76b", + "status": "succeeded", + "params": { + "liquidId": "1272fe89-7b30-4dcd-af7f-be50204227f7", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "B3": 16.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.453332+00:00", + "completedAt": "2023-11-29T20:18:30.453386+00:00" + }, + { + "id": "75960342-762b-450b-b582-4ea748a3afa8", + "createdAt": "2023-11-29T20:18:30.453560+00:00", + "commandType": "loadLiquid", + "key": "30b47009211688c737faa2995baffbc8", + "status": "succeeded", + "params": { + "liquidId": "d4394fca-54e0-4482-8df8-f363da968fd3", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "B4": 82.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.453603+00:00", + "completedAt": "2023-11-29T20:18:30.453649+00:00" + }, + { + "id": "937df0de-df85-4a64-a59c-7e579f1c4291", + "createdAt": "2023-11-29T20:18:30.453817+00:00", + "commandType": "loadLiquid", + "key": "c8a96018a6d3d38df9dab9080caf1dd0", + "status": "succeeded", + "params": { + "liquidId": "265760c3-6cba-4360-9797-8cf293cb3172", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "C1": 33.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.453865+00:00", + "completedAt": "2023-11-29T20:18:30.453920+00:00" + }, + { + "id": "e983ae86-26f8-4b12-9c70-7cb483d2383f", + "createdAt": "2023-11-29T20:18:30.454102+00:00", + "commandType": "loadLiquid", + "key": "c20428876a15ab116af69e451714b6ab", + "status": "succeeded", + "params": { + "liquidId": "2cb7adb4-3b25-417d-af95-ee52a75ea27d", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "C2": 148.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.454173+00:00", + "completedAt": "2023-11-29T20:18:30.454221+00:00" + }, + { + "id": "d74f56f0-6346-40de-9343-7bb964ea1f2d", + "createdAt": "2023-11-29T20:18:30.454382+00:00", + "commandType": "loadLiquid", + "key": "67454b4738c3ba66d86116026072f146", + "status": "succeeded", + "params": { + "liquidId": "1272fe89-7b30-4dcd-af7f-be50204227f7", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "C3": 16.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.454436+00:00", + "completedAt": "2023-11-29T20:18:30.454485+00:00" + }, + { + "id": "3c5355af-8809-4d3f-a109-55d1fe69f03e", + "createdAt": "2023-11-29T20:18:30.454642+00:00", + "commandType": "loadLiquid", + "key": "f6760b733fd446ff208e35da22a620dc", + "status": "succeeded", + "params": { + "liquidId": "d4394fca-54e0-4482-8df8-f363da968fd3", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "C4": 82.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.454687+00:00", + "completedAt": "2023-11-29T20:18:30.454732+00:00" + }, + { + "id": "02ce3d48-7896-4577-ad63-e5c26a49e4ca", + "createdAt": "2023-11-29T20:18:30.454903+00:00", + "commandType": "loadLiquid", + "key": "131743310f4a7f4acef6424d157953c8", + "status": "succeeded", + "params": { + "liquidId": "265760c3-6cba-4360-9797-8cf293cb3172", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "D1": 33.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.454945+00:00", + "completedAt": "2023-11-29T20:18:30.454988+00:00" + }, + { + "id": "62d94370-894f-47fb-8a94-b0814c563c13", + "createdAt": "2023-11-29T20:18:30.455171+00:00", + "commandType": "loadLiquid", + "key": "2e8d93650355e3f63105225e1a4f2806", + "status": "succeeded", + "params": { + "liquidId": "2cb7adb4-3b25-417d-af95-ee52a75ea27d", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "D2": 148.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.455220+00:00", + "completedAt": "2023-11-29T20:18:30.455273+00:00" + }, + { + "id": "22dfb6e9-504f-42c4-8ad4-359be52679a5", + "createdAt": "2023-11-29T20:18:30.455429+00:00", + "commandType": "loadLiquid", + "key": "d73e47ada7030202b136978663669de9", + "status": "succeeded", + "params": { + "liquidId": "1272fe89-7b30-4dcd-af7f-be50204227f7", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "D3": 16.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.455474+00:00", + "completedAt": "2023-11-29T20:18:30.455520+00:00" + }, + { + "id": "518000fe-f5d3-424c-b87a-ec6041641bbf", + "createdAt": "2023-11-29T20:18:30.455795+00:00", + "commandType": "loadLiquid", + "key": "45fad1b5b53d28ba081beebc89c18239", + "status": "succeeded", + "params": { + "liquidId": "d4394fca-54e0-4482-8df8-f363da968fd3", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "D4": 82.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.455850+00:00", + "completedAt": "2023-11-29T20:18:30.455901+00:00" + }, + { + "id": "3316e452-47df-49c3-8bc9-158c064d2a5d", + "createdAt": "2023-11-29T20:18:30.456083+00:00", + "commandType": "loadLiquid", + "key": "a42ba39d1c37823dea34803365217ccf", + "status": "succeeded", + "params": { + "liquidId": "265760c3-6cba-4360-9797-8cf293cb3172", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "E1": 33.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.456128+00:00", + "completedAt": "2023-11-29T20:18:30.456189+00:00" + }, + { + "id": "03aa7049-325f-48f8-9a13-52752525a0ae", + "createdAt": "2023-11-29T20:18:30.456402+00:00", + "commandType": "loadLiquid", + "key": "1c3c95b2cc13b26b120d566b6c678656", + "status": "succeeded", + "params": { + "liquidId": "2cb7adb4-3b25-417d-af95-ee52a75ea27d", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "E2": 148.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.456456+00:00", + "completedAt": "2023-11-29T20:18:30.456508+00:00" + }, + { + "id": "3519c261-8a04-4e46-93d1-cb4951a8893e", + "createdAt": "2023-11-29T20:18:30.456779+00:00", + "commandType": "loadLiquid", + "key": "712904868242f7b5a72a21624880ac99", + "status": "succeeded", + "params": { + "liquidId": "1272fe89-7b30-4dcd-af7f-be50204227f7", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "E3": 16.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.456836+00:00", + "completedAt": "2023-11-29T20:18:30.456889+00:00" + }, + { + "id": "e1fccd9f-3fcf-450d-bfba-f91c6cc509cf", + "createdAt": "2023-11-29T20:18:30.457108+00:00", + "commandType": "loadLiquid", + "key": "4dd781d5569536b7dac483ffdfe29142", + "status": "succeeded", + "params": { + "liquidId": "d4394fca-54e0-4482-8df8-f363da968fd3", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "E4": 82.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.457156+00:00", + "completedAt": "2023-11-29T20:18:30.457209+00:00" + }, + { + "id": "4a90a45c-ac89-459e-89eb-6cf9ee945f84", + "createdAt": "2023-11-29T20:18:30.457477+00:00", + "commandType": "loadLiquid", + "key": "c25992e70a6b0628ffab1da23e67a5ef", + "status": "succeeded", + "params": { + "liquidId": "265760c3-6cba-4360-9797-8cf293cb3172", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "F1": 33.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.457565+00:00", + "completedAt": "2023-11-29T20:18:30.457674+00:00" + }, + { + "id": "03ea9687-7867-4297-bebd-d1876473449e", + "createdAt": "2023-11-29T20:18:30.458000+00:00", + "commandType": "loadLiquid", + "key": "5e0864163d292abca0e4d4d34dbd7f46", + "status": "succeeded", + "params": { + "liquidId": "2cb7adb4-3b25-417d-af95-ee52a75ea27d", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "F2": 148.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.458116+00:00", + "completedAt": "2023-11-29T20:18:30.458194+00:00" + }, + { + "id": "357a6acb-a0e7-4b15-b087-6b6a9ac645cd", + "createdAt": "2023-11-29T20:18:30.458389+00:00", + "commandType": "loadLiquid", + "key": "8399ad8171dd6ed68a94af95f8ef78a9", + "status": "succeeded", + "params": { + "liquidId": "1272fe89-7b30-4dcd-af7f-be50204227f7", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "F3": 16.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.458439+00:00", + "completedAt": "2023-11-29T20:18:30.458487+00:00" + }, + { + "id": "5764ae90-cb12-4bf2-ba9b-1a14b2c13bd2", + "createdAt": "2023-11-29T20:18:30.458676+00:00", + "commandType": "loadLiquid", + "key": "4b5b03f77b1a7081401ddc6603b67bcb", + "status": "succeeded", + "params": { + "liquidId": "d4394fca-54e0-4482-8df8-f363da968fd3", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "F4": 82.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.458724+00:00", + "completedAt": "2023-11-29T20:18:30.458772+00:00" + }, + { + "id": "8ee6f512-5595-4233-a4ac-041521ea62b5", + "createdAt": "2023-11-29T20:18:30.459042+00:00", + "commandType": "loadLiquid", + "key": "c35a0dd1899b40a21ca1da436df2580f", + "status": "succeeded", + "params": { + "liquidId": "265760c3-6cba-4360-9797-8cf293cb3172", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "G1": 33.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.459124+00:00", + "completedAt": "2023-11-29T20:18:30.459193+00:00" + }, + { + "id": "d41ff46f-3e8e-4a9e-b4ff-4536e87dcc05", + "createdAt": "2023-11-29T20:18:30.459620+00:00", + "commandType": "loadLiquid", + "key": "b5661d112aed4d0dd53cf55cff2a9cde", + "status": "succeeded", + "params": { + "liquidId": "2cb7adb4-3b25-417d-af95-ee52a75ea27d", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "G2": 148.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.459698+00:00", + "completedAt": "2023-11-29T20:18:30.459767+00:00" + }, + { + "id": "4b94448e-6e9c-4c58-b235-e5250132bca9", + "createdAt": "2023-11-29T20:18:30.459969+00:00", + "commandType": "loadLiquid", + "key": "9e863275658eedfac21dde0cee1df7c1", + "status": "succeeded", + "params": { + "liquidId": "1272fe89-7b30-4dcd-af7f-be50204227f7", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "G3": 16.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.460035+00:00", + "completedAt": "2023-11-29T20:18:30.460091+00:00" + }, + { + "id": "d975b759-c81b-4c00-8a79-8b699e5dec1c", + "createdAt": "2023-11-29T20:18:30.460267+00:00", + "commandType": "loadLiquid", + "key": "beef6a2825731cf2605c28fbd9d312e4", + "status": "succeeded", + "params": { + "liquidId": "d4394fca-54e0-4482-8df8-f363da968fd3", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "G4": 82.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.460316+00:00", + "completedAt": "2023-11-29T20:18:30.460363+00:00" + }, + { + "id": "0801c579-458c-4160-a27a-a4f49467e706", + "createdAt": "2023-11-29T20:18:30.460564+00:00", + "commandType": "loadLiquid", + "key": "01a040d37e03385c3ab7dca3b5a12f1d", + "status": "succeeded", + "params": { + "liquidId": "265760c3-6cba-4360-9797-8cf293cb3172", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "H1": 33.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.460672+00:00", + "completedAt": "2023-11-29T20:18:30.460737+00:00" + }, + { + "id": "928f6214-0bf1-4611-9a00-bc90a5d4311c", + "createdAt": "2023-11-29T20:18:30.460988+00:00", + "commandType": "loadLiquid", + "key": "e36799ff8b5d922cb5cb7fea24d2b36e", + "status": "succeeded", + "params": { + "liquidId": "2cb7adb4-3b25-417d-af95-ee52a75ea27d", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "H2": 148.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.461047+00:00", + "completedAt": "2023-11-29T20:18:30.461111+00:00" + }, + { + "id": "eeb32f95-9f64-4942-8152-29d4955512d5", + "createdAt": "2023-11-29T20:18:30.461344+00:00", + "commandType": "loadLiquid", + "key": "bdcba14dcd780d7b67c0e72f5b75601e", + "status": "succeeded", + "params": { + "liquidId": "1272fe89-7b30-4dcd-af7f-be50204227f7", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "H3": 16.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.461395+00:00", + "completedAt": "2023-11-29T20:18:30.461457+00:00" + }, + { + "id": "0c731c45-19d9-4ae5-a09e-6ad75230b14e", + "createdAt": "2023-11-29T20:18:30.461809+00:00", + "commandType": "loadLiquid", + "key": "0ec242aeb6c6b1350321422e830c2451", + "status": "succeeded", + "params": { + "liquidId": "d4394fca-54e0-4482-8df8-f363da968fd3", + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "volumeByWell": { "H4": 82.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.461896+00:00", + "completedAt": "2023-11-29T20:18:30.461961+00:00" + }, + { + "id": "c44d1ad9-db00-4031-aff4-d0f49047952d", + "createdAt": "2023-11-29T20:18:30.462238+00:00", + "commandType": "loadPipette", + "key": "f19f76ac1142da75625deaeb8a330cac", + "status": "succeeded", + "params": { "pipetteName": "p1000_multi_flex", "mount": "left" }, + "result": { "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" }, + "startedAt": "2023-11-29T20:18:30.462292+00:00", + "completedAt": "2023-11-29T20:18:30.471490+00:00" + }, + { + "id": "93373058-56f1-4f5e-a15f-77e9e68e47b1", + "createdAt": "2023-11-29T20:18:30.472291+00:00", + "commandType": "loadPipette", + "key": "1b8da3d610aae4f39ff8b556b1974ac9", + "status": "succeeded", + "params": { "pipetteName": "p50_multi_flex", "mount": "right" }, + "result": { "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" }, + "startedAt": "2023-11-29T20:18:30.472393+00:00", + "completedAt": "2023-11-29T20:18:30.480607+00:00" + }, + { + "id": "b59084c0-65a8-4575-8868-6bff89c2e8c6", + "createdAt": "2023-11-29T20:18:30.481436+00:00", + "commandType": "thermocycler/openLid", + "key": "7cd9671dd175eb462e245243934ca477", + "status": "succeeded", + "params": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.481507+00:00", + "completedAt": "2023-11-29T20:18:30.483274+00:00" + }, + { + "id": "ad3b3f46-11d6-4919-8318-071aefd0aff5", + "createdAt": "2023-11-29T20:18:30.483601+00:00", + "commandType": "heaterShaker/openLabwareLatch", + "key": "f4db9f525e673b7199c492858b61363c", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": { "pipetteRetracted": true }, + "startedAt": "2023-11-29T20:18:30.483656+00:00", + "completedAt": "2023-11-29T20:18:30.484569+00:00" + }, + { + "id": "1c16a880-b227-44f8-9965-d6def3745560", + "createdAt": "2023-11-29T20:18:30.485113+00:00", + "commandType": "custom", + "key": "41a8cc74ddae5e52d36b14a2308c3994", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "SETTING THERMO and TEMP BLOCK Temperature" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.485201+00:00", + "completedAt": "2023-11-29T20:18:30.485262+00:00" + }, + { + "id": "46fb5f96-f2a9-471c-9135-6f1991cc32fe", + "createdAt": "2023-11-29T20:18:30.485545+00:00", + "commandType": "thermocycler/setTargetBlockTemperature", + "key": "a6331add7ea8646db41e0f62cf40950a", + "status": "succeeded", + "params": { + "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3", + "celsius": 4.0, + "holdTimeSeconds": 0.0 + }, + "result": { "targetBlockTemperature": 4.0 }, + "startedAt": "2023-11-29T20:18:30.485602+00:00", + "completedAt": "2023-11-29T20:18:30.485659+00:00" + }, + { + "id": "97b596de-0e8b-45a5-a370-7ab5c5f82409", + "createdAt": "2023-11-29T20:18:30.485857+00:00", + "commandType": "thermocycler/waitForBlockTemperature", + "key": "3e22813b4888ef81dd3605be1919d768", + "status": "succeeded", + "params": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.485914+00:00", + "completedAt": "2023-11-29T20:18:30.485964+00:00" + }, + { + "id": "59663107-b4ff-4dc9-8f32-69acfc1cda00", + "createdAt": "2023-11-29T20:18:30.486201+00:00", + "commandType": "thermocycler/setTargetLidTemperature", + "key": "9792bb1f14ccffd429c2c387b9adbce3", + "status": "succeeded", + "params": { + "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3", + "celsius": 100.0 + }, + "result": { "targetLidTemperature": 100.0 }, + "startedAt": "2023-11-29T20:18:30.486250+00:00", + "completedAt": "2023-11-29T20:18:30.486299+00:00" + }, + { + "id": "8643559c-9142-4b1f-9af9-f2281d8d0bf9", + "createdAt": "2023-11-29T20:18:30.486539+00:00", + "commandType": "thermocycler/waitForLidTemperature", + "key": "8f81d14684095872d663ece4619331cb", + "status": "succeeded", + "params": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.486599+00:00", + "completedAt": "2023-11-29T20:18:30.486646+00:00" + }, + { + "id": "e4239d54-b7fb-40a5-9375-8f692fec0cd3", + "createdAt": "2023-11-29T20:18:30.486868+00:00", + "commandType": "temperatureModule/setTargetTemperature", + "key": "f29532d79981af4be9fc83538418a40d", + "status": "succeeded", + "params": { + "moduleId": "dc893184-0c7b-4c95-80f1-627932a49ab0", + "celsius": 4.0 + }, + "result": { "targetTemperature": 4.0 }, + "startedAt": "2023-11-29T20:18:30.486915+00:00", + "completedAt": "2023-11-29T20:18:30.486966+00:00" + }, + { + "id": "7010a468-7873-4bea-bcb1-254f9048e33e", + "createdAt": "2023-11-29T20:18:30.487135+00:00", + "commandType": "temperatureModule/waitForTemperature", + "key": "4145e5afc07b629cd5983e9d73a92284", + "status": "succeeded", + "params": { "moduleId": "dc893184-0c7b-4c95-80f1-627932a49ab0" }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.487190+00:00", + "completedAt": "2023-11-29T20:18:30.487249+00:00" + }, + { + "id": "042a284e-7679-46c1-82fe-8a44c67629b2", + "createdAt": "2023-11-29T20:18:30.487476+00:00", + "commandType": "waitForResume", + "key": "752a20abb1521d11afd8ee73366bdcc4", + "status": "succeeded", + "params": { "message": "Ready" }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.487537+00:00", + "completedAt": "2023-11-29T20:18:30.487584+00:00" + }, + { + "id": "8a380225-fcad-4569-8d7d-155f385c9fc0", + "createdAt": "2023-11-29T20:18:30.487818+00:00", + "commandType": "heaterShaker/closeLabwareLatch", + "key": "65beb0321d871769c7cb253d34dbd0d3", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.487871+00:00", + "completedAt": "2023-11-29T20:18:30.487918+00:00" + }, + { + "id": "19306b12-62f7-42c0-a260-dd8cfd482125", + "createdAt": "2023-11-29T20:18:30.488528+00:00", + "commandType": "custom", + "key": "4029bba1a5cbcb81c20a5c020b13d97d", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "==============================================" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.488630+00:00", + "completedAt": "2023-11-29T20:18:30.488698+00:00" + }, + { + "id": "0ea4e409-571f-43a7-ae9f-4738890e1f45", + "createdAt": "2023-11-29T20:18:30.489186+00:00", + "commandType": "custom", + "key": "7e833f2dca16e51b0fe0688c4963bc16", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> FX" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.489259+00:00", + "completedAt": "2023-11-29T20:18:30.489305+00:00" + }, + { + "id": "3d9e4078-89d8-4367-9091-87823a7617cf", + "createdAt": "2023-11-29T20:18:30.489699+00:00", + "commandType": "custom", + "key": "dbe3b01800b5a0f88dc2c2e3c790d429", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "==============================================" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.489751+00:00", + "completedAt": "2023-11-29T20:18:30.489797+00:00" + }, + { + "id": "a98060ae-99ea-4143-8695-9bfe535d75d6", + "createdAt": "2023-11-29T20:18:30.490165+00:00", + "commandType": "custom", + "key": "804e2eefebd13dae2c84e8461c9a77d7", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Adding FX" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.490255+00:00", + "completedAt": "2023-11-29T20:18:30.490299+00:00" + }, + { + "id": "9d6d3458-27bf-4c58-93c7-de47854d5ba4", + "createdAt": "2023-11-29T20:18:30.490816+00:00", + "commandType": "pickUpTip", + "key": "92f72812d49ce6265e5ab6da595c0789", + "status": "succeeded", + "params": { + "labwareId": "e5b35230-f2df-4afa-b7c1-3b15c174733f", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 178.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:30.490883+00:00", + "completedAt": "2023-11-29T20:18:30.501611+00:00" + }, + { + "id": "530f764f-1252-4a8f-9506-6753490efa86", + "createdAt": "2023-11-29T20:18:30.502568+00:00", + "commandType": "aspirate", + "key": "66e003f1b1314ce467c2617fa2bc1419", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 11.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 11.0 + }, + "startedAt": "2023-11-29T20:18:30.502660+00:00", + "completedAt": "2023-11-29T20:18:30.508044+00:00" + }, + { + "id": "444f7335-b1eb-40d4-9997-598584ea4a2b", + "createdAt": "2023-11-29T20:18:30.509135+00:00", + "commandType": "dispense", + "key": "1d175f748b60c67153033ca2ec17a466", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 11.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 11.0 + }, + "startedAt": "2023-11-29T20:18:30.509246+00:00", + "completedAt": "2023-11-29T20:18:30.511670+00:00" + }, + { + "id": "68c33f6a-6865-4317-a0dd-7fd5f98e821a", + "createdAt": "2023-11-29T20:18:30.512541+00:00", + "commandType": "aspirate", + "key": "f1c6f41af004b2412152bca7b07948a9", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 11.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 11.0 + }, + "startedAt": "2023-11-29T20:18:30.512605+00:00", + "completedAt": "2023-11-29T20:18:30.517835+00:00" + }, + { + "id": "99dab424-b8d6-4b14-8bce-083888ecb8d2", + "createdAt": "2023-11-29T20:18:30.518832+00:00", + "commandType": "dispense", + "key": "081f1b1bfbf4a4139433000762da983b", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 11.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 11.0 + }, + "startedAt": "2023-11-29T20:18:30.518910+00:00", + "completedAt": "2023-11-29T20:18:30.521005+00:00" + }, + { + "id": "4769eea4-c5f4-4efa-b51d-4243c61dae5d", + "createdAt": "2023-11-29T20:18:30.522060+00:00", + "commandType": "aspirate", + "key": "499c473a58a4c793f41957e09b11be5a", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 11.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 11.0 + }, + "startedAt": "2023-11-29T20:18:30.522179+00:00", + "completedAt": "2023-11-29T20:18:30.527611+00:00" + }, + { + "id": "cb4149c6-1d5b-4695-a06e-787b6e07f782", + "createdAt": "2023-11-29T20:18:30.528693+00:00", + "commandType": "dispense", + "key": "638fdb6a8a86d1d73657bd456b94d8d5", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 1.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 1.0 + }, + "startedAt": "2023-11-29T20:18:30.528784+00:00", + "completedAt": "2023-11-29T20:18:30.530927+00:00" + }, + { + "id": "06c2d364-19a6-4207-b405-f72851356a01", + "createdAt": "2023-11-29T20:18:30.531744+00:00", + "commandType": "dispense", + "key": "6d7baf965fb5619b13878cafa2f0d522", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.531833+00:00", + "completedAt": "2023-11-29T20:18:30.537326+00:00" + }, + { + "id": "a7efaddf-fcfd-4f3f-929c-5f2c7beef49e", + "createdAt": "2023-11-29T20:18:30.538245+00:00", + "commandType": "aspirate", + "key": "395a2fd1361da846ccc4b5e6b0477757", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.538312+00:00", + "completedAt": "2023-11-29T20:18:30.543656+00:00" + }, + { + "id": "90c6d295-1287-4888-b66a-8b7dc40e5ba7", + "createdAt": "2023-11-29T20:18:30.544621+00:00", + "commandType": "dispense", + "key": "ad9cb4f0151fbe69940d52aeb8c3cf3a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.544697+00:00", + "completedAt": "2023-11-29T20:18:30.546692+00:00" + }, + { + "id": "4302a76c-284a-45ea-ae67-1989765dc55f", + "createdAt": "2023-11-29T20:18:30.547428+00:00", + "commandType": "aspirate", + "key": "75e1d6d523e3561eaaa61a668cf293fb", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.547494+00:00", + "completedAt": "2023-11-29T20:18:30.552949+00:00" + }, + { + "id": "9346021a-a90c-41e0-8c94-29055aa4a85d", + "createdAt": "2023-11-29T20:18:30.553802+00:00", + "commandType": "dispense", + "key": "e76946f69d52a19fb6571aa97b129cdb", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.553872+00:00", + "completedAt": "2023-11-29T20:18:30.555856+00:00" + }, + { + "id": "c55d3e5b-5791-4b7e-a6a9-cee5778ccc82", + "createdAt": "2023-11-29T20:18:30.556546+00:00", + "commandType": "aspirate", + "key": "df6433bd7c5ed18c6fd6aa40b10a1efd", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.556619+00:00", + "completedAt": "2023-11-29T20:18:30.561443+00:00" + }, + { + "id": "19898e2f-a917-48be-9eba-32f0e6747a96", + "createdAt": "2023-11-29T20:18:30.562171+00:00", + "commandType": "dispense", + "key": "3c8e0dee5aaa8af3baec38b1f570afcd", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.562235+00:00", + "completedAt": "2023-11-29T20:18:30.564107+00:00" + }, + { + "id": "089cc8ee-af57-43fa-8363-1bad252c46b7", + "createdAt": "2023-11-29T20:18:30.564629+00:00", + "commandType": "moveToWell", + "key": "9c8ea7e667d131322862288c40235fd6", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 13.259999999999994 + } + }, + "startedAt": "2023-11-29T20:18:30.564687+00:00", + "completedAt": "2023-11-29T20:18:30.566067+00:00" + }, + { + "id": "b5bbf4ac-9eb0-4b37-a0f9-d1b4b983baa1", + "createdAt": "2023-11-29T20:18:30.566458+00:00", + "commandType": "waitForDuration", + "key": "4d6e05330293b7c6737482eab76d2c94", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.566518+00:00", + "completedAt": "2023-11-29T20:18:30.566582+00:00" + }, + { + "id": "ee59e265-7b06-4435-abbf-fba93cc523d7", + "createdAt": "2023-11-29T20:18:30.567424+00:00", + "commandType": "blowout", + "key": "2bdf0279b850a7725f0c029cc1b64745", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 4.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 13.259999999999994 + } + }, + "startedAt": "2023-11-29T20:18:30.567537+00:00", + "completedAt": "2023-11-29T20:18:30.570036+00:00" + }, + { + "id": "3387b8d5-b9e4-42a5-850b-40770a059a65", + "createdAt": "2023-11-29T20:18:30.570531+00:00", + "commandType": "dropTip", + "key": "50b099872f3bff49be1ad74a80fe70cc", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 509.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:30.570606+00:00", + "completedAt": "2023-11-29T20:18:30.576757+00:00" + }, + { + "id": "fb9bfad4-57f2-48f4-9fb1-904987b817d6", + "createdAt": "2023-11-29T20:18:30.577382+00:00", + "commandType": "pickUpTip", + "key": "cc58ab3e5a15e16c89d63b1610b2e7a3", + "status": "succeeded", + "params": { + "labwareId": "e5b35230-f2df-4afa-b7c1-3b15c174733f", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 187.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:30.577466+00:00", + "completedAt": "2023-11-29T20:18:30.588203+00:00" + }, + { + "id": "c19972de-28db-485c-83c1-aa78916a2d23", + "createdAt": "2023-11-29T20:18:30.589114+00:00", + "commandType": "aspirate", + "key": "d17b911f0119ade0f74ce9dc5ad1c22f", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 11.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 11.0 + }, + "startedAt": "2023-11-29T20:18:30.589209+00:00", + "completedAt": "2023-11-29T20:18:30.594778+00:00" + }, + { + "id": "c40f0517-b6fe-470c-ad4b-54f34bdfd2fe", + "createdAt": "2023-11-29T20:18:30.595671+00:00", + "commandType": "dispense", + "key": "a12678170f558319af0f89654b39d60d", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 11.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 11.0 + }, + "startedAt": "2023-11-29T20:18:30.595732+00:00", + "completedAt": "2023-11-29T20:18:30.597877+00:00" + }, + { + "id": "25870d25-403f-4fb8-9ff3-6d180aefe439", + "createdAt": "2023-11-29T20:18:30.598797+00:00", + "commandType": "aspirate", + "key": "074449b80752c3c1a7f878f62822609a", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 11.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 11.0 + }, + "startedAt": "2023-11-29T20:18:30.598931+00:00", + "completedAt": "2023-11-29T20:18:30.604549+00:00" + }, + { + "id": "2aa1b42c-5d07-417c-87f9-014dca9f29e5", + "createdAt": "2023-11-29T20:18:30.605519+00:00", + "commandType": "dispense", + "key": "bdf8b3a7225aa0ff1c2775d9749d4e18", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 11.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 11.0 + }, + "startedAt": "2023-11-29T20:18:30.605595+00:00", + "completedAt": "2023-11-29T20:18:30.607878+00:00" + }, + { + "id": "ccc1ce5f-78c4-4c21-9b8b-e207ec1daa9e", + "createdAt": "2023-11-29T20:18:30.609103+00:00", + "commandType": "aspirate", + "key": "bd6e78d4c76073c507f0f06d64d3c44a", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 11.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 11.0 + }, + "startedAt": "2023-11-29T20:18:30.609185+00:00", + "completedAt": "2023-11-29T20:18:30.614772+00:00" + }, + { + "id": "7431038f-a576-41dc-b99f-3ac864d9909f", + "createdAt": "2023-11-29T20:18:30.615801+00:00", + "commandType": "dispense", + "key": "76b403e70b2c22bfea58f6bd544fe53c", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 1.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 1.0 + }, + "startedAt": "2023-11-29T20:18:30.615865+00:00", + "completedAt": "2023-11-29T20:18:30.618036+00:00" + }, + { + "id": "1cda6e81-97d9-4f17-854a-9c21731d66bf", + "createdAt": "2023-11-29T20:18:30.618784+00:00", + "commandType": "dispense", + "key": "429ffb6b7cb8d2b6a969422be0af3a25", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.5599999999999945 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.618862+00:00", + "completedAt": "2023-11-29T20:18:30.624014+00:00" + }, + { + "id": "d9a7b6f6-7a94-4989-8aea-98bb3fc054c8", + "createdAt": "2023-11-29T20:18:30.624835+00:00", + "commandType": "aspirate", + "key": "66a27f5b6b80fd0964ca500aad16010f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.5599999999999945 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.624900+00:00", + "completedAt": "2023-11-29T20:18:30.629850+00:00" + }, + { + "id": "7a5e4835-a83e-464e-8328-78d30fe2ff91", + "createdAt": "2023-11-29T20:18:30.630691+00:00", + "commandType": "dispense", + "key": "2ed0aa6331bf9b2375a4bba116dd4232", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.5599999999999945 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.630762+00:00", + "completedAt": "2023-11-29T20:18:30.632833+00:00" + }, + { + "id": "63f00ed5-4a67-4e81-97d6-67e2ca8a477c", + "createdAt": "2023-11-29T20:18:30.633715+00:00", + "commandType": "aspirate", + "key": "cfc06986306a410cf1f327b7939656bf", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.5599999999999945 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.633800+00:00", + "completedAt": "2023-11-29T20:18:30.638660+00:00" + }, + { + "id": "09226cf5-9b71-4985-881c-d1a22aa24fdd", + "createdAt": "2023-11-29T20:18:30.639508+00:00", + "commandType": "dispense", + "key": "4f95cde140fe1fd1223dc0c04d558c18", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.5599999999999945 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.639585+00:00", + "completedAt": "2023-11-29T20:18:30.641692+00:00" + }, + { + "id": "96f5b826-59d4-4460-904b-bd3997dbedfe", + "createdAt": "2023-11-29T20:18:30.642552+00:00", + "commandType": "aspirate", + "key": "9d02ffac16c1855d161625d600c2f88e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.5599999999999945 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.642666+00:00", + "completedAt": "2023-11-29T20:18:30.647939+00:00" + }, + { + "id": "ca4e79b1-1a81-4736-b4a6-743bc3a9d3bf", + "createdAt": "2023-11-29T20:18:30.648761+00:00", + "commandType": "dispense", + "key": "07a66d99b559fba1a2e22df4b4c40e07", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.5599999999999945 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.648838+00:00", + "completedAt": "2023-11-29T20:18:30.650974+00:00" + }, + { + "id": "87fb4685-7723-401a-b52c-ace603c8b8ac", + "createdAt": "2023-11-29T20:18:30.651723+00:00", + "commandType": "moveToWell", + "key": "7e554e6e0fb2e93ba21787aeab95c65f", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 13.259999999999994 } + }, + "startedAt": "2023-11-29T20:18:30.651799+00:00", + "completedAt": "2023-11-29T20:18:30.653273+00:00" + }, + { + "id": "1747287b-047a-43ea-86ec-26756cd101cd", + "createdAt": "2023-11-29T20:18:30.653576+00:00", + "commandType": "waitForDuration", + "key": "222adf872ea8cb2f8133a790410938e7", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.653634+00:00", + "completedAt": "2023-11-29T20:18:30.653687+00:00" + }, + { + "id": "a48f5226-1e1a-49e0-beef-ca33a95d91d6", + "createdAt": "2023-11-29T20:18:30.654481+00:00", + "commandType": "blowout", + "key": "0d3be177e83c259690707619b3b17741", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 4.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 13.259999999999994 } + }, + "startedAt": "2023-11-29T20:18:30.654536+00:00", + "completedAt": "2023-11-29T20:18:30.656462+00:00" + }, + { + "id": "646a9612-9f72-48d5-9863-ad96e34e45da", + "createdAt": "2023-11-29T20:18:30.656843+00:00", + "commandType": "dropTip", + "key": "f0571a97feedde21f1acc2c31eb6d20f", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:30.656904+00:00", + "completedAt": "2023-11-29T20:18:30.663189+00:00" + }, + { + "id": "71af7220-5f8d-478b-8685-11b6fbf9aab1", + "createdAt": "2023-11-29T20:18:30.663751+00:00", + "commandType": "pickUpTip", + "key": "544f146357a1ee5467ad989537d40b16", + "status": "succeeded", + "params": { + "labwareId": "e5b35230-f2df-4afa-b7c1-3b15c174733f", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 196.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:30.663811+00:00", + "completedAt": "2023-11-29T20:18:30.674768+00:00" + }, + { + "id": "aa20c930-7e69-4c38-ac6d-06809d7d6a34", + "createdAt": "2023-11-29T20:18:30.676149+00:00", + "commandType": "aspirate", + "key": "c1bbd9a4955034de8a2077f5dfa82dcb", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 11.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 11.0 + }, + "startedAt": "2023-11-29T20:18:30.676255+00:00", + "completedAt": "2023-11-29T20:18:30.682038+00:00" + }, + { + "id": "01356265-f412-452b-b43e-935e30bb57d6", + "createdAt": "2023-11-29T20:18:30.683218+00:00", + "commandType": "dispense", + "key": "b56f09dea56a27c9515d384e996a4fcb", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 11.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 11.0 + }, + "startedAt": "2023-11-29T20:18:30.683313+00:00", + "completedAt": "2023-11-29T20:18:30.685728+00:00" + }, + { + "id": "1426733b-e8c1-4cb9-aa88-13f5766a814f", + "createdAt": "2023-11-29T20:18:30.686631+00:00", + "commandType": "aspirate", + "key": "897e5746425b20d071e2887d188f9b7e", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 11.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 11.0 + }, + "startedAt": "2023-11-29T20:18:30.686699+00:00", + "completedAt": "2023-11-29T20:18:30.694216+00:00" + }, + { + "id": "c09d025e-b29a-4479-a7bc-f95e68753231", + "createdAt": "2023-11-29T20:18:30.695350+00:00", + "commandType": "dispense", + "key": "8413c3d349372fe03fe40ae2e97ead62", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 11.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 11.0 + }, + "startedAt": "2023-11-29T20:18:30.695610+00:00", + "completedAt": "2023-11-29T20:18:30.698417+00:00" + }, + { + "id": "c572340a-1754-4e1d-b1e5-8eec4eabbc60", + "createdAt": "2023-11-29T20:18:30.699500+00:00", + "commandType": "aspirate", + "key": "209f9c8527cb48eae8a16a4c7021b4c2", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 11.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 11.0 + }, + "startedAt": "2023-11-29T20:18:30.699572+00:00", + "completedAt": "2023-11-29T20:18:30.705347+00:00" + }, + { + "id": "ee9826d3-e3ac-4ca4-b893-0677cca5271a", + "createdAt": "2023-11-29T20:18:30.706614+00:00", + "commandType": "dispense", + "key": "e9b8b4578ea164b59593c1573aeb8440", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 1.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 74.24, "z": 16.55 }, + "volume": 1.0 + }, + "startedAt": "2023-11-29T20:18:30.706716+00:00", + "completedAt": "2023-11-29T20:18:30.709061+00:00" + }, + { + "id": "d6842104-6b98-4ad5-86eb-6d341541c4b1", + "createdAt": "2023-11-29T20:18:30.710068+00:00", + "commandType": "dispense", + "key": "e02be9a16c21b6bab16fd061b8e9307e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.710194+00:00", + "completedAt": "2023-11-29T20:18:30.715911+00:00" + }, + { + "id": "644d59f3-522f-4179-a925-01e3174c4078", + "createdAt": "2023-11-29T20:18:30.716957+00:00", + "commandType": "aspirate", + "key": "b6b248f3d5cd451504cf6dfbe0159606", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.717082+00:00", + "completedAt": "2023-11-29T20:18:30.722688+00:00" + }, + { + "id": "e758630e-1517-4ffc-982f-d50d6bee112a", + "createdAt": "2023-11-29T20:18:30.723570+00:00", + "commandType": "dispense", + "key": "4061ec2ca1c7a605ebd58f1a3b03173a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.723642+00:00", + "completedAt": "2023-11-29T20:18:30.725722+00:00" + }, + { + "id": "1d0f4a19-3b0a-46e7-b986-4d26fc82e39b", + "createdAt": "2023-11-29T20:18:30.726690+00:00", + "commandType": "aspirate", + "key": "19b96d262f99b16fe4c11481d93a2358", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.726818+00:00", + "completedAt": "2023-11-29T20:18:30.732466+00:00" + }, + { + "id": "50ca437f-0f13-49fc-aae6-9eaf4e264686", + "createdAt": "2023-11-29T20:18:30.733348+00:00", + "commandType": "dispense", + "key": "14e77d406c4835d13e8d39db0fc4a37e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.733454+00:00", + "completedAt": "2023-11-29T20:18:30.736037+00:00" + }, + { + "id": "36049ff0-5ddb-4688-844b-ff0b49dbdcb0", + "createdAt": "2023-11-29T20:18:30.737067+00:00", + "commandType": "aspirate", + "key": "8ab6d4cf0b99c638b16fa9d90aafccf5", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.737185+00:00", + "completedAt": "2023-11-29T20:18:30.742663+00:00" + }, + { + "id": "98a537bc-ac39-422b-af9d-46cbf2b59eed", + "createdAt": "2023-11-29T20:18:30.743644+00:00", + "commandType": "dispense", + "key": "83078ef7cbb93302b0691de62f9033f8", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:30.743858+00:00", + "completedAt": "2023-11-29T20:18:30.746116+00:00" + }, + { + "id": "c4fd9fea-faf7-4b71-9fb6-2e450aa92142", + "createdAt": "2023-11-29T20:18:30.746813+00:00", + "commandType": "moveToWell", + "key": "f2a92e39dbbaa52f1f8a1db7141aee0e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 13.259999999999994 + } + }, + "startedAt": "2023-11-29T20:18:30.746878+00:00", + "completedAt": "2023-11-29T20:18:30.748223+00:00" + }, + { + "id": "c29c9944-bc46-47d0-9ce3-9eef195572e5", + "createdAt": "2023-11-29T20:18:30.748549+00:00", + "commandType": "waitForDuration", + "key": "1a453a67105ebd7b9899ac402ffc40d3", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.748615+00:00", + "completedAt": "2023-11-29T20:18:30.748673+00:00" + }, + { + "id": "cf0218ad-39ec-4bd9-9b4e-2daf9d3e5c4b", + "createdAt": "2023-11-29T20:18:30.749418+00:00", + "commandType": "blowout", + "key": "c87057c08d931bcaea4bdcb846ad63dd", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 4.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 13.259999999999994 + } + }, + "startedAt": "2023-11-29T20:18:30.749475+00:00", + "completedAt": "2023-11-29T20:18:30.751644+00:00" + }, + { + "id": "966bb9d7-95d5-47e3-a69f-39582019ccce", + "createdAt": "2023-11-29T20:18:30.752094+00:00", + "commandType": "dropTip", + "key": "96f1a0973124866ee8f9f961ef37c5b2", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 509.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:30.752226+00:00", + "completedAt": "2023-11-29T20:18:30.759224+00:00" + }, + { + "id": "70618bc6-f70f-439e-9250-79bddcda2410", + "createdAt": "2023-11-29T20:18:30.759846+00:00", + "commandType": "thermocycler/closeLid", + "key": "d26cd23d4d91823bfa0b94844fbc437b", + "status": "succeeded", + "params": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.759918+00:00", + "completedAt": "2023-11-29T20:18:30.762901+00:00" + }, + { + "id": "14e661d4-75e2-4042-bb91-28c8885cf418", + "createdAt": "2023-11-29T20:18:30.763355+00:00", + "commandType": "thermocycler/runProfile", + "key": "dbf7c3c82d7cb7e14301bcd568824e7c", + "status": "succeeded", + "params": { + "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3", + "profile": [ + { "celsius": 32.0, "holdSeconds": 900.0 }, + { "celsius": 65.0, "holdSeconds": 1800.0 } + ], + "blockMaxVolumeUl": 50.0 + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.763425+00:00", + "completedAt": "2023-11-29T20:18:30.763497+00:00" + }, + { + "id": "4c2dcb61-6047-4012-92d3-6ccf076fbf7e", + "createdAt": "2023-11-29T20:18:30.763737+00:00", + "commandType": "thermocycler/setTargetBlockTemperature", + "key": "5543391d9bc6f290003627b95927f3e5", + "status": "succeeded", + "params": { + "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3", + "celsius": 4.0, + "holdTimeSeconds": 0.0 + }, + "result": { "targetBlockTemperature": 4.0 }, + "startedAt": "2023-11-29T20:18:30.763789+00:00", + "completedAt": "2023-11-29T20:18:30.763840+00:00" + }, + { + "id": "ac9c558e-4331-4dd9-87cc-e268da70c58a", + "createdAt": "2023-11-29T20:18:30.764008+00:00", + "commandType": "thermocycler/waitForBlockTemperature", + "key": "7952b80171ca9490d8f2cb91aa410122", + "status": "succeeded", + "params": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.764056+00:00", + "completedAt": "2023-11-29T20:18:30.764101+00:00" + }, + { + "id": "aefb3ff4-c8f2-42b8-9c52-257dc1c76b3e", + "createdAt": "2023-11-29T20:18:30.764507+00:00", + "commandType": "thermocycler/openLid", + "key": "9b0d70fd99c62b7352a83548c9243607", + "status": "succeeded", + "params": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.764572+00:00", + "completedAt": "2023-11-29T20:18:30.766208+00:00" + }, + { + "id": "caa7a6ff-588e-4492-9e83-0f2f46f4bbd0", + "createdAt": "2023-11-29T20:18:30.766821+00:00", + "commandType": "custom", + "key": "9fc3bd9eee782612a88d0571fa85788c", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "==============================================" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.766885+00:00", + "completedAt": "2023-11-29T20:18:30.766952+00:00" + }, + { + "id": "bc42c10f-92dd-4ae8-b491-153ad341fb55", + "createdAt": "2023-11-29T20:18:30.767401+00:00", + "commandType": "custom", + "key": "13438c10d2b2176780a984e10a1c6bbb", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Adapter Ligation" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.767517+00:00", + "completedAt": "2023-11-29T20:18:30.767614+00:00" + }, + { + "id": "b683ceae-3a00-40c1-a169-b2917370940c", + "createdAt": "2023-11-29T20:18:30.768216+00:00", + "commandType": "custom", + "key": "267f1b648f424ccd96c051ff08fe6481", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "==============================================" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.768324+00:00", + "completedAt": "2023-11-29T20:18:30.768389+00:00" + }, + { + "id": "b90317d0-9b11-4931-981a-0239525afe62", + "createdAt": "2023-11-29T20:18:30.768913+00:00", + "commandType": "custom", + "key": "e6f7b288ea08e979ddc5367d2f41b675", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Adding Barcodes" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.768982+00:00", + "completedAt": "2023-11-29T20:18:30.769051+00:00" + }, + { + "id": "7965b26c-f04a-4844-a960-11a191f0b403", + "createdAt": "2023-11-29T20:18:30.769580+00:00", + "commandType": "pickUpTip", + "key": "e4b7bbcf2416e101648db70555fa9cdc", + "status": "succeeded", + "params": { + "labwareId": "e5b35230-f2df-4afa-b7c1-3b15c174733f", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 205.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:30.769642+00:00", + "completedAt": "2023-11-29T20:18:30.780160+00:00" + }, + { + "id": "9fd2225d-d1dc-4be3-83f6-92e753110a47", + "createdAt": "2023-11-29T20:18:30.781007+00:00", + "commandType": "aspirate", + "key": "ef4f492d95a0e995a1a77260a96324c5", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 6.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 396.38, "y": 74.24, "z": 16.55 }, + "volume": 6.0 + }, + "startedAt": "2023-11-29T20:18:30.781072+00:00", + "completedAt": "2023-11-29T20:18:30.786502+00:00" + }, + { + "id": "950251bb-0a30-4f82-ba8f-e93551393493", + "createdAt": "2023-11-29T20:18:30.787609+00:00", + "commandType": "dispense", + "key": "c855878f28324caf212b9f730ea17128", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 1.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 396.38, "y": 74.24, "z": 16.55 }, + "volume": 1.0 + }, + "startedAt": "2023-11-29T20:18:30.787712+00:00", + "completedAt": "2023-11-29T20:18:30.789743+00:00" + }, + { + "id": "72d06c81-7f00-4834-a6fe-aff1bbebe767", + "createdAt": "2023-11-29T20:18:30.790332+00:00", + "commandType": "dispense", + "key": "dd3c4a8496454c2b73a2c83ef1319679", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 5.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 5.0 + }, + "startedAt": "2023-11-29T20:18:30.790389+00:00", + "completedAt": "2023-11-29T20:18:30.795928+00:00" + }, + { + "id": "928d85d1-bf4f-4ba3-8f63-8119d76870a1", + "createdAt": "2023-11-29T20:18:30.796881+00:00", + "commandType": "aspirate", + "key": "e3b206969941fac95fe08919a95a3e05", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.796967+00:00", + "completedAt": "2023-11-29T20:18:30.802984+00:00" + }, + { + "id": "0854ebb8-a162-4dfa-9622-cf0617be6abf", + "createdAt": "2023-11-29T20:18:30.804031+00:00", + "commandType": "dispense", + "key": "c20a24858a6559b36c0c1afc4e023b2f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.804188+00:00", + "completedAt": "2023-11-29T20:18:30.806834+00:00" + }, + { + "id": "e03d0d74-7b50-47cd-ace0-1badc716d50b", + "createdAt": "2023-11-29T20:18:30.807565+00:00", + "commandType": "aspirate", + "key": "1b8e616a967cc08a3a741c86bc5eb054", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.807677+00:00", + "completedAt": "2023-11-29T20:18:30.813384+00:00" + }, + { + "id": "d84bbd17-01fd-4dd1-bcda-a7ed88b22de5", + "createdAt": "2023-11-29T20:18:30.814282+00:00", + "commandType": "dispense", + "key": "085df20aabf7825b540c8cb3d1d86195", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.814359+00:00", + "completedAt": "2023-11-29T20:18:30.816755+00:00" + }, + { + "id": "11107ef4-7c43-43c0-9ca4-2109f35e3713", + "createdAt": "2023-11-29T20:18:30.817669+00:00", + "commandType": "aspirate", + "key": "dd4c98bafb87f2e1a9100e0cc8ad5f6b", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.817733+00:00", + "completedAt": "2023-11-29T20:18:30.823231+00:00" + }, + { + "id": "9a373e6b-5777-427a-8c2c-28a91d091e91", + "createdAt": "2023-11-29T20:18:30.824118+00:00", + "commandType": "dispense", + "key": "7a518f7c95ddf01232dd7189ba3b9b0b", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.824184+00:00", + "completedAt": "2023-11-29T20:18:30.826707+00:00" + }, + { + "id": "4dad644e-07c2-485e-9b17-e9c312bbc043", + "createdAt": "2023-11-29T20:18:30.827483+00:00", + "commandType": "moveToWell", + "key": "1a3eedf6e876fbc1d0213998740ebaf5", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 13.259999999999994 + } + }, + "startedAt": "2023-11-29T20:18:30.827598+00:00", + "completedAt": "2023-11-29T20:18:30.829079+00:00" + }, + { + "id": "ebc992e3-126b-4c02-b50b-297cf602e659", + "createdAt": "2023-11-29T20:18:30.829407+00:00", + "commandType": "waitForDuration", + "key": "febd44ca1a9060f2254ea38d0fab1b79", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.829474+00:00", + "completedAt": "2023-11-29T20:18:30.829532+00:00" + }, + { + "id": "a0838eea-26ab-4131-a828-809ed449bbf8", + "createdAt": "2023-11-29T20:18:30.830290+00:00", + "commandType": "blowout", + "key": "152731d49c6a75118940c7d7124f2698", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 4.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 13.259999999999994 + } + }, + "startedAt": "2023-11-29T20:18:30.830345+00:00", + "completedAt": "2023-11-29T20:18:30.832335+00:00" + }, + { + "id": "75323f93-37c3-4421-99ef-659b7053b195", + "createdAt": "2023-11-29T20:18:30.832692+00:00", + "commandType": "dropTip", + "key": "4b0353311b54b1d806b4b954fea225da", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:30.832832+00:00", + "completedAt": "2023-11-29T20:18:30.839894+00:00" + }, + { + "id": "8fc31f80-ea15-43ef-924a-331481cb6687", + "createdAt": "2023-11-29T20:18:30.840642+00:00", + "commandType": "pickUpTip", + "key": "2a640c9f8e2cfb8cc393c01ec50fa1e0", + "status": "succeeded", + "params": { + "labwareId": "e5b35230-f2df-4afa-b7c1-3b15c174733f", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 214.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:30.840729+00:00", + "completedAt": "2023-11-29T20:18:30.851769+00:00" + }, + { + "id": "991e4740-d5c0-4093-b522-a173b79826fc", + "createdAt": "2023-11-29T20:18:30.852780+00:00", + "commandType": "aspirate", + "key": "ccdc9e442bfcc9ef54b00e96518f78ea", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 6.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 405.38, "y": 74.24, "z": 16.55 }, + "volume": 6.0 + }, + "startedAt": "2023-11-29T20:18:30.852870+00:00", + "completedAt": "2023-11-29T20:18:30.858407+00:00" + }, + { + "id": "f88d2898-2d3f-4857-8d27-c224a8b9643c", + "createdAt": "2023-11-29T20:18:30.859582+00:00", + "commandType": "dispense", + "key": "9e26064be81d921de62aafd214f621c7", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 1.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 405.38, "y": 74.24, "z": 16.55 }, + "volume": 1.0 + }, + "startedAt": "2023-11-29T20:18:30.859707+00:00", + "completedAt": "2023-11-29T20:18:30.862008+00:00" + }, + { + "id": "f9e4fa9e-a4f5-465c-961b-636d34565702", + "createdAt": "2023-11-29T20:18:30.862747+00:00", + "commandType": "dispense", + "key": "5036c44c4b7c2ccdd9238148c67cf878", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 5.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.5599999999999945 }, + "volume": 5.0 + }, + "startedAt": "2023-11-29T20:18:30.862830+00:00", + "completedAt": "2023-11-29T20:18:30.868162+00:00" + }, + { + "id": "8d18294a-6da8-418f-baa2-57344837f3fc", + "createdAt": "2023-11-29T20:18:30.869223+00:00", + "commandType": "aspirate", + "key": "45e5dbe002578321e9681b7618196bdf", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.5599999999999945 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.869324+00:00", + "completedAt": "2023-11-29T20:18:30.874953+00:00" + }, + { + "id": "74e24030-318f-4ce2-bf99-cbf74c0287ca", + "createdAt": "2023-11-29T20:18:30.875921+00:00", + "commandType": "dispense", + "key": "31c5cfc068f54892def974f8840266da", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.5599999999999945 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.876034+00:00", + "completedAt": "2023-11-29T20:18:30.878698+00:00" + }, + { + "id": "add1f5d8-6066-401b-a110-c278f8b6718d", + "createdAt": "2023-11-29T20:18:30.879517+00:00", + "commandType": "aspirate", + "key": "c36615a91625f256b3ecb737277adc68", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.5599999999999945 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.879599+00:00", + "completedAt": "2023-11-29T20:18:30.885226+00:00" + }, + { + "id": "f3271031-1c73-4074-b26b-f0babb41cf04", + "createdAt": "2023-11-29T20:18:30.886260+00:00", + "commandType": "dispense", + "key": "8f49d75c9743274875ab58d8056f7058", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.5599999999999945 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.886405+00:00", + "completedAt": "2023-11-29T20:18:30.888599+00:00" + }, + { + "id": "9e45b3ea-5cfd-41a6-a478-87eea119ef0e", + "createdAt": "2023-11-29T20:18:30.889450+00:00", + "commandType": "aspirate", + "key": "2f632a1f713d7713c8e1a07c585e84c3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.5599999999999945 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.889527+00:00", + "completedAt": "2023-11-29T20:18:30.895348+00:00" + }, + { + "id": "865e294e-6ad5-4e63-a557-578f91706e0c", + "createdAt": "2023-11-29T20:18:30.896379+00:00", + "commandType": "dispense", + "key": "dc7975458623a9467c9adde04aadc7c9", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.5599999999999945 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.896519+00:00", + "completedAt": "2023-11-29T20:18:30.899169+00:00" + }, + { + "id": "25815c33-ede8-4bcc-a1d2-0e47f72b1a3f", + "createdAt": "2023-11-29T20:18:30.899931+00:00", + "commandType": "moveToWell", + "key": "9e16218d4189e9241ce2ad735889f146", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 13.259999999999994 } + }, + "startedAt": "2023-11-29T20:18:30.900011+00:00", + "completedAt": "2023-11-29T20:18:30.901691+00:00" + }, + { + "id": "adb40474-8485-4282-8293-3b285b46c402", + "createdAt": "2023-11-29T20:18:30.902088+00:00", + "commandType": "waitForDuration", + "key": "180479494e48462f94568c989d7925d9", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:30.902151+00:00", + "completedAt": "2023-11-29T20:18:30.902209+00:00" + }, + { + "id": "8249ac8b-9462-48da-9b28-5742cf032c58", + "createdAt": "2023-11-29T20:18:30.903075+00:00", + "commandType": "blowout", + "key": "4ae013c8005fb9cc3ba6d331ebbf27d6", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 4.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 13.259999999999994 } + }, + "startedAt": "2023-11-29T20:18:30.903196+00:00", + "completedAt": "2023-11-29T20:18:30.905764+00:00" + }, + { + "id": "8d26f424-09e7-4c5e-9412-4125cfa90bfa", + "createdAt": "2023-11-29T20:18:30.906176+00:00", + "commandType": "dropTip", + "key": "75878aaecf4d4c6ce965c317c1b521bc", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 509.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:30.906240+00:00", + "completedAt": "2023-11-29T20:18:30.913267+00:00" + }, + { + "id": "36948b5b-dbbc-4fd3-8a08-5f90398f308e", + "createdAt": "2023-11-29T20:18:30.913885+00:00", + "commandType": "pickUpTip", + "key": "26c5b628aeaace26e848f2e8ab69be50", + "status": "succeeded", + "params": { + "labwareId": "e5b35230-f2df-4afa-b7c1-3b15c174733f", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 223.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:30.913949+00:00", + "completedAt": "2023-11-29T20:18:30.924837+00:00" + }, + { + "id": "1bf355f9-1d9f-4180-83e9-cb409c207f2a", + "createdAt": "2023-11-29T20:18:30.925832+00:00", + "commandType": "aspirate", + "key": "2c395ccf57838547c16b88bd99a5ef64", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 6.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 414.38, "y": 74.24, "z": 16.55 }, + "volume": 6.0 + }, + "startedAt": "2023-11-29T20:18:30.925913+00:00", + "completedAt": "2023-11-29T20:18:30.931519+00:00" + }, + { + "id": "cb858be6-ac02-431c-a1b6-dede81253f6e", + "createdAt": "2023-11-29T20:18:30.932596+00:00", + "commandType": "dispense", + "key": "4127305a98b560b228ed0953abe766d9", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 1.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 414.38, "y": 74.24, "z": 16.55 }, + "volume": 1.0 + }, + "startedAt": "2023-11-29T20:18:30.932711+00:00", + "completedAt": "2023-11-29T20:18:30.935051+00:00" + }, + { + "id": "8835639e-15d6-4fbd-bdc5-abb9fdc8c0be", + "createdAt": "2023-11-29T20:18:30.935822+00:00", + "commandType": "dispense", + "key": "2a12478f0fbf70a16824a3e8e2f9940d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 2.0, + "volume": 5.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 5.0 + }, + "startedAt": "2023-11-29T20:18:30.935944+00:00", + "completedAt": "2023-11-29T20:18:30.941229+00:00" + }, + { + "id": "e972dea7-c80a-49ae-982c-8655e90a7858", + "createdAt": "2023-11-29T20:18:30.942148+00:00", + "commandType": "aspirate", + "key": "d95b88a27963fa8c607755724f6c5f1e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.942215+00:00", + "completedAt": "2023-11-29T20:18:30.960334+00:00" + }, + { + "id": "548820a3-9d88-4e12-a2e3-52a7ec61bea0", + "createdAt": "2023-11-29T20:18:30.961992+00:00", + "commandType": "dispense", + "key": "79e56bd8495f228c44139e220495c332", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.962176+00:00", + "completedAt": "2023-11-29T20:18:30.965620+00:00" + }, + { + "id": "b81b46a6-46c1-499e-9ab4-15da8d631736", + "createdAt": "2023-11-29T20:18:30.968181+00:00", + "commandType": "aspirate", + "key": "8ffb3e847c5db3eba8bf98f5885fb967", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.968309+00:00", + "completedAt": "2023-11-29T20:18:30.975141+00:00" + }, + { + "id": "084dd105-d90a-4835-aee2-16942f3abc54", + "createdAt": "2023-11-29T20:18:30.979456+00:00", + "commandType": "dispense", + "key": "7ff355304faef15a7a8372566c7c7fed", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.979868+00:00", + "completedAt": "2023-11-29T20:18:30.983588+00:00" + }, + { + "id": "8690b7cf-9d9d-4022-8c0a-6d97fe98b0a4", + "createdAt": "2023-11-29T20:18:30.989349+00:00", + "commandType": "aspirate", + "key": "29f2b42cd10ea7519885792e5003ae70", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:30.989682+00:00", + "completedAt": "2023-11-29T20:18:30.998518+00:00" + }, + { + "id": "7a95eea3-1404-4541-8d76-df0850a575eb", + "createdAt": "2023-11-29T20:18:31.002627+00:00", + "commandType": "dispense", + "key": "07f7f0ae53e32e4f2ecb61ead39db8b3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 8.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:31.003102+00:00", + "completedAt": "2023-11-29T20:18:31.006948+00:00" + }, + { + "id": "8696b306-77d1-4b7b-b3a1-8872270f873d", + "createdAt": "2023-11-29T20:18:31.007904+00:00", + "commandType": "moveToWell", + "key": "fcfe58753e8f1db2059ad7937183923d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 13.259999999999994 + } + }, + "startedAt": "2023-11-29T20:18:31.008027+00:00", + "completedAt": "2023-11-29T20:18:31.009676+00:00" + }, + { + "id": "e53f8032-1c15-48ae-a5f0-3bd491c9cd47", + "createdAt": "2023-11-29T20:18:31.010298+00:00", + "commandType": "waitForDuration", + "key": "7110589a47a4e063ff1d362ae3535bb2", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.010554+00:00", + "completedAt": "2023-11-29T20:18:31.010647+00:00" + }, + { + "id": "834e9c2c-b29e-4c6d-9fbf-b45a4d8013c0", + "createdAt": "2023-11-29T20:18:31.013585+00:00", + "commandType": "blowout", + "key": "fea8e4993ba149ad5e3e3caf84c94b3f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 4.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 13.259999999999994 + } + }, + "startedAt": "2023-11-29T20:18:31.013848+00:00", + "completedAt": "2023-11-29T20:18:31.016915+00:00" + }, + { + "id": "a9f1fb9b-1721-4c59-9500-c0c1f11621c7", + "createdAt": "2023-11-29T20:18:31.017915+00:00", + "commandType": "dropTip", + "key": "6be465c3ef54b1836178f7e44d3008bf", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:31.018693+00:00", + "completedAt": "2023-11-29T20:18:31.025465+00:00" + }, + { + "id": "e8112a85-6442-436a-b57d-d99b2cc36ace", + "createdAt": "2023-11-29T20:18:31.026179+00:00", + "commandType": "custom", + "key": "f3f758f6621b5a391e91ce79399d0b5a", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Adding Lig" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.026279+00:00", + "completedAt": "2023-11-29T20:18:31.026358+00:00" + }, + { + "id": "8a105047-6a50-4f81-8853-2bb999891b06", + "createdAt": "2023-11-29T20:18:31.027020+00:00", + "commandType": "pickUpTip", + "key": "e7348d2abaeeb185c9e78b6e63992a01", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:31.027123+00:00", + "completedAt": "2023-11-29T20:18:31.037771+00:00" + }, + { + "id": "91446e9f-294e-4139-95ea-85ff37baad40", + "createdAt": "2023-11-29T20:18:31.038669+00:00", + "commandType": "aspirate", + "key": "e84632f890c3688af1bd6a07820d1ee0", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 47.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 47.0 + }, + "startedAt": "2023-11-29T20:18:31.038784+00:00", + "completedAt": "2023-11-29T20:18:31.044073+00:00" + }, + { + "id": "b2d8b771-db16-45b1-a148-b7828a53ecdc", + "createdAt": "2023-11-29T20:18:31.045220+00:00", + "commandType": "dispense", + "key": "391ef38d16469650fada00787b1a1856", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 47.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 47.0 + }, + "startedAt": "2023-11-29T20:18:31.045302+00:00", + "completedAt": "2023-11-29T20:18:31.047692+00:00" + }, + { + "id": "53a0c966-c408-411d-8585-78b46aff727d", + "createdAt": "2023-11-29T20:18:31.048624+00:00", + "commandType": "aspirate", + "key": "109f253eb771c3e17999bc09d2388e00", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 47.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 47.0 + }, + "startedAt": "2023-11-29T20:18:31.048702+00:00", + "completedAt": "2023-11-29T20:18:31.053583+00:00" + }, + { + "id": "dfbfac70-39e9-44bc-9f3e-196c2f7ea25b", + "createdAt": "2023-11-29T20:18:31.054481+00:00", + "commandType": "dispense", + "key": "466296a53ce98eaac460693357b22a21", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 47.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 47.0 + }, + "startedAt": "2023-11-29T20:18:31.054577+00:00", + "completedAt": "2023-11-29T20:18:31.056861+00:00" + }, + { + "id": "23f3b73d-a1a5-4e7c-b10b-0526723c3957", + "createdAt": "2023-11-29T20:18:31.057882+00:00", + "commandType": "aspirate", + "key": "b83d870ca52b7173722d3c6a6f7fcc47", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 47.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 47.0 + }, + "startedAt": "2023-11-29T20:18:31.057987+00:00", + "completedAt": "2023-11-29T20:18:31.063128+00:00" + }, + { + "id": "75b08133-0339-42fa-be11-624513b589ba", + "createdAt": "2023-11-29T20:18:31.064107+00:00", + "commandType": "dispense", + "key": "4f6eaeb35c6106647a29b2aa6e9af630", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 2.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 2.0 + }, + "startedAt": "2023-11-29T20:18:31.064204+00:00", + "completedAt": "2023-11-29T20:18:31.066424+00:00" + }, + { + "id": "dd38dac9-8747-43f5-979f-8ef8b749d65c", + "createdAt": "2023-11-29T20:18:31.067211+00:00", + "commandType": "moveToWell", + "key": "8d0e9a3846bb1a671d272e21599c097b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { "position": { "x": 351.38, "y": 74.24, "z": 36.25 } }, + "startedAt": "2023-11-29T20:18:31.067286+00:00", + "completedAt": "2023-11-29T20:18:31.068851+00:00" + }, + { + "id": "3d588d34-2a55-4a0d-b032-8627c24faaef", + "createdAt": "2023-11-29T20:18:31.069229+00:00", + "commandType": "waitForDuration", + "key": "42ebba0d939a1d0c3fc3c4cd441bced2", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.069341+00:00", + "completedAt": "2023-11-29T20:18:31.069436+00:00" + }, + { + "id": "6291ba06-2df3-43ec-afcd-481eb3104e45", + "createdAt": "2023-11-29T20:18:31.070296+00:00", + "commandType": "dispense", + "key": "f6d77ddcff15171af19c1c53e0720c6c", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 40.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:31.070393+00:00", + "completedAt": "2023-11-29T20:18:31.075718+00:00" + }, + { + "id": "c5a445ed-dc07-4758-85f1-1956f6990827", + "createdAt": "2023-11-29T20:18:31.076495+00:00", + "commandType": "moveToWell", + "key": "be039cc3a211eab1bb4bb7150debf671", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + } + }, + "startedAt": "2023-11-29T20:18:31.076571+00:00", + "completedAt": "2023-11-29T20:18:31.077313+00:00" + }, + { + "id": "3beac61e-3d27-4294-acf5-6ffa8186532d", + "createdAt": "2023-11-29T20:18:31.078081+00:00", + "commandType": "aspirate", + "key": "ade95e35185769fd586af4bb3d19fc60", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.078148+00:00", + "completedAt": "2023-11-29T20:18:31.083312+00:00" + }, + { + "id": "f824d7e4-b25b-4af0-b1c8-037db372ed1e", + "createdAt": "2023-11-29T20:18:31.084313+00:00", + "commandType": "dispense", + "key": "e35eb03104e363afa00c0073b3c25338", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.084417+00:00", + "completedAt": "2023-11-29T20:18:31.086524+00:00" + }, + { + "id": "6f7c77d4-6e45-43f7-87e2-8aaa969d766a", + "createdAt": "2023-11-29T20:18:31.087339+00:00", + "commandType": "aspirate", + "key": "7c61e62a7661594617fb3eeb2fb73303", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.087412+00:00", + "completedAt": "2023-11-29T20:18:31.092402+00:00" + }, + { + "id": "888644c2-d963-4df1-ac33-599af6a259d7", + "createdAt": "2023-11-29T20:18:31.093220+00:00", + "commandType": "dispense", + "key": "9cdbadafbd190e3906955b3816dd8be7", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.093287+00:00", + "completedAt": "2023-11-29T20:18:31.095420+00:00" + }, + { + "id": "ceaeeff2-d8e8-4ab2-a697-37b271b63dea", + "createdAt": "2023-11-29T20:18:31.096136+00:00", + "commandType": "aspirate", + "key": "f1bfb08d4e18428c04a6b5caea4c5cbe", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.096197+00:00", + "completedAt": "2023-11-29T20:18:31.101037+00:00" + }, + { + "id": "a398b165-dfd5-4680-ab49-68818ecad794", + "createdAt": "2023-11-29T20:18:31.101894+00:00", + "commandType": "dispense", + "key": "021892861037d36ee1b358a5b5623c4a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.101969+00:00", + "completedAt": "2023-11-29T20:18:31.103939+00:00" + }, + { + "id": "374ce624-8d60-49c7-aa59-a97c615f03d6", + "createdAt": "2023-11-29T20:18:31.104623+00:00", + "commandType": "aspirate", + "key": "92ebda325e25f7cf27e1423fb7d03891", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.104763+00:00", + "completedAt": "2023-11-29T20:18:31.110097+00:00" + }, + { + "id": "ab6e7c3c-23d9-4ad1-985c-f8d8253e17d4", + "createdAt": "2023-11-29T20:18:31.110994+00:00", + "commandType": "dispense", + "key": "f4b234268ab9e602903f42b9d9338073", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.111066+00:00", + "completedAt": "2023-11-29T20:18:31.113132+00:00" + }, + { + "id": "888bf4d6-d881-415d-b8e2-81c70730d655", + "createdAt": "2023-11-29T20:18:31.114021+00:00", + "commandType": "aspirate", + "key": "5957fcb4492701da067da86506050933", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.114119+00:00", + "completedAt": "2023-11-29T20:18:31.119327+00:00" + }, + { + "id": "fc7fd2b8-6dfc-4c5b-bef5-b1df111cfa14", + "createdAt": "2023-11-29T20:18:31.120134+00:00", + "commandType": "dispense", + "key": "45529658b88fe02e7a77ec0a32b8921e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.120197+00:00", + "completedAt": "2023-11-29T20:18:31.122143+00:00" + }, + { + "id": "148edf28-bfbb-4f11-9199-a79fefe06711", + "createdAt": "2023-11-29T20:18:31.122873+00:00", + "commandType": "aspirate", + "key": "14e9e70594251cf2e2ac8d02f7bb7a59", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.122935+00:00", + "completedAt": "2023-11-29T20:18:31.127726+00:00" + }, + { + "id": "db1f5c5a-9c4b-4111-86f1-28ebd329099c", + "createdAt": "2023-11-29T20:18:31.128660+00:00", + "commandType": "dispense", + "key": "1ce30a3dc28acff727f88bc8a086cc90", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.128745+00:00", + "completedAt": "2023-11-29T20:18:31.130921+00:00" + }, + { + "id": "36634560-79c0-4247-965c-a813a1135ddd", + "createdAt": "2023-11-29T20:18:31.131770+00:00", + "commandType": "aspirate", + "key": "11083377c46914c472942cf1f7388248", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.131859+00:00", + "completedAt": "2023-11-29T20:18:31.137085+00:00" + }, + { + "id": "6d60eec1-af1a-47b3-ba34-bd6b05902b45", + "createdAt": "2023-11-29T20:18:31.137931+00:00", + "commandType": "dispense", + "key": "de53de4efb6f7d30f913cd7839e50d38", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.138032+00:00", + "completedAt": "2023-11-29T20:18:31.140167+00:00" + }, + { + "id": "56a850d4-25aa-4a0f-8e1e-bca5dd78417a", + "createdAt": "2023-11-29T20:18:31.141028+00:00", + "commandType": "aspirate", + "key": "dbc444c7ee54762a0bc09d4e6361eb67", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.141118+00:00", + "completedAt": "2023-11-29T20:18:31.145862+00:00" + }, + { + "id": "1c9d9b37-da09-44ba-8ec5-320f566ec1fa", + "createdAt": "2023-11-29T20:18:31.146648+00:00", + "commandType": "dispense", + "key": "148c65c1c9994712c9895244253fe5fd", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.146706+00:00", + "completedAt": "2023-11-29T20:18:31.148997+00:00" + }, + { + "id": "7bdf7b97-3b85-4907-81ce-fb14fb7d36d7", + "createdAt": "2023-11-29T20:18:31.149888+00:00", + "commandType": "aspirate", + "key": "a8567eeb11152cc828bae0c7f8e81f01", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.149956+00:00", + "completedAt": "2023-11-29T20:18:31.154711+00:00" + }, + { + "id": "51f48812-3ff2-4f4b-ad4d-1c04fdeecf74", + "createdAt": "2023-11-29T20:18:31.155443+00:00", + "commandType": "dispense", + "key": "a154624edbf909b62e76764f54d2d5e1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.155512+00:00", + "completedAt": "2023-11-29T20:18:31.157520+00:00" + }, + { + "id": "333b5be3-4bd6-493d-be7a-ef66aebebbc3", + "createdAt": "2023-11-29T20:18:31.158361+00:00", + "commandType": "aspirate", + "key": "28de0c43ded15cd04545215fee91aa7e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.158472+00:00", + "completedAt": "2023-11-29T20:18:31.163543+00:00" + }, + { + "id": "bdcd0e02-f85c-40e3-925f-92f502023a36", + "createdAt": "2023-11-29T20:18:31.164474+00:00", + "commandType": "dispense", + "key": "edc2e15c57a8d67b17a54c8e267c5eff", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.164589+00:00", + "completedAt": "2023-11-29T20:18:31.166828+00:00" + }, + { + "id": "0f867cca-7c02-40ec-a841-c65856236212", + "createdAt": "2023-11-29T20:18:31.167765+00:00", + "commandType": "moveToWell", + "key": "95524c05f918342b16ab9315cb365cb3", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 13.259999999999994 + } + }, + "startedAt": "2023-11-29T20:18:31.167865+00:00", + "completedAt": "2023-11-29T20:18:31.169300+00:00" + }, + { + "id": "ccd8550e-a46b-47ad-8f10-d7f693893640", + "createdAt": "2023-11-29T20:18:31.169732+00:00", + "commandType": "waitForDuration", + "key": "c228ed0ff2327a54672327565376b484", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.169843+00:00", + "completedAt": "2023-11-29T20:18:31.169921+00:00" + }, + { + "id": "4e024727-cd9b-44a6-bcae-397695fe29ca", + "createdAt": "2023-11-29T20:18:31.170753+00:00", + "commandType": "blowout", + "key": "54eee780df5754aa68e92516363048e7", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": -5.624999999999998, + "y": 356.2, + "z": 13.259999999999994 + } + }, + "startedAt": "2023-11-29T20:18:31.170810+00:00", + "completedAt": "2023-11-29T20:18:31.172842+00:00" + }, + { + "id": "5e249ce1-a5a0-4d84-b433-141e2ead6fa4", + "createdAt": "2023-11-29T20:18:31.173408+00:00", + "commandType": "dropTip", + "key": "f9d19f89cf5519db9c43572e90dc1252", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:31.173510+00:00", + "completedAt": "2023-11-29T20:18:31.180724+00:00" + }, + { + "id": "a54e6c2e-c960-408d-802b-feaee42eb835", + "createdAt": "2023-11-29T20:18:31.181611+00:00", + "commandType": "pickUpTip", + "key": "b5b81e8b41e30530b6cb6f99c4b7c424", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 187.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:31.181715+00:00", + "completedAt": "2023-11-29T20:18:31.192724+00:00" + }, + { + "id": "251d9798-547c-4771-9440-a82f571e384d", + "createdAt": "2023-11-29T20:18:31.193641+00:00", + "commandType": "aspirate", + "key": "a53cef8e9175db1733c37984aa8237ae", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 47.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 47.0 + }, + "startedAt": "2023-11-29T20:18:31.193716+00:00", + "completedAt": "2023-11-29T20:18:31.199118+00:00" + }, + { + "id": "39260313-07fb-485f-b091-65b0ab4c7328", + "createdAt": "2023-11-29T20:18:31.200134+00:00", + "commandType": "dispense", + "key": "b24cea5bba3fa9efba594c68f029f72c", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 47.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 47.0 + }, + "startedAt": "2023-11-29T20:18:31.200199+00:00", + "completedAt": "2023-11-29T20:18:31.202274+00:00" + }, + { + "id": "4c3e39f5-4624-48b4-93f4-fbcfdee9e976", + "createdAt": "2023-11-29T20:18:31.203039+00:00", + "commandType": "aspirate", + "key": "5958f74020d6ffd85fae2e91644ce7bf", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 47.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 47.0 + }, + "startedAt": "2023-11-29T20:18:31.203104+00:00", + "completedAt": "2023-11-29T20:18:31.208336+00:00" + }, + { + "id": "a2727657-5c90-4ff6-ab41-12701f1a13ea", + "createdAt": "2023-11-29T20:18:31.209437+00:00", + "commandType": "dispense", + "key": "2374a42659b54dea8c5b1a99824a1a42", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 47.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 47.0 + }, + "startedAt": "2023-11-29T20:18:31.209553+00:00", + "completedAt": "2023-11-29T20:18:31.212037+00:00" + }, + { + "id": "623dbfa8-03fe-4b1f-aa6e-38c391dc79e9", + "createdAt": "2023-11-29T20:18:31.213014+00:00", + "commandType": "aspirate", + "key": "f1ea7916eb1678e84a2a9cd355db7631", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 47.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 47.0 + }, + "startedAt": "2023-11-29T20:18:31.213105+00:00", + "completedAt": "2023-11-29T20:18:31.218434+00:00" + }, + { + "id": "136c4cb5-aa16-4068-a529-3d37de0295bf", + "createdAt": "2023-11-29T20:18:31.219449+00:00", + "commandType": "dispense", + "key": "ab350c3e8157ba990d2e6e13087e3646", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 2.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 2.0 + }, + "startedAt": "2023-11-29T20:18:31.219538+00:00", + "completedAt": "2023-11-29T20:18:31.221567+00:00" + }, + { + "id": "2f48ed14-19ba-414c-89e0-3c6d1531507b", + "createdAt": "2023-11-29T20:18:31.222557+00:00", + "commandType": "moveToWell", + "key": "c29615c3a70d7b3e08c3a91b33185eac", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { "position": { "x": 351.38, "y": 74.24, "z": 36.25 } }, + "startedAt": "2023-11-29T20:18:31.222650+00:00", + "completedAt": "2023-11-29T20:18:31.224224+00:00" + }, + { + "id": "e2723678-8998-4bfd-bbea-3b2b5fbd5769", + "createdAt": "2023-11-29T20:18:31.224646+00:00", + "commandType": "waitForDuration", + "key": "8dd68035f707ac3b9d3c1694bac556fe", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.224763+00:00", + "completedAt": "2023-11-29T20:18:31.224844+00:00" + }, + { + "id": "953a0668-2d09-4d60-b595-0e987b274cba", + "createdAt": "2023-11-29T20:18:31.225612+00:00", + "commandType": "dispense", + "key": "c73410f885972c0a455970fad9e53932", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 40.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.5599999999999945 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:31.225676+00:00", + "completedAt": "2023-11-29T20:18:31.230993+00:00" + }, + { + "id": "3ccfb66a-fd20-4af8-98ca-3f370d904825", + "createdAt": "2023-11-29T20:18:31.231854+00:00", + "commandType": "moveToWell", + "key": "b220828ed41cd89b74abf5d3754e84a0", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 } + }, + "startedAt": "2023-11-29T20:18:31.231939+00:00", + "completedAt": "2023-11-29T20:18:31.232800+00:00" + }, + { + "id": "cff2e421-d17c-4a70-a2d5-816b2ce67059", + "createdAt": "2023-11-29T20:18:31.233664+00:00", + "commandType": "aspirate", + "key": "dd7cb9e644eda6caa3a4a4ca060c59a8", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.233734+00:00", + "completedAt": "2023-11-29T20:18:31.238784+00:00" + }, + { + "id": "4ba74570-1f66-43db-8525-c66453e589d9", + "createdAt": "2023-11-29T20:18:31.239586+00:00", + "commandType": "dispense", + "key": "8c6ec9de768fd416543daca1502d0ee7", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.239657+00:00", + "completedAt": "2023-11-29T20:18:31.241760+00:00" + }, + { + "id": "558c345d-ac7b-4b0d-bfdd-4382f0e722d6", + "createdAt": "2023-11-29T20:18:31.242594+00:00", + "commandType": "aspirate", + "key": "ffc47250ae20f87df24957bfeaa66d14", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.242842+00:00", + "completedAt": "2023-11-29T20:18:31.247488+00:00" + }, + { + "id": "7a98e31a-b374-4b20-96ad-ce6f88fc65bb", + "createdAt": "2023-11-29T20:18:31.248321+00:00", + "commandType": "dispense", + "key": "3106f1545bb97667ec3c56a45ee2d957", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.248398+00:00", + "completedAt": "2023-11-29T20:18:31.250384+00:00" + }, + { + "id": "0c0123c8-f089-4deb-84a3-f66e7a6cff6b", + "createdAt": "2023-11-29T20:18:31.251232+00:00", + "commandType": "aspirate", + "key": "59a251f96fbe213f6a7ada1b3d0d805e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.251361+00:00", + "completedAt": "2023-11-29T20:18:31.256124+00:00" + }, + { + "id": "5ab8e3a9-6dec-4f74-bc98-60e4c3bf5d34", + "createdAt": "2023-11-29T20:18:31.257011+00:00", + "commandType": "dispense", + "key": "492261d88a1cbc478136db64a2acea25", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.257094+00:00", + "completedAt": "2023-11-29T20:18:31.259294+00:00" + }, + { + "id": "62fc7fd2-93c5-49ee-9637-49b2874a79a9", + "createdAt": "2023-11-29T20:18:31.260202+00:00", + "commandType": "aspirate", + "key": "ff93017c59ac15f7d25a0ac785a13f49", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.260284+00:00", + "completedAt": "2023-11-29T20:18:31.265188+00:00" + }, + { + "id": "35f0d7c5-8be4-4833-a317-4800a047cba5", + "createdAt": "2023-11-29T20:18:31.266157+00:00", + "commandType": "dispense", + "key": "9601138fdecf6d756240ae654927b2e9", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.266234+00:00", + "completedAt": "2023-11-29T20:18:31.268333+00:00" + }, + { + "id": "cc77219b-af21-46ba-91cc-c864de81f32e", + "createdAt": "2023-11-29T20:18:31.269110+00:00", + "commandType": "aspirate", + "key": "0f97af0cb4ac87d7c40ed829d3197b05", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.269181+00:00", + "completedAt": "2023-11-29T20:18:31.274018+00:00" + }, + { + "id": "a83b8c7c-6360-46d3-acf3-b18c2021c938", + "createdAt": "2023-11-29T20:18:31.275020+00:00", + "commandType": "dispense", + "key": "a89141b6c089adcf58f368d9b2cfc371", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.275088+00:00", + "completedAt": "2023-11-29T20:18:31.277391+00:00" + }, + { + "id": "6cf4b961-eaa0-49ea-a7d2-2c08b47e7c04", + "createdAt": "2023-11-29T20:18:31.278251+00:00", + "commandType": "aspirate", + "key": "73e655ca659d3430583f2848e5f25df1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.278334+00:00", + "completedAt": "2023-11-29T20:18:31.283251+00:00" + }, + { + "id": "32fc3f2e-7d09-428f-8fd5-9a2a4de53ee6", + "createdAt": "2023-11-29T20:18:31.284168+00:00", + "commandType": "dispense", + "key": "34abc27eb86648bf01706d548ee32039", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.284236+00:00", + "completedAt": "2023-11-29T20:18:31.286230+00:00" + }, + { + "id": "6ac862f7-114f-4ee5-a268-fc0b2d5a0cd0", + "createdAt": "2023-11-29T20:18:31.286972+00:00", + "commandType": "aspirate", + "key": "c6f806215893e1819f249737c1d75f01", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.287045+00:00", + "completedAt": "2023-11-29T20:18:31.292277+00:00" + }, + { + "id": "976a47dd-5a90-4aec-916b-0eaee26f15cd", + "createdAt": "2023-11-29T20:18:31.293322+00:00", + "commandType": "dispense", + "key": "80052636e0808bda2a66a2db5208bcd4", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.293428+00:00", + "completedAt": "2023-11-29T20:18:31.295568+00:00" + }, + { + "id": "d1d574e2-125f-4a78-a012-efc9c5d04354", + "createdAt": "2023-11-29T20:18:31.296337+00:00", + "commandType": "aspirate", + "key": "10a6a071bb8d8ecf6454aa0b161ebbf7", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.296441+00:00", + "completedAt": "2023-11-29T20:18:31.301255+00:00" + }, + { + "id": "f654cf53-4873-488c-b6c5-9338e8f6a4f2", + "createdAt": "2023-11-29T20:18:31.302231+00:00", + "commandType": "dispense", + "key": "79f6c8a5d456cece1ab989e6ad0b2945", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.302329+00:00", + "completedAt": "2023-11-29T20:18:31.304486+00:00" + }, + { + "id": "147a8efa-095d-4503-8b49-e9d3217d971a", + "createdAt": "2023-11-29T20:18:31.305226+00:00", + "commandType": "aspirate", + "key": "552b736d515712263c0cbcd085926b64", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.305314+00:00", + "completedAt": "2023-11-29T20:18:31.310690+00:00" + }, + { + "id": "a851cc5e-b649-432a-ae8f-56984446b43c", + "createdAt": "2023-11-29T20:18:31.311631+00:00", + "commandType": "dispense", + "key": "279f8633d2445dd875db12ca20c8fb96", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.311724+00:00", + "completedAt": "2023-11-29T20:18:31.313984+00:00" + }, + { + "id": "10b975d4-a177-4336-a880-bb2cd0f33c34", + "createdAt": "2023-11-29T20:18:31.314839+00:00", + "commandType": "aspirate", + "key": "c6402259cb01e0ecaec3e002834286e4", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.314927+00:00", + "completedAt": "2023-11-29T20:18:31.320006+00:00" + }, + { + "id": "a5cbfcb8-dbee-4ad9-9516-7d998dc40d46", + "createdAt": "2023-11-29T20:18:31.320947+00:00", + "commandType": "dispense", + "key": "b2007f09b24b78bfc129a8d741af0a23", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 1.6099999999999934 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.321059+00:00", + "completedAt": "2023-11-29T20:18:31.323042+00:00" + }, + { + "id": "fee3ad33-071f-4663-8860-8e3a3020e1ca", + "createdAt": "2023-11-29T20:18:31.323851+00:00", + "commandType": "moveToWell", + "key": "f75edbea8cf1165ee03bd78e2c04ff81", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 13.259999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.323926+00:00", + "completedAt": "2023-11-29T20:18:31.325334+00:00" + }, + { + "id": "25c39c6e-2a87-4c85-a214-50b575602a3f", + "createdAt": "2023-11-29T20:18:31.325763+00:00", + "commandType": "waitForDuration", + "key": "3efd0c060a42069826d93a5590e18c84", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.325886+00:00", + "completedAt": "2023-11-29T20:18:31.325969+00:00" + }, + { + "id": "f27b9d86-d25d-41d4-8656-4133ad2a4d58", + "createdAt": "2023-11-29T20:18:31.326848+00:00", + "commandType": "blowout", + "key": "d13ad82951e9ae386cdfa74cf1604d8e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 3.375, "y": 356.2, "z": 13.259999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.326929+00:00", + "completedAt": "2023-11-29T20:18:31.329088+00:00" + }, + { + "id": "728cc785-fb78-4ce9-abe8-7dd6f4f71d1f", + "createdAt": "2023-11-29T20:18:31.329613+00:00", + "commandType": "dropTip", + "key": "b6e048cf18d3b89683e0f80068be7e9a", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:31.329725+00:00", + "completedAt": "2023-11-29T20:18:31.336528+00:00" + }, + { + "id": "b8be906e-6ad4-49ab-8eef-b1a61732fcdd", + "createdAt": "2023-11-29T20:18:31.337251+00:00", + "commandType": "pickUpTip", + "key": "34e68f1ed5470b0e790c8c5c5fa253a7", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:31.337340+00:00", + "completedAt": "2023-11-29T20:18:31.348510+00:00" + }, + { + "id": "686589a6-359e-4421-a0c9-7374848fd7c6", + "createdAt": "2023-11-29T20:18:31.349522+00:00", + "commandType": "aspirate", + "key": "548461baf6a17a292e5df2a7b678686a", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 47.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 47.0 + }, + "startedAt": "2023-11-29T20:18:31.349600+00:00", + "completedAt": "2023-11-29T20:18:31.355335+00:00" + }, + { + "id": "cd76f7cc-6718-4f28-a75e-e8d072d4a186", + "createdAt": "2023-11-29T20:18:31.356264+00:00", + "commandType": "dispense", + "key": "a7f3c7ac58470e2b19cf9bbefecae75a", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 47.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 47.0 + }, + "startedAt": "2023-11-29T20:18:31.356337+00:00", + "completedAt": "2023-11-29T20:18:31.358621+00:00" + }, + { + "id": "47bcc0c4-eb20-4f95-ad37-8e297afabaa5", + "createdAt": "2023-11-29T20:18:31.359554+00:00", + "commandType": "aspirate", + "key": "3e16796470e61a132f4ce28668883e78", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 47.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 47.0 + }, + "startedAt": "2023-11-29T20:18:31.359654+00:00", + "completedAt": "2023-11-29T20:18:31.365064+00:00" + }, + { + "id": "8c0f9bad-23ff-4b46-b071-59856ee0e1e0", + "createdAt": "2023-11-29T20:18:31.366029+00:00", + "commandType": "dispense", + "key": "83bd312dd9f84ad4fbdfb4a677ee9d48", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 47.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 47.0 + }, + "startedAt": "2023-11-29T20:18:31.366095+00:00", + "completedAt": "2023-11-29T20:18:31.368178+00:00" + }, + { + "id": "150f5690-ee02-40f5-b09e-f4e19572b51f", + "createdAt": "2023-11-29T20:18:31.369183+00:00", + "commandType": "aspirate", + "key": "502af68d2629651cb77f9d6ecac60b1c", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 47.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 47.0 + }, + "startedAt": "2023-11-29T20:18:31.369286+00:00", + "completedAt": "2023-11-29T20:18:31.374848+00:00" + }, + { + "id": "79c11e34-a950-4cdd-bbda-6e6ce8b82f9e", + "createdAt": "2023-11-29T20:18:31.375974+00:00", + "commandType": "dispense", + "key": "21aba517cca78e7ebfbfbd553bf9fbda", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 32.0, + "volume": 2.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 74.24, "z": 16.55 }, + "volume": 2.0 + }, + "startedAt": "2023-11-29T20:18:31.376145+00:00", + "completedAt": "2023-11-29T20:18:31.378469+00:00" + }, + { + "id": "8447bb8b-3ee4-44cd-b7aa-da1446ef0c08", + "createdAt": "2023-11-29T20:18:31.379235+00:00", + "commandType": "moveToWell", + "key": "1c599ec6c2bfff9cf28c451342b80a01", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { "position": { "x": 351.38, "y": 74.24, "z": 36.25 } }, + "startedAt": "2023-11-29T20:18:31.379294+00:00", + "completedAt": "2023-11-29T20:18:31.380593+00:00" + }, + { + "id": "7e67f716-8c52-46f1-b5ea-5bd17e94852f", + "createdAt": "2023-11-29T20:18:31.380905+00:00", + "commandType": "waitForDuration", + "key": "789369a1552182baafc702db9d77d7a6", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.381010+00:00", + "completedAt": "2023-11-29T20:18:31.381117+00:00" + }, + { + "id": "9d1ab142-7bd8-4c50-b7c3-b5cef29b550d", + "createdAt": "2023-11-29T20:18:31.381952+00:00", + "commandType": "dispense", + "key": "58c0e5f6008b5245eec0e1d5f378342c", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.7 } + }, + "flowRate": 40.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.5599999999999945 + }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:31.382021+00:00", + "completedAt": "2023-11-29T20:18:31.387278+00:00" + }, + { + "id": "9e024ea2-e920-461e-b753-58867bd242ed", + "createdAt": "2023-11-29T20:18:31.387988+00:00", + "commandType": "moveToWell", + "key": "863445e4b29826b97320fd34067ba240", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + } + }, + "startedAt": "2023-11-29T20:18:31.388063+00:00", + "completedAt": "2023-11-29T20:18:31.388802+00:00" + }, + { + "id": "5a1a0445-50ad-4794-bb8a-2300dea11f95", + "createdAt": "2023-11-29T20:18:31.389597+00:00", + "commandType": "aspirate", + "key": "fdc703bcdef73ba02bf9e9c5d730d820", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.389665+00:00", + "completedAt": "2023-11-29T20:18:31.395025+00:00" + }, + { + "id": "320fd9a2-b832-49a3-adba-c209797a5997", + "createdAt": "2023-11-29T20:18:31.395850+00:00", + "commandType": "dispense", + "key": "ac2472643b548b22f7c42327dbb676b5", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.395914+00:00", + "completedAt": "2023-11-29T20:18:31.398084+00:00" + }, + { + "id": "99209ee3-08f1-4c96-917a-c95f3883990e", + "createdAt": "2023-11-29T20:18:31.399292+00:00", + "commandType": "aspirate", + "key": "1bf16f963a31788aba178d4379c6f5df", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.399396+00:00", + "completedAt": "2023-11-29T20:18:31.404630+00:00" + }, + { + "id": "9c77a825-6e6a-43e7-8bed-5a02c8d113c6", + "createdAt": "2023-11-29T20:18:31.405596+00:00", + "commandType": "dispense", + "key": "5cd80ac702609a8345f0630aecd1c9f3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.405683+00:00", + "completedAt": "2023-11-29T20:18:31.407967+00:00" + }, + { + "id": "4111a1bc-c240-49f4-9717-dada80d4def1", + "createdAt": "2023-11-29T20:18:31.408848+00:00", + "commandType": "aspirate", + "key": "08a76300e37a3cf8b3d485acde71b4f1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.408912+00:00", + "completedAt": "2023-11-29T20:18:31.414063+00:00" + }, + { + "id": "35de6cac-8023-4412-abdf-a52f33eff9c3", + "createdAt": "2023-11-29T20:18:31.415087+00:00", + "commandType": "dispense", + "key": "99da5c770d791c958e392d2869c75a9a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.415181+00:00", + "completedAt": "2023-11-29T20:18:31.417363+00:00" + }, + { + "id": "fe211968-0fec-4a74-8c2b-01fa8ab6c5df", + "createdAt": "2023-11-29T20:18:31.418185+00:00", + "commandType": "aspirate", + "key": "e25c26137b63bfd52e8c9abf9321d728", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.418257+00:00", + "completedAt": "2023-11-29T20:18:31.423139+00:00" + }, + { + "id": "f461d07e-0a2a-4b86-b21f-3ad6d9a75d9c", + "createdAt": "2023-11-29T20:18:31.424009+00:00", + "commandType": "dispense", + "key": "2c6fe5bad33c30d054ce2a8f1273f76e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.424103+00:00", + "completedAt": "2023-11-29T20:18:31.426575+00:00" + }, + { + "id": "5a67eb45-55bb-4723-b8f6-270a71080f72", + "createdAt": "2023-11-29T20:18:31.427550+00:00", + "commandType": "aspirate", + "key": "b1c2f0b4bdce8fa34bd9bb0665fa5511", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.427642+00:00", + "completedAt": "2023-11-29T20:18:31.432994+00:00" + }, + { + "id": "09cb3f37-af64-4935-8482-0dfacca2a5d8", + "createdAt": "2023-11-29T20:18:31.434068+00:00", + "commandType": "dispense", + "key": "b19216e5b6dd675c294f7a94ba5af1f7", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.434224+00:00", + "completedAt": "2023-11-29T20:18:31.436567+00:00" + }, + { + "id": "2e06862e-98ac-4169-9d1b-9957c811877e", + "createdAt": "2023-11-29T20:18:31.437364+00:00", + "commandType": "aspirate", + "key": "3b289c723b7142a23db1ff5dd7b41449", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.437428+00:00", + "completedAt": "2023-11-29T20:18:31.442266+00:00" + }, + { + "id": "3c479e37-d606-453d-bc3a-adb2a894eb64", + "createdAt": "2023-11-29T20:18:31.443341+00:00", + "commandType": "dispense", + "key": "412e1912e5ba2fd96647ad125a128518", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.443448+00:00", + "completedAt": "2023-11-29T20:18:31.445761+00:00" + }, + { + "id": "d2b16a47-cffe-4a41-8643-f9d65f1ed7f3", + "createdAt": "2023-11-29T20:18:31.446601+00:00", + "commandType": "aspirate", + "key": "5b579106537a25e5ba2212d38cb642b6", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.446723+00:00", + "completedAt": "2023-11-29T20:18:31.452501+00:00" + }, + { + "id": "676b4f14-9faf-4dd7-8781-e5a45070e840", + "createdAt": "2023-11-29T20:18:31.453475+00:00", + "commandType": "dispense", + "key": "87f699e0b175628bef3313804a21e99f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.453564+00:00", + "completedAt": "2023-11-29T20:18:31.455945+00:00" + }, + { + "id": "b2cc0b43-5910-4eab-a07b-fe6a6047701d", + "createdAt": "2023-11-29T20:18:31.456855+00:00", + "commandType": "aspirate", + "key": "cae026175921b734b2cdca96c0835a1d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.456932+00:00", + "completedAt": "2023-11-29T20:18:31.462757+00:00" + }, + { + "id": "975d96e9-3fe2-45d8-b619-63fb63426580", + "createdAt": "2023-11-29T20:18:31.463650+00:00", + "commandType": "dispense", + "key": "898b60dcb02724d224024a050f310912", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.463731+00:00", + "completedAt": "2023-11-29T20:18:31.465993+00:00" + }, + { + "id": "4d2587ce-e3e9-4389-aa52-e635cc0dc415", + "createdAt": "2023-11-29T20:18:31.466849+00:00", + "commandType": "aspirate", + "key": "8e278b350cf53ff422978ea8a598d1d4", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.466916+00:00", + "completedAt": "2023-11-29T20:18:31.471961+00:00" + }, + { + "id": "57d4947f-5cd9-4bb0-9667-cd4e01c21d80", + "createdAt": "2023-11-29T20:18:31.472801+00:00", + "commandType": "dispense", + "key": "b626da2b58eb4ccccfdc54867afbea78", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.472908+00:00", + "completedAt": "2023-11-29T20:18:31.475070+00:00" + }, + { + "id": "bd29c580-04ae-4af8-bfa2-693d973bcf1f", + "createdAt": "2023-11-29T20:18:31.476037+00:00", + "commandType": "aspirate", + "key": "3682cc9dc38b45fa2d3274b1d161e3df", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.476140+00:00", + "completedAt": "2023-11-29T20:18:31.481159+00:00" + }, + { + "id": "1d2e245c-84ce-42c3-819d-796dc75e4eae", + "createdAt": "2023-11-29T20:18:31.482063+00:00", + "commandType": "dispense", + "key": "2af226426bcce9dd692a4f72008cd862", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.65 } + }, + "flowRate": 80.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 1.6099999999999934 + }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.482156+00:00", + "completedAt": "2023-11-29T20:18:31.484458+00:00" + }, + { + "id": "312543aa-1e4c-4d85-8e1a-a155747fdeae", + "createdAt": "2023-11-29T20:18:31.485325+00:00", + "commandType": "moveToWell", + "key": "08130774c12046e0ee16e7e4c71ac0a7", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 13.259999999999994 + } + }, + "startedAt": "2023-11-29T20:18:31.485394+00:00", + "completedAt": "2023-11-29T20:18:31.486774+00:00" + }, + { + "id": "f6a872c1-e35a-4a62-88dd-08dbd0d7f239", + "createdAt": "2023-11-29T20:18:31.487113+00:00", + "commandType": "waitForDuration", + "key": "f6e8c3c671ca5ceca7d285ba0135590d", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.487215+00:00", + "completedAt": "2023-11-29T20:18:31.487274+00:00" + }, + { + "id": "25543b52-de4a-41fd-8776-ac7bf76282ed", + "createdAt": "2023-11-29T20:18:31.488056+00:00", + "commandType": "blowout", + "key": "ad572df606bef1a38ded069c4b2d21dd", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { + "x": 12.375000000000004, + "y": 356.2, + "z": 13.259999999999994 + } + }, + "startedAt": "2023-11-29T20:18:31.488122+00:00", + "completedAt": "2023-11-29T20:18:31.490078+00:00" + }, + { + "id": "af87aa64-688e-485b-aea8-a193bb1c8411", + "createdAt": "2023-11-29T20:18:31.490512+00:00", + "commandType": "dropTip", + "key": "e0ca5fca3e031e8af6baf1c532111227", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:31.490569+00:00", + "completedAt": "2023-11-29T20:18:31.497126+00:00" + }, + { + "id": "a25be67c-e49f-4e9e-a24a-f09a71a0e385", + "createdAt": "2023-11-29T20:18:31.497668+00:00", + "commandType": "thermocycler/closeLid", + "key": "d19a09d90e848fb3ae9d5792b7068944", + "status": "succeeded", + "params": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.497770+00:00", + "completedAt": "2023-11-29T20:18:31.501171+00:00" + }, + { + "id": "ab64319b-66e1-444f-9394-7e3ab0d8c840", + "createdAt": "2023-11-29T20:18:31.501653+00:00", + "commandType": "thermocycler/runProfile", + "key": "fefe5dc5536fe120bf188ed6255e46a6", + "status": "succeeded", + "params": { + "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3", + "profile": [{ "celsius": 20.0, "holdSeconds": 900.0 }], + "blockMaxVolumeUl": 50.0 + }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.501729+00:00", + "completedAt": "2023-11-29T20:18:31.501816+00:00" + }, + { + "id": "9dcd1623-191e-40f8-ab92-4340bde39073", + "createdAt": "2023-11-29T20:18:31.502085+00:00", + "commandType": "thermocycler/setTargetBlockTemperature", + "key": "4d686d06b22feda25a0402a3334a275b", + "status": "succeeded", + "params": { + "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3", + "celsius": 10.0, + "holdTimeSeconds": 0.0 + }, + "result": { "targetBlockTemperature": 10.0 }, + "startedAt": "2023-11-29T20:18:31.502141+00:00", + "completedAt": "2023-11-29T20:18:31.502198+00:00" + }, + { + "id": "fbbf5b08-762a-4a55-9da1-18595bf3d02a", + "createdAt": "2023-11-29T20:18:31.502392+00:00", + "commandType": "thermocycler/waitForBlockTemperature", + "key": "d1eb612db5e42b44a81226285c32bd4d", + "status": "succeeded", + "params": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.502443+00:00", + "completedAt": "2023-11-29T20:18:31.502493+00:00" + }, + { + "id": "0ea99196-b126-43c7-ae0a-31e974c00f4d", + "createdAt": "2023-11-29T20:18:31.502755+00:00", + "commandType": "thermocycler/openLid", + "key": "4b0b026e1624aedf2ac33af623112740", + "status": "succeeded", + "params": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.502835+00:00", + "completedAt": "2023-11-29T20:18:31.504741+00:00" + }, + { + "id": "6e7afec8-63b4-4e60-9395-b93d2b285a0f", + "createdAt": "2023-11-29T20:18:31.505116+00:00", + "commandType": "heaterShaker/openLabwareLatch", + "key": "08eb53098f915296e0bb5f2fdc24782b", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": { "pipetteRetracted": true }, + "startedAt": "2023-11-29T20:18:31.505190+00:00", + "completedAt": "2023-11-29T20:18:31.506130+00:00" + }, + { + "id": "3dd07dab-0921-452a-856b-082e392a06e9", + "createdAt": "2023-11-29T20:18:31.506410+00:00", + "commandType": "moveLabware", + "key": "4514ea910cfa0bf6c6a2253504942640", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "newLocation": { "labwareId": "3787af65-0305-4b08-bf02-a2c6596a10e5" }, + "strategy": "usingGripper", + "pickUpOffset": { "x": 0.0, "y": 0.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": -2.0, "z": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.506465+00:00", + "completedAt": "2023-11-29T20:18:31.506700+00:00" + }, + { + "id": "95a9ac96-59f2-4160-bb04-f98574420951", + "createdAt": "2023-11-29T20:18:31.506927+00:00", + "commandType": "heaterShaker/closeLabwareLatch", + "key": "1518738a0e58630c638122e9cd902c14", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.507011+00:00", + "completedAt": "2023-11-29T20:18:31.507067+00:00" + }, + { + "id": "0be63496-14a4-45d7-af5d-4197305f8a4e", + "createdAt": "2023-11-29T20:18:31.507577+00:00", + "commandType": "custom", + "key": "6cce4032b340e9165b576e8d90f6422d", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "==============================================" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.507633+00:00", + "completedAt": "2023-11-29T20:18:31.507683+00:00" + }, + { + "id": "6e7eacac-1920-4046-a8e1-029474366a93", + "createdAt": "2023-11-29T20:18:31.508161+00:00", + "commandType": "custom", + "key": "1ebe845515c6ab48dd4d444e3195e8b8", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Cleanup 1" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.508312+00:00", + "completedAt": "2023-11-29T20:18:31.508366+00:00" + }, + { + "id": "d927e848-9212-4793-9ecf-934dc8efa985", + "createdAt": "2023-11-29T20:18:31.508849+00:00", + "commandType": "custom", + "key": "74fc84b48cdb435e97c8b6f09f35ee14", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "==============================================" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.508904+00:00", + "completedAt": "2023-11-29T20:18:31.508951+00:00" + }, + { + "id": "eebeeacb-a398-497f-bfc0-d007e73302e9", + "createdAt": "2023-11-29T20:18:31.509346+00:00", + "commandType": "custom", + "key": "add28615c3ffd0461dd96ecc86b885d7", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> ADDING AMPure (0.8x)" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.509412+00:00", + "completedAt": "2023-11-29T20:18:31.509462+00:00" + }, + { + "id": "b4c8a481-6f93-40af-af1c-a8863899e5d7", + "createdAt": "2023-11-29T20:18:31.510225+00:00", + "commandType": "pickUpTip", + "key": "79e49612ff71320b74e5049d7772b1b8", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:31.510309+00:00", + "completedAt": "2023-11-29T20:18:31.520723+00:00" + }, + { + "id": "f657360c-2394-4534-92e4-8731314cfe93", + "createdAt": "2023-11-29T20:18:31.521460+00:00", + "commandType": "aspirate", + "key": "47c13a25158bf8cd12007ade4c6b89d7", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.521541+00:00", + "completedAt": "2023-11-29T20:18:31.527178+00:00" + }, + { + "id": "04b1de98-8fc3-4df8-b491-460794a6d5eb", + "createdAt": "2023-11-29T20:18:31.527907+00:00", + "commandType": "dispense", + "key": "de8a0be1b78bc115c67fb3f0c69a977e", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.527972+00:00", + "completedAt": "2023-11-29T20:18:31.529774+00:00" + }, + { + "id": "1540a195-8fd7-4fc8-abbb-a77f6be3aba1", + "createdAt": "2023-11-29T20:18:31.530240+00:00", + "commandType": "aspirate", + "key": "e2fb02c760285f5044f25027188b5266", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.530297+00:00", + "completedAt": "2023-11-29T20:18:31.535039+00:00" + }, + { + "id": "53a51ef8-5775-4b15-8a64-705a7c597a28", + "createdAt": "2023-11-29T20:18:31.535996+00:00", + "commandType": "dispense", + "key": "68063d7d48aa63dd4558cba13a0056d7", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.536091+00:00", + "completedAt": "2023-11-29T20:18:31.538097+00:00" + }, + { + "id": "52bcebc5-7c6e-4f17-99be-8fbc69fe0722", + "createdAt": "2023-11-29T20:18:31.538679+00:00", + "commandType": "aspirate", + "key": "1e6f7ffc8184225cf08ad3b38de5eb09", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.538762+00:00", + "completedAt": "2023-11-29T20:18:31.543961+00:00" + }, + { + "id": "9c13799a-1319-49f4-a417-a98df3aa28e8", + "createdAt": "2023-11-29T20:18:31.544787+00:00", + "commandType": "dispense", + "key": "22ec3fb4560b5651db7d89cc9888eae0", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.544902+00:00", + "completedAt": "2023-11-29T20:18:31.546986+00:00" + }, + { + "id": "d30a2801-7b06-4712-90da-995309020119", + "createdAt": "2023-11-29T20:18:31.547578+00:00", + "commandType": "aspirate", + "key": "7b89634c1c8a6b4492d705888ee8c778", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.547651+00:00", + "completedAt": "2023-11-29T20:18:31.552463+00:00" + }, + { + "id": "f986e267-93fa-4c49-9303-f61f5436fea1", + "createdAt": "2023-11-29T20:18:31.553237+00:00", + "commandType": "dispense", + "key": "c9b8cff6061a286cce41573d536c8bee", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 3.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 3.0 + }, + "startedAt": "2023-11-29T20:18:31.553317+00:00", + "completedAt": "2023-11-29T20:18:31.555417+00:00" + }, + { + "id": "05c3a7aa-15dc-42a7-9138-25aa4be1f7c0", + "createdAt": "2023-11-29T20:18:31.555984+00:00", + "commandType": "moveToWell", + "key": "523e42e3ff39b77458564873b53cdbe5", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:31.556100+00:00", + "completedAt": "2023-11-29T20:18:31.557410+00:00" + }, + { + "id": "503a99a7-aa26-4d85-baf4-5d915ebb81dc", + "createdAt": "2023-11-29T20:18:31.558186+00:00", + "commandType": "moveToWell", + "key": "36d98ae8aa7ada86f6f1f2e7639b2d05", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 182.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:31.558263+00:00", + "completedAt": "2023-11-29T20:18:31.559720+00:00" + }, + { + "id": "07d952c4-0a32-4ad1-9750-c2681afb186b", + "createdAt": "2023-11-29T20:18:31.560463+00:00", + "commandType": "moveToWell", + "key": "bc2b5d4558de1e24ef81993be85c06f1", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 174.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:31.560585+00:00", + "completedAt": "2023-11-29T20:18:31.561914+00:00" + }, + { + "id": "938755d8-d2e6-4790-b5cd-0303c9860665", + "createdAt": "2023-11-29T20:18:31.562731+00:00", + "commandType": "dispense", + "key": "bcb0e655266e7b8b813315482ed3d8bf", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 40.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.562792+00:00", + "completedAt": "2023-11-29T20:18:31.568174+00:00" + }, + { + "id": "6b3d3f42-bac5-46ce-986e-598d1009c78e", + "createdAt": "2023-11-29T20:18:31.569379+00:00", + "commandType": "moveToWell", + "key": "fa93ba20f30629222284272bdc7f8153", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:31.569490+00:00", + "completedAt": "2023-11-29T20:18:31.570932+00:00" + }, + { + "id": "73013005-b564-4ceb-8d19-74d011156099", + "createdAt": "2023-11-29T20:18:31.571845+00:00", + "commandType": "aspirate", + "key": "a120e3b709daa318830a317845c974a3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.571933+00:00", + "completedAt": "2023-11-29T20:18:31.576821+00:00" + }, + { + "id": "a3888f68-e78f-4ec3-9c9d-96e4da00ade9", + "createdAt": "2023-11-29T20:18:31.577608+00:00", + "commandType": "moveToWell", + "key": "da7edd901cd33c833b1de2149d692fae", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:31.577754+00:00", + "completedAt": "2023-11-29T20:18:31.579289+00:00" + }, + { + "id": "9063a637-3f12-4beb-ac46-535b5faa078d", + "createdAt": "2023-11-29T20:18:31.580068+00:00", + "commandType": "aspirate", + "key": "849339b2f1bc75d64a67ab04760075fd", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.580127+00:00", + "completedAt": "2023-11-29T20:18:31.582490+00:00" + }, + { + "id": "e018d167-7fc5-45a6-b5b8-f640ac7c4411", + "createdAt": "2023-11-29T20:18:31.583512+00:00", + "commandType": "dispense", + "key": "dfed49f478e56d19c6ab4c7d91a2b356", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.583592+00:00", + "completedAt": "2023-11-29T20:18:31.585859+00:00" + }, + { + "id": "7b2c136a-4983-4ea6-8ab3-432b36f546fc", + "createdAt": "2023-11-29T20:18:31.586640+00:00", + "commandType": "moveToWell", + "key": "2906e95dca40064b333d2018c621a222", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:31.586820+00:00", + "completedAt": "2023-11-29T20:18:31.588239+00:00" + }, + { + "id": "40f61e0a-9736-4970-981d-ca76300c4c89", + "createdAt": "2023-11-29T20:18:31.589034+00:00", + "commandType": "dispense", + "key": "3eb42c300ac09dab7563ba97d9953f4f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.589148+00:00", + "completedAt": "2023-11-29T20:18:31.591502+00:00" + }, + { + "id": "2d70da78-60b9-4dc9-96ca-a51504f5a488", + "createdAt": "2023-11-29T20:18:31.592487+00:00", + "commandType": "aspirate", + "key": "0f957603a43a1c7039fd1eac762c566a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.592592+00:00", + "completedAt": "2023-11-29T20:18:31.597739+00:00" + }, + { + "id": "7d51135b-8f01-49ca-ac13-5bb6d2b4268c", + "createdAt": "2023-11-29T20:18:31.598541+00:00", + "commandType": "moveToWell", + "key": "0b697162e97fe85772413cb188bf0b3e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:31.598631+00:00", + "completedAt": "2023-11-29T20:18:31.600304+00:00" + }, + { + "id": "d9a0ecb9-c656-40c0-bfed-7b3ce13df6d1", + "createdAt": "2023-11-29T20:18:31.601335+00:00", + "commandType": "aspirate", + "key": "9aba503b3b20ce67ad41768ca5d2d4f7", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.601417+00:00", + "completedAt": "2023-11-29T20:18:31.603600+00:00" + }, + { + "id": "e9c57009-803c-412f-a851-6e7085d2ae6e", + "createdAt": "2023-11-29T20:18:31.604486+00:00", + "commandType": "dispense", + "key": "1626e0a6a2da7c340cc0d80fceddd1b1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.604603+00:00", + "completedAt": "2023-11-29T20:18:31.607055+00:00" + }, + { + "id": "181db4e6-cef7-4099-a592-a3c92897f3f0", + "createdAt": "2023-11-29T20:18:31.607866+00:00", + "commandType": "moveToWell", + "key": "3dec9098a74463429c433a53eb7e8adf", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:31.607941+00:00", + "completedAt": "2023-11-29T20:18:31.609550+00:00" + }, + { + "id": "9043dd8c-e93c-4899-8fa2-31b297826e99", + "createdAt": "2023-11-29T20:18:31.610413+00:00", + "commandType": "dispense", + "key": "0efcec82b1adb239a96e5d75bfdd42b2", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.610524+00:00", + "completedAt": "2023-11-29T20:18:31.612764+00:00" + }, + { + "id": "bcb064e4-36de-4585-93cd-88ca379ec245", + "createdAt": "2023-11-29T20:18:31.613486+00:00", + "commandType": "moveToWell", + "key": "88fd5040554be92de4a914447359ffd9", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.613554+00:00", + "completedAt": "2023-11-29T20:18:31.614891+00:00" + }, + { + "id": "9d6bc948-d2d4-4376-9b9f-58882035e549", + "createdAt": "2023-11-29T20:18:31.615182+00:00", + "commandType": "waitForDuration", + "key": "af3b7aef0e583f8ea3cd21ffe2fddcb0", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.615242+00:00", + "completedAt": "2023-11-29T20:18:31.615297+00:00" + }, + { + "id": "39173106-73cb-4cd5-98d4-f28a90af8c4e", + "createdAt": "2023-11-29T20:18:31.616307+00:00", + "commandType": "blowout", + "key": "007061fbee194d54ee47dbc67e0c00c6", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.616367+00:00", + "completedAt": "2023-11-29T20:18:31.618607+00:00" + }, + { + "id": "61be3d7b-823f-4967-a1c7-e87fe2a84329", + "createdAt": "2023-11-29T20:18:31.619368+00:00", + "commandType": "touchTip", + "key": "4de3ceadd08ade17d3116d0143757a59", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 36.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.619456+00:00", + "completedAt": "2023-11-29T20:18:31.626494+00:00" + }, + { + "id": "4c30797e-dec7-4861-97ab-7de18e291bad", + "createdAt": "2023-11-29T20:18:31.627584+00:00", + "commandType": "moveToWell", + "key": "7b32809468cb88261ab0bd87c8b9d671", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.627656+00:00", + "completedAt": "2023-11-29T20:18:31.629163+00:00" + }, + { + "id": "f46d2af0-878a-4b6f-889d-198f2319c078", + "createdAt": "2023-11-29T20:18:31.629837+00:00", + "commandType": "moveToWell", + "key": "36e33bc3f523bf7649f7e974f55f9559", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 37.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.629977+00:00", + "completedAt": "2023-11-29T20:18:31.631400+00:00" + }, + { + "id": "19d58d02-e227-43f8-8c31-d927515ee475", + "createdAt": "2023-11-29T20:18:31.632093+00:00", + "commandType": "moveToWell", + "key": "8fd09156975169c45bada317dbcf9936", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.632203+00:00", + "completedAt": "2023-11-29T20:18:31.633901+00:00" + }, + { + "id": "20d58433-cbac-40fa-b32e-b9608b26db9c", + "createdAt": "2023-11-29T20:18:31.634371+00:00", + "commandType": "dropTip", + "key": "377959b71b7381c52a13ffb46e549c42", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:31.634484+00:00", + "completedAt": "2023-11-29T20:18:31.641882+00:00" + }, + { + "id": "af5725b6-3b9e-4abd-9841-07ae33108e25", + "createdAt": "2023-11-29T20:18:31.642655+00:00", + "commandType": "pickUpTip", + "key": "391c5d467e8fced77afafad49999384b", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:31.642900+00:00", + "completedAt": "2023-11-29T20:18:31.654403+00:00" + }, + { + "id": "eadb1cc1-891a-49a2-8f15-65ddff6a8997", + "createdAt": "2023-11-29T20:18:31.655140+00:00", + "commandType": "aspirate", + "key": "414e3b57c7c1480a59aa1bceb82a0352", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.655223+00:00", + "completedAt": "2023-11-29T20:18:31.660518+00:00" + }, + { + "id": "6f9c611d-12aa-47f9-a1ee-84378c334458", + "createdAt": "2023-11-29T20:18:31.661375+00:00", + "commandType": "dispense", + "key": "2903d2ff3bf9eba5f7de869f9541f607", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.661451+00:00", + "completedAt": "2023-11-29T20:18:31.663385+00:00" + }, + { + "id": "c048a5e1-1d58-4e9d-8eae-a16c835f8ede", + "createdAt": "2023-11-29T20:18:31.663914+00:00", + "commandType": "aspirate", + "key": "018572eee4148933d8310b5af4580446", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.663974+00:00", + "completedAt": "2023-11-29T20:18:31.668456+00:00" + }, + { + "id": "4364257a-4834-456d-8538-703f239329c4", + "createdAt": "2023-11-29T20:18:31.669381+00:00", + "commandType": "dispense", + "key": "d0b8d6fe05cda27a58ca7767dfa6341a", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.669507+00:00", + "completedAt": "2023-11-29T20:18:31.671674+00:00" + }, + { + "id": "4ac403af-c153-4c48-ba35-3af645e30db7", + "createdAt": "2023-11-29T20:18:31.672263+00:00", + "commandType": "aspirate", + "key": "5cfe03f510ab7ef48322dd181e744d2a", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.672325+00:00", + "completedAt": "2023-11-29T20:18:31.677273+00:00" + }, + { + "id": "3acefd89-eddb-4f69-a84d-c04e99d3fe32", + "createdAt": "2023-11-29T20:18:31.678088+00:00", + "commandType": "dispense", + "key": "2c48b9b398cb6eceb94fb0dee8ff747f", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.678158+00:00", + "completedAt": "2023-11-29T20:18:31.680048+00:00" + }, + { + "id": "f473a771-d0dd-41a8-bd12-16e1e31bba1e", + "createdAt": "2023-11-29T20:18:31.680639+00:00", + "commandType": "aspirate", + "key": "37c90eea282535f13db8b134aea255e3", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.680695+00:00", + "completedAt": "2023-11-29T20:18:31.685106+00:00" + }, + { + "id": "bc8efa70-207f-4032-a714-bd4348f393e1", + "createdAt": "2023-11-29T20:18:31.685808+00:00", + "commandType": "dispense", + "key": "9c983b0688f94d6e82af0e504f9b8766", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 3.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 3.0 + }, + "startedAt": "2023-11-29T20:18:31.685873+00:00", + "completedAt": "2023-11-29T20:18:31.687697+00:00" + }, + { + "id": "329b4b3f-f3cb-4377-a19a-dd35edf8f2de", + "createdAt": "2023-11-29T20:18:31.688226+00:00", + "commandType": "moveToWell", + "key": "9c07278275274b9331b76065e9e552f9", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:31.688283+00:00", + "completedAt": "2023-11-29T20:18:31.689324+00:00" + }, + { + "id": "a872c846-5b76-4af7-ad38-cb0bd0ef38d7", + "createdAt": "2023-11-29T20:18:31.689791+00:00", + "commandType": "moveToWell", + "key": "4185dc16d8fc55274f37ba7a7ceb957d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 182.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:31.689848+00:00", + "completedAt": "2023-11-29T20:18:31.691247+00:00" + }, + { + "id": "ece9820f-0d49-4d26-8438-4c9f3fae81e9", + "createdAt": "2023-11-29T20:18:31.691990+00:00", + "commandType": "moveToWell", + "key": "953438b7e0f01e148f2e3982824ac049", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 174.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:31.692082+00:00", + "completedAt": "2023-11-29T20:18:31.693521+00:00" + }, + { + "id": "69379715-8eb0-459e-b981-efe39faae118", + "createdAt": "2023-11-29T20:18:31.695065+00:00", + "commandType": "dispense", + "key": "66607f06cedff7d848861d29d3c4d816", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 40.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.695194+00:00", + "completedAt": "2023-11-29T20:18:31.700801+00:00" + }, + { + "id": "7ceebfca-d25d-4930-80c4-056077448190", + "createdAt": "2023-11-29T20:18:31.701744+00:00", + "commandType": "moveToWell", + "key": "30cd26231e38a544e053e559c7a504a5", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:31.701809+00:00", + "completedAt": "2023-11-29T20:18:31.703173+00:00" + }, + { + "id": "25375eae-ecc4-4c9f-b6d2-24871bf3f53a", + "createdAt": "2023-11-29T20:18:31.703920+00:00", + "commandType": "aspirate", + "key": "16dd4c8e3a3194f835786d63d14aa4d3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.703980+00:00", + "completedAt": "2023-11-29T20:18:31.709036+00:00" + }, + { + "id": "aed6d011-02a9-4277-ab02-3fa313685209", + "createdAt": "2023-11-29T20:18:31.709875+00:00", + "commandType": "moveToWell", + "key": "d7a6da9f16ebaef14bcacdef28c4253a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:31.709981+00:00", + "completedAt": "2023-11-29T20:18:31.711588+00:00" + }, + { + "id": "044c38b7-b4f1-494e-aac6-18b47180cf40", + "createdAt": "2023-11-29T20:18:31.712546+00:00", + "commandType": "aspirate", + "key": "04a6cb7bababd7af383fead90bf444ad", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.712620+00:00", + "completedAt": "2023-11-29T20:18:31.714925+00:00" + }, + { + "id": "6809b7d4-b3d6-4cd1-8bc8-9e23e2fc068a", + "createdAt": "2023-11-29T20:18:31.715834+00:00", + "commandType": "dispense", + "key": "fd61591419e36c55503ce2844af7d4b3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.715925+00:00", + "completedAt": "2023-11-29T20:18:31.718070+00:00" + }, + { + "id": "f43c533b-ac94-433d-9ad4-3d7b4f27baf1", + "createdAt": "2023-11-29T20:18:31.718769+00:00", + "commandType": "moveToWell", + "key": "3db4889cac7b34976d82503acbb820aa", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:31.718868+00:00", + "completedAt": "2023-11-29T20:18:31.720245+00:00" + }, + { + "id": "20bddbda-7897-459d-a02b-1ad740745668", + "createdAt": "2023-11-29T20:18:31.720990+00:00", + "commandType": "dispense", + "key": "55cc0af90b169855f8ebcec3a63c7617", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.721050+00:00", + "completedAt": "2023-11-29T20:18:31.723027+00:00" + }, + { + "id": "14334017-c6a7-4700-bc75-3e2ff0185b5e", + "createdAt": "2023-11-29T20:18:31.723827+00:00", + "commandType": "aspirate", + "key": "e8413e57d0297f1a38d3ae24d2097d9a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.723892+00:00", + "completedAt": "2023-11-29T20:18:31.728665+00:00" + }, + { + "id": "8bc6bc9c-653d-4b28-b4c3-36790dde3637", + "createdAt": "2023-11-29T20:18:31.729369+00:00", + "commandType": "moveToWell", + "key": "f72083560bb2ceec3fa344c31e50566a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:31.729434+00:00", + "completedAt": "2023-11-29T20:18:31.730710+00:00" + }, + { + "id": "b9afa411-b9d0-4887-a9e5-676c33a9d09b", + "createdAt": "2023-11-29T20:18:31.731473+00:00", + "commandType": "aspirate", + "key": "285eeb77093f95a0f4dd656bb5e9df9f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.731535+00:00", + "completedAt": "2023-11-29T20:18:31.733645+00:00" + }, + { + "id": "3f14ecbd-e21f-4027-8921-b7c5274c2c14", + "createdAt": "2023-11-29T20:18:31.734444+00:00", + "commandType": "dispense", + "key": "9c88517422f3ea9c319cf5e82b09c6a1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.734502+00:00", + "completedAt": "2023-11-29T20:18:31.736464+00:00" + }, + { + "id": "ef219ff4-1cde-4145-a8b7-6085888ed0a0", + "createdAt": "2023-11-29T20:18:31.737208+00:00", + "commandType": "moveToWell", + "key": "997ed0a792980688d9b47bfb41ff3443", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:31.737324+00:00", + "completedAt": "2023-11-29T20:18:31.738777+00:00" + }, + { + "id": "977a2263-f66e-4250-b32b-57107e21ae18", + "createdAt": "2023-11-29T20:18:31.739647+00:00", + "commandType": "dispense", + "key": "6930712f3d4d27c8fd65aa08a795e953", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.739718+00:00", + "completedAt": "2023-11-29T20:18:31.741923+00:00" + }, + { + "id": "3715d209-afd0-420b-b662-273c370256b6", + "createdAt": "2023-11-29T20:18:31.742798+00:00", + "commandType": "moveToWell", + "key": "63d844e0a48ee99dfc70a65aa168edda", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.742877+00:00", + "completedAt": "2023-11-29T20:18:31.744362+00:00" + }, + { + "id": "7929515f-8d8f-4aa4-83c0-18cc857dc4ac", + "createdAt": "2023-11-29T20:18:31.744744+00:00", + "commandType": "waitForDuration", + "key": "77f89fc997688b1d5b466e187e9ab2c3", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.744821+00:00", + "completedAt": "2023-11-29T20:18:31.744875+00:00" + }, + { + "id": "c63e777f-28ce-4ae0-838c-c8a5b9f58bfe", + "createdAt": "2023-11-29T20:18:31.745771+00:00", + "commandType": "blowout", + "key": "925a38bb167cc83cbdc31402375e65b1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.745828+00:00", + "completedAt": "2023-11-29T20:18:31.748035+00:00" + }, + { + "id": "81297869-0c0f-4e83-ad9b-823a80845662", + "createdAt": "2023-11-29T20:18:31.748794+00:00", + "commandType": "touchTip", + "key": "e5270b63243ccbb1c43037601190df4a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 36.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.748864+00:00", + "completedAt": "2023-11-29T20:18:31.754905+00:00" + }, + { + "id": "0ff2e4f5-0c95-46df-9ccb-eeb8928f75da", + "createdAt": "2023-11-29T20:18:31.755709+00:00", + "commandType": "moveToWell", + "key": "e3c2e0a63940dbf99f0042d70fe43a21", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.755767+00:00", + "completedAt": "2023-11-29T20:18:31.757198+00:00" + }, + { + "id": "5c30369f-851d-4b40-8022-16ceeef00502", + "createdAt": "2023-11-29T20:18:31.757942+00:00", + "commandType": "moveToWell", + "key": "453eebe517b06a59488b150596865079", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 37.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.758016+00:00", + "completedAt": "2023-11-29T20:18:31.759719+00:00" + }, + { + "id": "05d48306-7174-47b0-8c7f-0c5b661740c4", + "createdAt": "2023-11-29T20:18:31.760460+00:00", + "commandType": "moveToWell", + "key": "7eda58d52cb7b117e7c8c309218f8e02", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.760535+00:00", + "completedAt": "2023-11-29T20:18:31.762056+00:00" + }, + { + "id": "ebd7eca2-de02-429a-831f-621d854d6ed7", + "createdAt": "2023-11-29T20:18:31.762387+00:00", + "commandType": "dropTip", + "key": "eb661537d645615219cad7b520a8427e", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:31.762444+00:00", + "completedAt": "2023-11-29T20:18:31.769528+00:00" + }, + { + "id": "d57fc281-319c-4831-8f35-8ebcfb7b7284", + "createdAt": "2023-11-29T20:18:31.770203+00:00", + "commandType": "pickUpTip", + "key": "6cc44598bf803e391a3db79b30234493", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 223.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:31.770268+00:00", + "completedAt": "2023-11-29T20:18:31.781752+00:00" + }, + { + "id": "a67c792f-03dc-4150-9fb5-f3aa322e98fb", + "createdAt": "2023-11-29T20:18:31.782495+00:00", + "commandType": "aspirate", + "key": "9ddb6dd97e10984f34884ca443456fa7", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.782569+00:00", + "completedAt": "2023-11-29T20:18:31.787587+00:00" + }, + { + "id": "05fd5f0f-4452-4594-9a26-bcf3b6c0c2b6", + "createdAt": "2023-11-29T20:18:31.788227+00:00", + "commandType": "dispense", + "key": "b181e2f07b9428f6e112616fa4854446", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.788303+00:00", + "completedAt": "2023-11-29T20:18:31.790157+00:00" + }, + { + "id": "c4991b62-2185-4ca8-b5c7-9414515c94f7", + "createdAt": "2023-11-29T20:18:31.790758+00:00", + "commandType": "aspirate", + "key": "af53dbb27d6bfb66a16bec860b17380b", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.790833+00:00", + "completedAt": "2023-11-29T20:18:31.795482+00:00" + }, + { + "id": "b1c5316a-d940-4fa3-822e-0cc933af7862", + "createdAt": "2023-11-29T20:18:31.796181+00:00", + "commandType": "dispense", + "key": "41caa656ab0d2123f77dbe7021482428", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.796272+00:00", + "completedAt": "2023-11-29T20:18:31.798406+00:00" + }, + { + "id": "d70735e6-77e1-4e65-aeb4-3d85c21a57e6", + "createdAt": "2023-11-29T20:18:31.799068+00:00", + "commandType": "aspirate", + "key": "2499526f8f0f17ab5d797ddf42a0d67d", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.799151+00:00", + "completedAt": "2023-11-29T20:18:31.803821+00:00" + }, + { + "id": "a9101f71-a297-4765-a023-45ad7625a180", + "createdAt": "2023-11-29T20:18:31.804406+00:00", + "commandType": "dispense", + "key": "906ecc33b58a1a8c40bc943271f06e6d", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.804464+00:00", + "completedAt": "2023-11-29T20:18:31.806252+00:00" + }, + { + "id": "3d37ec9f-2489-45d4-b79d-63eeebd4a535", + "createdAt": "2023-11-29T20:18:31.807051+00:00", + "commandType": "aspirate", + "key": "71f1593ab05b8b8dd57bc723b3c2b9dc", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 83.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 83.0 + }, + "startedAt": "2023-11-29T20:18:31.807143+00:00", + "completedAt": "2023-11-29T20:18:31.812551+00:00" + }, + { + "id": "60d78d74-aa0a-4458-9428-968b98db54f2", + "createdAt": "2023-11-29T20:18:31.813354+00:00", + "commandType": "dispense", + "key": "a0608f8b9f772b70c314d07dd898675d", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 3.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 3.0 + }, + "startedAt": "2023-11-29T20:18:31.813430+00:00", + "completedAt": "2023-11-29T20:18:31.815427+00:00" + }, + { + "id": "85790f29-2110-4b70-bbca-cda6a15423f5", + "createdAt": "2023-11-29T20:18:31.816059+00:00", + "commandType": "moveToWell", + "key": "6d6c4562ead11e92aa2ab5473150deb5", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:31.816141+00:00", + "completedAt": "2023-11-29T20:18:31.817386+00:00" + }, + { + "id": "137953df-90f9-43ed-8f60-ce4a2c053b59", + "createdAt": "2023-11-29T20:18:31.818245+00:00", + "commandType": "moveToWell", + "key": "2e139829e310387385007080ed1e004f", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 182.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:31.818342+00:00", + "completedAt": "2023-11-29T20:18:31.819815+00:00" + }, + { + "id": "017dc854-cb25-4724-9900-c20a4b75e6d8", + "createdAt": "2023-11-29T20:18:31.820470+00:00", + "commandType": "moveToWell", + "key": "9edb6a5de1970bf12100de7f04661253", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 174.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:31.820560+00:00", + "completedAt": "2023-11-29T20:18:31.821819+00:00" + }, + { + "id": "d7a09d8f-df27-4125-9a99-25a6d3e631d5", + "createdAt": "2023-11-29T20:18:31.822635+00:00", + "commandType": "dispense", + "key": "d58b9701c73726600bf7cb13ea3fc9fa", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 40.0, + "volume": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 80.0 + }, + "startedAt": "2023-11-29T20:18:31.822726+00:00", + "completedAt": "2023-11-29T20:18:31.828012+00:00" + }, + { + "id": "12648591-00b5-486b-8c66-b0c6dc8d8c45", + "createdAt": "2023-11-29T20:18:31.828841+00:00", + "commandType": "moveToWell", + "key": "8497f0588293ceac6dbbab493a0d4b95", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:31.828904+00:00", + "completedAt": "2023-11-29T20:18:31.830364+00:00" + }, + { + "id": "16f5d63c-7029-4907-b507-7211f7ba8556", + "createdAt": "2023-11-29T20:18:31.831332+00:00", + "commandType": "aspirate", + "key": "18372c4abbfa6e999af7cd0e90194a72", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.831424+00:00", + "completedAt": "2023-11-29T20:18:31.836724+00:00" + }, + { + "id": "68dd798d-b801-4992-a8f2-6458db6f1acf", + "createdAt": "2023-11-29T20:18:31.837443+00:00", + "commandType": "moveToWell", + "key": "b8e0637f8177651970217375e0a4dc15", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:31.837535+00:00", + "completedAt": "2023-11-29T20:18:31.838929+00:00" + }, + { + "id": "88e2bd65-a40f-4844-a126-bea8e0ce440a", + "createdAt": "2023-11-29T20:18:31.839810+00:00", + "commandType": "aspirate", + "key": "1b0fba3c87609d9db79c3c26a38a0e10", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.839878+00:00", + "completedAt": "2023-11-29T20:18:31.842258+00:00" + }, + { + "id": "62e50105-d12d-4bee-950d-8bee53269f9c", + "createdAt": "2023-11-29T20:18:31.843234+00:00", + "commandType": "dispense", + "key": "914a1c65b27b0d2fcf5c8623a9503c28", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.843356+00:00", + "completedAt": "2023-11-29T20:18:31.845472+00:00" + }, + { + "id": "ba7c0941-b2b4-4066-9735-a7e652311b7c", + "createdAt": "2023-11-29T20:18:31.846093+00:00", + "commandType": "moveToWell", + "key": "be6b8a4b294a401403a813a9761a267b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:31.846150+00:00", + "completedAt": "2023-11-29T20:18:31.847573+00:00" + }, + { + "id": "50b401dc-ee28-42c2-8628-54b6f0badc31", + "createdAt": "2023-11-29T20:18:31.848579+00:00", + "commandType": "dispense", + "key": "20cf09330d5731f5fa42aaf9b84a6ea5", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.848693+00:00", + "completedAt": "2023-11-29T20:18:31.850921+00:00" + }, + { + "id": "f6f7c7fd-a996-4fa9-8d78-838eab742ad0", + "createdAt": "2023-11-29T20:18:31.851823+00:00", + "commandType": "aspirate", + "key": "b3c6389eef75908ab29e34b03d3ec7b5", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.851918+00:00", + "completedAt": "2023-11-29T20:18:31.856772+00:00" + }, + { + "id": "b9c934db-45ca-4438-bb12-355fe333cc44", + "createdAt": "2023-11-29T20:18:31.857632+00:00", + "commandType": "moveToWell", + "key": "9d8a5aca4a56acfbdcf0875b386b4730", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:31.857810+00:00", + "completedAt": "2023-11-29T20:18:31.859310+00:00" + }, + { + "id": "00b38a7e-fdd7-4ce9-8af5-9045425c30ee", + "createdAt": "2023-11-29T20:18:31.860186+00:00", + "commandType": "aspirate", + "key": "88d7c9df60469e430946fdc494679c22", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.860254+00:00", + "completedAt": "2023-11-29T20:18:31.862648+00:00" + }, + { + "id": "cf583ef0-a9ab-404e-b843-0689c42899dd", + "createdAt": "2023-11-29T20:18:31.863627+00:00", + "commandType": "dispense", + "key": "e9f311d67fc9ffecccebbc4df12d6f38", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.863711+00:00", + "completedAt": "2023-11-29T20:18:31.865943+00:00" + }, + { + "id": "20e19ac5-ad08-4270-acc0-ceb67c686332", + "createdAt": "2023-11-29T20:18:31.866687+00:00", + "commandType": "moveToWell", + "key": "40da557ff42d6b71b6b3684471f15c34", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:31.866756+00:00", + "completedAt": "2023-11-29T20:18:31.868131+00:00" + }, + { + "id": "28cdeaac-a502-43ca-b8bc-18114834be4a", + "createdAt": "2023-11-29T20:18:31.868873+00:00", + "commandType": "dispense", + "key": "0905bd204c0073f935c2901d4ec0ca7a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:31.868932+00:00", + "completedAt": "2023-11-29T20:18:31.871084+00:00" + }, + { + "id": "4f9e0c8b-705f-4f22-b24a-8808921d4dae", + "createdAt": "2023-11-29T20:18:31.871886+00:00", + "commandType": "moveToWell", + "key": "a9cf4dbc640a4dd5625842fcbd6c1c63", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.871984+00:00", + "completedAt": "2023-11-29T20:18:31.873373+00:00" + }, + { + "id": "b757ef91-bd9e-4120-84eb-a4e57ef7fe03", + "createdAt": "2023-11-29T20:18:31.873755+00:00", + "commandType": "waitForDuration", + "key": "ddabb4d0484fce1d18bf37c31726f9c1", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.873835+00:00", + "completedAt": "2023-11-29T20:18:31.873905+00:00" + }, + { + "id": "4ea1a9f8-a1c0-4054-85e4-b428ed3ea462", + "createdAt": "2023-11-29T20:18:31.874917+00:00", + "commandType": "blowout", + "key": "81b0ed11d51c030b06ee350b2c432a21", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.875004+00:00", + "completedAt": "2023-11-29T20:18:31.906537+00:00" + }, + { + "id": "3fb5dd72-45c2-4892-baa9-e91a9c91da13", + "createdAt": "2023-11-29T20:18:31.907464+00:00", + "commandType": "touchTip", + "key": "840592b9820867173c1294c8cc1af930", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 36.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.907607+00:00", + "completedAt": "2023-11-29T20:18:31.914328+00:00" + }, + { + "id": "7862dd0d-eac0-4535-a502-fbd955953126", + "createdAt": "2023-11-29T20:18:31.915425+00:00", + "commandType": "moveToWell", + "key": "05aed986f527b22b1c7fa341e955f6ef", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.915492+00:00", + "completedAt": "2023-11-29T20:18:31.916985+00:00" + }, + { + "id": "748ad86f-9ba1-45bd-aecd-1e5deac54b72", + "createdAt": "2023-11-29T20:18:31.917726+00:00", + "commandType": "moveToWell", + "key": "a1275ab6c9a6f6a7be95bd9e68af180e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 37.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.917863+00:00", + "completedAt": "2023-11-29T20:18:31.919485+00:00" + }, + { + "id": "726d2a44-9e3a-4347-87b9-168e329141ea", + "createdAt": "2023-11-29T20:18:31.920243+00:00", + "commandType": "moveToWell", + "key": "b2a531ec087a39a20501cd1b096391a5", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.920315+00:00", + "completedAt": "2023-11-29T20:18:31.921804+00:00" + }, + { + "id": "6a3c52aa-d284-4256-a75b-ea1e29ddbb0d", + "createdAt": "2023-11-29T20:18:31.922265+00:00", + "commandType": "dropTip", + "key": "baebf265b0d28b7e63a7d387728c0c80", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:31.922338+00:00", + "completedAt": "2023-11-29T20:18:31.930178+00:00" + }, + { + "id": "aafe6f0d-71f2-4872-82f9-2f662769ba3b", + "createdAt": "2023-11-29T20:18:31.930692+00:00", + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "key": "5321000238853e18be8815bc8b2705db", + "status": "succeeded", + "params": { + "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5", + "rpm": 1600.0 + }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:31.930760+00:00", + "completedAt": "2023-11-29T20:18:31.930875+00:00" + }, + { + "id": "58d9069b-65dd-4d0b-9725-44242f25efed", + "createdAt": "2023-11-29T20:18:31.931444+00:00", + "commandType": "waitForDuration", + "key": "e0c5b3e7e00e584cc9007e4f91ffc8d9", + "status": "succeeded", + "params": { "seconds": 300.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.931524+00:00", + "completedAt": "2023-11-29T20:18:31.931583+00:00" + }, + { + "id": "d3d9154e-8c3a-492e-a23b-a8b300871c2a", + "createdAt": "2023-11-29T20:18:31.931917+00:00", + "commandType": "heaterShaker/deactivateShaker", + "key": "d189c0a69a0cdc609f230d40511dde05", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.932035+00:00", + "completedAt": "2023-11-29T20:18:31.932124+00:00" + }, + { + "id": "14796cbd-223e-481a-bc49-1f40e02f6405", + "createdAt": "2023-11-29T20:18:31.932421+00:00", + "commandType": "heaterShaker/openLabwareLatch", + "key": "3e0fb6d2d1d5cd78adf92aef683384f9", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:31.932480+00:00", + "completedAt": "2023-11-29T20:18:31.932577+00:00" + }, + { + "id": "4771ce5e-2f20-4a81-a093-be8845034a86", + "createdAt": "2023-11-29T20:18:31.932857+00:00", + "commandType": "moveLabware", + "key": "f99a4dfb32a9d3a3133bac89cf7b4d8d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "newLocation": { "moduleId": "dc2de112-b2b7-4811-9cf5-501f1fee6878" }, + "strategy": "usingGripper", + "pickUpOffset": { "x": 0.0, "y": -2.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": 0.0, "z": 0.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.932909+00:00", + "completedAt": "2023-11-29T20:18:31.933102+00:00" + }, + { + "id": "5f8ffe9d-aa33-452d-95da-4273b19edc31", + "createdAt": "2023-11-29T20:18:31.933302+00:00", + "commandType": "heaterShaker/closeLabwareLatch", + "key": "36a8ff3580cfe25e26182e51f18a80b7", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.933353+00:00", + "completedAt": "2023-11-29T20:18:31.933401+00:00" + }, + { + "id": "1ac055f0-cd06-4f89-a4f2-42474a81739a", + "createdAt": "2023-11-29T20:18:31.933665+00:00", + "commandType": "waitForDuration", + "key": "4263c22af7aad29c2afc51869a45546f", + "status": "succeeded", + "params": { "seconds": 240.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.933722+00:00", + "completedAt": "2023-11-29T20:18:31.933774+00:00" + }, + { + "id": "d3b381db-e45d-4cf7-9e2e-31f5376712f1", + "createdAt": "2023-11-29T20:18:31.934283+00:00", + "commandType": "custom", + "key": "9649e7da2312ca9abab3f78907213f27", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Removing Supernatant" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.934339+00:00", + "completedAt": "2023-11-29T20:18:31.934387+00:00" + }, + { + "id": "557f8425-3323-472c-a37b-9b43d773dd6c", + "createdAt": "2023-11-29T20:18:31.934904+00:00", + "commandType": "pickUpTip", + "key": "5b872f143f9e440f6b0ad45feb356872", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 232.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:31.935003+00:00", + "completedAt": "2023-11-29T20:18:31.946074+00:00" + }, + { + "id": "d0aa4a25-43d3-43e4-8c80-21228e248d7b", + "createdAt": "2023-11-29T20:18:31.946840+00:00", + "commandType": "moveToWell", + "key": "ded6cc5be18daf1f038cd5ceb8a8a795", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:31.946914+00:00", + "completedAt": "2023-11-29T20:18:31.951571+00:00" + }, + { + "id": "885ce9fe-bde0-4047-8eda-f1560c29f403", + "createdAt": "2023-11-29T20:18:31.952577+00:00", + "commandType": "aspirate", + "key": "646fcbe736493bbeb37f74e06a85b75a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:31.952689+00:00", + "completedAt": "2023-11-29T20:18:31.954938+00:00" + }, + { + "id": "bce89690-4b6b-4b90-aef9-500fe5e91711", + "createdAt": "2023-11-29T20:18:31.955266+00:00", + "commandType": "waitForDuration", + "key": "a6224252e648a2917b75203a8744d93f", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.955323+00:00", + "completedAt": "2023-11-29T20:18:31.955376+00:00" + }, + { + "id": "b62eb350-ce89-48db-a494-8a99891cba30", + "createdAt": "2023-11-29T20:18:31.955898+00:00", + "commandType": "moveToWell", + "key": "e1c0fe3ee578d96aa127e0cabf5c667d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:31.955958+00:00", + "completedAt": "2023-11-29T20:18:31.957421+00:00" + }, + { + "id": "dc7bed64-93b3-4dcd-9bb9-fba98264d204", + "createdAt": "2023-11-29T20:18:31.958431+00:00", + "commandType": "aspirate", + "key": "a5cbaa63cea3b3d6ad7e14007acee512", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:31.958527+00:00", + "completedAt": "2023-11-29T20:18:31.961074+00:00" + }, + { + "id": "eb17eb11-5cb8-4bf7-9712-607e79a8726c", + "createdAt": "2023-11-29T20:18:31.961973+00:00", + "commandType": "moveToWell", + "key": "066bf3a91db6151904cdf9658b850f73", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.962040+00:00", + "completedAt": "2023-11-29T20:18:31.963424+00:00" + }, + { + "id": "2dd20950-d28e-4f95-95d2-f01126ba2a96", + "createdAt": "2023-11-29T20:18:31.964185+00:00", + "commandType": "touchTip", + "key": "2668543cc545d004ee052c1e88121486", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:31.964256+00:00", + "completedAt": "2023-11-29T20:18:31.970685+00:00" + }, + { + "id": "75a135b4-2d65-4976-820f-100f4b1d4aa3", + "createdAt": "2023-11-29T20:18:31.971265+00:00", + "commandType": "dispense", + "key": "a910136e99961b07a0f00f6089e50127", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:31.971327+00:00", + "completedAt": "2023-11-29T20:18:31.976690+00:00" + }, + { + "id": "69eab963-930b-4cc3-a28b-a14911d0355f", + "createdAt": "2023-11-29T20:18:31.977104+00:00", + "commandType": "waitForDuration", + "key": "cf9c9964b695c7e42ccd9a7097dca327", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:31.977165+00:00", + "completedAt": "2023-11-29T20:18:31.977225+00:00" + }, + { + "id": "9ce638c8-ce18-4efc-b117-e58c8e041bb2", + "createdAt": "2023-11-29T20:18:31.977903+00:00", + "commandType": "blowout", + "key": "4933775a8e6783d648f6bc368a4e228f", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:31.977968+00:00", + "completedAt": "2023-11-29T20:18:31.979841+00:00" + }, + { + "id": "e716255f-840e-4cf9-ba31-859200842ac3", + "createdAt": "2023-11-29T20:18:31.980433+00:00", + "commandType": "moveToWell", + "key": "9cb15da67f115a03ab526b49c9726ea4", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 281.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:31.980539+00:00", + "completedAt": "2023-11-29T20:18:31.981750+00:00" + }, + { + "id": "fe4d270c-6747-4daf-9c8d-245021673bcd", + "createdAt": "2023-11-29T20:18:31.982169+00:00", + "commandType": "moveToWell", + "key": "2272c05c1004bc942112c5b132566fea", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 273.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:31.982263+00:00", + "completedAt": "2023-11-29T20:18:31.983777+00:00" + }, + { + "id": "4ca680d7-fad8-42a2-816f-9dec4e330b37", + "createdAt": "2023-11-29T20:18:31.984646+00:00", + "commandType": "moveToWell", + "key": "06c1acdea3c7d821a3469a2903498f98", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:31.984720+00:00", + "completedAt": "2023-11-29T20:18:31.986177+00:00" + }, + { + "id": "11164b6f-126b-495e-8585-a058df01be84", + "createdAt": "2023-11-29T20:18:31.986685+00:00", + "commandType": "moveToWell", + "key": "12f08dab29df13308467dd4877a5f331", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:31.986760+00:00", + "completedAt": "2023-11-29T20:18:31.988049+00:00" + }, + { + "id": "aaea0408-ac31-4b9d-9864-16fac7538eac", + "createdAt": "2023-11-29T20:18:31.988388+00:00", + "commandType": "dropTip", + "key": "b0339b6f606fde2be2c2c710e4144bb9", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:31.988445+00:00", + "completedAt": "2023-11-29T20:18:31.994639+00:00" + }, + { + "id": "e7979d64-b6c6-4b9e-8f58-1701d410b7ec", + "createdAt": "2023-11-29T20:18:31.995373+00:00", + "commandType": "pickUpTip", + "key": "d99e046f16c68586a3bccf770c80de5f", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 241.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:31.995471+00:00", + "completedAt": "2023-11-29T20:18:32.006087+00:00" + }, + { + "id": "babef8bb-de3e-42ea-b23f-b9cb8882f0fb", + "createdAt": "2023-11-29T20:18:32.006902+00:00", + "commandType": "moveToWell", + "key": "a2cd3f1f2182387a587042a05cf7545c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.006969+00:00", + "completedAt": "2023-11-29T20:18:32.011861+00:00" + }, + { + "id": "3432a3e3-917b-48b3-8e3d-4239bea7d816", + "createdAt": "2023-11-29T20:18:32.012720+00:00", + "commandType": "aspirate", + "key": "3f2d8b1e08201251e51ef27e1ab5478d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.012820+00:00", + "completedAt": "2023-11-29T20:18:32.015086+00:00" + }, + { + "id": "1fbc85f8-8495-42ab-b0a1-2aa98141f3c4", + "createdAt": "2023-11-29T20:18:32.015385+00:00", + "commandType": "waitForDuration", + "key": "c5766eef3031736402d00b5da0c5e78b", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.015465+00:00", + "completedAt": "2023-11-29T20:18:32.015539+00:00" + }, + { + "id": "98d68df4-5d86-4856-9fa6-98357d5f72e1", + "createdAt": "2023-11-29T20:18:32.016142+00:00", + "commandType": "moveToWell", + "key": "444fa8781d8a5a424b043219f33c8da8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.016213+00:00", + "completedAt": "2023-11-29T20:18:32.017622+00:00" + }, + { + "id": "28ea221f-81b7-400c-a5e3-ca46793c2d64", + "createdAt": "2023-11-29T20:18:32.018400+00:00", + "commandType": "aspirate", + "key": "06c3b93c2a882ee8475f5dcecfdd4004", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.018465+00:00", + "completedAt": "2023-11-29T20:18:32.020672+00:00" + }, + { + "id": "2e286081-2ab5-4592-8c66-9837622e06b3", + "createdAt": "2023-11-29T20:18:32.021385+00:00", + "commandType": "moveToWell", + "key": "9e39339669201a0c2bd0fecf04c8a070", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.021443+00:00", + "completedAt": "2023-11-29T20:18:32.022857+00:00" + }, + { + "id": "3511080a-8a71-4597-8a39-fa4c515eb653", + "createdAt": "2023-11-29T20:18:32.023541+00:00", + "commandType": "touchTip", + "key": "64e4acb9014309e517372c2043c97f0e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.023606+00:00", + "completedAt": "2023-11-29T20:18:32.030044+00:00" + }, + { + "id": "8d475f88-9aa7-4c46-b065-9b43762afe27", + "createdAt": "2023-11-29T20:18:32.030741+00:00", + "commandType": "dispense", + "key": "a899dd4c39be478b8304235525696fd8", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:32.030817+00:00", + "completedAt": "2023-11-29T20:18:32.035872+00:00" + }, + { + "id": "01b2e3f2-8ae9-4663-97e8-6df1e1c50de3", + "createdAt": "2023-11-29T20:18:32.036218+00:00", + "commandType": "waitForDuration", + "key": "7af2e38559d96cbfff62bff880120dfd", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.036275+00:00", + "completedAt": "2023-11-29T20:18:32.036331+00:00" + }, + { + "id": "50558df5-110b-46e4-8a31-471ee8fca88c", + "createdAt": "2023-11-29T20:18:32.036772+00:00", + "commandType": "blowout", + "key": "0a86141b2da48c73646548edbabbce67", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.036826+00:00", + "completedAt": "2023-11-29T20:18:32.038827+00:00" + }, + { + "id": "a47ed975-c8c6-42db-98b4-bca288fef7b3", + "createdAt": "2023-11-29T20:18:32.039323+00:00", + "commandType": "moveToWell", + "key": "7d5662691c3bd01462258eadd2602894", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 281.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.039377+00:00", + "completedAt": "2023-11-29T20:18:32.040706+00:00" + }, + { + "id": "e2628715-f1c7-42d0-ab1b-88870f15206f", + "createdAt": "2023-11-29T20:18:32.041333+00:00", + "commandType": "moveToWell", + "key": "aef9ccf37e97b19aa90f42aabf07da65", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 273.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.041470+00:00", + "completedAt": "2023-11-29T20:18:32.042872+00:00" + }, + { + "id": "b3f4dcfa-0f3b-4f8c-9f43-348e7e1c2305", + "createdAt": "2023-11-29T20:18:32.043692+00:00", + "commandType": "moveToWell", + "key": "fde1e183a620d39fd6ad63ae7daf3499", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.043763+00:00", + "completedAt": "2023-11-29T20:18:32.045236+00:00" + }, + { + "id": "1641ebf2-72a5-4e3f-88ad-807e0db94c13", + "createdAt": "2023-11-29T20:18:32.045771+00:00", + "commandType": "moveToWell", + "key": "9a9c4a075a340ced5166745463616779", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.045837+00:00", + "completedAt": "2023-11-29T20:18:32.047132+00:00" + }, + { + "id": "29d9e54d-e554-4211-8072-4675703b3c09", + "createdAt": "2023-11-29T20:18:32.047419+00:00", + "commandType": "dropTip", + "key": "860e3ac88c22d1e3b5245692fe90c7ac", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.047475+00:00", + "completedAt": "2023-11-29T20:18:32.053455+00:00" + }, + { + "id": "24048c90-9283-4879-b20a-3df0f15ee76f", + "createdAt": "2023-11-29T20:18:32.054109+00:00", + "commandType": "pickUpTip", + "key": "2ee4aedcc61c9fc06ba2d55f68202139", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 250.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.054174+00:00", + "completedAt": "2023-11-29T20:18:32.064320+00:00" + }, + { + "id": "512740fa-c3b1-421d-84d3-19b1a8f68aaf", + "createdAt": "2023-11-29T20:18:32.065255+00:00", + "commandType": "moveToWell", + "key": "3700a80708bbd0d3d3bc422e3d4209d8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.065359+00:00", + "completedAt": "2023-11-29T20:18:32.070213+00:00" + }, + { + "id": "1e0df0b4-4d22-4e99-8538-67335dca8c78", + "createdAt": "2023-11-29T20:18:32.071012+00:00", + "commandType": "aspirate", + "key": "8f79d5f17f0606416dc9294448b70c2b", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.071109+00:00", + "completedAt": "2023-11-29T20:18:32.073286+00:00" + }, + { + "id": "07cbe502-8a6a-4953-b958-d20eccea8acd", + "createdAt": "2023-11-29T20:18:32.073704+00:00", + "commandType": "waitForDuration", + "key": "a79dfbc507ea4c60be8844247b3607fa", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.073794+00:00", + "completedAt": "2023-11-29T20:18:32.073864+00:00" + }, + { + "id": "6c09f069-3b7d-4e8c-a3f8-3d140a6d98bb", + "createdAt": "2023-11-29T20:18:32.074456+00:00", + "commandType": "moveToWell", + "key": "daa9a6944b12166b3514492da38706f7", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.074534+00:00", + "completedAt": "2023-11-29T20:18:32.076005+00:00" + }, + { + "id": "8ff89f1b-5129-489e-9731-4e4724706cb3", + "createdAt": "2023-11-29T20:18:32.076910+00:00", + "commandType": "aspirate", + "key": "2ba686da3921ac0c1718ce1cd8198c2b", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.077012+00:00", + "completedAt": "2023-11-29T20:18:32.079185+00:00" + }, + { + "id": "b6711418-92b5-456a-b0f9-1f9c69ce4717", + "createdAt": "2023-11-29T20:18:32.079878+00:00", + "commandType": "moveToWell", + "key": "62525462e9b00488d0e0d07fe5930ebb", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.079937+00:00", + "completedAt": "2023-11-29T20:18:32.081322+00:00" + }, + { + "id": "3e6521b6-8a17-4b1d-ab91-3ae738c3321f", + "createdAt": "2023-11-29T20:18:32.082017+00:00", + "commandType": "touchTip", + "key": "a643718cb8b157a40dafe08977b5d3a5", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.082081+00:00", + "completedAt": "2023-11-29T20:18:32.088616+00:00" + }, + { + "id": "1fac7ac4-fb68-4b25-b51b-aad5a3e56d16", + "createdAt": "2023-11-29T20:18:32.089179+00:00", + "commandType": "dispense", + "key": "f7d797273639e49f621713e4ae86e3bd", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:32.089241+00:00", + "completedAt": "2023-11-29T20:18:32.094333+00:00" + }, + { + "id": "f7813d29-f08b-4cc1-a082-7d15d74ca1b7", + "createdAt": "2023-11-29T20:18:32.094708+00:00", + "commandType": "waitForDuration", + "key": "dbc9ef92fac5f16cb7c14a03edd941b1", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.094768+00:00", + "completedAt": "2023-11-29T20:18:32.094831+00:00" + }, + { + "id": "b3f572d1-42b0-4f8b-89d0-6fe4beb6d526", + "createdAt": "2023-11-29T20:18:32.095362+00:00", + "commandType": "blowout", + "key": "d0bafa07012a7aec0a1e1480e1adecea", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.095420+00:00", + "completedAt": "2023-11-29T20:18:32.097223+00:00" + }, + { + "id": "997207df-acfb-4e80-84f8-3fe0bae925fd", + "createdAt": "2023-11-29T20:18:32.097837+00:00", + "commandType": "moveToWell", + "key": "594a5da9cad4ea5e21fa8e8569744bb8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 281.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.097893+00:00", + "completedAt": "2023-11-29T20:18:32.099158+00:00" + }, + { + "id": "89889534-9813-4135-96e9-3026a36aa564", + "createdAt": "2023-11-29T20:18:32.099704+00:00", + "commandType": "moveToWell", + "key": "29e758e1cc40440ad66a287e331b6149", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 273.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.099814+00:00", + "completedAt": "2023-11-29T20:18:32.101285+00:00" + }, + { + "id": "d19b8392-3c7c-4ba9-9157-00d90878a58a", + "createdAt": "2023-11-29T20:18:32.102002+00:00", + "commandType": "moveToWell", + "key": "3c589869d14a9df26db4ad2fd1a7e43f", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.102065+00:00", + "completedAt": "2023-11-29T20:18:32.103385+00:00" + }, + { + "id": "2995f52f-49d5-4acd-b2ae-27b3b6610df2", + "createdAt": "2023-11-29T20:18:32.103785+00:00", + "commandType": "moveToWell", + "key": "e7adea653ce2840fda5cd5e3f9123bb8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.103839+00:00", + "completedAt": "2023-11-29T20:18:32.105186+00:00" + }, + { + "id": "c7342c07-b381-4c12-8273-768fb38a610d", + "createdAt": "2023-11-29T20:18:32.105720+00:00", + "commandType": "dropTip", + "key": "fd317fc424e1fdcbaff693ec17270830", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.105840+00:00", + "completedAt": "2023-11-29T20:18:32.112801+00:00" + }, + { + "id": "2beb5f9c-b40b-4f9a-8aaa-7a4cd25a44f7", + "createdAt": "2023-11-29T20:18:32.113523+00:00", + "commandType": "custom", + "key": "dcf948c199b061019bd5f56072c0dddc", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> ETOH Wash" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.113667+00:00", + "completedAt": "2023-11-29T20:18:32.113740+00:00" + }, + { + "id": "4fdc2b5b-f75d-41e3-ab87-498fa61923eb", + "createdAt": "2023-11-29T20:18:32.114274+00:00", + "commandType": "pickUpTip", + "key": "153b61ec3604e6d81a756e0930c23f58", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.114340+00:00", + "completedAt": "2023-11-29T20:18:32.125383+00:00" + }, + { + "id": "ac443881-e8ce-4f1d-b12b-96f5c4c3d0f0", + "createdAt": "2023-11-29T20:18:32.126094+00:00", + "commandType": "aspirate", + "key": "63b000fe15bb53617ae683fd2e6f9e84", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:32.126162+00:00", + "completedAt": "2023-11-29T20:18:32.131238+00:00" + }, + { + "id": "13c888f4-03c2-4310-8745-0109563fb683", + "createdAt": "2023-11-29T20:18:32.131714+00:00", + "commandType": "moveToWell", + "key": "176030e30bbfefd28eb2fdc18bac66c3", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.131776+00:00", + "completedAt": "2023-11-29T20:18:32.133066+00:00" + }, + { + "id": "6db2b5a7-d954-46e0-a3c3-d57de4ad1ba0", + "createdAt": "2023-11-29T20:18:32.133681+00:00", + "commandType": "moveToWell", + "key": "c7239816891f42e85c6d5614aa9f409f", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.133781+00:00", + "completedAt": "2023-11-29T20:18:32.135087+00:00" + }, + { + "id": "feb1b009-b2d5-4bbb-a95d-6629ef4599ee", + "createdAt": "2023-11-29T20:18:32.135735+00:00", + "commandType": "moveToWell", + "key": "0c9722a9ffb949b4c1d0c620fb8adb07", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 200.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.135801+00:00", + "completedAt": "2023-11-29T20:18:32.137239+00:00" + }, + { + "id": "f00fc236-fa99-43a3-a216-8a787c41689c", + "createdAt": "2023-11-29T20:18:32.137726+00:00", + "commandType": "moveToWell", + "key": "c84cdb75fc1c471f7b4b226ec3a112dd", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 192.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.137782+00:00", + "completedAt": "2023-11-29T20:18:32.139017+00:00" + }, + { + "id": "a4d88fd4-683a-483b-96c7-5eb9f4a2ca48", + "createdAt": "2023-11-29T20:18:32.139802+00:00", + "commandType": "dispense", + "key": "5f53fb7762368068081f7338fc3c3a63", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:32.139888+00:00", + "completedAt": "2023-11-29T20:18:32.145423+00:00" + }, + { + "id": "1a01ccc6-e708-4978-adb3-9246423d73c9", + "createdAt": "2023-11-29T20:18:32.145835+00:00", + "commandType": "waitForDuration", + "key": "6739546e2e1a67ce8c15e69e4379a7bf", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.145914+00:00", + "completedAt": "2023-11-29T20:18:32.145978+00:00" + }, + { + "id": "f1f74435-9a01-40da-a6dd-45cfbf00c22d", + "createdAt": "2023-11-29T20:18:32.146688+00:00", + "commandType": "blowout", + "key": "e600a7de23c4a1d8a41dc6d02c5f4741", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.146791+00:00", + "completedAt": "2023-11-29T20:18:32.148828+00:00" + }, + { + "id": "510bfebd-82cc-429a-8e79-70b670a9ee03", + "createdAt": "2023-11-29T20:18:32.149434+00:00", + "commandType": "moveToWell", + "key": "a5d4e088cada95c31f56186c899a0ab2", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.149506+00:00", + "completedAt": "2023-11-29T20:18:32.151077+00:00" + }, + { + "id": "032c006b-db6a-48df-badd-11f5fdb6ff6d", + "createdAt": "2023-11-29T20:18:32.151725+00:00", + "commandType": "moveToWell", + "key": "01030f1e5f9338d8c87f019752cf9fa6", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.151784+00:00", + "completedAt": "2023-11-29T20:18:32.153148+00:00" + }, + { + "id": "e717a556-58d5-4be2-921a-7bb1e442df8b", + "createdAt": "2023-11-29T20:18:32.153749+00:00", + "commandType": "moveToWell", + "key": "b593d554ce604b5dc978953ecc5cd78d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.153815+00:00", + "completedAt": "2023-11-29T20:18:32.155285+00:00" + }, + { + "id": "37bd7c9b-77f5-4b82-9be8-d038131b5324", + "createdAt": "2023-11-29T20:18:32.155602+00:00", + "commandType": "dropTip", + "key": "42707bee089eac5108bd022344790337", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.155676+00:00", + "completedAt": "2023-11-29T20:18:32.163063+00:00" + }, + { + "id": "89e95c6d-3962-4dac-a0bb-0ad48a581feb", + "createdAt": "2023-11-29T20:18:32.163718+00:00", + "commandType": "pickUpTip", + "key": "7df635057786c77cd79a051e194ce1d9", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.163782+00:00", + "completedAt": "2023-11-29T20:18:32.174263+00:00" + }, + { + "id": "4adad29e-8ce6-467e-8d38-06bf70a538d6", + "createdAt": "2023-11-29T20:18:32.174943+00:00", + "commandType": "aspirate", + "key": "2e766f19945515266dce836005d1a644", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:32.175030+00:00", + "completedAt": "2023-11-29T20:18:32.180310+00:00" + }, + { + "id": "b2c2f7ac-3927-4d4e-ae8b-c97063cd05bd", + "createdAt": "2023-11-29T20:18:32.180945+00:00", + "commandType": "moveToWell", + "key": "11702f88b489628bcd9b2c7e1cec9af6", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.181069+00:00", + "completedAt": "2023-11-29T20:18:32.182538+00:00" + }, + { + "id": "e4af93b0-1244-4df1-b1de-7afe22239dc2", + "createdAt": "2023-11-29T20:18:32.183036+00:00", + "commandType": "moveToWell", + "key": "cea11b37cb1d2044faf2f8a1bc6b7a37", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.183102+00:00", + "completedAt": "2023-11-29T20:18:32.184394+00:00" + }, + { + "id": "2b50d350-fee9-4e52-be35-f441dab5b741", + "createdAt": "2023-11-29T20:18:32.185116+00:00", + "commandType": "moveToWell", + "key": "0d5bfe11d23ce9783b7e902c694f8bb2", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 200.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.185220+00:00", + "completedAt": "2023-11-29T20:18:32.186589+00:00" + }, + { + "id": "5978c516-0a34-4d91-8f26-0d6adf1de4dd", + "createdAt": "2023-11-29T20:18:32.187107+00:00", + "commandType": "moveToWell", + "key": "5fb338b87495044f1e4f13be2b9f6b30", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 192.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.187170+00:00", + "completedAt": "2023-11-29T20:18:32.188566+00:00" + }, + { + "id": "13b38fcf-3326-446a-9316-bfc0a71d8522", + "createdAt": "2023-11-29T20:18:32.189318+00:00", + "commandType": "dispense", + "key": "829664e4577195c91e1d1522f8098437", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:32.189416+00:00", + "completedAt": "2023-11-29T20:18:32.194650+00:00" + }, + { + "id": "3e16ccc9-7f8a-47a2-bab2-7508bff8fe1d", + "createdAt": "2023-11-29T20:18:32.195248+00:00", + "commandType": "waitForDuration", + "key": "1d114aaf5a35e9ff18f7e089c3fc9688", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.195326+00:00", + "completedAt": "2023-11-29T20:18:32.195407+00:00" + }, + { + "id": "8c3879e5-8baa-4717-a09d-1108f071d2a8", + "createdAt": "2023-11-29T20:18:32.196316+00:00", + "commandType": "blowout", + "key": "04deda7508b6a617c5ec80f438623d36", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.196396+00:00", + "completedAt": "2023-11-29T20:18:32.198482+00:00" + }, + { + "id": "9a68f0aa-0674-4022-b682-5ec68f70fa0a", + "createdAt": "2023-11-29T20:18:32.199207+00:00", + "commandType": "moveToWell", + "key": "197e2c7bd0ebe3a436e12238ccd298b5", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.199281+00:00", + "completedAt": "2023-11-29T20:18:32.200745+00:00" + }, + { + "id": "460c5358-7501-418b-9966-a8a2ea6d4bc6", + "createdAt": "2023-11-29T20:18:32.201436+00:00", + "commandType": "moveToWell", + "key": "6d03cae984dc40e29ad4b34cbd438983", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.201519+00:00", + "completedAt": "2023-11-29T20:18:32.202814+00:00" + }, + { + "id": "442660c7-5cee-4392-914f-2f421bbffb9b", + "createdAt": "2023-11-29T20:18:32.203287+00:00", + "commandType": "moveToWell", + "key": "ec12808092775132e9dc6923cdece75c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.203339+00:00", + "completedAt": "2023-11-29T20:18:32.204582+00:00" + }, + { + "id": "b3901184-75d1-4a0a-80ef-83aa7bbdd604", + "createdAt": "2023-11-29T20:18:32.204954+00:00", + "commandType": "dropTip", + "key": "48f97c47627b32e46dd3596fb4208e9f", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.205021+00:00", + "completedAt": "2023-11-29T20:18:32.212248+00:00" + }, + { + "id": "fbfa701c-e6d5-4d45-ab2c-c6c51dad4327", + "createdAt": "2023-11-29T20:18:32.212942+00:00", + "commandType": "pickUpTip", + "key": "d78782ac65e9bf8b053cb1ea5cc4c6dd", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.213008+00:00", + "completedAt": "2023-11-29T20:18:32.223574+00:00" + }, + { + "id": "8d81e255-d8df-41f6-b97d-f2817215f306", + "createdAt": "2023-11-29T20:18:32.224229+00:00", + "commandType": "aspirate", + "key": "acc0ed17f7360de5275fd19c620a95b6", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:32.224300+00:00", + "completedAt": "2023-11-29T20:18:32.229859+00:00" + }, + { + "id": "c3fa4cfb-05a1-4396-80f7-6b32152dbb18", + "createdAt": "2023-11-29T20:18:32.230422+00:00", + "commandType": "moveToWell", + "key": "1c237af8f6226e9fa0338cb445e26482", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.230486+00:00", + "completedAt": "2023-11-29T20:18:32.231726+00:00" + }, + { + "id": "c69ee7ff-4d1e-496b-9c99-2d0f2e2e6b2e", + "createdAt": "2023-11-29T20:18:32.232320+00:00", + "commandType": "moveToWell", + "key": "ff7608e5181114b3b0307113faac6205", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.232488+00:00", + "completedAt": "2023-11-29T20:18:32.233914+00:00" + }, + { + "id": "7acef017-3395-4d4e-8e01-4f8c4fd295fe", + "createdAt": "2023-11-29T20:18:32.234671+00:00", + "commandType": "moveToWell", + "key": "bf1bec951bfc64c3802b4d3d8746e7b3", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 200.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.234736+00:00", + "completedAt": "2023-11-29T20:18:32.235991+00:00" + }, + { + "id": "30267f8a-a454-4a01-9228-13fcfefc65dc", + "createdAt": "2023-11-29T20:18:32.236532+00:00", + "commandType": "moveToWell", + "key": "9e9f448240e84a9a0f7613fcba5ac5f1", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 192.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.236615+00:00", + "completedAt": "2023-11-29T20:18:32.237894+00:00" + }, + { + "id": "3fb6424b-acbf-43a9-8d88-71ce1996e74b", + "createdAt": "2023-11-29T20:18:32.238654+00:00", + "commandType": "dispense", + "key": "9e3106e4f2a8a8482d17576b8672f3b8", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:32.238713+00:00", + "completedAt": "2023-11-29T20:18:32.244251+00:00" + }, + { + "id": "2cba19ab-e139-41f1-bcce-1ef12e879142", + "createdAt": "2023-11-29T20:18:32.244668+00:00", + "commandType": "waitForDuration", + "key": "da18e32c4918e759c73b3529a6f7f0c4", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.244753+00:00", + "completedAt": "2023-11-29T20:18:32.244824+00:00" + }, + { + "id": "a6800bfa-3b2e-4916-91ce-13c5a6e187d3", + "createdAt": "2023-11-29T20:18:32.245523+00:00", + "commandType": "blowout", + "key": "850649856d17e780cfba0519060a51b3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.245583+00:00", + "completedAt": "2023-11-29T20:18:32.247690+00:00" + }, + { + "id": "c1c1d17c-3c1c-48d9-bed9-961bf0d0a38b", + "createdAt": "2023-11-29T20:18:32.248479+00:00", + "commandType": "moveToWell", + "key": "58100b56392500ba2fec1a7ce49cb2d1", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.248563+00:00", + "completedAt": "2023-11-29T20:18:32.250189+00:00" + }, + { + "id": "e1d5a36c-c123-416c-8a26-e9857de7c7f2", + "createdAt": "2023-11-29T20:18:32.250807+00:00", + "commandType": "moveToWell", + "key": "59cade9e21d68c01111b0efd5e793922", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.250893+00:00", + "completedAt": "2023-11-29T20:18:32.252385+00:00" + }, + { + "id": "89d20da4-c9e2-4daf-a65b-0437eaa5e135", + "createdAt": "2023-11-29T20:18:32.252986+00:00", + "commandType": "moveToWell", + "key": "183ab05f104cc527d93e407799553bcb", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.253047+00:00", + "completedAt": "2023-11-29T20:18:32.254450+00:00" + }, + { + "id": "a62aebeb-655e-40af-8830-bd58225d8f2f", + "createdAt": "2023-11-29T20:18:32.254794+00:00", + "commandType": "dropTip", + "key": "f8a5c5e5dca8890965bb19b56f6600d2", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.254895+00:00", + "completedAt": "2023-11-29T20:18:32.262272+00:00" + }, + { + "id": "9c0d3e8d-6316-4c7d-b78f-cfcdbdaf518f", + "createdAt": "2023-11-29T20:18:32.262719+00:00", + "commandType": "waitForDuration", + "key": "41c12b878e73c6c7b5590d0b7ad78df5", + "status": "succeeded", + "params": { "seconds": 30.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.262787+00:00", + "completedAt": "2023-11-29T20:18:32.262848+00:00" + }, + { + "id": "43c4eb43-ff4f-47df-9bf7-2e3d67b6dc1b", + "createdAt": "2023-11-29T20:18:32.263342+00:00", + "commandType": "custom", + "key": "d8797e44a023e9bf4623ea940b2878d8", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Remove ETOH Wash" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.263396+00:00", + "completedAt": "2023-11-29T20:18:32.263443+00:00" + }, + { + "id": "1a915878-3ab5-46f2-9774-8eabb2aeafa0", + "createdAt": "2023-11-29T20:18:32.263963+00:00", + "commandType": "pickUpTip", + "key": "b0da5c4fae4235af33c914cdf2a76c34", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 342.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.264017+00:00", + "completedAt": "2023-11-29T20:18:32.274544+00:00" + }, + { + "id": "1e924aed-4a46-42bb-a406-50e7a3f5455c", + "createdAt": "2023-11-29T20:18:32.275318+00:00", + "commandType": "moveToWell", + "key": "6a81bff6685a167a1ea16bd1540c6c43", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.275395+00:00", + "completedAt": "2023-11-29T20:18:32.280195+00:00" + }, + { + "id": "e59ba62d-6270-410f-8bf9-527c65d13ed0", + "createdAt": "2023-11-29T20:18:32.281035+00:00", + "commandType": "aspirate", + "key": "598dce5e72cc86b49d5779065a1f75dc", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.281111+00:00", + "completedAt": "2023-11-29T20:18:32.283260+00:00" + }, + { + "id": "440f8937-27ca-4599-91d6-79db326298a4", + "createdAt": "2023-11-29T20:18:32.283640+00:00", + "commandType": "waitForDuration", + "key": "bda9f214e2202ac1038a7afe8396c2b2", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.283736+00:00", + "completedAt": "2023-11-29T20:18:32.283801+00:00" + }, + { + "id": "cdeb870c-576b-4ad2-8c90-062daee082dd", + "createdAt": "2023-11-29T20:18:32.284347+00:00", + "commandType": "moveToWell", + "key": "d5c7e071371d14aed67a5696bcf4e9eb", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.284402+00:00", + "completedAt": "2023-11-29T20:18:32.285794+00:00" + }, + { + "id": "edee49ea-c791-4f1e-aee9-4df45a798708", + "createdAt": "2023-11-29T20:18:32.286607+00:00", + "commandType": "aspirate", + "key": "1f144ad521001be1e68d94fc07d066a9", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.286676+00:00", + "completedAt": "2023-11-29T20:18:32.288762+00:00" + }, + { + "id": "4948af80-a7ae-49a2-ac8b-f9a4dc812441", + "createdAt": "2023-11-29T20:18:32.289620+00:00", + "commandType": "moveToWell", + "key": "0a1fa48c2ecee0287c121a3fd832e92c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.289708+00:00", + "completedAt": "2023-11-29T20:18:32.291169+00:00" + }, + { + "id": "429a6055-8d2f-48bd-9ee8-5de19e22ce7c", + "createdAt": "2023-11-29T20:18:32.292040+00:00", + "commandType": "touchTip", + "key": "e589d8d7810228fb99774df7b978d0e9", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.292116+00:00", + "completedAt": "2023-11-29T20:18:32.298528+00:00" + }, + { + "id": "4020aac1-ef0f-44d9-a0c5-b55afeb3e64b", + "createdAt": "2023-11-29T20:18:32.299442+00:00", + "commandType": "dispense", + "key": "ed13b9923dbc65fe2f429080868f4fcd", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:32.299516+00:00", + "completedAt": "2023-11-29T20:18:32.304781+00:00" + }, + { + "id": "ff264f88-eaca-4ebf-afe4-72846f32f022", + "createdAt": "2023-11-29T20:18:32.305187+00:00", + "commandType": "waitForDuration", + "key": "b759ca2eb14ad75f0e5030621897d6e9", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.305289+00:00", + "completedAt": "2023-11-29T20:18:32.305351+00:00" + }, + { + "id": "5983749a-0ec3-46cb-9d2f-dff7e70009e9", + "createdAt": "2023-11-29T20:18:32.305954+00:00", + "commandType": "blowout", + "key": "a08d4e39d2c70c2be8a9823a60a6c064", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.306045+00:00", + "completedAt": "2023-11-29T20:18:32.308245+00:00" + }, + { + "id": "d94d8b2c-c5ed-45f3-9184-5a450b50dd30", + "createdAt": "2023-11-29T20:18:32.309004+00:00", + "commandType": "moveToWell", + "key": "eb979f9ce744f1edf938e59a3f4fe6cd", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 281.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.309123+00:00", + "completedAt": "2023-11-29T20:18:32.310716+00:00" + }, + { + "id": "002594d6-e98d-4ec5-ad1f-7bf755a7a906", + "createdAt": "2023-11-29T20:18:32.311338+00:00", + "commandType": "moveToWell", + "key": "b3a40c2ca1c1fba1b3f0524f36d25846", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 273.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.311420+00:00", + "completedAt": "2023-11-29T20:18:32.312725+00:00" + }, + { + "id": "f825a54b-ebac-4c34-a441-14aae042aee1", + "createdAt": "2023-11-29T20:18:32.313234+00:00", + "commandType": "moveToWell", + "key": "441c0c6f514ee7cbfd543df5ec4a8134", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.313292+00:00", + "completedAt": "2023-11-29T20:18:32.314634+00:00" + }, + { + "id": "f687524d-d2a3-4e4d-b0dc-0000bdb55bb4", + "createdAt": "2023-11-29T20:18:32.315072+00:00", + "commandType": "moveToWell", + "key": "3b5d73b8774432ee8a5bbb8a60a35f56", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.315129+00:00", + "completedAt": "2023-11-29T20:18:32.316343+00:00" + }, + { + "id": "481676a0-c9db-4844-9048-7a03efd84c6f", + "createdAt": "2023-11-29T20:18:32.316655+00:00", + "commandType": "dropTip", + "key": "df7511e1d32c05fbf8d6ff08a49dc54d", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.316718+00:00", + "completedAt": "2023-11-29T20:18:32.322847+00:00" + }, + { + "id": "84ee3756-f44a-46e6-90e0-7c986680335b", + "createdAt": "2023-11-29T20:18:32.323566+00:00", + "commandType": "pickUpTip", + "key": "2433e6fb25f1626d51cd4a0c82fba681", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.323693+00:00", + "completedAt": "2023-11-29T20:18:32.334409+00:00" + }, + { + "id": "5bc800bb-e9bb-4d46-8b7b-ef962fb97f0c", + "createdAt": "2023-11-29T20:18:32.335225+00:00", + "commandType": "moveToWell", + "key": "a35356cef96b3563c2e452e6b7b352d5", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.335308+00:00", + "completedAt": "2023-11-29T20:18:32.340109+00:00" + }, + { + "id": "f9ca7606-7a69-4e00-acaf-7fa8e73d8236", + "createdAt": "2023-11-29T20:18:32.341094+00:00", + "commandType": "aspirate", + "key": "2a2722b1ff7fdfa711df01a323d19f1a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.341170+00:00", + "completedAt": "2023-11-29T20:18:32.343501+00:00" + }, + { + "id": "af9784af-bc33-4f5d-9020-6f45a717bf1d", + "createdAt": "2023-11-29T20:18:32.343957+00:00", + "commandType": "waitForDuration", + "key": "176a6a028db9138f9c590f6dc61b869e", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.344022+00:00", + "completedAt": "2023-11-29T20:18:32.344078+00:00" + }, + { + "id": "e46eafa0-df53-4d88-8b71-80a7751cb635", + "createdAt": "2023-11-29T20:18:32.344611+00:00", + "commandType": "moveToWell", + "key": "7ea349237bb8db680cabb75ef41b7181", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.344667+00:00", + "completedAt": "2023-11-29T20:18:32.346056+00:00" + }, + { + "id": "88786e34-eee9-40af-90ab-426034e167dc", + "createdAt": "2023-11-29T20:18:32.346713+00:00", + "commandType": "aspirate", + "key": "8cd0bdd5e16007bd816374714fb70273", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.346768+00:00", + "completedAt": "2023-11-29T20:18:32.348691+00:00" + }, + { + "id": "2afa2fe4-4c61-4559-b7df-e9bcd83f17cb", + "createdAt": "2023-11-29T20:18:32.349563+00:00", + "commandType": "moveToWell", + "key": "1fd91247fb34f4cf1d748c7900730208", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.349650+00:00", + "completedAt": "2023-11-29T20:18:32.351082+00:00" + }, + { + "id": "1625cb8b-9d63-409d-b037-8d51cc548fe5", + "createdAt": "2023-11-29T20:18:32.351878+00:00", + "commandType": "touchTip", + "key": "f1590f40c9d5179a238d08ea1aa07166", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.351956+00:00", + "completedAt": "2023-11-29T20:18:32.358208+00:00" + }, + { + "id": "dd5d0fd0-c750-4539-884c-9c7f2c60a4b5", + "createdAt": "2023-11-29T20:18:32.358946+00:00", + "commandType": "dispense", + "key": "dce8547950b908ec204eba7170331d55", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:32.359024+00:00", + "completedAt": "2023-11-29T20:18:32.364425+00:00" + }, + { + "id": "dcbd428b-f461-43fd-ae9b-3e4789e95894", + "createdAt": "2023-11-29T20:18:32.364837+00:00", + "commandType": "waitForDuration", + "key": "1c3aeacb3b3c716433cd68ee13b24d99", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.364904+00:00", + "completedAt": "2023-11-29T20:18:32.364975+00:00" + }, + { + "id": "a80fe045-0694-43f4-8b6b-5dba29c6c73b", + "createdAt": "2023-11-29T20:18:32.365604+00:00", + "commandType": "blowout", + "key": "f558712f5929d1bebf9e46ecdc54563f", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.365708+00:00", + "completedAt": "2023-11-29T20:18:32.367710+00:00" + }, + { + "id": "499098be-cda2-4298-bd01-9cb0c95020cc", + "createdAt": "2023-11-29T20:18:32.368459+00:00", + "commandType": "moveToWell", + "key": "21e6e035c538359b02277664d3acdb93", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 281.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.368525+00:00", + "completedAt": "2023-11-29T20:18:32.369796+00:00" + }, + { + "id": "4c6ccc8e-5686-4a65-b26f-abdac1011709", + "createdAt": "2023-11-29T20:18:32.370259+00:00", + "commandType": "moveToWell", + "key": "867369deb086b6bb75d66dbeb0f23daa", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 273.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.370318+00:00", + "completedAt": "2023-11-29T20:18:32.371484+00:00" + }, + { + "id": "040244c1-b93e-4ae0-bc96-3fbb14460e81", + "createdAt": "2023-11-29T20:18:32.371998+00:00", + "commandType": "moveToWell", + "key": "5edf99f02ede1082b21defb3145aba38", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.372052+00:00", + "completedAt": "2023-11-29T20:18:32.373285+00:00" + }, + { + "id": "fc90b936-7b62-429a-9b39-1057811e22c3", + "createdAt": "2023-11-29T20:18:32.373776+00:00", + "commandType": "moveToWell", + "key": "e010714a657d0b7630f67812557b016e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.373841+00:00", + "completedAt": "2023-11-29T20:18:32.375248+00:00" + }, + { + "id": "81ad08b2-bf79-4589-a8b5-e8181fd3d26e", + "createdAt": "2023-11-29T20:18:32.375664+00:00", + "commandType": "dropTip", + "key": "d4015a423bf42cad89a0139e68de924c", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.375731+00:00", + "completedAt": "2023-11-29T20:18:32.382422+00:00" + }, + { + "id": "a4a2d51d-a13c-4338-a62e-5d8b33a69371", + "createdAt": "2023-11-29T20:18:32.383274+00:00", + "commandType": "pickUpTip", + "key": "ab41e2d319b76fb6a37ccf2083513747", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 360.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.383343+00:00", + "completedAt": "2023-11-29T20:18:32.393748+00:00" + }, + { + "id": "3ce3f764-6feb-471b-84d1-64c278b63847", + "createdAt": "2023-11-29T20:18:32.394498+00:00", + "commandType": "moveToWell", + "key": "76aa95ad9b5822dee5c324494e0f42e9", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.394627+00:00", + "completedAt": "2023-11-29T20:18:32.399621+00:00" + }, + { + "id": "6b048df7-527d-4ae4-b5cd-5668b86a046a", + "createdAt": "2023-11-29T20:18:32.400595+00:00", + "commandType": "aspirate", + "key": "b03a71da1c24d27a9d19d299cb83fab5", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.400673+00:00", + "completedAt": "2023-11-29T20:18:32.402863+00:00" + }, + { + "id": "87b6e596-3a1d-4fd7-886e-6f12d3d30a35", + "createdAt": "2023-11-29T20:18:32.403224+00:00", + "commandType": "waitForDuration", + "key": "cdb2e2d590cd9a55eee7e576333414f4", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.403293+00:00", + "completedAt": "2023-11-29T20:18:32.403349+00:00" + }, + { + "id": "206643fb-a12d-4fa4-bb00-dda8beb829f9", + "createdAt": "2023-11-29T20:18:32.403890+00:00", + "commandType": "moveToWell", + "key": "41d559519d3e9bfe18e03504a8d3bbd2", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.403943+00:00", + "completedAt": "2023-11-29T20:18:32.405230+00:00" + }, + { + "id": "42782f07-b974-4414-adbd-1df4840159b0", + "createdAt": "2023-11-29T20:18:32.405942+00:00", + "commandType": "aspirate", + "key": "07f2ecfdb3de8184003324309fe3b2dc", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.406005+00:00", + "completedAt": "2023-11-29T20:18:32.408305+00:00" + }, + { + "id": "21eb61f8-9393-47a3-88d4-2a291704c764", + "createdAt": "2023-11-29T20:18:32.409141+00:00", + "commandType": "moveToWell", + "key": "ad18142d8e1329ffe416acc6de05a16e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.409203+00:00", + "completedAt": "2023-11-29T20:18:32.410754+00:00" + }, + { + "id": "06679dc3-9214-47cb-b40b-1ea60ed02721", + "createdAt": "2023-11-29T20:18:32.411448+00:00", + "commandType": "touchTip", + "key": "c947a9e206b7c1962fc9639f2bdb88a0", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.411520+00:00", + "completedAt": "2023-11-29T20:18:32.417945+00:00" + }, + { + "id": "f9f35026-c168-46e2-80f8-0455608308cf", + "createdAt": "2023-11-29T20:18:32.418754+00:00", + "commandType": "dispense", + "key": "f260bad1cc802665e590b0160284dcd3", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:32.418876+00:00", + "completedAt": "2023-11-29T20:18:32.424731+00:00" + }, + { + "id": "8261cd63-0a0f-4bed-bf85-d11d0a14058c", + "createdAt": "2023-11-29T20:18:32.425303+00:00", + "commandType": "waitForDuration", + "key": "34eb16c6b5d704cb1cb97a51ebe8e97a", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.425435+00:00", + "completedAt": "2023-11-29T20:18:32.425520+00:00" + }, + { + "id": "5ed5c312-cc42-4ed9-9439-d88ef94c9a08", + "createdAt": "2023-11-29T20:18:32.426256+00:00", + "commandType": "blowout", + "key": "393cf0b78c9a9626877f80bd1f4f7871", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.426360+00:00", + "completedAt": "2023-11-29T20:18:32.428579+00:00" + }, + { + "id": "8a64072d-4763-4406-a1a6-b040c876ab5a", + "createdAt": "2023-11-29T20:18:32.429332+00:00", + "commandType": "moveToWell", + "key": "da11361e229b9c1fc65d2faa5f3a7248", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 281.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.429403+00:00", + "completedAt": "2023-11-29T20:18:32.430814+00:00" + }, + { + "id": "9a802d22-7e89-4b33-a263-d3b8f2bdae57", + "createdAt": "2023-11-29T20:18:32.431355+00:00", + "commandType": "moveToWell", + "key": "ddb70c483a339f218963a88cea1d4314", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 273.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.431467+00:00", + "completedAt": "2023-11-29T20:18:32.432791+00:00" + }, + { + "id": "69c8fc32-3fca-436e-957b-eb239b078527", + "createdAt": "2023-11-29T20:18:32.433461+00:00", + "commandType": "moveToWell", + "key": "3ac0a14f7ec464520ca533ed4da6d84d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.433569+00:00", + "completedAt": "2023-11-29T20:18:32.434924+00:00" + }, + { + "id": "8eb74f56-1134-43a6-b4bb-5cc64ad4fc5c", + "createdAt": "2023-11-29T20:18:32.435513+00:00", + "commandType": "moveToWell", + "key": "035ab23d66aabc3bd49eea7145cb04b9", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.435582+00:00", + "completedAt": "2023-11-29T20:18:32.436824+00:00" + }, + { + "id": "a68b941d-9ba3-44b2-adfb-a50baa94da73", + "createdAt": "2023-11-29T20:18:32.437165+00:00", + "commandType": "dropTip", + "key": "68f41affc69c7e65b3b4c2d069b4a561", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.437225+00:00", + "completedAt": "2023-11-29T20:18:32.443407+00:00" + }, + { + "id": "f2a35589-dee9-4247-aec1-5390483a006c", + "createdAt": "2023-11-29T20:18:32.444128+00:00", + "commandType": "custom", + "key": "c349ad836fcd8a90ff988ece15d0f0d9", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> ETOH Wash" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.444211+00:00", + "completedAt": "2023-11-29T20:18:32.444276+00:00" + }, + { + "id": "a78f89d1-68ea-4729-8c89-aed53b07547c", + "createdAt": "2023-11-29T20:18:32.444867+00:00", + "commandType": "pickUpTip", + "key": "939ee9613a4b9989c9f0164b55f2bb3f", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.444940+00:00", + "completedAt": "2023-11-29T20:18:32.455787+00:00" + }, + { + "id": "a4a26a3c-9e47-429f-8e6f-56639ef9d01e", + "createdAt": "2023-11-29T20:18:32.456413+00:00", + "commandType": "aspirate", + "key": "7bc7eed91bf3858d696d51f97c054e7a", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:32.456478+00:00", + "completedAt": "2023-11-29T20:18:32.461414+00:00" + }, + { + "id": "7410f048-6355-4a42-bf4e-6e8a1d35b558", + "createdAt": "2023-11-29T20:18:32.461925+00:00", + "commandType": "moveToWell", + "key": "cb2100dd159128d46888047bdcad2056", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.462044+00:00", + "completedAt": "2023-11-29T20:18:32.463547+00:00" + }, + { + "id": "31d9eebb-46cd-4545-ace6-8f45e925d6e6", + "createdAt": "2023-11-29T20:18:32.464022+00:00", + "commandType": "moveToWell", + "key": "a0bd1cef4acb1df1bacba5c6a4ee2682", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.464081+00:00", + "completedAt": "2023-11-29T20:18:32.465475+00:00" + }, + { + "id": "4cd83314-5749-4189-b0b7-a39bf1f1dd99", + "createdAt": "2023-11-29T20:18:32.466149+00:00", + "commandType": "moveToWell", + "key": "99e2e966b70f6dc89e5846c7905fb393", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 200.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.466236+00:00", + "completedAt": "2023-11-29T20:18:32.467631+00:00" + }, + { + "id": "10cb0e38-efb7-4514-a50b-b3e368edfe70", + "createdAt": "2023-11-29T20:18:32.468060+00:00", + "commandType": "moveToWell", + "key": "06021985f6c641581531aabe4c3f156f", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 192.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.468182+00:00", + "completedAt": "2023-11-29T20:18:32.469395+00:00" + }, + { + "id": "bfb4038c-1a24-4d86-9c86-82734a14f6fa", + "createdAt": "2023-11-29T20:18:32.470218+00:00", + "commandType": "dispense", + "key": "51e7ceb19ce00eb3ec6c6075217b1905", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:32.470286+00:00", + "completedAt": "2023-11-29T20:18:32.475616+00:00" + }, + { + "id": "67723efc-4193-4971-86af-2917802da1a8", + "createdAt": "2023-11-29T20:18:32.476159+00:00", + "commandType": "waitForDuration", + "key": "c25c410c82e5008597af87b96d75c0be", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.476265+00:00", + "completedAt": "2023-11-29T20:18:32.476331+00:00" + }, + { + "id": "dc17bd8b-6725-4111-a311-e70244449ec8", + "createdAt": "2023-11-29T20:18:32.477077+00:00", + "commandType": "blowout", + "key": "343396d5c8376c3ba40274587cd1f0a2", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.477171+00:00", + "completedAt": "2023-11-29T20:18:32.479438+00:00" + }, + { + "id": "9b939746-5e18-43ef-be8e-20d2f999a615", + "createdAt": "2023-11-29T20:18:32.480082+00:00", + "commandType": "moveToWell", + "key": "a38d7caccfb5e0d840e55e0fa40ca9b0", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.480145+00:00", + "completedAt": "2023-11-29T20:18:32.481581+00:00" + }, + { + "id": "3a271f10-fd8e-403f-bf20-30adb251ece7", + "createdAt": "2023-11-29T20:18:32.482362+00:00", + "commandType": "moveToWell", + "key": "23c30cd0af7364ecde1c06c9d08aaea1", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.482446+00:00", + "completedAt": "2023-11-29T20:18:32.483989+00:00" + }, + { + "id": "e432a7b2-d703-4070-be83-b4b14e0ca64f", + "createdAt": "2023-11-29T20:18:32.484745+00:00", + "commandType": "moveToWell", + "key": "117650f2e7b774c2daca1d60597570d4", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.484834+00:00", + "completedAt": "2023-11-29T20:18:32.486314+00:00" + }, + { + "id": "695e842d-4cd3-4347-8fac-861c7d578696", + "createdAt": "2023-11-29T20:18:32.486632+00:00", + "commandType": "dropTip", + "key": "ee4ea9a3f33c20308ab63275772c8545", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.486688+00:00", + "completedAt": "2023-11-29T20:18:32.493869+00:00" + }, + { + "id": "4e3d358a-a6fe-47e9-864d-e8dc8cdd142b", + "createdAt": "2023-11-29T20:18:32.494686+00:00", + "commandType": "pickUpTip", + "key": "ad98a796223106fe778ff104c001fca5", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 378.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.494809+00:00", + "completedAt": "2023-11-29T20:18:32.505862+00:00" + }, + { + "id": "d2ecf021-0c3f-4cea-afdf-493dde45f3e3", + "createdAt": "2023-11-29T20:18:32.506565+00:00", + "commandType": "aspirate", + "key": "a1de277ea806e1e533ab1bf606649ba6", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:32.506652+00:00", + "completedAt": "2023-11-29T20:18:32.512282+00:00" + }, + { + "id": "d02cc0f7-786b-4f49-a7cf-7318ed2371c9", + "createdAt": "2023-11-29T20:18:32.512845+00:00", + "commandType": "moveToWell", + "key": "024932080635f6dcad6d38b1c71b37e8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.512911+00:00", + "completedAt": "2023-11-29T20:18:32.514182+00:00" + }, + { + "id": "92cb57ea-06a4-420d-9afc-33a2b7412b4e", + "createdAt": "2023-11-29T20:18:32.514594+00:00", + "commandType": "moveToWell", + "key": "8f382d8c20e4ab189b7fbec1cd950d33", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.514704+00:00", + "completedAt": "2023-11-29T20:18:32.515922+00:00" + }, + { + "id": "18875b80-0362-44b1-940a-7419776cff9e", + "createdAt": "2023-11-29T20:18:32.516534+00:00", + "commandType": "moveToWell", + "key": "1d5dc17fb6127ec52c22224006e8ba77", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 200.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.516603+00:00", + "completedAt": "2023-11-29T20:18:32.518100+00:00" + }, + { + "id": "4494523e-1865-4c4d-bcdc-89aa6d80ba43", + "createdAt": "2023-11-29T20:18:32.518597+00:00", + "commandType": "moveToWell", + "key": "c9bb9b5fcf084331abd0c290d5588c7f", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 192.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.518660+00:00", + "completedAt": "2023-11-29T20:18:32.520002+00:00" + }, + { + "id": "37b85f6d-0dc7-4a80-a8ec-4cceed8c13d0", + "createdAt": "2023-11-29T20:18:32.520730+00:00", + "commandType": "dispense", + "key": "204f6a96a9bdb131f6a05c0169509fb5", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:32.520790+00:00", + "completedAt": "2023-11-29T20:18:32.526220+00:00" + }, + { + "id": "07cd7052-81c1-45c0-b02d-88765cbd443a", + "createdAt": "2023-11-29T20:18:32.526714+00:00", + "commandType": "waitForDuration", + "key": "b3484b9645fccf9c023a379d9d8a73fd", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.526786+00:00", + "completedAt": "2023-11-29T20:18:32.526855+00:00" + }, + { + "id": "5962ac01-9df8-4e24-afab-4e48076f6d05", + "createdAt": "2023-11-29T20:18:32.527767+00:00", + "commandType": "blowout", + "key": "a112690901d8cad52f71b8a8565a1b71", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.527852+00:00", + "completedAt": "2023-11-29T20:18:32.529936+00:00" + }, + { + "id": "e09ec352-e241-4f98-b53f-ebc0719294e2", + "createdAt": "2023-11-29T20:18:32.530461+00:00", + "commandType": "moveToWell", + "key": "91784348d08af0e3764018474a59cc53", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.530517+00:00", + "completedAt": "2023-11-29T20:18:32.531787+00:00" + }, + { + "id": "806e17f0-e7eb-4bac-a6a9-16c840bf45f3", + "createdAt": "2023-11-29T20:18:32.532317+00:00", + "commandType": "moveToWell", + "key": "add9cc0c564ce8b19175255e2a82d39b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.532412+00:00", + "completedAt": "2023-11-29T20:18:32.533906+00:00" + }, + { + "id": "f7f61a90-5072-485d-aa05-438b70f6ea09", + "createdAt": "2023-11-29T20:18:32.534664+00:00", + "commandType": "moveToWell", + "key": "77a3d54c46cd9014ef3c9584385be2e3", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.534774+00:00", + "completedAt": "2023-11-29T20:18:32.536528+00:00" + }, + { + "id": "3dd24201-8c04-4a6b-9807-189ffc7b9461", + "createdAt": "2023-11-29T20:18:32.537181+00:00", + "commandType": "dropTip", + "key": "3e9993595c88d09ca95d6e4cc3a8225b", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.537300+00:00", + "completedAt": "2023-11-29T20:18:32.545024+00:00" + }, + { + "id": "71f6205d-b334-44ff-868d-18eb696f0894", + "createdAt": "2023-11-29T20:18:32.545862+00:00", + "commandType": "pickUpTip", + "key": "ea8e2e7e4cbdd96f33105a8e985ba07a", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 387.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.545931+00:00", + "completedAt": "2023-11-29T20:18:32.557431+00:00" + }, + { + "id": "80b63729-49e3-4621-88d3-b680be1a48a9", + "createdAt": "2023-11-29T20:18:32.558237+00:00", + "commandType": "aspirate", + "key": "541e899bb5f2df388e219561cbd53e04", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:32.558322+00:00", + "completedAt": "2023-11-29T20:18:32.563944+00:00" + }, + { + "id": "6c215053-a860-4199-8135-cad06cea54f7", + "createdAt": "2023-11-29T20:18:32.564728+00:00", + "commandType": "moveToWell", + "key": "c558df632bd1cb9f6332a1709c2464da", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.564851+00:00", + "completedAt": "2023-11-29T20:18:32.566435+00:00" + }, + { + "id": "e0263a85-b944-4cf4-bb7b-249e5d2764ec", + "createdAt": "2023-11-29T20:18:32.566948+00:00", + "commandType": "moveToWell", + "key": "dd5215470fbc956f2efc9b9eb2059248", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.567026+00:00", + "completedAt": "2023-11-29T20:18:32.568291+00:00" + }, + { + "id": "7a3ecb98-c86a-4aeb-8008-0aa375b38b4c", + "createdAt": "2023-11-29T20:18:32.568899+00:00", + "commandType": "moveToWell", + "key": "558786879881176f9fdcad82524db6e0", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 200.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.568966+00:00", + "completedAt": "2023-11-29T20:18:32.570425+00:00" + }, + { + "id": "b017e5de-638d-4c7f-9daa-e6762752c657", + "createdAt": "2023-11-29T20:18:32.570924+00:00", + "commandType": "moveToWell", + "key": "700d8c11841d37f1f7c0ff4074a069f7", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 192.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.570986+00:00", + "completedAt": "2023-11-29T20:18:32.572311+00:00" + }, + { + "id": "2ad30a85-54ab-4205-bf61-570ec4026fe3", + "createdAt": "2023-11-29T20:18:32.573017+00:00", + "commandType": "dispense", + "key": "f3e62cf85121e584eb15bc9ce7f7cccb", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:32.573077+00:00", + "completedAt": "2023-11-29T20:18:32.578326+00:00" + }, + { + "id": "9945ebbf-07f2-497b-b53d-e73a4b5e96a9", + "createdAt": "2023-11-29T20:18:32.578735+00:00", + "commandType": "waitForDuration", + "key": "7d77bc4ec0e22a713c4509041b94a42b", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.578843+00:00", + "completedAt": "2023-11-29T20:18:32.578913+00:00" + }, + { + "id": "6c2e85d9-0788-4890-b999-8d6ed06253ca", + "createdAt": "2023-11-29T20:18:32.579595+00:00", + "commandType": "blowout", + "key": "456f30e0e0408f06b8234536d8971df3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.579654+00:00", + "completedAt": "2023-11-29T20:18:32.581931+00:00" + }, + { + "id": "3cd34557-6e07-4c60-bc3e-f90a2656c529", + "createdAt": "2023-11-29T20:18:32.582661+00:00", + "commandType": "moveToWell", + "key": "e04e28c16d8204e9eccba0befac0dc9b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.582739+00:00", + "completedAt": "2023-11-29T20:18:32.584408+00:00" + }, + { + "id": "382c90a4-2442-4b48-a5f3-08a3d83100c8", + "createdAt": "2023-11-29T20:18:32.585157+00:00", + "commandType": "moveToWell", + "key": "09befe9f82667f23b295a13a3752b1c1", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.585233+00:00", + "completedAt": "2023-11-29T20:18:32.586721+00:00" + }, + { + "id": "cec280fa-0b4c-4050-9a11-54f4abe86d02", + "createdAt": "2023-11-29T20:18:32.587324+00:00", + "commandType": "moveToWell", + "key": "479e2c9b18794c5e0d81206a1f038a25", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.587485+00:00", + "completedAt": "2023-11-29T20:18:32.588893+00:00" + }, + { + "id": "1cd68007-b4ac-4f8d-b598-cac99c70d0e4", + "createdAt": "2023-11-29T20:18:32.589308+00:00", + "commandType": "dropTip", + "key": "8bbfb3e20f83a4292895cb1e378157a2", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.589383+00:00", + "completedAt": "2023-11-29T20:18:32.597010+00:00" + }, + { + "id": "5f12ecf6-a3aa-4d33-8e99-029ff6636c8c", + "createdAt": "2023-11-29T20:18:32.597437+00:00", + "commandType": "waitForDuration", + "key": "effa8c4b0a446da404dd47c3c087ec80", + "status": "succeeded", + "params": { "seconds": 30.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.597501+00:00", + "completedAt": "2023-11-29T20:18:32.597564+00:00" + }, + { + "id": "0c7399e6-2760-4601-ae2b-7ed11ec5fb39", + "createdAt": "2023-11-29T20:18:32.598163+00:00", + "commandType": "custom", + "key": "008b9afc8775236ef892aaf3770ca5bc", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Remove ETOH Wash" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.598256+00:00", + "completedAt": "2023-11-29T20:18:32.598320+00:00" + }, + { + "id": "c38c3a17-036c-4bcf-836a-4dedb8a0fddb", + "createdAt": "2023-11-29T20:18:32.598948+00:00", + "commandType": "pickUpTip", + "key": "b5b1f490d7257531ad3321675f24f035", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 396.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.599076+00:00", + "completedAt": "2023-11-29T20:18:32.610164+00:00" + }, + { + "id": "2c201ea1-6ee5-4f9a-82a2-f627bd0aae6a", + "createdAt": "2023-11-29T20:18:32.611092+00:00", + "commandType": "moveToWell", + "key": "7076acce01fc7543c47e716606c1e177", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.611190+00:00", + "completedAt": "2023-11-29T20:18:32.616809+00:00" + }, + { + "id": "1c2a4c97-4560-4a22-a8a7-b3e28d0d9ae6", + "createdAt": "2023-11-29T20:18:32.618729+00:00", + "commandType": "aspirate", + "key": "c7ffbd1cf2ea19156c83a326a53472b8", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.619511+00:00", + "completedAt": "2023-11-29T20:18:32.621964+00:00" + }, + { + "id": "0a962cdd-ff3c-4315-80fd-b23e62925d21", + "createdAt": "2023-11-29T20:18:32.622284+00:00", + "commandType": "waitForDuration", + "key": "a5cf7814d5ca744233d29b48f3da731f", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.622364+00:00", + "completedAt": "2023-11-29T20:18:32.622428+00:00" + }, + { + "id": "c7bbc75c-afa8-4591-9512-89976d44034d", + "createdAt": "2023-11-29T20:18:32.623072+00:00", + "commandType": "moveToWell", + "key": "2aaacb3ef58e37acd23eef17de5fc5c8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.623198+00:00", + "completedAt": "2023-11-29T20:18:32.624742+00:00" + }, + { + "id": "e710fd8e-c10a-4219-b936-0d5d4e3ebc11", + "createdAt": "2023-11-29T20:18:32.625542+00:00", + "commandType": "aspirate", + "key": "5cb623a293792ca7b5831f7aef0ef3fa", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.625621+00:00", + "completedAt": "2023-11-29T20:18:32.628020+00:00" + }, + { + "id": "18a21e8b-9c84-4099-a64c-3ab6b34a2f04", + "createdAt": "2023-11-29T20:18:32.628895+00:00", + "commandType": "moveToWell", + "key": "1bc1a130f37298dc3a36f00dcf2fa0c8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.629002+00:00", + "completedAt": "2023-11-29T20:18:32.630434+00:00" + }, + { + "id": "f573846f-1756-4ad6-a8ee-c05ba8ee43ce", + "createdAt": "2023-11-29T20:18:32.631196+00:00", + "commandType": "touchTip", + "key": "f867ff9a5cb0f5aceb4e8c1e11f9cb11", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.631281+00:00", + "completedAt": "2023-11-29T20:18:32.638271+00:00" + }, + { + "id": "3214f513-c3f4-42f9-9f34-490ff5382126", + "createdAt": "2023-11-29T20:18:32.638954+00:00", + "commandType": "dispense", + "key": "005fbb58f750c541180465141e17fce7", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:32.639031+00:00", + "completedAt": "2023-11-29T20:18:32.644725+00:00" + }, + { + "id": "2226147a-182a-43c7-ab4c-b3359114a550", + "createdAt": "2023-11-29T20:18:32.645185+00:00", + "commandType": "waitForDuration", + "key": "bc47eb24a57805b34b67ee3e110dcfae", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.645310+00:00", + "completedAt": "2023-11-29T20:18:32.645383+00:00" + }, + { + "id": "54d78b6b-7707-4c1f-9c75-418381b4bc6d", + "createdAt": "2023-11-29T20:18:32.645939+00:00", + "commandType": "blowout", + "key": "f72345cbbbb40f32d20285e067157e8f", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.646011+00:00", + "completedAt": "2023-11-29T20:18:32.648053+00:00" + }, + { + "id": "c9d9accf-a1c4-4442-ae91-c3888e5036c6", + "createdAt": "2023-11-29T20:18:32.648828+00:00", + "commandType": "moveToWell", + "key": "b2957611c21a0ed448a21ace9bf4b442", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 281.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.648911+00:00", + "completedAt": "2023-11-29T20:18:32.650248+00:00" + }, + { + "id": "00496117-ddd2-42a4-a6f8-32596661c153", + "createdAt": "2023-11-29T20:18:32.650680+00:00", + "commandType": "moveToWell", + "key": "0bf75b8d124337c2e293dceba0a6aefe", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 273.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.650748+00:00", + "completedAt": "2023-11-29T20:18:32.652049+00:00" + }, + { + "id": "7ad31e85-f4c5-4971-8f62-d946cf6a69ca", + "createdAt": "2023-11-29T20:18:32.652817+00:00", + "commandType": "moveToWell", + "key": "82bd6529bb4038b8aed8c59225b2be84", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.652892+00:00", + "completedAt": "2023-11-29T20:18:32.654219+00:00" + }, + { + "id": "8184a418-d7d1-4462-af05-6d5b42f50952", + "createdAt": "2023-11-29T20:18:32.654617+00:00", + "commandType": "moveToWell", + "key": "1c9311309aeb45730ca88591e859fbd6", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.654672+00:00", + "completedAt": "2023-11-29T20:18:32.655842+00:00" + }, + { + "id": "cc8a26f2-c2f3-4620-86f6-4cc48fb25a11", + "createdAt": "2023-11-29T20:18:32.656203+00:00", + "commandType": "dropTip", + "key": "71cd0df57108888dc0b21d839d1c3089", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.656268+00:00", + "completedAt": "2023-11-29T20:18:32.663064+00:00" + }, + { + "id": "9f7de227-0af0-41b9-8f3c-f8513d8a8760", + "createdAt": "2023-11-29T20:18:32.663824+00:00", + "commandType": "pickUpTip", + "key": "0547a5c2657a33fb7b2e2d46d1defde3", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 405.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.663947+00:00", + "completedAt": "2023-11-29T20:18:32.674761+00:00" + }, + { + "id": "b0a1e80c-3052-4c3d-999b-3ec085d23f6d", + "createdAt": "2023-11-29T20:18:32.675694+00:00", + "commandType": "moveToWell", + "key": "4e151cc8173d0ca935e3027c701a9971", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.675824+00:00", + "completedAt": "2023-11-29T20:18:32.680906+00:00" + }, + { + "id": "1a8c5527-d539-4430-a71e-850a20aa7e20", + "createdAt": "2023-11-29T20:18:32.681900+00:00", + "commandType": "aspirate", + "key": "e4ff93a5769ec88a7f815b31f27360e9", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.681983+00:00", + "completedAt": "2023-11-29T20:18:32.684345+00:00" + }, + { + "id": "a1cd64d9-d8bc-4089-bcd2-71bf90794503", + "createdAt": "2023-11-29T20:18:32.684742+00:00", + "commandType": "waitForDuration", + "key": "210873e0389fe5b63e82016ba6162671", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.684820+00:00", + "completedAt": "2023-11-29T20:18:32.684888+00:00" + }, + { + "id": "d71681be-279e-41aa-b277-109aaafc837a", + "createdAt": "2023-11-29T20:18:32.685434+00:00", + "commandType": "moveToWell", + "key": "5e8d638840ec0c22b212d4228ac66620", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.685492+00:00", + "completedAt": "2023-11-29T20:18:32.687158+00:00" + }, + { + "id": "6e6fb075-3339-482a-b088-525998474b3b", + "createdAt": "2023-11-29T20:18:32.687965+00:00", + "commandType": "aspirate", + "key": "5960ec751d03f6579174e57a113913b6", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.688102+00:00", + "completedAt": "2023-11-29T20:18:32.690285+00:00" + }, + { + "id": "b99813a0-9df9-4326-b729-e7e3fd4ff1db", + "createdAt": "2023-11-29T20:18:32.691165+00:00", + "commandType": "moveToWell", + "key": "2a530636626cbc4740148bf0aa4229a7", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.691242+00:00", + "completedAt": "2023-11-29T20:18:32.692699+00:00" + }, + { + "id": "89b4ad88-751c-4269-92e7-06db4c42eb8b", + "createdAt": "2023-11-29T20:18:32.693395+00:00", + "commandType": "touchTip", + "key": "21e576fc631aaa2bcd6494290921d9b4", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.693502+00:00", + "completedAt": "2023-11-29T20:18:32.700679+00:00" + }, + { + "id": "9f13c578-3359-4cbf-aa36-e4dfa5ba67ce", + "createdAt": "2023-11-29T20:18:32.701411+00:00", + "commandType": "dispense", + "key": "84df58269baf527e8df8db558ab116ff", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:32.701487+00:00", + "completedAt": "2023-11-29T20:18:32.707098+00:00" + }, + { + "id": "932903a7-c62f-4649-8389-3b8b92b80a77", + "createdAt": "2023-11-29T20:18:32.707578+00:00", + "commandType": "waitForDuration", + "key": "d8737c4ddca4a2bbd5037234498f90e0", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.707671+00:00", + "completedAt": "2023-11-29T20:18:32.707739+00:00" + }, + { + "id": "9ecef3c7-affe-4b75-a3f8-ec1fa22542dc", + "createdAt": "2023-11-29T20:18:32.708248+00:00", + "commandType": "blowout", + "key": "91f007cd36104063848b673067ed8ed4", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.708309+00:00", + "completedAt": "2023-11-29T20:18:32.710539+00:00" + }, + { + "id": "8e8901d8-39d9-4c10-8ae6-29821091208e", + "createdAt": "2023-11-29T20:18:32.711371+00:00", + "commandType": "moveToWell", + "key": "210663888cfe87982550419c7123674b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 281.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.711471+00:00", + "completedAt": "2023-11-29T20:18:32.712838+00:00" + }, + { + "id": "4f3f9941-bf1b-4727-bbc4-895bd6e823b8", + "createdAt": "2023-11-29T20:18:32.713395+00:00", + "commandType": "moveToWell", + "key": "e26d2c5ef433466b017fa55232ce1858", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 273.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.713467+00:00", + "completedAt": "2023-11-29T20:18:32.714711+00:00" + }, + { + "id": "d9c7f23f-f298-4091-b6e2-d9cf341e386a", + "createdAt": "2023-11-29T20:18:32.715213+00:00", + "commandType": "moveToWell", + "key": "5e4ada05d4fb0526c0dfc768dfea0a74", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.715267+00:00", + "completedAt": "2023-11-29T20:18:32.716531+00:00" + }, + { + "id": "e2d7046f-25cb-4645-9f91-5caa9540f1ec", + "createdAt": "2023-11-29T20:18:32.716938+00:00", + "commandType": "moveToWell", + "key": "9e0e6867ad2391dd3c5f46a4f9dfd256", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.716996+00:00", + "completedAt": "2023-11-29T20:18:32.718325+00:00" + }, + { + "id": "ec410f1d-bb2c-423e-a969-115d8494aeb0", + "createdAt": "2023-11-29T20:18:32.718731+00:00", + "commandType": "dropTip", + "key": "030cffbbf9f5ebf297c66c629c28e46f", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.718793+00:00", + "completedAt": "2023-11-29T20:18:32.724949+00:00" + }, + { + "id": "01a8f16b-dd49-4ff1-8b1e-f69cfa3afe9e", + "createdAt": "2023-11-29T20:18:32.725974+00:00", + "commandType": "pickUpTip", + "key": "794523b02e12c2cbef4de8566957143d", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 414.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.726074+00:00", + "completedAt": "2023-11-29T20:18:32.737095+00:00" + }, + { + "id": "f80c9f02-afc0-4e1c-9b16-eaca2e738771", + "createdAt": "2023-11-29T20:18:32.737863+00:00", + "commandType": "moveToWell", + "key": "8c4dc027867d10c89a7a80fff88eed34", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.737926+00:00", + "completedAt": "2023-11-29T20:18:32.742592+00:00" + }, + { + "id": "793f44d2-fd0a-4d92-9b02-8fafe955c99f", + "createdAt": "2023-11-29T20:18:32.743632+00:00", + "commandType": "aspirate", + "key": "f2426455f9fe982cd5f5011155691d1d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.743786+00:00", + "completedAt": "2023-11-29T20:18:32.746002+00:00" + }, + { + "id": "b9e1b936-0081-4b3c-8939-3763fbdcd575", + "createdAt": "2023-11-29T20:18:32.746426+00:00", + "commandType": "waitForDuration", + "key": "1029b20b656d97e56879bf6567d0b753", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.746533+00:00", + "completedAt": "2023-11-29T20:18:32.746616+00:00" + }, + { + "id": "af56f721-57ba-43fc-a89d-0a3959889fca", + "createdAt": "2023-11-29T20:18:32.747212+00:00", + "commandType": "moveToWell", + "key": "0c7bf641d8ff0a67927a90d7b954414b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:32.747297+00:00", + "completedAt": "2023-11-29T20:18:32.748748+00:00" + }, + { + "id": "f42f5f68-94f1-4469-a8d9-f607985843e0", + "createdAt": "2023-11-29T20:18:32.749623+00:00", + "commandType": "aspirate", + "key": "2dbafabb71743ed3eddf26a2e837d5d9", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:32.749751+00:00", + "completedAt": "2023-11-29T20:18:32.751883+00:00" + }, + { + "id": "31020cad-a4fe-4e8f-b2c5-52e8a05f0a94", + "createdAt": "2023-11-29T20:18:32.752859+00:00", + "commandType": "moveToWell", + "key": "4d7761d4b3f33e019c00b43145f68353", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.752945+00:00", + "completedAt": "2023-11-29T20:18:32.754286+00:00" + }, + { + "id": "aae540b9-9143-4e3e-bd06-d42bb5263f14", + "createdAt": "2023-11-29T20:18:32.754883+00:00", + "commandType": "touchTip", + "key": "58ea912e8ce5e51ed4049178ecfdfffc", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.754940+00:00", + "completedAt": "2023-11-29T20:18:32.761592+00:00" + }, + { + "id": "f4b31433-afb9-4b37-8457-7bce6016701e", + "createdAt": "2023-11-29T20:18:32.762308+00:00", + "commandType": "dispense", + "key": "bd4ff36d8cc1e1190924701f46ebd9ad", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:32.762380+00:00", + "completedAt": "2023-11-29T20:18:32.767587+00:00" + }, + { + "id": "b3fa2122-4523-42a7-b67c-fe8f323650e2", + "createdAt": "2023-11-29T20:18:32.767996+00:00", + "commandType": "waitForDuration", + "key": "28e39a59eccf0f1eaa4faa623d6a4f6e", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.768062+00:00", + "completedAt": "2023-11-29T20:18:32.768124+00:00" + }, + { + "id": "e87e374a-04c8-4a77-8c54-ac93aa590a1f", + "createdAt": "2023-11-29T20:18:32.768650+00:00", + "commandType": "blowout", + "key": "00c87519b73ca746379c4237aaa50845", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.768710+00:00", + "completedAt": "2023-11-29T20:18:32.770623+00:00" + }, + { + "id": "e1167db2-1628-48b5-9cbe-7c467ddf0f7a", + "createdAt": "2023-11-29T20:18:32.771166+00:00", + "commandType": "moveToWell", + "key": "108a8d2cc8855dda45c9171099773053", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 281.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.771221+00:00", + "completedAt": "2023-11-29T20:18:32.772401+00:00" + }, + { + "id": "37bb36da-99e1-4c96-a815-92c2b724bc85", + "createdAt": "2023-11-29T20:18:32.772784+00:00", + "commandType": "moveToWell", + "key": "1b848ecb765634ca01082d4b83b4f62c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 273.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.772835+00:00", + "completedAt": "2023-11-29T20:18:32.774000+00:00" + }, + { + "id": "de088f2d-b9aa-4679-a0ea-c6268f0cae00", + "createdAt": "2023-11-29T20:18:32.774615+00:00", + "commandType": "moveToWell", + "key": "a5cdb657dc04d8f7df4b38723f866b0c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.774746+00:00", + "completedAt": "2023-11-29T20:18:32.776903+00:00" + }, + { + "id": "1008aa15-95c9-4e79-9fef-436b32c7b7f8", + "createdAt": "2023-11-29T20:18:32.777561+00:00", + "commandType": "moveToWell", + "key": "f86ff6b24af9e42336a5374e04b9c4fe", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:32.777634+00:00", + "completedAt": "2023-11-29T20:18:32.778922+00:00" + }, + { + "id": "281f61af-1269-4cd4-a3ec-d52d44aee930", + "createdAt": "2023-11-29T20:18:32.779307+00:00", + "commandType": "dropTip", + "key": "df2756ea011964fe731f878148a4b44c", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.779367+00:00", + "completedAt": "2023-11-29T20:18:32.785371+00:00" + }, + { + "id": "51b5b753-b5ab-4aa6-b2ae-e15b4251c861", + "createdAt": "2023-11-29T20:18:32.785802+00:00", + "commandType": "waitForDuration", + "key": "d9a215274f20b4e7ce83d257cedd0e5f", + "status": "succeeded", + "params": { "seconds": 60.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.785864+00:00", + "completedAt": "2023-11-29T20:18:32.785926+00:00" + }, + { + "id": "8291557e-2e84-4857-8c7b-ca7538a01238", + "createdAt": "2023-11-29T20:18:32.786404+00:00", + "commandType": "custom", + "key": "0b3768ff210c78c623bc9ec7eba88183", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Removing Residual Wash" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.786513+00:00", + "completedAt": "2023-11-29T20:18:32.786615+00:00" + }, + { + "id": "a6513789-c767-435d-838e-8ad7e1aa9ef9", + "createdAt": "2023-11-29T20:18:32.787306+00:00", + "commandType": "pickUpTip", + "key": "8f87f2cdfae7d25ec68323e13b529799", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 423.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.787389+00:00", + "completedAt": "2023-11-29T20:18:32.797903+00:00" + }, + { + "id": "c452b56a-1d9a-4e74-a2da-50066f0acdf7", + "createdAt": "2023-11-29T20:18:32.798691+00:00", + "commandType": "moveToWell", + "key": "70f013b0a2103343b67ebeb0439ac90e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:32.798785+00:00", + "completedAt": "2023-11-29T20:18:32.803434+00:00" + }, + { + "id": "7b9012a9-e120-4f0b-89fb-31bbf51b559c", + "createdAt": "2023-11-29T20:18:32.804296+00:00", + "commandType": "aspirate", + "key": "ae898f93a21a9d2581bd37dd87955e9b", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 40.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:32.804408+00:00", + "completedAt": "2023-11-29T20:18:32.806476+00:00" + }, + { + "id": "71eec0ee-cb6c-4368-ae46-1b621001900f", + "createdAt": "2023-11-29T20:18:32.806832+00:00", + "commandType": "dropTip", + "key": "292ac098b4b0b05788c344d08b0c09ff", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.806898+00:00", + "completedAt": "2023-11-29T20:18:32.815276+00:00" + }, + { + "id": "106979de-7bc7-47ef-8a0d-638b07fd6acd", + "createdAt": "2023-11-29T20:18:32.816176+00:00", + "commandType": "pickUpTip", + "key": "5fa41b096c62c02bc305c3963a98bc8c", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 432.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.816278+00:00", + "completedAt": "2023-11-29T20:18:32.826929+00:00" + }, + { + "id": "1300bdcb-5f03-4553-addb-420a12ffe5a7", + "createdAt": "2023-11-29T20:18:32.827722+00:00", + "commandType": "moveToWell", + "key": "390a6000a198462cfa3cd1273c90372f", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:32.827811+00:00", + "completedAt": "2023-11-29T20:18:32.832414+00:00" + }, + { + "id": "25188de1-dcee-407b-bd4b-720b91922c9c", + "createdAt": "2023-11-29T20:18:32.833300+00:00", + "commandType": "aspirate", + "key": "5b4272bd3e91d78f088b55725fce7cf7", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 40.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:32.833375+00:00", + "completedAt": "2023-11-29T20:18:32.835527+00:00" + }, + { + "id": "59743f5c-1e1d-4c2a-9ab4-5a4360eb2025", + "createdAt": "2023-11-29T20:18:32.835995+00:00", + "commandType": "dropTip", + "key": "a69468faaa666a2bc1c2bf0cc20cdead", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.836055+00:00", + "completedAt": "2023-11-29T20:18:32.844089+00:00" + }, + { + "id": "327025ef-4cce-40d9-a663-add2bad4c0fd", + "createdAt": "2023-11-29T20:18:32.844909+00:00", + "commandType": "pickUpTip", + "key": "afc80f52d8a4b6f9d639a90dd51976d1", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 441.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.844974+00:00", + "completedAt": "2023-11-29T20:18:32.855310+00:00" + }, + { + "id": "097b1efd-28f0-4f0f-995c-33a0f5d6e675", + "createdAt": "2023-11-29T20:18:32.856111+00:00", + "commandType": "moveToWell", + "key": "df965777d0ea24fb6b0530c304dc8c1d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:32.856191+00:00", + "completedAt": "2023-11-29T20:18:32.861316+00:00" + }, + { + "id": "df41559a-bcc4-40da-a9c6-d9c6ccba7851", + "createdAt": "2023-11-29T20:18:32.862179+00:00", + "commandType": "aspirate", + "key": "79a114a2ab40c7e754b97e4622775823", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 40.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:32.862255+00:00", + "completedAt": "2023-11-29T20:18:32.864394+00:00" + }, + { + "id": "613ffd8c-76f6-41b1-bf69-c5a19acec63d", + "createdAt": "2023-11-29T20:18:32.864779+00:00", + "commandType": "dropTip", + "key": "496befc71ca99e8e4e10ae114449c215", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.864966+00:00", + "completedAt": "2023-11-29T20:18:32.872942+00:00" + }, + { + "id": "5bbe8cbb-88bb-4fed-8400-cafad8d71948", + "createdAt": "2023-11-29T20:18:32.873432+00:00", + "commandType": "waitForDuration", + "key": "9184773d3befe045a14734d570232d84", + "status": "succeeded", + "params": { "seconds": 30.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.873497+00:00", + "completedAt": "2023-11-29T20:18:32.873562+00:00" + }, + { + "id": "b62bae87-c825-4d56-9288-f026ad2e2df9", + "createdAt": "2023-11-29T20:18:32.873773+00:00", + "commandType": "heaterShaker/openLabwareLatch", + "key": "f5cd8e69c7ec5b326909288ffbd893d1", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:32.873822+00:00", + "completedAt": "2023-11-29T20:18:32.873910+00:00" + }, + { + "id": "34c1d39d-52f6-4f5a-b92d-0be61d2a50fd", + "createdAt": "2023-11-29T20:18:32.874206+00:00", + "commandType": "moveLabware", + "key": "34a47adfac63a26b38cb36360c5d2409", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "newLocation": { "labwareId": "3787af65-0305-4b08-bf02-a2c6596a10e5" }, + "strategy": "usingGripper", + "pickUpOffset": { "x": 0.0, "y": -2.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": -2.0, "z": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.874262+00:00", + "completedAt": "2023-11-29T20:18:32.874491+00:00" + }, + { + "id": "13248848-fed7-4292-b56b-230ea5e660a6", + "createdAt": "2023-11-29T20:18:32.874695+00:00", + "commandType": "heaterShaker/closeLabwareLatch", + "key": "5b46afd1a9eaf15c7e3b49ab6a7c8358", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.874744+00:00", + "completedAt": "2023-11-29T20:18:32.874788+00:00" + }, + { + "id": "db5deb5b-48ab-405b-beec-4f01d42aec3e", + "createdAt": "2023-11-29T20:18:32.875337+00:00", + "commandType": "custom", + "key": "bf86da14d29888faaec0f92bad409537", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Adding RSB" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.875395+00:00", + "completedAt": "2023-11-29T20:18:32.875447+00:00" + }, + { + "id": "74301a86-02cd-419d-8f4e-58c7221f1a40", + "createdAt": "2023-11-29T20:18:32.875883+00:00", + "commandType": "pickUpTip", + "key": "8eb1f3631c6af536d4d7c69f1b21001b", + "status": "succeeded", + "params": { + "labwareId": "e5b35230-f2df-4afa-b7c1-3b15c174733f", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:32.875940+00:00", + "completedAt": "2023-11-29T20:18:32.886755+00:00" + }, + { + "id": "29ed3011-0ea0-4307-afc8-d829f97a3e31", + "createdAt": "2023-11-29T20:18:32.887486+00:00", + "commandType": "aspirate", + "key": "a182a7f30c9ee8446d31524be79bcb9a", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 2.0, + "volume": 50.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 42.78, "z": 5.55 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:32.887576+00:00", + "completedAt": "2023-11-29T20:18:32.892910+00:00" + }, + { + "id": "d5ffd5f6-bb1e-4c11-bb6a-ba696c044a9f", + "createdAt": "2023-11-29T20:18:32.893907+00:00", + "commandType": "moveToWell", + "key": "9ae24f7bc19c1df52997590647cf391a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 23.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:32.894002+00:00", + "completedAt": "2023-11-29T20:18:32.897880+00:00" + }, + { + "id": "cb6eabd1-8eba-407e-945f-00f13956ac77", + "createdAt": "2023-11-29T20:18:32.898932+00:00", + "commandType": "dispense", + "key": "0a16adcbed218f61336fea24af602688", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "flowRate": 4.0, + "volume": 50.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 23.90000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:32.899003+00:00", + "completedAt": "2023-11-29T20:18:32.901444+00:00" + }, + { + "id": "c8024af4-5ac1-48c6-85c1-254c2e0404f3", + "createdAt": "2023-11-29T20:18:32.902192+00:00", + "commandType": "blowout", + "key": "ccb763d0eb2cdd4003d691e8a637e240", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 4.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 14.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.902257+00:00", + "completedAt": "2023-11-29T20:18:32.905006+00:00" + }, + { + "id": "5b500a5e-0146-47f1-9f0e-fa2cf850f45e", + "createdAt": "2023-11-29T20:18:32.905399+00:00", + "commandType": "dropTip", + "key": "1432a1bba4c096a6d460d98d228f6833", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 509.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.905461+00:00", + "completedAt": "2023-11-29T20:18:32.913249+00:00" + }, + { + "id": "006e8711-8f17-4c65-bf82-7c9dd893a910", + "createdAt": "2023-11-29T20:18:32.913865+00:00", + "commandType": "pickUpTip", + "key": "91e1997bf8e9396719c8e5f023e81866", + "status": "succeeded", + "params": { + "labwareId": "e5b35230-f2df-4afa-b7c1-3b15c174733f", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 241.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:32.913933+00:00", + "completedAt": "2023-11-29T20:18:32.924597+00:00" + }, + { + "id": "0ad11b48-d65d-4fa0-a3ca-5c87f1e8e693", + "createdAt": "2023-11-29T20:18:32.925334+00:00", + "commandType": "aspirate", + "key": "6519a33b99ad26ebe4474b8f542184e7", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 2.0, + "volume": 50.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 42.78, "z": 5.55 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:32.925419+00:00", + "completedAt": "2023-11-29T20:18:32.931008+00:00" + }, + { + "id": "c4d28ad6-c8f2-45e0-b3ab-108c871cae45", + "createdAt": "2023-11-29T20:18:32.931808+00:00", + "commandType": "moveToWell", + "key": "97d662dc246c762c4c35fe8687a65955", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 23.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:32.931882+00:00", + "completedAt": "2023-11-29T20:18:32.935746+00:00" + }, + { + "id": "3ae3a676-5cf7-4bce-af9f-62f132d64f0b", + "createdAt": "2023-11-29T20:18:32.936954+00:00", + "commandType": "dispense", + "key": "5176ceb0800878ae3834432c996894d2", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "flowRate": 4.0, + "volume": 50.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 23.90000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:32.937038+00:00", + "completedAt": "2023-11-29T20:18:32.939332+00:00" + }, + { + "id": "111b21e8-d26b-434d-9c18-aae8561d39ba", + "createdAt": "2023-11-29T20:18:32.940180+00:00", + "commandType": "blowout", + "key": "2595cc2427f8af29f05ae9b7b7cd91aa", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 4.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 23.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.940257+00:00", + "completedAt": "2023-11-29T20:18:32.943103+00:00" + }, + { + "id": "75e9f1b6-80b8-4f0c-bd12-6ddf1bfbf98d", + "createdAt": "2023-11-29T20:18:32.943473+00:00", + "commandType": "dropTip", + "key": "5624739935f7fbcf47aa6473ac1db51e", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.943608+00:00", + "completedAt": "2023-11-29T20:18:32.951157+00:00" + }, + { + "id": "1af685e7-e854-4e91-a5f4-07caad76555e", + "createdAt": "2023-11-29T20:18:32.951785+00:00", + "commandType": "pickUpTip", + "key": "fd96af203b0980251177169efbeee02a", + "status": "succeeded", + "params": { + "labwareId": "e5b35230-f2df-4afa-b7c1-3b15c174733f", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 250.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:32.951849+00:00", + "completedAt": "2023-11-29T20:18:32.962789+00:00" + }, + { + "id": "c43ac2f3-065e-402c-9f36-34a9abfcbbb8", + "createdAt": "2023-11-29T20:18:32.963515+00:00", + "commandType": "aspirate", + "key": "2f3892bb10fedb1becb8f4ab6d78c488", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 2.0, + "volume": 50.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 42.78, "z": 5.55 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:32.963642+00:00", + "completedAt": "2023-11-29T20:18:32.969106+00:00" + }, + { + "id": "20b870d8-3f51-4db8-8bd0-f2cba4be2d61", + "createdAt": "2023-11-29T20:18:32.969964+00:00", + "commandType": "moveToWell", + "key": "16c5674a1d51a9d0c288c131d04f62f8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 23.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:32.970037+00:00", + "completedAt": "2023-11-29T20:18:32.973924+00:00" + }, + { + "id": "3781b849-8144-4875-8f86-b0822a04af0e", + "createdAt": "2023-11-29T20:18:32.975126+00:00", + "commandType": "dispense", + "key": "a5a535b7e586e533be4dbc73eb37b394", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "flowRate": 4.0, + "volume": 50.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 23.90000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:32.975207+00:00", + "completedAt": "2023-11-29T20:18:32.977583+00:00" + }, + { + "id": "b3a09501-dabf-4e34-90ef-12216c1196c8", + "createdAt": "2023-11-29T20:18:32.978277+00:00", + "commandType": "blowout", + "key": "9f5db3a4a61fc593e051cba845241ed1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 4.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 32.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:32.978344+00:00", + "completedAt": "2023-11-29T20:18:32.981025+00:00" + }, + { + "id": "8394a8b2-3281-4cd7-8abe-0752e651aa58", + "createdAt": "2023-11-29T20:18:32.981541+00:00", + "commandType": "dropTip", + "key": "ed899a8f967f22fe35c8c11e155c4dd1", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 509.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:32.981616+00:00", + "completedAt": "2023-11-29T20:18:32.989668+00:00" + }, + { + "id": "1dc9be13-d765-4327-a4ab-569016cfde68", + "createdAt": "2023-11-29T20:18:32.990143+00:00", + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "key": "d6c7a7b93180de06d193867c6f132d0d", + "status": "succeeded", + "params": { + "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5", + "rpm": 2000.0 + }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:32.990228+00:00", + "completedAt": "2023-11-29T20:18:32.990355+00:00" + }, + { + "id": "9a616914-36aa-4df4-8f1e-da494a295bf0", + "createdAt": "2023-11-29T20:18:32.990613+00:00", + "commandType": "waitForDuration", + "key": "2944d9bbf3a521bb4dae129063299195", + "status": "succeeded", + "params": { "seconds": 300.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.990669+00:00", + "completedAt": "2023-11-29T20:18:32.990717+00:00" + }, + { + "id": "4c2bd60c-8be7-41f5-b975-58d57a29ce91", + "createdAt": "2023-11-29T20:18:32.990925+00:00", + "commandType": "heaterShaker/deactivateShaker", + "key": "a9ac83914e907625c9ed62721b8f067f", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.990977+00:00", + "completedAt": "2023-11-29T20:18:32.991023+00:00" + }, + { + "id": "8f17ecce-0a88-42c7-acf5-f11473d047f2", + "createdAt": "2023-11-29T20:18:32.991208+00:00", + "commandType": "heaterShaker/openLabwareLatch", + "key": "166eea3004beb095a086071daa6017b6", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:32.991262+00:00", + "completedAt": "2023-11-29T20:18:32.991329+00:00" + }, + { + "id": "f1b4e91c-454b-4e46-b188-a174fe3d8d5b", + "createdAt": "2023-11-29T20:18:32.991596+00:00", + "commandType": "moveLabware", + "key": "e8eaf1f773c897763ecebb98f291045e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "newLocation": { "moduleId": "dc2de112-b2b7-4811-9cf5-501f1fee6878" }, + "strategy": "usingGripper", + "pickUpOffset": { "x": 0.0, "y": -2.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": 0.0, "z": 0.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.991648+00:00", + "completedAt": "2023-11-29T20:18:32.991837+00:00" + }, + { + "id": "bf65b470-7916-4a0e-8e12-a943700f35ed", + "createdAt": "2023-11-29T20:18:32.992092+00:00", + "commandType": "heaterShaker/closeLabwareLatch", + "key": "064ef9dcfa03cf0ae458b0e40c49870f", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.992163+00:00", + "completedAt": "2023-11-29T20:18:32.992218+00:00" + }, + { + "id": "a631a783-fd1d-4cf6-a489-f1bb7a89fe6b", + "createdAt": "2023-11-29T20:18:32.992439+00:00", + "commandType": "waitForDuration", + "key": "d6f0710da4800e1b24b7ffc16467ee45", + "status": "succeeded", + "params": { "seconds": 180.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.992516+00:00", + "completedAt": "2023-11-29T20:18:32.992572+00:00" + }, + { + "id": "dd90436c-0dc6-452a-aed2-0be8f897e706", + "createdAt": "2023-11-29T20:18:32.993077+00:00", + "commandType": "custom", + "key": "d6afc0ec4af0be59aa939efaaeb84563", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Transferring Supernatant" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:32.993146+00:00", + "completedAt": "2023-11-29T20:18:32.993197+00:00" + }, + { + "id": "b95f0799-3195-49b0-9faf-0bdd0a6591a9", + "createdAt": "2023-11-29T20:18:32.993917+00:00", + "commandType": "pickUpTip", + "key": "4ef7046343fdba361f87dad2a0977368", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:32.994003+00:00", + "completedAt": "2023-11-29T20:18:33.004818+00:00" + }, + { + "id": "7f0399ec-dc24-4e2f-8b01-604657f5d29e", + "createdAt": "2023-11-29T20:18:33.005670+00:00", + "commandType": "moveToWell", + "key": "f3e518ba8d9d9e50c47d04313776a7da", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:33.005785+00:00", + "completedAt": "2023-11-29T20:18:33.011177+00:00" + }, + { + "id": "806675d4-710a-4670-bbf5-02c9a92e1393", + "createdAt": "2023-11-29T20:18:33.012179+00:00", + "commandType": "aspirate", + "key": "aa033c303bcc4131fd63d17cb9539ec5", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:33.012282+00:00", + "completedAt": "2023-11-29T20:18:33.014525+00:00" + }, + { + "id": "f1e153fd-99fb-4ebd-a1c8-eacbf3bbcfba", + "createdAt": "2023-11-29T20:18:33.014877+00:00", + "commandType": "waitForDuration", + "key": "e1b575286787ea8f13686b9948e472f0", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.014956+00:00", + "completedAt": "2023-11-29T20:18:33.015011+00:00" + }, + { + "id": "c24f3797-2d10-4abe-b383-de5de402ca60", + "createdAt": "2023-11-29T20:18:33.015697+00:00", + "commandType": "moveToWell", + "key": "e8b5f86e52e35392e026d477bbd91a3e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.015769+00:00", + "completedAt": "2023-11-29T20:18:33.017227+00:00" + }, + { + "id": "a4863f1e-3e38-473e-9239-a4122fc3204e", + "createdAt": "2023-11-29T20:18:33.018157+00:00", + "commandType": "aspirate", + "key": "0f4debf56b5fde980c43ba96f22aeeaf", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 14.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:33.018237+00:00", + "completedAt": "2023-11-29T20:18:33.020722+00:00" + }, + { + "id": "99ac8cac-a12e-4398-b2be-592a2c724197", + "createdAt": "2023-11-29T20:18:33.021525+00:00", + "commandType": "dispense", + "key": "73c189dbf1a548efdf18fa7b7df01eb3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999996 } + }, + "flowRate": 80.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 36.510000000000005 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:33.021600+00:00", + "completedAt": "2023-11-29T20:18:33.026518+00:00" + }, + { + "id": "ac9db906-048b-4353-affc-b93eddd43f0a", + "createdAt": "2023-11-29T20:18:33.027168+00:00", + "commandType": "dropTip", + "key": "66a9a8c612cd45afee348aa21086c0a0", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:33.027302+00:00", + "completedAt": "2023-11-29T20:18:33.034847+00:00" + }, + { + "id": "71f49782-66e1-4745-b1fe-feeef89390a2", + "createdAt": "2023-11-29T20:18:33.035648+00:00", + "commandType": "pickUpTip", + "key": "9c1677f5bb82c8f6312279b3fa107e13", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 187.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:33.035735+00:00", + "completedAt": "2023-11-29T20:18:33.047917+00:00" + }, + { + "id": "c83ef1c2-c10e-47a7-b698-ac0ff4f36918", + "createdAt": "2023-11-29T20:18:33.048758+00:00", + "commandType": "moveToWell", + "key": "993dc3820116544ebd9ecb53e2e74553", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:33.048899+00:00", + "completedAt": "2023-11-29T20:18:33.054211+00:00" + }, + { + "id": "60732aac-2146-463d-a0cb-8c99be7b2590", + "createdAt": "2023-11-29T20:18:33.055089+00:00", + "commandType": "aspirate", + "key": "b438a15ca1ff110e0584ef6e43160c38", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:33.055163+00:00", + "completedAt": "2023-11-29T20:18:33.057152+00:00" + }, + { + "id": "fa75753c-a628-4587-a21a-b5414a230f90", + "createdAt": "2023-11-29T20:18:33.057507+00:00", + "commandType": "waitForDuration", + "key": "f5b8c24e0f0a6879893cf25d4d3a0e1c", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.057597+00:00", + "completedAt": "2023-11-29T20:18:33.057661+00:00" + }, + { + "id": "4d1362cd-7d17-4feb-bf72-600bd03501f2", + "createdAt": "2023-11-29T20:18:33.058380+00:00", + "commandType": "moveToWell", + "key": "cef7062dae01dfb7ec05c38e7dd44206", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.058502+00:00", + "completedAt": "2023-11-29T20:18:33.060165+00:00" + }, + { + "id": "a194d24f-f38c-430a-85f1-dfd843ea09fc", + "createdAt": "2023-11-29T20:18:33.061118+00:00", + "commandType": "aspirate", + "key": "348684c5a8f07b48688691713f016866", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 23.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:33.061189+00:00", + "completedAt": "2023-11-29T20:18:33.063275+00:00" + }, + { + "id": "0d8df7a8-5b2f-46fd-b26a-1d8c0857ff2f", + "createdAt": "2023-11-29T20:18:33.063902+00:00", + "commandType": "dispense", + "key": "dff5ca78aff8b9407eaec8c97dd801d9", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999996 } + }, + "flowRate": 80.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 36.510000000000005 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:33.063967+00:00", + "completedAt": "2023-11-29T20:18:33.068231+00:00" + }, + { + "id": "4f77aa0b-7b21-41ad-ba2d-d92c5592fd95", + "createdAt": "2023-11-29T20:18:33.068896+00:00", + "commandType": "dropTip", + "key": "f5fb0228e338b57e048ff2f7d08638cd", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:33.069069+00:00", + "completedAt": "2023-11-29T20:18:33.076544+00:00" + }, + { + "id": "1e143179-cc22-4a81-be1c-87628f9428f7", + "createdAt": "2023-11-29T20:18:33.077435+00:00", + "commandType": "pickUpTip", + "key": "1cfe827eb231e8cc3f701745c6f0e7a8", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:33.077515+00:00", + "completedAt": "2023-11-29T20:18:33.088967+00:00" + }, + { + "id": "f4439c89-a180-4775-a44b-3854b167249a", + "createdAt": "2023-11-29T20:18:33.089791+00:00", + "commandType": "moveToWell", + "key": "25fa4c4b2384ec20b56e5c5153f95b64", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:33.089891+00:00", + "completedAt": "2023-11-29T20:18:33.095095+00:00" + }, + { + "id": "b5bd7f49-1116-43f6-b1c0-ab6fec265d52", + "createdAt": "2023-11-29T20:18:33.096161+00:00", + "commandType": "aspirate", + "key": "a840ece406df2b5ee3c61e6ab18677e0", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:33.096384+00:00", + "completedAt": "2023-11-29T20:18:33.098610+00:00" + }, + { + "id": "7ff6edc9-5f8e-4cca-9fd6-8e7f05919d73", + "createdAt": "2023-11-29T20:18:33.098946+00:00", + "commandType": "waitForDuration", + "key": "fa977cfe4838ef4c2018d801450a955f", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.099009+00:00", + "completedAt": "2023-11-29T20:18:33.099072+00:00" + }, + { + "id": "5b8fba2c-1882-4cbe-b831-5db6209bb2a2", + "createdAt": "2023-11-29T20:18:33.099724+00:00", + "commandType": "moveToWell", + "key": "8f6d86d31e66ad1273a5503b427deb51", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.099802+00:00", + "completedAt": "2023-11-29T20:18:33.101440+00:00" + }, + { + "id": "fa740e2c-4224-4d92-ae85-9b9978d2e7ff", + "createdAt": "2023-11-29T20:18:33.102527+00:00", + "commandType": "aspirate", + "key": "fa75e8849e4eded651408851aaedf8b6", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 32.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:33.102632+00:00", + "completedAt": "2023-11-29T20:18:33.104940+00:00" + }, + { + "id": "e9ea1216-46d6-4276-a466-be7084ee7a3d", + "createdAt": "2023-11-29T20:18:33.105644+00:00", + "commandType": "dispense", + "key": "987159a5c653c72c0bf4c95bba06fbb4", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999996 } + }, + "flowRate": 80.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 36.510000000000005 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:33.105718+00:00", + "completedAt": "2023-11-29T20:18:33.110441+00:00" + }, + { + "id": "6022f588-f547-4ccf-ba5c-3658ceac2f7d", + "createdAt": "2023-11-29T20:18:33.110891+00:00", + "commandType": "dropTip", + "key": "9ef1d07d72d0ff4bc644a55d38b92683", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:33.110956+00:00", + "completedAt": "2023-11-29T20:18:33.118562+00:00" + }, + { + "id": "a5ac6c25-f3df-4532-bd8a-58e40cac6a1c", + "createdAt": "2023-11-29T20:18:33.119022+00:00", + "commandType": "heaterShaker/openLabwareLatch", + "key": "1d1a3deedeb5db8b341201df74683cbd", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:33.119111+00:00", + "completedAt": "2023-11-29T20:18:33.119216+00:00" + }, + { + "id": "af7177ab-7dad-4813-97de-f70a67d26ed2", + "createdAt": "2023-11-29T20:18:33.119539+00:00", + "commandType": "moveLabware", + "key": "8f9fbfd9240d89e44628a362cecd7041", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "newLocation": { "labwareId": "3787af65-0305-4b08-bf02-a2c6596a10e5" }, + "strategy": "usingGripper", + "pickUpOffset": { "x": 0.0, "y": -2.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": -2.0, "z": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.119595+00:00", + "completedAt": "2023-11-29T20:18:33.119879+00:00" + }, + { + "id": "aad7b7ba-d895-425e-a264-52df7813969a", + "createdAt": "2023-11-29T20:18:33.120190+00:00", + "commandType": "heaterShaker/closeLabwareLatch", + "key": "5afcf51f29a5f6792590f1a387e97add", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.120255+00:00", + "completedAt": "2023-11-29T20:18:33.120311+00:00" + }, + { + "id": "9f2b3810-eb80-42d0-b9d8-d136c5d5bdb8", + "createdAt": "2023-11-29T20:18:33.120811+00:00", + "commandType": "custom", + "key": "c6d571f2d5d6c3c67f4d70c793ffb93c", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "==============================================" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.120895+00:00", + "completedAt": "2023-11-29T20:18:33.120942+00:00" + }, + { + "id": "df9e6c72-14f0-411f-88d5-964a486106b8", + "createdAt": "2023-11-29T20:18:33.121321+00:00", + "commandType": "custom", + "key": "5058eaddbaee430d90a1f49b4f46caf0", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Cleanup 2" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.121460+00:00", + "completedAt": "2023-11-29T20:18:33.121516+00:00" + }, + { + "id": "e7da4935-8548-44d4-9413-fe2497fd8054", + "createdAt": "2023-11-29T20:18:33.121953+00:00", + "commandType": "custom", + "key": "1c21bf72c29c097a0eeafb82cd7a1fe3", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "==============================================" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.122016+00:00", + "completedAt": "2023-11-29T20:18:33.122064+00:00" + }, + { + "id": "a7e7a75c-a8a8-4b5e-a1c3-71ec381e77c0", + "createdAt": "2023-11-29T20:18:33.122279+00:00", + "commandType": "waitForDuration", + "key": "cceb6fd6a370714384e08201205ac7c9", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.122331+00:00", + "completedAt": "2023-11-29T20:18:33.122385+00:00" + }, + { + "id": "0587949b-8866-4330-91ae-c856fe3d18b8", + "createdAt": "2023-11-29T20:18:33.122786+00:00", + "commandType": "custom", + "key": "5529d7144a37fc29564a4e452874f95c", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> ADDING AMPure (0.8x)" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.122842+00:00", + "completedAt": "2023-11-29T20:18:33.122889+00:00" + }, + { + "id": "5bbadb14-1bbe-4c1a-801e-ac1312353ecd", + "createdAt": "2023-11-29T20:18:33.123429+00:00", + "commandType": "pickUpTip", + "key": "92f5a6ee09ba0d42e10936dcb6850bcd", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:33.123489+00:00", + "completedAt": "2023-11-29T20:18:33.135083+00:00" + }, + { + "id": "e27da8d4-6863-47ac-96ed-466f913c5743", + "createdAt": "2023-11-29T20:18:33.135842+00:00", + "commandType": "aspirate", + "key": "d463960bddc6c908d5c14504532d3a29", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.135926+00:00", + "completedAt": "2023-11-29T20:18:33.141735+00:00" + }, + { + "id": "b21632aa-8b4f-4160-b3e5-36c3fda95f78", + "createdAt": "2023-11-29T20:18:33.142531+00:00", + "commandType": "dispense", + "key": "216936316865a9141cdc2a35cff9b58a", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.142746+00:00", + "completedAt": "2023-11-29T20:18:33.144931+00:00" + }, + { + "id": "3216673b-9591-45d4-bd3b-1101b26f97be", + "createdAt": "2023-11-29T20:18:33.145563+00:00", + "commandType": "aspirate", + "key": "fd0bbf182f1bf7bbc69b285f6d02593f", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.145676+00:00", + "completedAt": "2023-11-29T20:18:33.150727+00:00" + }, + { + "id": "d9f3802f-07a3-4737-8a78-6e3a090225f6", + "createdAt": "2023-11-29T20:18:33.151475+00:00", + "commandType": "dispense", + "key": "d1eaf102358a23958a39260fab6698d7", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.151608+00:00", + "completedAt": "2023-11-29T20:18:33.153796+00:00" + }, + { + "id": "3d084552-5f09-4049-a50e-9b7c788c7586", + "createdAt": "2023-11-29T20:18:33.154425+00:00", + "commandType": "aspirate", + "key": "93bbd7a180c3ae4b4ea276b6127d6768", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.154487+00:00", + "completedAt": "2023-11-29T20:18:33.159352+00:00" + }, + { + "id": "f25fa624-19cf-4a56-b93c-dc7bd4bf7725", + "createdAt": "2023-11-29T20:18:33.160151+00:00", + "commandType": "dispense", + "key": "90188263bd613a59e2d52e56ccfa80ca", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.160229+00:00", + "completedAt": "2023-11-29T20:18:33.162351+00:00" + }, + { + "id": "66a6c740-7bf0-4969-a838-73aa20f5d332", + "createdAt": "2023-11-29T20:18:33.163026+00:00", + "commandType": "aspirate", + "key": "645430d01fe3b09f5df3acd8cd2b2382", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.163099+00:00", + "completedAt": "2023-11-29T20:18:33.167917+00:00" + }, + { + "id": "1422bddf-8e6b-44ae-91f8-103c9d4c7f27", + "createdAt": "2023-11-29T20:18:33.168882+00:00", + "commandType": "dispense", + "key": "da020cedf8bb9ffd559e465a1657391a", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 3.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 3.0 + }, + "startedAt": "2023-11-29T20:18:33.169025+00:00", + "completedAt": "2023-11-29T20:18:33.171178+00:00" + }, + { + "id": "4c2557d1-0f2e-4db2-b7d1-9ae4fc571fbe", + "createdAt": "2023-11-29T20:18:33.171901+00:00", + "commandType": "moveToWell", + "key": "57bb2c3d9fc8b194c8e3808926a43b48", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.171969+00:00", + "completedAt": "2023-11-29T20:18:33.173272+00:00" + }, + { + "id": "5a45862e-9e5f-4272-8c6a-6532c8b583c9", + "createdAt": "2023-11-29T20:18:33.174051+00:00", + "commandType": "moveToWell", + "key": "68f77634c71aa460914a2ae2446ce07c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 182.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.174122+00:00", + "completedAt": "2023-11-29T20:18:33.175457+00:00" + }, + { + "id": "18cf7f67-2a61-4fd7-9027-b67cf5e405df", + "createdAt": "2023-11-29T20:18:33.176039+00:00", + "commandType": "moveToWell", + "key": "d53c113f85cfb246b01bbf4fdd45ee81", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 174.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.176143+00:00", + "completedAt": "2023-11-29T20:18:33.177776+00:00" + }, + { + "id": "d4d74e0e-7ab8-498a-a6f9-a4c8a2863d32", + "createdAt": "2023-11-29T20:18:33.178848+00:00", + "commandType": "dispense", + "key": "07d0fb5522b546d17702e7a369f1016e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 40.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:33.178918+00:00", + "completedAt": "2023-11-29T20:18:33.184201+00:00" + }, + { + "id": "30204557-b1a2-4cf5-80f0-013598e3ffca", + "createdAt": "2023-11-29T20:18:33.185287+00:00", + "commandType": "moveToWell", + "key": "e417041dcaf7badd1d060d950325caf4", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.185371+00:00", + "completedAt": "2023-11-29T20:18:33.186838+00:00" + }, + { + "id": "0229bfa2-5c48-457a-82a0-258a2f1e063d", + "createdAt": "2023-11-29T20:18:33.187746+00:00", + "commandType": "aspirate", + "key": "6bc1fc614999b5bc90f5a457d9addd77", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:33.187809+00:00", + "completedAt": "2023-11-29T20:18:33.192719+00:00" + }, + { + "id": "459fecbf-00aa-4b5a-8982-a245b9a02140", + "createdAt": "2023-11-29T20:18:33.193552+00:00", + "commandType": "moveToWell", + "key": "fd4490b4902a0663c7c56e47b01f32f9", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.193644+00:00", + "completedAt": "2023-11-29T20:18:33.195285+00:00" + }, + { + "id": "cad00a5f-d4d0-4982-b9d9-5e1a359063ff", + "createdAt": "2023-11-29T20:18:33.196319+00:00", + "commandType": "aspirate", + "key": "9995f1c8c0629c920272a65080de222d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:33.196414+00:00", + "completedAt": "2023-11-29T20:18:33.198641+00:00" + }, + { + "id": "8b767496-0314-406b-be92-eef7b2e82105", + "createdAt": "2023-11-29T20:18:33.199669+00:00", + "commandType": "dispense", + "key": "c3d30e74212e0edda19447679741f99c", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:33.199754+00:00", + "completedAt": "2023-11-29T20:18:33.202418+00:00" + }, + { + "id": "2f80cf60-a932-4744-85e0-83eeb9caa6ea", + "createdAt": "2023-11-29T20:18:33.203259+00:00", + "commandType": "moveToWell", + "key": "4ec1bb61b3e5ce2e8c39bf67b58fac64", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.203341+00:00", + "completedAt": "2023-11-29T20:18:33.204909+00:00" + }, + { + "id": "1ce02a5e-d552-48b6-94f8-a5a4fbe8cb9f", + "createdAt": "2023-11-29T20:18:33.205918+00:00", + "commandType": "dispense", + "key": "75731c20fef9121b58237a4cdb89e403", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:33.206000+00:00", + "completedAt": "2023-11-29T20:18:33.208633+00:00" + }, + { + "id": "d2bf4370-ae7e-4e83-9896-290ff5b96f3a", + "createdAt": "2023-11-29T20:18:33.209814+00:00", + "commandType": "aspirate", + "key": "2a7aa1026bfae41326d3c6cd06f5d4fd", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:33.209891+00:00", + "completedAt": "2023-11-29T20:18:33.215195+00:00" + }, + { + "id": "fca80dda-438f-4c47-ad4e-f6e568baf3c0", + "createdAt": "2023-11-29T20:18:33.215995+00:00", + "commandType": "moveToWell", + "key": "7d882d2b98616d13e5b744917861a9ea", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.216060+00:00", + "completedAt": "2023-11-29T20:18:33.217434+00:00" + }, + { + "id": "a91eef6c-5195-4ea3-a507-faba203001c4", + "createdAt": "2023-11-29T20:18:33.218342+00:00", + "commandType": "aspirate", + "key": "7b27c40daca00fbeaec90316ace200b4", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:33.218430+00:00", + "completedAt": "2023-11-29T20:18:33.220897+00:00" + }, + { + "id": "0000aa99-6a2f-4993-b71d-1ed067b7ba5d", + "createdAt": "2023-11-29T20:18:33.221744+00:00", + "commandType": "dispense", + "key": "9b1c1e8caa810b051880963ce343e8e2", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:33.221852+00:00", + "completedAt": "2023-11-29T20:18:33.224029+00:00" + }, + { + "id": "2de73cf8-3b78-4480-8713-920641a2c2af", + "createdAt": "2023-11-29T20:18:33.224876+00:00", + "commandType": "moveToWell", + "key": "9af848c57a86b694e9cfae2b3481f82b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.225000+00:00", + "completedAt": "2023-11-29T20:18:33.226571+00:00" + }, + { + "id": "6bb9687e-3edc-4d8e-b6ac-1d6804bc4922", + "createdAt": "2023-11-29T20:18:33.228063+00:00", + "commandType": "dispense", + "key": "945131a6c705e14e51be71029e11958d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:33.228214+00:00", + "completedAt": "2023-11-29T20:18:33.230708+00:00" + }, + { + "id": "f3329c91-2a3c-404b-99d3-ce244a74a828", + "createdAt": "2023-11-29T20:18:33.231815+00:00", + "commandType": "moveToWell", + "key": "3e7bb394c3c6b6dea66c95ab435badcb", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.231923+00:00", + "completedAt": "2023-11-29T20:18:33.233494+00:00" + }, + { + "id": "d3bcf1eb-40a4-429c-b896-c57175fa6de6", + "createdAt": "2023-11-29T20:18:33.233865+00:00", + "commandType": "waitForDuration", + "key": "94636fe652b48895364ca3d6e579a26f", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.234004+00:00", + "completedAt": "2023-11-29T20:18:33.234083+00:00" + }, + { + "id": "419b1a8b-f528-49f7-b2dd-fc0c5054d7bb", + "createdAt": "2023-11-29T20:18:33.235155+00:00", + "commandType": "blowout", + "key": "02163f5288a66c0523d98a4069b22916", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.235247+00:00", + "completedAt": "2023-11-29T20:18:33.237662+00:00" + }, + { + "id": "8b7740a4-c99e-4e99-970f-cd68522ac063", + "createdAt": "2023-11-29T20:18:33.238281+00:00", + "commandType": "touchTip", + "key": "0f13e04e2cda61ce31fd26dba665b16f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 36.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.238343+00:00", + "completedAt": "2023-11-29T20:18:33.244935+00:00" + }, + { + "id": "0668d9dd-7885-4aff-8ca0-c2e0a85b063f", + "createdAt": "2023-11-29T20:18:33.245937+00:00", + "commandType": "moveToWell", + "key": "1c852d43196ba9a01b4d7d89eb52abdd", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.246010+00:00", + "completedAt": "2023-11-29T20:18:33.247500+00:00" + }, + { + "id": "b28d1e2b-2f9e-4185-9584-066b304bc9fb", + "createdAt": "2023-11-29T20:18:33.248192+00:00", + "commandType": "moveToWell", + "key": "cf183437c4a99ba70b02add711632f0b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 37.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.248295+00:00", + "completedAt": "2023-11-29T20:18:33.249756+00:00" + }, + { + "id": "5b5859c0-8363-4c5d-a442-e36c252857ce", + "createdAt": "2023-11-29T20:18:33.250553+00:00", + "commandType": "moveToWell", + "key": "5dd5b913a78035d100bde6158d8595f9", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.250660+00:00", + "completedAt": "2023-11-29T20:18:33.252268+00:00" + }, + { + "id": "37a0dbd1-3791-406b-be6a-5873738d04bb", + "createdAt": "2023-11-29T20:18:33.252678+00:00", + "commandType": "dropTip", + "key": "e5c086ad9c1e9ab4683336a8c4c917e2", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:33.252745+00:00", + "completedAt": "2023-11-29T20:18:33.260243+00:00" + }, + { + "id": "f6d4c9b0-d34f-4ff7-9fff-4bd03a41c23d", + "createdAt": "2023-11-29T20:18:33.261172+00:00", + "commandType": "pickUpTip", + "key": "25c3030a7c2dc0a090ba36f8c5bd0b2d", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:33.261259+00:00", + "completedAt": "2023-11-29T20:18:33.272926+00:00" + }, + { + "id": "549901cb-fead-4b75-8d51-b38bf4a99f1d", + "createdAt": "2023-11-29T20:18:33.273561+00:00", + "commandType": "aspirate", + "key": "75689e804d95b730b63c88f365efd5f9", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.273626+00:00", + "completedAt": "2023-11-29T20:18:33.279255+00:00" + }, + { + "id": "e200be2d-c103-4680-8df7-3ce729e7c2df", + "createdAt": "2023-11-29T20:18:33.280053+00:00", + "commandType": "dispense", + "key": "3bb65d967cbf6d042c2919e45050e96b", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.280130+00:00", + "completedAt": "2023-11-29T20:18:33.282286+00:00" + }, + { + "id": "d557395a-972c-432d-bb35-10c62f12bd29", + "createdAt": "2023-11-29T20:18:33.282950+00:00", + "commandType": "aspirate", + "key": "06942234ebccc9c28e69e858224cbba9", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.283034+00:00", + "completedAt": "2023-11-29T20:18:33.288233+00:00" + }, + { + "id": "b9b2771e-6eed-45c4-a556-433ae946d11f", + "createdAt": "2023-11-29T20:18:33.288913+00:00", + "commandType": "dispense", + "key": "e9c9f3196d0e8fc39db35f4aca7a159d", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.288984+00:00", + "completedAt": "2023-11-29T20:18:33.290946+00:00" + }, + { + "id": "5d19a5a7-78a1-47a1-bf16-557c727dacad", + "createdAt": "2023-11-29T20:18:33.291673+00:00", + "commandType": "aspirate", + "key": "4a5abdbdfc68150cc7e5f497a59605b1", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.291757+00:00", + "completedAt": "2023-11-29T20:18:33.297080+00:00" + }, + { + "id": "42df6ca5-2ed2-41a8-962e-06ba646d1433", + "createdAt": "2023-11-29T20:18:33.297808+00:00", + "commandType": "dispense", + "key": "229d86f872530085d6f0f18fe4a8d6b6", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.297880+00:00", + "completedAt": "2023-11-29T20:18:33.299835+00:00" + }, + { + "id": "16ba72e7-e4f5-420f-9e49-d36335e1467b", + "createdAt": "2023-11-29T20:18:33.300632+00:00", + "commandType": "aspirate", + "key": "830be2fc991350eb7191888851a03863", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.300747+00:00", + "completedAt": "2023-11-29T20:18:33.305938+00:00" + }, + { + "id": "b8c4d2be-555d-4d66-8846-1a37683d14ce", + "createdAt": "2023-11-29T20:18:33.306673+00:00", + "commandType": "dispense", + "key": "88caa87c57e56d21d442d74e5804188f", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 3.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 3.0 + }, + "startedAt": "2023-11-29T20:18:33.306738+00:00", + "completedAt": "2023-11-29T20:18:33.308885+00:00" + }, + { + "id": "05a013eb-8d84-4f03-aa99-a4c38f48e210", + "createdAt": "2023-11-29T20:18:33.309906+00:00", + "commandType": "moveToWell", + "key": "5b1606dcddf46d7bb835e66b698539a2", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.310045+00:00", + "completedAt": "2023-11-29T20:18:33.311514+00:00" + }, + { + "id": "42c4864b-ef96-4b84-ae87-73835e50f098", + "createdAt": "2023-11-29T20:18:33.312233+00:00", + "commandType": "moveToWell", + "key": "b7201bf7ce836d403c51691f693e4830", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 182.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.312327+00:00", + "completedAt": "2023-11-29T20:18:33.313616+00:00" + }, + { + "id": "4855d9b9-4242-4e42-8068-47f0eb507f51", + "createdAt": "2023-11-29T20:18:33.314001+00:00", + "commandType": "moveToWell", + "key": "ea62abd04921e02bc3bada15a68cfb5c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 174.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.314116+00:00", + "completedAt": "2023-11-29T20:18:33.315390+00:00" + }, + { + "id": "edde0f56-6fb7-452c-bd75-a114db08d885", + "createdAt": "2023-11-29T20:18:33.316417+00:00", + "commandType": "dispense", + "key": "fa79d690837bcd226efe7ce789b99d2a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 40.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:33.316524+00:00", + "completedAt": "2023-11-29T20:18:33.322007+00:00" + }, + { + "id": "223057b7-5c3e-4cbf-aff4-b653b8a8ad1b", + "createdAt": "2023-11-29T20:18:33.322882+00:00", + "commandType": "moveToWell", + "key": "b91b6f5febb96183494cc93a1463fc15", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.323004+00:00", + "completedAt": "2023-11-29T20:18:33.324473+00:00" + }, + { + "id": "cbe80667-4127-4098-990c-9268b9d14516", + "createdAt": "2023-11-29T20:18:33.325494+00:00", + "commandType": "aspirate", + "key": "5febeeee8854834b1ae98a54fe8648e1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:33.325578+00:00", + "completedAt": "2023-11-29T20:18:33.331060+00:00" + }, + { + "id": "2fe1416d-fb81-4570-bf3d-07c7432bfa60", + "createdAt": "2023-11-29T20:18:33.331882+00:00", + "commandType": "moveToWell", + "key": "d19010e62b36df337e9cce11c07e6eb1", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.331963+00:00", + "completedAt": "2023-11-29T20:18:33.333545+00:00" + }, + { + "id": "09266280-a868-4e08-8799-950441c9a246", + "createdAt": "2023-11-29T20:18:33.334452+00:00", + "commandType": "aspirate", + "key": "91d0f0fea1ee5b5aca772133d58b2803", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:33.334532+00:00", + "completedAt": "2023-11-29T20:18:33.336736+00:00" + }, + { + "id": "a04c9198-e49f-4f37-ae39-e3ce324e2093", + "createdAt": "2023-11-29T20:18:33.337687+00:00", + "commandType": "dispense", + "key": "71d6f461858e433ee28f47e63c4de6d6", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:33.337753+00:00", + "completedAt": "2023-11-29T20:18:33.339769+00:00" + }, + { + "id": "ec04ef76-2678-4c0c-8e47-e0e2786578fc", + "createdAt": "2023-11-29T20:18:33.340347+00:00", + "commandType": "moveToWell", + "key": "39e3547e219479ea388230e3a9dec0f9", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.340437+00:00", + "completedAt": "2023-11-29T20:18:33.341763+00:00" + }, + { + "id": "195ca611-0052-4279-ab8d-4137f36e8017", + "createdAt": "2023-11-29T20:18:33.342882+00:00", + "commandType": "dispense", + "key": "3a6ed08b8f9acf6919f6202bc196ca95", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:33.343015+00:00", + "completedAt": "2023-11-29T20:18:33.345475+00:00" + }, + { + "id": "b975e458-711b-4260-ba0c-30908b89e116", + "createdAt": "2023-11-29T20:18:33.346465+00:00", + "commandType": "aspirate", + "key": "688d84f4f23f7dc96fb89f9a0d831ff4", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:33.346538+00:00", + "completedAt": "2023-11-29T20:18:33.351540+00:00" + }, + { + "id": "e1ae991b-8791-4471-a9f7-5197c817416f", + "createdAt": "2023-11-29T20:18:33.352585+00:00", + "commandType": "moveToWell", + "key": "1793cb340534002dec2cb785cf1b44b8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.352652+00:00", + "completedAt": "2023-11-29T20:18:33.354115+00:00" + }, + { + "id": "b2bb5821-b196-4bdb-85db-7f6ffcc344bf", + "createdAt": "2023-11-29T20:18:33.354938+00:00", + "commandType": "aspirate", + "key": "ade7238c5454b00c92f13f34347ac7ef", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:33.355000+00:00", + "completedAt": "2023-11-29T20:18:33.356975+00:00" + }, + { + "id": "974d14ed-c156-4738-85da-02d24da81697", + "createdAt": "2023-11-29T20:18:33.357711+00:00", + "commandType": "dispense", + "key": "174b55c1c0c861742c34d26bc58fc1c3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:33.357768+00:00", + "completedAt": "2023-11-29T20:18:33.359963+00:00" + }, + { + "id": "7ff5cf65-a4ec-4f46-a7bd-51e30a5576f1", + "createdAt": "2023-11-29T20:18:33.360696+00:00", + "commandType": "moveToWell", + "key": "4411cfe6c6bbe0b6bc956a9bf9f6da6f", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.360800+00:00", + "completedAt": "2023-11-29T20:18:33.362441+00:00" + }, + { + "id": "04045220-db24-41e3-8c25-0bc5b9756260", + "createdAt": "2023-11-29T20:18:33.363451+00:00", + "commandType": "dispense", + "key": "6789f5fc95337cd6aed9dc6c49766ca1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:33.363521+00:00", + "completedAt": "2023-11-29T20:18:33.365805+00:00" + }, + { + "id": "ddc9affd-3f37-4916-be04-268e1ad7677a", + "createdAt": "2023-11-29T20:18:33.366613+00:00", + "commandType": "moveToWell", + "key": "e8c32ce115606359cdc6f4bb5638da67", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.366712+00:00", + "completedAt": "2023-11-29T20:18:33.368175+00:00" + }, + { + "id": "9ffd710b-e7c4-46b1-a700-15730ec4b4ff", + "createdAt": "2023-11-29T20:18:33.368590+00:00", + "commandType": "waitForDuration", + "key": "360a2fb641d20b016f37bcd1490c3d3d", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.368686+00:00", + "completedAt": "2023-11-29T20:18:33.368765+00:00" + }, + { + "id": "df2f5257-4d2d-46ad-a4d8-f97c977e7ca8", + "createdAt": "2023-11-29T20:18:33.369833+00:00", + "commandType": "blowout", + "key": "2f3dc1e5be920c2a2ace18a05a432329", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.369919+00:00", + "completedAt": "2023-11-29T20:18:33.372003+00:00" + }, + { + "id": "129e0b39-b4e0-4fa5-b637-904918ee90b8", + "createdAt": "2023-11-29T20:18:33.372532+00:00", + "commandType": "touchTip", + "key": "bee5a9420e6a1ff0851350167cf17705", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 36.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.372596+00:00", + "completedAt": "2023-11-29T20:18:33.379405+00:00" + }, + { + "id": "738441ff-6a15-4a69-8c1d-d2f41987d099", + "createdAt": "2023-11-29T20:18:33.380406+00:00", + "commandType": "moveToWell", + "key": "e6420b443345839e1d4b573b7583581b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.380479+00:00", + "completedAt": "2023-11-29T20:18:33.382013+00:00" + }, + { + "id": "df3a898d-8aed-48ef-b8b6-83a2db1c2e4a", + "createdAt": "2023-11-29T20:18:33.382840+00:00", + "commandType": "moveToWell", + "key": "d13db34e1294fee003be03c265169a3e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 37.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.382928+00:00", + "completedAt": "2023-11-29T20:18:33.384491+00:00" + }, + { + "id": "f68d516d-dff7-4e28-9742-f47d204f2038", + "createdAt": "2023-11-29T20:18:33.385184+00:00", + "commandType": "moveToWell", + "key": "037824070cc095762aa6454ea98e540a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.385256+00:00", + "completedAt": "2023-11-29T20:18:33.386635+00:00" + }, + { + "id": "502fd220-cdaf-432d-9391-364f35761cc6", + "createdAt": "2023-11-29T20:18:33.386988+00:00", + "commandType": "dropTip", + "key": "9bb2553f02245cd2f26124281a57cfc3", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:33.387066+00:00", + "completedAt": "2023-11-29T20:18:33.394275+00:00" + }, + { + "id": "4b0d1eed-ec5b-4aec-9772-278caee5fd7a", + "createdAt": "2023-11-29T20:18:33.395180+00:00", + "commandType": "pickUpTip", + "key": "753cd4a672c7bf7841053b51ad0b7300", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 223.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:33.395266+00:00", + "completedAt": "2023-11-29T20:18:33.405881+00:00" + }, + { + "id": "665b4570-becf-41fc-9dd3-e1c59ae87891", + "createdAt": "2023-11-29T20:18:33.406600+00:00", + "commandType": "aspirate", + "key": "6fd85bd5bc164173bc2f5465d3264988", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.406681+00:00", + "completedAt": "2023-11-29T20:18:33.412235+00:00" + }, + { + "id": "18512e71-8040-4bcd-b518-2626b34193b0", + "createdAt": "2023-11-29T20:18:33.412882+00:00", + "commandType": "dispense", + "key": "f6f8e3fe802eddfc9acb81dffa64500e", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.412949+00:00", + "completedAt": "2023-11-29T20:18:33.414808+00:00" + }, + { + "id": "da478f4e-5cfb-40c6-a85c-9823f1536b9b", + "createdAt": "2023-11-29T20:18:33.415367+00:00", + "commandType": "aspirate", + "key": "2ea7f5cd0ec18d41649e6437b2916c33", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.415461+00:00", + "completedAt": "2023-11-29T20:18:33.420458+00:00" + }, + { + "id": "7100c06f-fb07-4d77-b9a9-5a229f433f0e", + "createdAt": "2023-11-29T20:18:33.421078+00:00", + "commandType": "dispense", + "key": "5bb5a20cc35bbb3daac51ccd67c2ab0c", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.421142+00:00", + "completedAt": "2023-11-29T20:18:33.423140+00:00" + }, + { + "id": "e4a569bf-2a4a-4004-9091-1c12ff3dabb8", + "createdAt": "2023-11-29T20:18:33.423728+00:00", + "commandType": "aspirate", + "key": "63c84932ec06d86d567cc2addbc4300f", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.423839+00:00", + "completedAt": "2023-11-29T20:18:33.429379+00:00" + }, + { + "id": "5562a3ca-0c5b-4107-93b3-fc82f6d00412", + "createdAt": "2023-11-29T20:18:33.430016+00:00", + "commandType": "dispense", + "key": "7609f5db6002cf1bbb68c7f5066e24e9", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.430081+00:00", + "completedAt": "2023-11-29T20:18:33.432083+00:00" + }, + { + "id": "16467e71-df71-4fb7-9c76-f2f9ad6767e5", + "createdAt": "2023-11-29T20:18:33.432757+00:00", + "commandType": "aspirate", + "key": "065ec15b3993c81ce1acfb38a17a923b", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:33.432917+00:00", + "completedAt": "2023-11-29T20:18:33.438061+00:00" + }, + { + "id": "60e867c9-d6d6-4b0e-b6de-4457aef43423", + "createdAt": "2023-11-29T20:18:33.438729+00:00", + "commandType": "dispense", + "key": "ed35173b30c60f30296d65316052b8d1", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 3.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 3.0 + }, + "startedAt": "2023-11-29T20:18:33.438793+00:00", + "completedAt": "2023-11-29T20:18:33.440703+00:00" + }, + { + "id": "8823c2c5-2056-43ab-a9e2-25f08bd4d8ec", + "createdAt": "2023-11-29T20:18:33.441490+00:00", + "commandType": "moveToWell", + "key": "0b02de09ad29ee69ddb2caff206602eb", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.441565+00:00", + "completedAt": "2023-11-29T20:18:33.442937+00:00" + }, + { + "id": "53790b96-4a50-4631-bb29-9b3e85445cb0", + "createdAt": "2023-11-29T20:18:33.443739+00:00", + "commandType": "moveToWell", + "key": "9a4af27c9ae901a9dcf5012985f04a40", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 182.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.443837+00:00", + "completedAt": "2023-11-29T20:18:33.445212+00:00" + }, + { + "id": "4997454b-68fb-430a-8b38-11448aaebfe4", + "createdAt": "2023-11-29T20:18:33.445708+00:00", + "commandType": "moveToWell", + "key": "cef72e932d5090c9559c40c3199b31b9", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 174.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.445782+00:00", + "completedAt": "2023-11-29T20:18:33.447088+00:00" + }, + { + "id": "10183907-c275-4edf-8ce8-ee3d0fd547b8", + "createdAt": "2023-11-29T20:18:33.448094+00:00", + "commandType": "dispense", + "key": "9ce525216597a1be409939e54d20eac1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 40.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:33.448188+00:00", + "completedAt": "2023-11-29T20:18:33.453966+00:00" + }, + { + "id": "122deb13-399c-4bad-b528-4e29f7f29bd5", + "createdAt": "2023-11-29T20:18:33.455145+00:00", + "commandType": "moveToWell", + "key": "53e0f30f5ab29a89fb9931339c2acce5", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.455277+00:00", + "completedAt": "2023-11-29T20:18:33.456971+00:00" + }, + { + "id": "b88d3483-0ec6-44a2-8948-0c4dd28f0c26", + "createdAt": "2023-11-29T20:18:33.458000+00:00", + "commandType": "aspirate", + "key": "e330ea45ad7775f0217c883b87d8aa37", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:33.458125+00:00", + "completedAt": "2023-11-29T20:18:33.465293+00:00" + }, + { + "id": "f9a2707e-5c81-4010-bfbf-aba020b43016", + "createdAt": "2023-11-29T20:18:33.468646+00:00", + "commandType": "moveToWell", + "key": "6e4de9b81b9224c6159b28a84b3497ca", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.468775+00:00", + "completedAt": "2023-11-29T20:18:33.470451+00:00" + }, + { + "id": "2f1022a4-c9b2-4d21-90b3-7e99f6bd9764", + "createdAt": "2023-11-29T20:18:33.472397+00:00", + "commandType": "aspirate", + "key": "a302913408f4ef8f249198b762bfdf84", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:33.472933+00:00", + "completedAt": "2023-11-29T20:18:33.475750+00:00" + }, + { + "id": "f96dcf3f-2715-4bed-a44f-6f7c9c72a4b9", + "createdAt": "2023-11-29T20:18:33.477507+00:00", + "commandType": "dispense", + "key": "be3ea953d2759b13e195fcd759dcfcfe", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:33.477796+00:00", + "completedAt": "2023-11-29T20:18:33.480710+00:00" + }, + { + "id": "2d65e6c1-c8f8-49fc-9a8a-e570a029bab5", + "createdAt": "2023-11-29T20:18:33.482551+00:00", + "commandType": "moveToWell", + "key": "a6427c6cca5ce430d80e8b7514bf08be", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.482665+00:00", + "completedAt": "2023-11-29T20:18:33.484216+00:00" + }, + { + "id": "779e008d-1280-4da5-8397-acfc07014564", + "createdAt": "2023-11-29T20:18:33.485405+00:00", + "commandType": "dispense", + "key": "585727c4300b7c9eed46471f80a3b797", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:33.485558+00:00", + "completedAt": "2023-11-29T20:18:33.488765+00:00" + }, + { + "id": "a39f99b3-cd35-4624-9219-791c55d44c9c", + "createdAt": "2023-11-29T20:18:33.491793+00:00", + "commandType": "aspirate", + "key": "1321aea6247355fe77c4104dc8e39a51", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:33.491997+00:00", + "completedAt": "2023-11-29T20:18:33.497708+00:00" + }, + { + "id": "bb1a2a3b-f91d-4a02-97e2-124630d4e6d5", + "createdAt": "2023-11-29T20:18:33.498633+00:00", + "commandType": "moveToWell", + "key": "ce2718bb4685700eb3815eba83cd4ffe", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.498727+00:00", + "completedAt": "2023-11-29T20:18:33.500196+00:00" + }, + { + "id": "abe191a1-0d7c-4a33-bb44-531e06eef5d4", + "createdAt": "2023-11-29T20:18:33.501080+00:00", + "commandType": "aspirate", + "key": "683f011ab634b19ddb1e7d88efa98a4f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:33.501194+00:00", + "completedAt": "2023-11-29T20:18:33.503752+00:00" + }, + { + "id": "7f5bf0f3-f0b5-4da8-af76-cf23331f81c2", + "createdAt": "2023-11-29T20:18:33.504905+00:00", + "commandType": "dispense", + "key": "5e1c83069f30239d285ab10769649d05", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:33.505013+00:00", + "completedAt": "2023-11-29T20:18:33.507343+00:00" + }, + { + "id": "6a7179bb-ec7d-400c-a564-53ae93a939b0", + "createdAt": "2023-11-29T20:18:33.508104+00:00", + "commandType": "moveToWell", + "key": "5b08df0897cf6a35b5861ff7b0e2de4c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:33.508166+00:00", + "completedAt": "2023-11-29T20:18:33.509577+00:00" + }, + { + "id": "c9f44090-0b0a-4b1a-b2c9-d1211a1627e6", + "createdAt": "2023-11-29T20:18:33.510768+00:00", + "commandType": "dispense", + "key": "35ed395cd9499fdcb579227fdb3f5ef5", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:33.510876+00:00", + "completedAt": "2023-11-29T20:18:33.513434+00:00" + }, + { + "id": "b3c1b4ac-7a83-41ad-9256-ad305b02a2fc", + "createdAt": "2023-11-29T20:18:33.514209+00:00", + "commandType": "moveToWell", + "key": "be32467cb47ad46a7dbe6a32b174943b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.514322+00:00", + "completedAt": "2023-11-29T20:18:33.515790+00:00" + }, + { + "id": "4d051204-af07-4e5a-aabf-62270c7453ed", + "createdAt": "2023-11-29T20:18:33.516102+00:00", + "commandType": "waitForDuration", + "key": "6a49f1d876afed38118890f84fd316d3", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.516156+00:00", + "completedAt": "2023-11-29T20:18:33.516205+00:00" + }, + { + "id": "85813a5f-b67f-4eed-9e2d-b808934b9721", + "createdAt": "2023-11-29T20:18:33.517070+00:00", + "commandType": "blowout", + "key": "fa5f6b219d55487e1668b0e8b05b3e4d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.517127+00:00", + "completedAt": "2023-11-29T20:18:33.519296+00:00" + }, + { + "id": "27e3d895-9400-46c3-875f-b247fbe0a74d", + "createdAt": "2023-11-29T20:18:33.519839+00:00", + "commandType": "touchTip", + "key": "bf2f11e3f3c04f4709f29229b9f25dd3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 36.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.519899+00:00", + "completedAt": "2023-11-29T20:18:33.525862+00:00" + }, + { + "id": "4b583b50-7cc0-4ab0-a0c1-a57592a3c0fd", + "createdAt": "2023-11-29T20:18:33.527064+00:00", + "commandType": "moveToWell", + "key": "b64f82a34442b7c8024b414bfb061344", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.527177+00:00", + "completedAt": "2023-11-29T20:18:33.528780+00:00" + }, + { + "id": "b3b52f34-5f4c-4b28-a142-fe4e0ed89476", + "createdAt": "2023-11-29T20:18:33.529410+00:00", + "commandType": "moveToWell", + "key": "bbb2ef79e2dc0c386a88d170878497b4", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 37.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.529469+00:00", + "completedAt": "2023-11-29T20:18:33.530839+00:00" + }, + { + "id": "2f0f8925-e36c-4afc-be18-d8b0551f3cd9", + "createdAt": "2023-11-29T20:18:33.531639+00:00", + "commandType": "moveToWell", + "key": "8fabe73021fa876cc1d792e4024310f9", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.531708+00:00", + "completedAt": "2023-11-29T20:18:33.533257+00:00" + }, + { + "id": "df16caf8-85c0-4b5c-846f-c3c9f7b56fc7", + "createdAt": "2023-11-29T20:18:33.533679+00:00", + "commandType": "dropTip", + "key": "9dc6e59b40d53464b94d92f27a30e560", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:33.533760+00:00", + "completedAt": "2023-11-29T20:18:33.540962+00:00" + }, + { + "id": "be0938b3-ddae-4182-a71f-c0f9bf22f974", + "createdAt": "2023-11-29T20:18:33.541463+00:00", + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "key": "4c599c47a9e0c9f6291a75f12a9ea2ce", + "status": "succeeded", + "params": { + "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5", + "rpm": 1600.0 + }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:33.541567+00:00", + "completedAt": "2023-11-29T20:18:33.541688+00:00" + }, + { + "id": "43f0084c-1b5f-4070-8e5f-f3aa04affea7", + "createdAt": "2023-11-29T20:18:33.542070+00:00", + "commandType": "waitForDuration", + "key": "a9441c68c59476d51486e3b038ffe00a", + "status": "succeeded", + "params": { "seconds": 300.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.542166+00:00", + "completedAt": "2023-11-29T20:18:33.542217+00:00" + }, + { + "id": "1e71bc18-f133-4796-b521-b367083ab516", + "createdAt": "2023-11-29T20:18:33.542505+00:00", + "commandType": "heaterShaker/deactivateShaker", + "key": "9c0bbd0c106924871d7efe65af005125", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.542591+00:00", + "completedAt": "2023-11-29T20:18:33.542701+00:00" + }, + { + "id": "1f043d12-7d2a-4f2d-98d7-0fe9fb1a0d3c", + "createdAt": "2023-11-29T20:18:33.543192+00:00", + "commandType": "heaterShaker/openLabwareLatch", + "key": "12267a66c36deb8be2ab5cd241660872", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:33.543268+00:00", + "completedAt": "2023-11-29T20:18:33.543367+00:00" + }, + { + "id": "474a28b9-5319-4e44-83b9-8303bd1e6048", + "createdAt": "2023-11-29T20:18:33.543748+00:00", + "commandType": "moveLabware", + "key": "ce1d9658e1ea0eee59de3521f0345b62", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "newLocation": { "moduleId": "dc2de112-b2b7-4811-9cf5-501f1fee6878" }, + "strategy": "usingGripper", + "pickUpOffset": { "x": 0.0, "y": -2.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": 0.0, "z": 0.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.543812+00:00", + "completedAt": "2023-11-29T20:18:33.544096+00:00" + }, + { + "id": "08b30f5d-7046-45ca-99c6-21a83feed62b", + "createdAt": "2023-11-29T20:18:33.544412+00:00", + "commandType": "heaterShaker/closeLabwareLatch", + "key": "966227ff870abd3d389515fd33c0c090", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.544467+00:00", + "completedAt": "2023-11-29T20:18:33.544516+00:00" + }, + { + "id": "80150f73-9543-453f-a279-299df095faf3", + "createdAt": "2023-11-29T20:18:33.544828+00:00", + "commandType": "waitForDuration", + "key": "ad527526f4abbbd1eecd6c01715cbf53", + "status": "succeeded", + "params": { "seconds": 240.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.544894+00:00", + "completedAt": "2023-11-29T20:18:33.544946+00:00" + }, + { + "id": "6b8a512b-741d-4882-b74e-3d807af17492", + "createdAt": "2023-11-29T20:18:33.545491+00:00", + "commandType": "custom", + "key": "0d9c0acb568dfade55eb82c6bfc61fab", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Removing Supernatant" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.545575+00:00", + "completedAt": "2023-11-29T20:18:33.545668+00:00" + }, + { + "id": "ff4c3b73-adb6-45d6-9bf1-ebc6745a5a54", + "createdAt": "2023-11-29T20:18:33.546301+00:00", + "commandType": "pickUpTip", + "key": "217aea3ab56e08c11c372bc4af3b3401", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 232.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:33.546384+00:00", + "completedAt": "2023-11-29T20:18:33.557029+00:00" + }, + { + "id": "ee10f692-0d17-4b03-9e85-595d0787a87b", + "createdAt": "2023-11-29T20:18:33.557802+00:00", + "commandType": "moveToWell", + "key": "980f67c16644b6776fd9beeb77ed2378", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:33.557879+00:00", + "completedAt": "2023-11-29T20:18:33.562713+00:00" + }, + { + "id": "307da129-0e15-4a71-a340-a55f01107fca", + "createdAt": "2023-11-29T20:18:33.563497+00:00", + "commandType": "aspirate", + "key": "b3843526a4d00e5caceeaca0b6b80a49", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:33.563567+00:00", + "completedAt": "2023-11-29T20:18:33.565772+00:00" + }, + { + "id": "5e4895e7-a858-4213-9295-5e50a818f4e5", + "createdAt": "2023-11-29T20:18:33.566124+00:00", + "commandType": "waitForDuration", + "key": "299254e37eac2a2c4134b4111dd679b1", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.566183+00:00", + "completedAt": "2023-11-29T20:18:33.566243+00:00" + }, + { + "id": "33973047-7e27-42cf-ba35-fe7deef76279", + "createdAt": "2023-11-29T20:18:33.566784+00:00", + "commandType": "moveToWell", + "key": "861c40b3e9b17dec5208a5e7c8364523", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:33.566836+00:00", + "completedAt": "2023-11-29T20:18:33.568226+00:00" + }, + { + "id": "3e78813d-bee3-4f86-a355-6226fce5d8d0", + "createdAt": "2023-11-29T20:18:33.568863+00:00", + "commandType": "aspirate", + "key": "27c4b4c31680b6385abef517f2408bfb", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:33.568922+00:00", + "completedAt": "2023-11-29T20:18:33.570958+00:00" + }, + { + "id": "c90f62d0-a737-472d-9512-788a4b640e66", + "createdAt": "2023-11-29T20:18:33.571714+00:00", + "commandType": "moveToWell", + "key": "0380fd51b8681e77c2ad3ecce3309fdf", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.571773+00:00", + "completedAt": "2023-11-29T20:18:33.573000+00:00" + }, + { + "id": "74684fe8-ba8d-441e-9936-a3a79325a272", + "createdAt": "2023-11-29T20:18:33.573640+00:00", + "commandType": "touchTip", + "key": "87723f8001e37a4a01022c22383e0a1d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.573714+00:00", + "completedAt": "2023-11-29T20:18:33.580503+00:00" + }, + { + "id": "51d42d59-2322-4994-a4e6-8aaaf5465268", + "createdAt": "2023-11-29T20:18:33.581121+00:00", + "commandType": "dispense", + "key": "3d386e3dc7b235c4705750d09c39d068", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:33.581190+00:00", + "completedAt": "2023-11-29T20:18:33.586140+00:00" + }, + { + "id": "de898aa5-5301-4178-a814-1120a4b5aaeb", + "createdAt": "2023-11-29T20:18:33.586637+00:00", + "commandType": "waitForDuration", + "key": "99a9f2d2800ad89d26b1e958a6fc275a", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.586716+00:00", + "completedAt": "2023-11-29T20:18:33.586776+00:00" + }, + { + "id": "bc184c56-3756-4cc0-9153-79e3c68f58fa", + "createdAt": "2023-11-29T20:18:33.587304+00:00", + "commandType": "blowout", + "key": "8c921cc50ba8fa10b2ecc5e59ff31203", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.587413+00:00", + "completedAt": "2023-11-29T20:18:33.589479+00:00" + }, + { + "id": "05c2b01a-47cc-4aff-ac66-afbe6143b569", + "createdAt": "2023-11-29T20:18:33.590217+00:00", + "commandType": "moveToWell", + "key": "a6f7fd2ed617e28ead59e0cf12f8894f", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 272.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.590284+00:00", + "completedAt": "2023-11-29T20:18:33.591759+00:00" + }, + { + "id": "cc9a03f6-158e-45c5-8ce4-d18bfc0b8027", + "createdAt": "2023-11-29T20:18:33.592325+00:00", + "commandType": "moveToWell", + "key": "f1754469eadcc6ac3b64ce165161dd35", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 264.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.592492+00:00", + "completedAt": "2023-11-29T20:18:33.593778+00:00" + }, + { + "id": "eba6c9d7-aec0-45df-849c-5c69b467ae91", + "createdAt": "2023-11-29T20:18:33.594599+00:00", + "commandType": "moveToWell", + "key": "cd3fb13f1823b2a235fa048dcea08474", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.594660+00:00", + "completedAt": "2023-11-29T20:18:33.596011+00:00" + }, + { + "id": "78877541-bd41-42c7-8f8a-846e62961054", + "createdAt": "2023-11-29T20:18:33.596783+00:00", + "commandType": "moveToWell", + "key": "595c7ddb2d243880b67412f6935ca2d6", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.596858+00:00", + "completedAt": "2023-11-29T20:18:33.598121+00:00" + }, + { + "id": "0a33688a-47fa-4cb3-9fa5-9715ec5255aa", + "createdAt": "2023-11-29T20:18:33.598516+00:00", + "commandType": "dropTip", + "key": "b461fc8406d7b93fd947e01a29478577", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:33.598605+00:00", + "completedAt": "2023-11-29T20:18:33.605130+00:00" + }, + { + "id": "c63551a0-cd93-48a1-918f-b1d1308eb12a", + "createdAt": "2023-11-29T20:18:33.605817+00:00", + "commandType": "pickUpTip", + "key": "590fc5d06da684903e0f128c4e3d9f98", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 241.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:33.605880+00:00", + "completedAt": "2023-11-29T20:18:33.616687+00:00" + }, + { + "id": "075ebb4c-6b17-4a06-94e0-f72b5a138ada", + "createdAt": "2023-11-29T20:18:33.617528+00:00", + "commandType": "moveToWell", + "key": "5f11add841649826516f23e3dd6b5f90", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:33.617645+00:00", + "completedAt": "2023-11-29T20:18:33.622111+00:00" + }, + { + "id": "906538f0-e5b0-4d74-8bd7-4c69995556ec", + "createdAt": "2023-11-29T20:18:33.622986+00:00", + "commandType": "aspirate", + "key": "07ac5f57fcad966a8f762981b01d7106", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:33.623070+00:00", + "completedAt": "2023-11-29T20:18:33.625371+00:00" + }, + { + "id": "eb4d6ce6-b1f1-4e7d-9577-fcf268bc300c", + "createdAt": "2023-11-29T20:18:33.625736+00:00", + "commandType": "waitForDuration", + "key": "7cc5ff4bb96963516587e3e76dfb9dd8", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.625872+00:00", + "completedAt": "2023-11-29T20:18:33.625958+00:00" + }, + { + "id": "a6d8eb1b-4302-4480-9b76-60c065fd8423", + "createdAt": "2023-11-29T20:18:33.626581+00:00", + "commandType": "moveToWell", + "key": "ac18cbf38794fc3e3352521104175df8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:33.626659+00:00", + "completedAt": "2023-11-29T20:18:33.628015+00:00" + }, + { + "id": "a04e7f91-31e4-4d11-8bf7-447b12f7f3cb", + "createdAt": "2023-11-29T20:18:33.628698+00:00", + "commandType": "aspirate", + "key": "e22aa9f914654962e52daac5cc4e1fbe", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:33.628756+00:00", + "completedAt": "2023-11-29T20:18:33.630826+00:00" + }, + { + "id": "9ddf474b-281a-4dfd-8c03-52524e0affff", + "createdAt": "2023-11-29T20:18:33.631499+00:00", + "commandType": "moveToWell", + "key": "f39e845b31bb2edb9443138ea72c4c24", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.631559+00:00", + "completedAt": "2023-11-29T20:18:33.632873+00:00" + }, + { + "id": "57c0708b-ff86-4767-ac20-abbd8a0ff661", + "createdAt": "2023-11-29T20:18:33.633441+00:00", + "commandType": "touchTip", + "key": "2b84dcf6cb27b4c32a449aa573bb048e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.633500+00:00", + "completedAt": "2023-11-29T20:18:33.639449+00:00" + }, + { + "id": "72fbaae0-7952-4040-9503-272c97abb9db", + "createdAt": "2023-11-29T20:18:33.640095+00:00", + "commandType": "dispense", + "key": "0fc695b8f6105da9190ca0b9d3bf5062", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:33.640172+00:00", + "completedAt": "2023-11-29T20:18:33.645718+00:00" + }, + { + "id": "aeb0b417-d59d-40f1-a4c2-796475f04ae9", + "createdAt": "2023-11-29T20:18:33.646089+00:00", + "commandType": "waitForDuration", + "key": "4b1e850797a382119e0c82abea32fbc6", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.646160+00:00", + "completedAt": "2023-11-29T20:18:33.646218+00:00" + }, + { + "id": "8cf5cbe5-31cf-4ef3-9620-6a3172d3252b", + "createdAt": "2023-11-29T20:18:33.646679+00:00", + "commandType": "blowout", + "key": "94e2f423dac6337c41a42f12ce037765", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.646734+00:00", + "completedAt": "2023-11-29T20:18:33.648673+00:00" + }, + { + "id": "258913bb-3fdb-4202-8e23-4770a414a761", + "createdAt": "2023-11-29T20:18:33.649505+00:00", + "commandType": "moveToWell", + "key": "893dff93a39de03d900b45a3b2c2c4f4", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 272.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.649581+00:00", + "completedAt": "2023-11-29T20:18:33.651076+00:00" + }, + { + "id": "33a2c1e0-3019-42f2-b2df-ebbab9c7aa01", + "createdAt": "2023-11-29T20:18:33.651664+00:00", + "commandType": "moveToWell", + "key": "466f2cce48ba6ea9c67b9f42e12cc329", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 264.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.651770+00:00", + "completedAt": "2023-11-29T20:18:33.653045+00:00" + }, + { + "id": "14cbced6-6dd0-4523-bcba-05372b6a930e", + "createdAt": "2023-11-29T20:18:33.653596+00:00", + "commandType": "moveToWell", + "key": "231650f3b5a3f39ca710bfadf267edab", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.653651+00:00", + "completedAt": "2023-11-29T20:18:33.654833+00:00" + }, + { + "id": "96b145ef-ff01-4858-be2a-2699da007bf2", + "createdAt": "2023-11-29T20:18:33.655304+00:00", + "commandType": "moveToWell", + "key": "726dbb9b7e0e7afe6ed31b3a12ae2ced", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.655388+00:00", + "completedAt": "2023-11-29T20:18:33.656877+00:00" + }, + { + "id": "c0743b56-489d-402e-9eb4-632fcf4813c3", + "createdAt": "2023-11-29T20:18:33.657343+00:00", + "commandType": "dropTip", + "key": "5256b1b9a6dcbf8f558d28fba9c69c46", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:33.657420+00:00", + "completedAt": "2023-11-29T20:18:33.664111+00:00" + }, + { + "id": "7e0f292b-1afc-4e92-ab8e-6c51d5e270f2", + "createdAt": "2023-11-29T20:18:33.665051+00:00", + "commandType": "pickUpTip", + "key": "25ddd80e90f1229cb29f67de238cf48c", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 250.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:33.665136+00:00", + "completedAt": "2023-11-29T20:18:33.676207+00:00" + }, + { + "id": "f70959e5-96bf-4b54-99aa-bcbdfb08d492", + "createdAt": "2023-11-29T20:18:33.677070+00:00", + "commandType": "moveToWell", + "key": "22106be06857ce19b809be31567940b3", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:33.677201+00:00", + "completedAt": "2023-11-29T20:18:33.681836+00:00" + }, + { + "id": "392ec94c-3abb-4d1b-a38a-65396351886f", + "createdAt": "2023-11-29T20:18:33.682736+00:00", + "commandType": "aspirate", + "key": "5090abad891eeed01dc2f29f71670b66", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:33.682816+00:00", + "completedAt": "2023-11-29T20:18:33.685028+00:00" + }, + { + "id": "92a37da1-5d89-4fd6-bcfa-1216a6382983", + "createdAt": "2023-11-29T20:18:33.685369+00:00", + "commandType": "waitForDuration", + "key": "97f9eebff40d0a3fff6634d068800075", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.685440+00:00", + "completedAt": "2023-11-29T20:18:33.685493+00:00" + }, + { + "id": "ae4ed106-4e31-4634-b325-01aa9819cd30", + "createdAt": "2023-11-29T20:18:33.685979+00:00", + "commandType": "moveToWell", + "key": "d36a15751556700c9bc005249995c06d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:33.686033+00:00", + "completedAt": "2023-11-29T20:18:33.687319+00:00" + }, + { + "id": "1c6fa144-41c3-409e-bf75-fa07ea9138ce", + "createdAt": "2023-11-29T20:18:33.688210+00:00", + "commandType": "aspirate", + "key": "c9dfb4799ef4018196e9262e9a12a9ee", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:33.688281+00:00", + "completedAt": "2023-11-29T20:18:33.690454+00:00" + }, + { + "id": "8038cf89-1ced-473e-adb8-6bea78604837", + "createdAt": "2023-11-29T20:18:33.691333+00:00", + "commandType": "moveToWell", + "key": "23643701741e3051c107a968aacf6847", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.691445+00:00", + "completedAt": "2023-11-29T20:18:33.692934+00:00" + }, + { + "id": "9fcb47bd-1a1a-4400-995c-a87e6d020517", + "createdAt": "2023-11-29T20:18:33.693800+00:00", + "commandType": "touchTip", + "key": "70296a4cb60d116258dcdc4dabe2248a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.693935+00:00", + "completedAt": "2023-11-29T20:18:33.701002+00:00" + }, + { + "id": "f3b9a814-7163-4b42-a381-d41d395ff330", + "createdAt": "2023-11-29T20:18:33.701682+00:00", + "commandType": "dispense", + "key": "1e8e5f4d45cdb661436421764db6df2b", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:33.701762+00:00", + "completedAt": "2023-11-29T20:18:33.706752+00:00" + }, + { + "id": "8887aaa9-965f-416d-b8bd-194c9fa864d0", + "createdAt": "2023-11-29T20:18:33.707213+00:00", + "commandType": "waitForDuration", + "key": "2f9f82265e583e5542db53ab12bf2f3f", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.707307+00:00", + "completedAt": "2023-11-29T20:18:33.707386+00:00" + }, + { + "id": "8299be1d-4d71-44b1-888b-68d53979f585", + "createdAt": "2023-11-29T20:18:33.708078+00:00", + "commandType": "blowout", + "key": "c164a77c92fa1c3bdc6129aa60cffb32", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.708167+00:00", + "completedAt": "2023-11-29T20:18:33.710319+00:00" + }, + { + "id": "1e0e4969-947a-4752-b067-ae52ce9d4c8d", + "createdAt": "2023-11-29T20:18:33.711148+00:00", + "commandType": "moveToWell", + "key": "624a825c0a57c5e485430689bb40e116", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 272.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.711353+00:00", + "completedAt": "2023-11-29T20:18:33.712962+00:00" + }, + { + "id": "9e84a2c1-8276-4b1d-a77c-9b2f416892a9", + "createdAt": "2023-11-29T20:18:33.713511+00:00", + "commandType": "moveToWell", + "key": "c0e93b275eb42901885469301eae7101", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 264.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.713592+00:00", + "completedAt": "2023-11-29T20:18:33.714853+00:00" + }, + { + "id": "867c55d6-6380-4ee4-b0b2-494f12191106", + "createdAt": "2023-11-29T20:18:33.715630+00:00", + "commandType": "moveToWell", + "key": "63686d5b258fe6de3c777a59cac68c4a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.715716+00:00", + "completedAt": "2023-11-29T20:18:33.717166+00:00" + }, + { + "id": "f0348a22-30dc-4007-8bc5-d4dd3567a4f4", + "createdAt": "2023-11-29T20:18:33.717697+00:00", + "commandType": "moveToWell", + "key": "e46da9a62723b8229356535a385ab65c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.717766+00:00", + "completedAt": "2023-11-29T20:18:33.719109+00:00" + }, + { + "id": "a2687298-9ba4-4f10-bf8c-16a955872a5a", + "createdAt": "2023-11-29T20:18:33.719508+00:00", + "commandType": "dropTip", + "key": "f246b9a1414e831a2725518961c39a9f", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:33.719576+00:00", + "completedAt": "2023-11-29T20:18:33.725760+00:00" + }, + { + "id": "829e358e-a593-4995-8c24-0e4ad20b97cc", + "createdAt": "2023-11-29T20:18:33.726547+00:00", + "commandType": "custom", + "key": "046452013158efa2b38ce639e0dbb975", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> ETOH Wash" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.726642+00:00", + "completedAt": "2023-11-29T20:18:33.726711+00:00" + }, + { + "id": "958e0e5e-24c1-4211-9e4d-e6e5fcaadfd9", + "createdAt": "2023-11-29T20:18:33.727321+00:00", + "commandType": "pickUpTip", + "key": "82bc1251295c3bb231cbc265d82f2efe", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:33.727450+00:00", + "completedAt": "2023-11-29T20:18:33.738565+00:00" + }, + { + "id": "b93eb620-a160-4aa4-b26f-33c1a45e58e4", + "createdAt": "2023-11-29T20:18:33.739230+00:00", + "commandType": "aspirate", + "key": "dd98758f2356578e51f3bc3f4465f1c2", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:33.739304+00:00", + "completedAt": "2023-11-29T20:18:33.744395+00:00" + }, + { + "id": "2dc132eb-5cc1-4f8a-b018-e96548e89527", + "createdAt": "2023-11-29T20:18:33.744929+00:00", + "commandType": "moveToWell", + "key": "cccd5a84e82b6f6e0d3794581f310e90", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.744996+00:00", + "completedAt": "2023-11-29T20:18:33.746197+00:00" + }, + { + "id": "e8f6fcb6-4444-4e64-9247-86f871b33f0e", + "createdAt": "2023-11-29T20:18:33.746587+00:00", + "commandType": "moveToWell", + "key": "feea52118707c00f7ef84f1faec88502", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.746642+00:00", + "completedAt": "2023-11-29T20:18:33.748138+00:00" + }, + { + "id": "60169a56-bcf8-40a4-b37d-2d6ecae31450", + "createdAt": "2023-11-29T20:18:33.748888+00:00", + "commandType": "moveToWell", + "key": "c9360e6555f82b2b479a820d2d7b7efc", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 209.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.748956+00:00", + "completedAt": "2023-11-29T20:18:33.750357+00:00" + }, + { + "id": "6795da01-9f9e-4bc9-bdcc-bb2e514151b5", + "createdAt": "2023-11-29T20:18:33.750760+00:00", + "commandType": "moveToWell", + "key": "192c1d393f4b77e712aa96bf64b3d1f4", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 201.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.750819+00:00", + "completedAt": "2023-11-29T20:18:33.751985+00:00" + }, + { + "id": "c6399898-44fa-46ba-9bf4-797b988620d1", + "createdAt": "2023-11-29T20:18:33.752756+00:00", + "commandType": "dispense", + "key": "99064ef68489ce60cdec9614c1e6d393", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:33.752814+00:00", + "completedAt": "2023-11-29T20:18:33.758205+00:00" + }, + { + "id": "07d35d90-27fc-46bb-8431-404b800fcb98", + "createdAt": "2023-11-29T20:18:33.758735+00:00", + "commandType": "waitForDuration", + "key": "6d82feb54759d90d6f11d2f65c59f0cb", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.758819+00:00", + "completedAt": "2023-11-29T20:18:33.758897+00:00" + }, + { + "id": "5e424b4b-0c49-47a4-b4e5-74107ab31ba8", + "createdAt": "2023-11-29T20:18:33.759849+00:00", + "commandType": "blowout", + "key": "69205c16ce5182f865a4b4073c3c7077", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.759933+00:00", + "completedAt": "2023-11-29T20:18:33.762221+00:00" + }, + { + "id": "647cc626-0863-4542-84f1-c2608fee1221", + "createdAt": "2023-11-29T20:18:33.762871+00:00", + "commandType": "moveToWell", + "key": "ffda59b419cd87a4b8fbdf2ca7806c62", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.762934+00:00", + "completedAt": "2023-11-29T20:18:33.764394+00:00" + }, + { + "id": "c257f3e2-c433-45e1-bfa8-298492482d5c", + "createdAt": "2023-11-29T20:18:33.765119+00:00", + "commandType": "moveToWell", + "key": "6b83ec308a66f8e89504c9d200087cdc", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.765211+00:00", + "completedAt": "2023-11-29T20:18:33.766652+00:00" + }, + { + "id": "adbf7357-c315-4b36-ad73-4014cf645920", + "createdAt": "2023-11-29T20:18:33.767164+00:00", + "commandType": "moveToWell", + "key": "24bc031cee44fe73f34ba238c68dd4e3", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.767223+00:00", + "completedAt": "2023-11-29T20:18:33.768733+00:00" + }, + { + "id": "e328e58a-4521-43a2-abb7-27d024e05f9f", + "createdAt": "2023-11-29T20:18:33.769053+00:00", + "commandType": "dropTip", + "key": "9ce1abe7de5ff7a21a153237a0b88064", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:33.769107+00:00", + "completedAt": "2023-11-29T20:18:33.776262+00:00" + }, + { + "id": "1a925462-4bfc-4f24-b084-144662c30659", + "createdAt": "2023-11-29T20:18:33.777065+00:00", + "commandType": "pickUpTip", + "key": "73aad431c3873c2140e2d3210cdb1793", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:33.777160+00:00", + "completedAt": "2023-11-29T20:18:33.788327+00:00" + }, + { + "id": "3c151e0c-b873-404e-9502-03b1c35aadc9", + "createdAt": "2023-11-29T20:18:33.788941+00:00", + "commandType": "aspirate", + "key": "a0588c7245aa3a31cc3db47a13fc4002", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:33.789004+00:00", + "completedAt": "2023-11-29T20:18:33.794541+00:00" + }, + { + "id": "d872645a-34c6-4a12-9727-60186b2db285", + "createdAt": "2023-11-29T20:18:33.795219+00:00", + "commandType": "moveToWell", + "key": "956f810da746db3baf6d33d57295a27f", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.795317+00:00", + "completedAt": "2023-11-29T20:18:33.796645+00:00" + }, + { + "id": "d0336b48-c453-45ef-9799-cd177cb352d0", + "createdAt": "2023-11-29T20:18:33.797217+00:00", + "commandType": "moveToWell", + "key": "c5d433ea6fbe4d1bd67d206d46d506e1", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.797373+00:00", + "completedAt": "2023-11-29T20:18:33.798684+00:00" + }, + { + "id": "66b9446f-a2f8-45e4-a555-24d617e2af4e", + "createdAt": "2023-11-29T20:18:33.799285+00:00", + "commandType": "moveToWell", + "key": "2e4a113b2cdf9717699908c9d67e6814", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 209.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.799382+00:00", + "completedAt": "2023-11-29T20:18:33.800863+00:00" + }, + { + "id": "603666a6-f2d1-449b-87ab-82cdab0468f9", + "createdAt": "2023-11-29T20:18:33.801337+00:00", + "commandType": "moveToWell", + "key": "1212fa1e0bf0a515a118f312f7976b19", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 201.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.801396+00:00", + "completedAt": "2023-11-29T20:18:33.802647+00:00" + }, + { + "id": "133c30cf-af85-46c4-8d53-cacbfd21bb5e", + "createdAt": "2023-11-29T20:18:33.803325+00:00", + "commandType": "dispense", + "key": "01fd9a16432e030ba2694e525e4e99f2", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:33.803380+00:00", + "completedAt": "2023-11-29T20:18:33.808484+00:00" + }, + { + "id": "f3c3ee81-d2ee-420b-8e63-9c1b726bc3b6", + "createdAt": "2023-11-29T20:18:33.808917+00:00", + "commandType": "waitForDuration", + "key": "b0a3c36f34a5ce3f5d40dc58f2fb3e27", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.808990+00:00", + "completedAt": "2023-11-29T20:18:33.809070+00:00" + }, + { + "id": "6ef3483f-75b7-40b9-8777-4116acd08e93", + "createdAt": "2023-11-29T20:18:33.810017+00:00", + "commandType": "blowout", + "key": "3a4d76bd357e9606f0238a6284e37e78", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.810121+00:00", + "completedAt": "2023-11-29T20:18:33.812446+00:00" + }, + { + "id": "b8650ec2-bcd2-427c-bd80-b0c3e0a2440b", + "createdAt": "2023-11-29T20:18:33.813194+00:00", + "commandType": "moveToWell", + "key": "74d4207b51a8031d4a871b826716b472", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.813266+00:00", + "completedAt": "2023-11-29T20:18:33.814697+00:00" + }, + { + "id": "d4fa1bac-5a29-48ae-a7c2-0e51028df5ec", + "createdAt": "2023-11-29T20:18:33.815281+00:00", + "commandType": "moveToWell", + "key": "718d5cb0192e1378d0ff9dd74e720217", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.815358+00:00", + "completedAt": "2023-11-29T20:18:33.816737+00:00" + }, + { + "id": "453ef466-f2be-441a-9eef-2e42c92e8bde", + "createdAt": "2023-11-29T20:18:33.817303+00:00", + "commandType": "moveToWell", + "key": "2e43b0a62c0600f6093262c17d68ae08", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.817390+00:00", + "completedAt": "2023-11-29T20:18:33.818720+00:00" + }, + { + "id": "0d0cc8a6-7d60-4dda-9094-69338aac02d4", + "createdAt": "2023-11-29T20:18:33.819218+00:00", + "commandType": "dropTip", + "key": "689792e82b164df7894465afded90ed4", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:33.819284+00:00", + "completedAt": "2023-11-29T20:18:33.826178+00:00" + }, + { + "id": "e27b1f46-a073-4192-b651-d9039b3a5b14", + "createdAt": "2023-11-29T20:18:33.827099+00:00", + "commandType": "pickUpTip", + "key": "615085749b8824724d19beee8e24ffff", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:33.827212+00:00", + "completedAt": "2023-11-29T20:18:33.838105+00:00" + }, + { + "id": "b3c8c246-ada0-4a82-a747-8c36b12107ce", + "createdAt": "2023-11-29T20:18:33.838787+00:00", + "commandType": "aspirate", + "key": "47c07099ba457f58b6b87a6ddab9b476", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:33.838860+00:00", + "completedAt": "2023-11-29T20:18:33.844040+00:00" + }, + { + "id": "3108c727-95cf-43e2-bb77-e907b7bd73f1", + "createdAt": "2023-11-29T20:18:33.844671+00:00", + "commandType": "moveToWell", + "key": "e4e2ebf2c8afce06a47aa03f7e5a4d7e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.844745+00:00", + "completedAt": "2023-11-29T20:18:33.846027+00:00" + }, + { + "id": "c93355d3-3929-41f8-9654-4fb41f42f647", + "createdAt": "2023-11-29T20:18:33.846477+00:00", + "commandType": "moveToWell", + "key": "772e293f73ca5a8401f5b16df7620011", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.846541+00:00", + "completedAt": "2023-11-29T20:18:33.847793+00:00" + }, + { + "id": "9f485439-648b-44bd-8421-b7024218b20b", + "createdAt": "2023-11-29T20:18:33.848502+00:00", + "commandType": "moveToWell", + "key": "5a0d369c0bc2c618f70ecf5f4bd9b142", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 209.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.848571+00:00", + "completedAt": "2023-11-29T20:18:33.850044+00:00" + }, + { + "id": "c32b6eb4-591c-48a4-8163-b55bc70d6b1b", + "createdAt": "2023-11-29T20:18:33.850683+00:00", + "commandType": "moveToWell", + "key": "6e472207e959505d1d9b9034ba6d2572", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 201.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.850745+00:00", + "completedAt": "2023-11-29T20:18:33.852092+00:00" + }, + { + "id": "e6cd74a1-a005-431b-91b9-b91cf965a9e1", + "createdAt": "2023-11-29T20:18:33.852821+00:00", + "commandType": "dispense", + "key": "3cbdd09df0db53c2d85e4cf4b459be97", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:33.852881+00:00", + "completedAt": "2023-11-29T20:18:33.857973+00:00" + }, + { + "id": "3c936cea-4dce-4982-97a3-0cc6943943b4", + "createdAt": "2023-11-29T20:18:33.858483+00:00", + "commandType": "waitForDuration", + "key": "3145dbaeeb4dfbf2e09f20c1a13ce4a0", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.858558+00:00", + "completedAt": "2023-11-29T20:18:33.858636+00:00" + }, + { + "id": "38978ec9-679d-4a0e-9c82-ace435d36a77", + "createdAt": "2023-11-29T20:18:33.859491+00:00", + "commandType": "blowout", + "key": "ded41423097e44df5447f2bfb225def7", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.859558+00:00", + "completedAt": "2023-11-29T20:18:33.861647+00:00" + }, + { + "id": "322049cf-e954-408a-b3cf-20320a3901b9", + "createdAt": "2023-11-29T20:18:33.862437+00:00", + "commandType": "moveToWell", + "key": "3afd0f1c6c36ae282ac83b2c3c3b3b17", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.862509+00:00", + "completedAt": "2023-11-29T20:18:33.863942+00:00" + }, + { + "id": "1fabc648-809c-4544-9415-ceffb2a804bd", + "createdAt": "2023-11-29T20:18:33.864547+00:00", + "commandType": "moveToWell", + "key": "40f948853cca87a28ace140609a33c13", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.864679+00:00", + "completedAt": "2023-11-29T20:18:33.866099+00:00" + }, + { + "id": "fbc02b74-46dd-452d-b05c-3430824ecf9e", + "createdAt": "2023-11-29T20:18:33.866872+00:00", + "commandType": "moveToWell", + "key": "c559bd3130b204eb34cec3cd8a89288c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.866964+00:00", + "completedAt": "2023-11-29T20:18:33.868443+00:00" + }, + { + "id": "56e65da6-c52d-4c9b-b652-00b0a9ebbc9d", + "createdAt": "2023-11-29T20:18:33.868812+00:00", + "commandType": "dropTip", + "key": "5639821ffc335cd33f2b51b481e73941", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:33.868871+00:00", + "completedAt": "2023-11-29T20:18:33.875643+00:00" + }, + { + "id": "8692ea69-5102-42d0-a2af-e88f74e47fe0", + "createdAt": "2023-11-29T20:18:33.876171+00:00", + "commandType": "waitForDuration", + "key": "0730d8048f7d1c185a20ecb793e2e401", + "status": "succeeded", + "params": { "seconds": 30.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.876250+00:00", + "completedAt": "2023-11-29T20:18:33.876322+00:00" + }, + { + "id": "9a1b89e4-e830-46bc-8502-f477ff55e81e", + "createdAt": "2023-11-29T20:18:33.876932+00:00", + "commandType": "custom", + "key": "cf622768f17be2f14921e8d155935ed5", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Remove ETOH Wash" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.877002+00:00", + "completedAt": "2023-11-29T20:18:33.877056+00:00" + }, + { + "id": "d1cabedd-9981-4348-b3c5-313bffd09a76", + "createdAt": "2023-11-29T20:18:33.877537+00:00", + "commandType": "waitForResume", + "key": "3adba8ca4420a121a7342405f0046382", + "status": "succeeded", + "params": { "message": "RESET p200 TIPS" }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.877669+00:00", + "completedAt": "2023-11-29T20:18:33.877737+00:00" + }, + { + "id": "d07fae79-372d-4687-bae6-4633afaae9f3", + "createdAt": "2023-11-29T20:18:33.878850+00:00", + "commandType": "pickUpTip", + "key": "c84b9d97a0bc17ca701856a7e7cc4592", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:33.878926+00:00", + "completedAt": "2023-11-29T20:18:33.889856+00:00" + }, + { + "id": "8ddbea26-2312-4c6b-9298-37a8a558867a", + "createdAt": "2023-11-29T20:18:33.890775+00:00", + "commandType": "moveToWell", + "key": "b96e35f83af1783e1964c9bbcbf7a63d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:33.890861+00:00", + "completedAt": "2023-11-29T20:18:33.896083+00:00" + }, + { + "id": "ea5e33f5-40e1-44c2-8d0f-b7bfdcfe8b9b", + "createdAt": "2023-11-29T20:18:33.896987+00:00", + "commandType": "aspirate", + "key": "cf5a8ffa03d859f82af28d4f8685366d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:33.897054+00:00", + "completedAt": "2023-11-29T20:18:33.899241+00:00" + }, + { + "id": "01ed8136-cf4f-4a57-a2ff-b91bd24b49f7", + "createdAt": "2023-11-29T20:18:33.899690+00:00", + "commandType": "waitForDuration", + "key": "342edd4071c372f4862e22ddec8f3d13", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.899796+00:00", + "completedAt": "2023-11-29T20:18:33.899895+00:00" + }, + { + "id": "a9a42533-e27b-4abe-a0dd-286309b21966", + "createdAt": "2023-11-29T20:18:33.900572+00:00", + "commandType": "moveToWell", + "key": "652567d923f64e16d2df3632ab8f3aa3", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:33.900655+00:00", + "completedAt": "2023-11-29T20:18:33.902246+00:00" + }, + { + "id": "8ed139b9-5e9b-4352-83df-c28a89f8df08", + "createdAt": "2023-11-29T20:18:33.903020+00:00", + "commandType": "aspirate", + "key": "35f619e2968809ae54dab856e7341a84", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:33.903130+00:00", + "completedAt": "2023-11-29T20:18:33.905374+00:00" + }, + { + "id": "8e7e6515-add5-426c-b308-cd828d9a70ad", + "createdAt": "2023-11-29T20:18:33.906131+00:00", + "commandType": "moveToWell", + "key": "a9c88a28987676ffcfa456af295454fb", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.906198+00:00", + "completedAt": "2023-11-29T20:18:33.907616+00:00" + }, + { + "id": "9001cb3d-780a-44d7-b1d8-1ddbea2fcbb6", + "createdAt": "2023-11-29T20:18:33.908459+00:00", + "commandType": "touchTip", + "key": "e4278459b373d5c483674082599e2995", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.908539+00:00", + "completedAt": "2023-11-29T20:18:33.915153+00:00" + }, + { + "id": "79198cc2-8560-47c2-8bac-bfcb13fab419", + "createdAt": "2023-11-29T20:18:33.915805+00:00", + "commandType": "dispense", + "key": "7dd084d552a56e80e170e5e115cf9c9d", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:33.915867+00:00", + "completedAt": "2023-11-29T20:18:33.921452+00:00" + }, + { + "id": "0933c214-6da5-49bc-95fc-a255d4a2da75", + "createdAt": "2023-11-29T20:18:33.921865+00:00", + "commandType": "waitForDuration", + "key": "1e4a5bc19c0636bd689dc54d36eb38e6", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.921929+00:00", + "completedAt": "2023-11-29T20:18:33.921992+00:00" + }, + { + "id": "8083e28a-4ec8-4ce5-ad43-0a01c3799a84", + "createdAt": "2023-11-29T20:18:33.922548+00:00", + "commandType": "blowout", + "key": "88b64cba291e2755d3aec7c0fbe6fe1f", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.922612+00:00", + "completedAt": "2023-11-29T20:18:33.924661+00:00" + }, + { + "id": "1b14f441-65bf-40eb-9613-c460b5ad0ad4", + "createdAt": "2023-11-29T20:18:33.925416+00:00", + "commandType": "moveToWell", + "key": "147024cb6d5e02c76ba1e09159f7a2b6", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 272.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.925479+00:00", + "completedAt": "2023-11-29T20:18:33.926778+00:00" + }, + { + "id": "c3cf1930-738a-4b4d-84ca-9edb77a642b0", + "createdAt": "2023-11-29T20:18:33.927237+00:00", + "commandType": "moveToWell", + "key": "550c99f29902963fff45dd03fc72918b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 264.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.927301+00:00", + "completedAt": "2023-11-29T20:18:33.928767+00:00" + }, + { + "id": "0d7d9905-5718-4646-98c6-f0923b47ce93", + "createdAt": "2023-11-29T20:18:33.929368+00:00", + "commandType": "moveToWell", + "key": "33cc085d480e824059ebb291d3d521f4", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.929428+00:00", + "completedAt": "2023-11-29T20:18:33.930873+00:00" + }, + { + "id": "6ed6c945-c0db-47cd-b2e6-2552672ad9c4", + "createdAt": "2023-11-29T20:18:33.931385+00:00", + "commandType": "moveToWell", + "key": "d1f3f5a31ce8196842e8ae12215f690d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.931466+00:00", + "completedAt": "2023-11-29T20:18:33.932995+00:00" + }, + { + "id": "53a7585b-62f4-4657-9001-b3496d262cc1", + "createdAt": "2023-11-29T20:18:33.933368+00:00", + "commandType": "dropTip", + "key": "e92eb1c661b3ac82e74cd6b59b48b848", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:33.933434+00:00", + "completedAt": "2023-11-29T20:18:33.939687+00:00" + }, + { + "id": "3fcb05c2-72be-4906-a737-a738b65a9446", + "createdAt": "2023-11-29T20:18:33.940434+00:00", + "commandType": "pickUpTip", + "key": "868d7381468b185324799c3795dbaed0", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 187.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:33.940507+00:00", + "completedAt": "2023-11-29T20:18:33.951117+00:00" + }, + { + "id": "0b49e35d-83bc-4dba-8584-e35f5f18679d", + "createdAt": "2023-11-29T20:18:33.951902+00:00", + "commandType": "moveToWell", + "key": "062b02fc7047224c96a72ef5d4d5fa80", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:33.951973+00:00", + "completedAt": "2023-11-29T20:18:33.956826+00:00" + }, + { + "id": "8642486e-c637-4c51-8cd3-9057631065ca", + "createdAt": "2023-11-29T20:18:33.957794+00:00", + "commandType": "aspirate", + "key": "f51672dee36c176b983ebdee9d407d14", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:33.957916+00:00", + "completedAt": "2023-11-29T20:18:33.960388+00:00" + }, + { + "id": "77b18b35-1e44-48d7-a43a-d08c1d93b071", + "createdAt": "2023-11-29T20:18:33.960800+00:00", + "commandType": "waitForDuration", + "key": "b3269743d79ede86a0ba3b0feeb89259", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.960873+00:00", + "completedAt": "2023-11-29T20:18:33.960933+00:00" + }, + { + "id": "d8c3ace3-2d11-4b98-90f4-18780d6135fb", + "createdAt": "2023-11-29T20:18:33.961456+00:00", + "commandType": "moveToWell", + "key": "45640bd4e05d150413ecbb5848618dcb", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:33.961531+00:00", + "completedAt": "2023-11-29T20:18:33.963179+00:00" + }, + { + "id": "14982f24-896c-479c-b995-ec3afa5e9659", + "createdAt": "2023-11-29T20:18:33.964218+00:00", + "commandType": "aspirate", + "key": "b2cf8b6cde8595b2a199c91ca3236bd4", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:33.964296+00:00", + "completedAt": "2023-11-29T20:18:33.966607+00:00" + }, + { + "id": "800e3dda-698c-4bfc-a3bd-9ddb656f3198", + "createdAt": "2023-11-29T20:18:33.967620+00:00", + "commandType": "moveToWell", + "key": "38e512835ad69e5918991a2dd12e413f", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.967707+00:00", + "completedAt": "2023-11-29T20:18:33.969131+00:00" + }, + { + "id": "e602a592-d25c-4e0f-aaa3-a63a15f67f88", + "createdAt": "2023-11-29T20:18:33.969953+00:00", + "commandType": "touchTip", + "key": "f7e438ea95348e1478fa3e65c3209aef", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:33.970051+00:00", + "completedAt": "2023-11-29T20:18:33.976788+00:00" + }, + { + "id": "19f59631-e20e-4c0b-9461-45897becc074", + "createdAt": "2023-11-29T20:18:33.977476+00:00", + "commandType": "dispense", + "key": "4bd263f42efdadd38c6c6c3393645280", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:33.977556+00:00", + "completedAt": "2023-11-29T20:18:33.983196+00:00" + }, + { + "id": "ef90fe84-1806-4938-980e-c1b743f29a15", + "createdAt": "2023-11-29T20:18:33.983678+00:00", + "commandType": "waitForDuration", + "key": "3954a4a07ce6092786177b4807650664", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:33.983746+00:00", + "completedAt": "2023-11-29T20:18:33.983808+00:00" + }, + { + "id": "e8706ab4-5e3d-4a14-89c6-6674e6b2dab3", + "createdAt": "2023-11-29T20:18:33.984493+00:00", + "commandType": "blowout", + "key": "1896f8c74a09ad14d25e4adfbf17adad", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.984588+00:00", + "completedAt": "2023-11-29T20:18:33.986757+00:00" + }, + { + "id": "8fb51fe5-7313-4977-925a-efdc1c29154d", + "createdAt": "2023-11-29T20:18:33.987423+00:00", + "commandType": "moveToWell", + "key": "4023a9d91e5838cb7f8c55130ebb6b73", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 272.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.987530+00:00", + "completedAt": "2023-11-29T20:18:33.988842+00:00" + }, + { + "id": "7a6cd83d-8084-440e-8a6a-e5ce35228861", + "createdAt": "2023-11-29T20:18:33.989262+00:00", + "commandType": "moveToWell", + "key": "fb665aa8fdc52b9b01bd9b45efa131df", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 264.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.989319+00:00", + "completedAt": "2023-11-29T20:18:33.990561+00:00" + }, + { + "id": "1140adf7-29e4-4656-91fd-a13d4bf18fcb", + "createdAt": "2023-11-29T20:18:33.991199+00:00", + "commandType": "moveToWell", + "key": "6f8a7c0d3e3a190c6747a15be962ee2b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.991301+00:00", + "completedAt": "2023-11-29T20:18:33.992925+00:00" + }, + { + "id": "df14ffa9-c0c0-43b3-b8cb-f600091bd0d2", + "createdAt": "2023-11-29T20:18:33.993743+00:00", + "commandType": "moveToWell", + "key": "0c82fac392adfabaacd1b99ca712ba36", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:33.993825+00:00", + "completedAt": "2023-11-29T20:18:33.995319+00:00" + }, + { + "id": "3ff68aa2-f8ff-4333-85ab-37fca2779108", + "createdAt": "2023-11-29T20:18:33.995895+00:00", + "commandType": "dropTip", + "key": "8ff87fe8ff6ae01ee8e8dc75972be538", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:33.995980+00:00", + "completedAt": "2023-11-29T20:18:34.002661+00:00" + }, + { + "id": "435084ad-6298-4590-8e23-8e64248f344f", + "createdAt": "2023-11-29T20:18:34.003549+00:00", + "commandType": "pickUpTip", + "key": "fa5e5f8f35467944bbc55b84cd5b37c7", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:34.003688+00:00", + "completedAt": "2023-11-29T20:18:34.015335+00:00" + }, + { + "id": "f9f47774-2ca5-4e19-8385-6bbfed0fb9cb", + "createdAt": "2023-11-29T20:18:34.016176+00:00", + "commandType": "moveToWell", + "key": "4d222fd5e3d3580f6da1fae1a4d123ee", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:34.016291+00:00", + "completedAt": "2023-11-29T20:18:34.021483+00:00" + }, + { + "id": "c8270176-18f3-4a6e-beae-2321735c82d9", + "createdAt": "2023-11-29T20:18:34.022382+00:00", + "commandType": "aspirate", + "key": "7ad56e4683a505de38ad86badc254330", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:34.022456+00:00", + "completedAt": "2023-11-29T20:18:34.024695+00:00" + }, + { + "id": "ea906208-6ea5-4dec-a3ff-2a4dac09f844", + "createdAt": "2023-11-29T20:18:34.025118+00:00", + "commandType": "waitForDuration", + "key": "af80a46be9c524cf75b97ce4e813bc61", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.025197+00:00", + "completedAt": "2023-11-29T20:18:34.025254+00:00" + }, + { + "id": "ad56aa06-97a0-470b-b87f-7d5be2143f4b", + "createdAt": "2023-11-29T20:18:34.025868+00:00", + "commandType": "moveToWell", + "key": "e280fa3550fcd8c6ca8258bbe203d2ee", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:34.025934+00:00", + "completedAt": "2023-11-29T20:18:34.027400+00:00" + }, + { + "id": "bc58ef84-d78f-4352-85cd-d98fd7b7166f", + "createdAt": "2023-11-29T20:18:34.028137+00:00", + "commandType": "aspirate", + "key": "cd0c379c9938d3061e2e8aac6fb6cf25", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:34.028222+00:00", + "completedAt": "2023-11-29T20:18:34.030335+00:00" + }, + { + "id": "6a014d1c-98a5-455f-97e4-573ef73fa059", + "createdAt": "2023-11-29T20:18:34.031021+00:00", + "commandType": "moveToWell", + "key": "609af16fd6fb884a054730253273b60b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.031094+00:00", + "completedAt": "2023-11-29T20:18:34.032528+00:00" + }, + { + "id": "ad4e07fb-f922-4162-a4c3-23927d50af8f", + "createdAt": "2023-11-29T20:18:34.033281+00:00", + "commandType": "touchTip", + "key": "c815e8080fe2e0d4ec9f5db3265a3cc3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.033355+00:00", + "completedAt": "2023-11-29T20:18:34.039725+00:00" + }, + { + "id": "ab637233-4e62-4b41-b1bf-5c187a6f093b", + "createdAt": "2023-11-29T20:18:34.040309+00:00", + "commandType": "dispense", + "key": "f515148d215c36da906a0e3bf6cc0cd7", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:34.040374+00:00", + "completedAt": "2023-11-29T20:18:34.046136+00:00" + }, + { + "id": "fd35e793-955e-4e1a-84d1-546d2b73157c", + "createdAt": "2023-11-29T20:18:34.046505+00:00", + "commandType": "waitForDuration", + "key": "febe0225f6d502e395f606e078dc1872", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.046569+00:00", + "completedAt": "2023-11-29T20:18:34.046630+00:00" + }, + { + "id": "18db1972-fc26-4615-abcc-c29af826e5c7", + "createdAt": "2023-11-29T20:18:34.047105+00:00", + "commandType": "blowout", + "key": "2d9223adc76394919348f723f8d5bf24", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.047162+00:00", + "completedAt": "2023-11-29T20:18:34.048998+00:00" + }, + { + "id": "f1396d42-5d2a-4766-b344-a400b139a0be", + "createdAt": "2023-11-29T20:18:34.049578+00:00", + "commandType": "moveToWell", + "key": "d80678e200172bcc0d5719c8557d0824", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 272.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.049646+00:00", + "completedAt": "2023-11-29T20:18:34.050918+00:00" + }, + { + "id": "d1a55104-dc98-4fae-b2d3-7f74494fc253", + "createdAt": "2023-11-29T20:18:34.051554+00:00", + "commandType": "moveToWell", + "key": "2900413bf7580862308ff9d10651cf4b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 264.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.051615+00:00", + "completedAt": "2023-11-29T20:18:34.052886+00:00" + }, + { + "id": "cd992992-99ea-4717-a44e-687fb8616bf5", + "createdAt": "2023-11-29T20:18:34.053358+00:00", + "commandType": "moveToWell", + "key": "29e04c58b09a000b58ccb0c937757b9c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.053411+00:00", + "completedAt": "2023-11-29T20:18:34.055270+00:00" + }, + { + "id": "476a3f83-24e6-4cba-8f4e-2586ded37873", + "createdAt": "2023-11-29T20:18:34.055666+00:00", + "commandType": "moveToWell", + "key": "20f53df9d5c40b77a29fa8deceb12d06", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.055720+00:00", + "completedAt": "2023-11-29T20:18:34.056941+00:00" + }, + { + "id": "d968b181-e0b4-4d91-9055-090aec6fd007", + "createdAt": "2023-11-29T20:18:34.057295+00:00", + "commandType": "dropTip", + "key": "48dd63525d1f3ff6545d5f4097f6ed19", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.057354+00:00", + "completedAt": "2023-11-29T20:18:34.063442+00:00" + }, + { + "id": "eb656c79-5e15-4389-a8e2-e4d7dde155f6", + "createdAt": "2023-11-29T20:18:34.064193+00:00", + "commandType": "custom", + "key": "569395cd99a3ce9a08a43aaaf93d3403", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> ETOH Wash" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.064260+00:00", + "completedAt": "2023-11-29T20:18:34.064318+00:00" + }, + { + "id": "b08c3f75-d4d1-471a-bc47-4bcd6bb489ac", + "createdAt": "2023-11-29T20:18:34.064902+00:00", + "commandType": "pickUpTip", + "key": "8ca3169f5fc87cd3038b222ed60f24cd", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:34.064975+00:00", + "completedAt": "2023-11-29T20:18:34.075914+00:00" + }, + { + "id": "78042739-a2ea-496d-98ce-c11c6e622653", + "createdAt": "2023-11-29T20:18:34.076652+00:00", + "commandType": "aspirate", + "key": "da2eba66d37ddac4f47ac7120d5cf12d", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:34.076733+00:00", + "completedAt": "2023-11-29T20:18:34.082339+00:00" + }, + { + "id": "9ed2cb5a-c3d9-4cfc-8333-0419e7761d8f", + "createdAt": "2023-11-29T20:18:34.082902+00:00", + "commandType": "moveToWell", + "key": "7019efa1085983b44397508e021b340a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.082985+00:00", + "completedAt": "2023-11-29T20:18:34.084411+00:00" + }, + { + "id": "c9192b2c-d9f3-4415-ae22-25ef531531c1", + "createdAt": "2023-11-29T20:18:34.084969+00:00", + "commandType": "moveToWell", + "key": "20a726dbe949ae7c5b7776336b7ee0e1", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.085032+00:00", + "completedAt": "2023-11-29T20:18:34.086249+00:00" + }, + { + "id": "a1fe4dc8-b6d5-4fae-867d-aa22cf779336", + "createdAt": "2023-11-29T20:18:34.086823+00:00", + "commandType": "moveToWell", + "key": "b42dac04bdbddb0b8b36d5f530bac7f2", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 209.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.086883+00:00", + "completedAt": "2023-11-29T20:18:34.088089+00:00" + }, + { + "id": "fc5815bb-9ed2-4967-87e8-151feab6e5e3", + "createdAt": "2023-11-29T20:18:34.088465+00:00", + "commandType": "moveToWell", + "key": "20f6dbc828741d75a2436664b6687716", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 201.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.088516+00:00", + "completedAt": "2023-11-29T20:18:34.089696+00:00" + }, + { + "id": "8a80a7d3-cff0-41db-9e27-843592cdc94c", + "createdAt": "2023-11-29T20:18:34.090488+00:00", + "commandType": "dispense", + "key": "645f554abf018c6fe09311ece1789a9a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:34.090548+00:00", + "completedAt": "2023-11-29T20:18:34.096218+00:00" + }, + { + "id": "ad884f26-83a7-4b09-8080-d396b1b3b6c7", + "createdAt": "2023-11-29T20:18:34.096652+00:00", + "commandType": "waitForDuration", + "key": "51213175ea65a72ecb4249e970ce4cbb", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.096713+00:00", + "completedAt": "2023-11-29T20:18:34.096778+00:00" + }, + { + "id": "20bdb710-ed38-428b-ae8a-175d25609adb", + "createdAt": "2023-11-29T20:18:34.097557+00:00", + "commandType": "blowout", + "key": "f3e0716f748719c69d4f319f104c9090", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.097669+00:00", + "completedAt": "2023-11-29T20:18:34.099843+00:00" + }, + { + "id": "0edb641b-b80e-476a-b0f6-6d484afdeead", + "createdAt": "2023-11-29T20:18:34.100536+00:00", + "commandType": "moveToWell", + "key": "f2867a398485f44a309adf3663096b94", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.100604+00:00", + "completedAt": "2023-11-29T20:18:34.102137+00:00" + }, + { + "id": "d8b22f93-cd8b-4c94-b10d-6f51b69b8b08", + "createdAt": "2023-11-29T20:18:34.102674+00:00", + "commandType": "moveToWell", + "key": "89312f2cbc287f8e408171aba83b363d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.102730+00:00", + "completedAt": "2023-11-29T20:18:34.104220+00:00" + }, + { + "id": "505456bf-bfaf-4abc-a619-7ec411d1deb0", + "createdAt": "2023-11-29T20:18:34.104824+00:00", + "commandType": "moveToWell", + "key": "252fcb96000957296becc0b64a4f2ee4", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.104893+00:00", + "completedAt": "2023-11-29T20:18:34.106329+00:00" + }, + { + "id": "9ff71002-352c-4b76-abf5-f0765ac3910c", + "createdAt": "2023-11-29T20:18:34.106714+00:00", + "commandType": "dropTip", + "key": "ae3e75316ccebbb24446513dc482a933", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.106786+00:00", + "completedAt": "2023-11-29T20:18:34.113938+00:00" + }, + { + "id": "e2bbfb9e-d979-4143-9c50-8ec7d6825c18", + "createdAt": "2023-11-29T20:18:34.114645+00:00", + "commandType": "pickUpTip", + "key": "75da685dca776ccad9cdbf47f187a74f", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:34.114712+00:00", + "completedAt": "2023-11-29T20:18:34.125732+00:00" + }, + { + "id": "cae6eebe-9741-4265-ab97-d246d2a85e5a", + "createdAt": "2023-11-29T20:18:34.126361+00:00", + "commandType": "aspirate", + "key": "99e5631ba80bee3403440a6bbb6b57b1", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:34.126471+00:00", + "completedAt": "2023-11-29T20:18:34.131378+00:00" + }, + { + "id": "849400a0-7c77-47c0-b884-55e9503e7f11", + "createdAt": "2023-11-29T20:18:34.131937+00:00", + "commandType": "moveToWell", + "key": "f8fbe2e899ae9105d63dbb6c425be65f", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.132000+00:00", + "completedAt": "2023-11-29T20:18:34.133282+00:00" + }, + { + "id": "445e5966-2641-4a04-8563-17c4a78acd23", + "createdAt": "2023-11-29T20:18:34.133659+00:00", + "commandType": "moveToWell", + "key": "ae3fa4db9237ab5719c9f3d544ed67a8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.133713+00:00", + "completedAt": "2023-11-29T20:18:34.134857+00:00" + }, + { + "id": "537075d9-f7d3-43fc-9f2e-fb5b708fcb7c", + "createdAt": "2023-11-29T20:18:34.135573+00:00", + "commandType": "moveToWell", + "key": "741dd5ca2965b8ae9dc71f5e1ccdca9c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 209.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.135691+00:00", + "completedAt": "2023-11-29T20:18:34.137272+00:00" + }, + { + "id": "bd54472c-3390-42aa-9818-fa48d2c6f71b", + "createdAt": "2023-11-29T20:18:34.137803+00:00", + "commandType": "moveToWell", + "key": "9cc0b2650e07af87e3bca89862da68c0", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 201.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.137871+00:00", + "completedAt": "2023-11-29T20:18:34.139226+00:00" + }, + { + "id": "038b710d-7198-470b-83d2-7095ef6e593c", + "createdAt": "2023-11-29T20:18:34.140038+00:00", + "commandType": "dispense", + "key": "9a186b0c5399297fab9cd229268b58ad", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:34.140102+00:00", + "completedAt": "2023-11-29T20:18:34.145493+00:00" + }, + { + "id": "53e24d5a-dcf8-4605-bc41-a8d54bf7b293", + "createdAt": "2023-11-29T20:18:34.145943+00:00", + "commandType": "waitForDuration", + "key": "ee2d68085db4fa1eccca846db0b06ad9", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.146012+00:00", + "completedAt": "2023-11-29T20:18:34.146072+00:00" + }, + { + "id": "1ea8ffa9-dd44-4152-a7ac-b198779d1ed9", + "createdAt": "2023-11-29T20:18:34.146794+00:00", + "commandType": "blowout", + "key": "bee0457b97b4ddc720d33b74d92bb9c6", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.146868+00:00", + "completedAt": "2023-11-29T20:18:34.148958+00:00" + }, + { + "id": "b18dc655-bdf1-4fe3-a05f-2681b82b68c4", + "createdAt": "2023-11-29T20:18:34.149671+00:00", + "commandType": "moveToWell", + "key": "4fbfe8d09ebe22266d1af736f04648ac", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.149753+00:00", + "completedAt": "2023-11-29T20:18:34.151308+00:00" + }, + { + "id": "aa280cae-98d3-4e3e-988f-4061c9e2011a", + "createdAt": "2023-11-29T20:18:34.151913+00:00", + "commandType": "moveToWell", + "key": "d53f6aaf5713a331d5f95095333fbf7c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.151978+00:00", + "completedAt": "2023-11-29T20:18:34.153380+00:00" + }, + { + "id": "222c410d-64af-48a3-8d5e-058c6bd989c0", + "createdAt": "2023-11-29T20:18:34.154052+00:00", + "commandType": "moveToWell", + "key": "7e3f6cbf0fbc3259d0972446406ef081", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.154136+00:00", + "completedAt": "2023-11-29T20:18:34.155583+00:00" + }, + { + "id": "675cb498-c814-4c62-9d98-020e90c75f5d", + "createdAt": "2023-11-29T20:18:34.155970+00:00", + "commandType": "dropTip", + "key": "6def224ea7bf14325abf24a5cfc12978", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.156046+00:00", + "completedAt": "2023-11-29T20:18:34.162990+00:00" + }, + { + "id": "5b0fc320-d6f3-46bd-b409-4b8d0f2d6dcc", + "createdAt": "2023-11-29T20:18:34.163616+00:00", + "commandType": "pickUpTip", + "key": "2f4f2038848fa564f0ea3b1837fda3bd", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 223.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:34.163675+00:00", + "completedAt": "2023-11-29T20:18:34.174481+00:00" + }, + { + "id": "1a0b6202-3103-4c9d-95a3-e82d55110068", + "createdAt": "2023-11-29T20:18:34.175238+00:00", + "commandType": "aspirate", + "key": "c401fa456480a6b471f730be51579975", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:34.175376+00:00", + "completedAt": "2023-11-29T20:18:34.180976+00:00" + }, + { + "id": "65007a5b-49bc-4cb6-bdc7-b0c4b202c73a", + "createdAt": "2023-11-29T20:18:34.181551+00:00", + "commandType": "moveToWell", + "key": "1fa05b5555ce9d657fdaa3b00e8ebc27", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.181669+00:00", + "completedAt": "2023-11-29T20:18:34.183051+00:00" + }, + { + "id": "db2da127-8bf8-4bf2-ab17-eaeceabecd0d", + "createdAt": "2023-11-29T20:18:34.183570+00:00", + "commandType": "moveToWell", + "key": "75435f4fbc6753fed85a926187ec26c7", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.183658+00:00", + "completedAt": "2023-11-29T20:18:34.184970+00:00" + }, + { + "id": "e9b2eb20-fe4a-4fd2-a410-8d9fabbbcf0a", + "createdAt": "2023-11-29T20:18:34.185535+00:00", + "commandType": "moveToWell", + "key": "9b0c97e1ae29f1a2e553444c7e77958e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 209.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.185596+00:00", + "completedAt": "2023-11-29T20:18:34.186859+00:00" + }, + { + "id": "e936530f-7f7c-4b05-ab4e-0fb20ef9cfce", + "createdAt": "2023-11-29T20:18:34.187323+00:00", + "commandType": "moveToWell", + "key": "8b47a109d51b6e6b1c91253cff87bd72", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 201.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.187390+00:00", + "completedAt": "2023-11-29T20:18:34.188579+00:00" + }, + { + "id": "765dd338-7fd9-45d5-8c31-546a20454cfb", + "createdAt": "2023-11-29T20:18:34.189292+00:00", + "commandType": "dispense", + "key": "82087e4a15242669d15a95e0d256be64", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:34.189351+00:00", + "completedAt": "2023-11-29T20:18:34.195005+00:00" + }, + { + "id": "6f45bfe8-3f28-466b-a03f-b941370226e0", + "createdAt": "2023-11-29T20:18:34.195533+00:00", + "commandType": "waitForDuration", + "key": "9f90df2263f6c186a8fdc1d44327c00e", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.195637+00:00", + "completedAt": "2023-11-29T20:18:34.195713+00:00" + }, + { + "id": "bca35dbd-9822-494b-9bf2-a6bf330fa96d", + "createdAt": "2023-11-29T20:18:34.196559+00:00", + "commandType": "blowout", + "key": "e7376b693b5645b774622d3115a46cc7", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.196634+00:00", + "completedAt": "2023-11-29T20:18:34.198745+00:00" + }, + { + "id": "170db0ee-c210-4ed8-8c6e-cd4bc01eca18", + "createdAt": "2023-11-29T20:18:34.199517+00:00", + "commandType": "moveToWell", + "key": "c8969e3d4de822e50010e2e76eb3cb80", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.199678+00:00", + "completedAt": "2023-11-29T20:18:34.201272+00:00" + }, + { + "id": "e220a2a6-49aa-48c2-af44-9efd6bf0a98e", + "createdAt": "2023-11-29T20:18:34.201958+00:00", + "commandType": "moveToWell", + "key": "ea82bd9a03201e6e8c89bb12d6969a49", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.202022+00:00", + "completedAt": "2023-11-29T20:18:34.203308+00:00" + }, + { + "id": "7e4018a8-f789-403f-a0a3-d2c3661d52b7", + "createdAt": "2023-11-29T20:18:34.203774+00:00", + "commandType": "moveToWell", + "key": "bb9647785ad8c62887aeec3d056a035b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.203856+00:00", + "completedAt": "2023-11-29T20:18:34.205108+00:00" + }, + { + "id": "0bce6d65-03c0-4222-87b8-bfed3763fb3f", + "createdAt": "2023-11-29T20:18:34.205425+00:00", + "commandType": "dropTip", + "key": "63352db145ff4b40dfa51bcc57fee946", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.205488+00:00", + "completedAt": "2023-11-29T20:18:34.212909+00:00" + }, + { + "id": "3351abfc-454f-4891-895f-84ace51c6d0d", + "createdAt": "2023-11-29T20:18:34.213431+00:00", + "commandType": "waitForDuration", + "key": "a0930fc952a251a36aff5bd1e7cd8c8f", + "status": "succeeded", + "params": { "seconds": 30.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.213523+00:00", + "completedAt": "2023-11-29T20:18:34.213588+00:00" + }, + { + "id": "7928edb0-f8ae-44da-be64-d1d3ccc6c090", + "createdAt": "2023-11-29T20:18:34.214196+00:00", + "commandType": "custom", + "key": "a96cdf450d6fd1caea434b4171f74bf8", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Remove ETOH Wash" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.214258+00:00", + "completedAt": "2023-11-29T20:18:34.214308+00:00" + }, + { + "id": "4be9c5ca-6c4c-4186-9cd4-5ec28c253427", + "createdAt": "2023-11-29T20:18:34.214928+00:00", + "commandType": "pickUpTip", + "key": "b305061df778ba288c36dcf11703faa3", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 232.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:34.214995+00:00", + "completedAt": "2023-11-29T20:18:34.225226+00:00" + }, + { + "id": "7422a9c8-91e2-4b20-9381-fc3e078388b0", + "createdAt": "2023-11-29T20:18:34.226215+00:00", + "commandType": "moveToWell", + "key": "0d17280b94d7e1b2ddc6b1fd8c26dd2e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:34.226311+00:00", + "completedAt": "2023-11-29T20:18:34.230942+00:00" + }, + { + "id": "d3917a76-296e-4e80-a78a-363978176119", + "createdAt": "2023-11-29T20:18:34.231748+00:00", + "commandType": "aspirate", + "key": "e47d114a67da69978c3d703cfa06424a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:34.231815+00:00", + "completedAt": "2023-11-29T20:18:34.233995+00:00" + }, + { + "id": "ad011791-b009-4387-b4c1-1bfa7a680a12", + "createdAt": "2023-11-29T20:18:34.234439+00:00", + "commandType": "waitForDuration", + "key": "1c44ea0e18f90e98af9da2164ee8e9c0", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.234513+00:00", + "completedAt": "2023-11-29T20:18:34.234577+00:00" + }, + { + "id": "f21ffa02-6c78-43f8-8c74-11fdeda38f94", + "createdAt": "2023-11-29T20:18:34.235140+00:00", + "commandType": "moveToWell", + "key": "3fb96a73b5a6033435ba006eb0fcdbbf", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:34.235225+00:00", + "completedAt": "2023-11-29T20:18:34.236675+00:00" + }, + { + "id": "0c83ffc0-4dcc-43d5-abc0-add68490c52a", + "createdAt": "2023-11-29T20:18:34.237460+00:00", + "commandType": "aspirate", + "key": "7e218793f55f20bb6a3a52baacbab242", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:34.237574+00:00", + "completedAt": "2023-11-29T20:18:34.239920+00:00" + }, + { + "id": "23333036-9374-43e7-91e9-d4364620c915", + "createdAt": "2023-11-29T20:18:34.240712+00:00", + "commandType": "moveToWell", + "key": "fbbced252f42c12a46531ebdaa754e32", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.240816+00:00", + "completedAt": "2023-11-29T20:18:34.242283+00:00" + }, + { + "id": "26bb3249-8847-4787-8a60-ac4508829cb3", + "createdAt": "2023-11-29T20:18:34.243114+00:00", + "commandType": "touchTip", + "key": "b91a9911d47ca1893fe03d10520e8218", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.243189+00:00", + "completedAt": "2023-11-29T20:18:34.249922+00:00" + }, + { + "id": "0c22f357-9a67-4faa-8dd7-257879d4e403", + "createdAt": "2023-11-29T20:18:34.250582+00:00", + "commandType": "dispense", + "key": "5f63b25e355985afc998748f53f9a3be", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:34.250649+00:00", + "completedAt": "2023-11-29T20:18:34.255893+00:00" + }, + { + "id": "45268f70-c009-4018-a124-e208f2fe2ff3", + "createdAt": "2023-11-29T20:18:34.256218+00:00", + "commandType": "waitForDuration", + "key": "89471c388a4de21169a7882be97cf3db", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.256284+00:00", + "completedAt": "2023-11-29T20:18:34.256343+00:00" + }, + { + "id": "d2dc70cd-4c63-4496-9bfc-b814cf6414bd", + "createdAt": "2023-11-29T20:18:34.256857+00:00", + "commandType": "blowout", + "key": "9218f8ecb7a4fcffd847c01ca5d7b80f", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.256919+00:00", + "completedAt": "2023-11-29T20:18:34.258866+00:00" + }, + { + "id": "dc15d693-8307-40bd-8e53-badb4197c062", + "createdAt": "2023-11-29T20:18:34.259423+00:00", + "commandType": "moveToWell", + "key": "430fe5e2ca00d43f4b2ea4ebe3105380", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 272.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.259527+00:00", + "completedAt": "2023-11-29T20:18:34.261042+00:00" + }, + { + "id": "e68c0ecc-62ce-4375-ba59-c8b4f8c6b41a", + "createdAt": "2023-11-29T20:18:34.261532+00:00", + "commandType": "moveToWell", + "key": "95cc65856c0de7ae0c9d57c671a99e12", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 264.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.261592+00:00", + "completedAt": "2023-11-29T20:18:34.262943+00:00" + }, + { + "id": "ae6b9e2b-f19a-4b0c-a3ca-64d4e48fc22b", + "createdAt": "2023-11-29T20:18:34.263415+00:00", + "commandType": "moveToWell", + "key": "5877aba86804ad97c013c5e107162d05", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.263483+00:00", + "completedAt": "2023-11-29T20:18:34.264903+00:00" + }, + { + "id": "c06264fa-c2bf-4c1f-90a1-2c7151f1b2d4", + "createdAt": "2023-11-29T20:18:34.265586+00:00", + "commandType": "moveToWell", + "key": "dcc73f079d4ea7529d22ddcd2443a76e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.265671+00:00", + "completedAt": "2023-11-29T20:18:34.267117+00:00" + }, + { + "id": "7c90fd65-743f-489a-a3a6-dbf366d8a984", + "createdAt": "2023-11-29T20:18:34.267500+00:00", + "commandType": "dropTip", + "key": "7605773c48cc78560858ec17cbf2f689", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.267565+00:00", + "completedAt": "2023-11-29T20:18:34.273898+00:00" + }, + { + "id": "7d09561b-bbb8-476b-80cd-56a2be05e509", + "createdAt": "2023-11-29T20:18:34.274687+00:00", + "commandType": "pickUpTip", + "key": "06da82ce771c465fd723fd91f92d1cc4", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 241.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:34.274771+00:00", + "completedAt": "2023-11-29T20:18:34.285601+00:00" + }, + { + "id": "aff38a2e-819c-4257-a283-fe09aadbf90c", + "createdAt": "2023-11-29T20:18:34.286384+00:00", + "commandType": "moveToWell", + "key": "de6f8750455b089754447234dfb24e3e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:34.286541+00:00", + "completedAt": "2023-11-29T20:18:34.291797+00:00" + }, + { + "id": "1879d6d5-9a18-4506-8583-45c5721ed410", + "createdAt": "2023-11-29T20:18:34.292954+00:00", + "commandType": "aspirate", + "key": "4d3cb9e31fb6ffa069476f56dfd694d1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:34.293167+00:00", + "completedAt": "2023-11-29T20:18:34.296224+00:00" + }, + { + "id": "426b7839-5282-49ab-8619-3a8a0bdebb7c", + "createdAt": "2023-11-29T20:18:34.296640+00:00", + "commandType": "waitForDuration", + "key": "b3d6934f99e3275627b4b1fe4ab78bd0", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.296747+00:00", + "completedAt": "2023-11-29T20:18:34.296861+00:00" + }, + { + "id": "007e4962-5b79-42af-99b7-36b83122788b", + "createdAt": "2023-11-29T20:18:34.297512+00:00", + "commandType": "moveToWell", + "key": "6a481b8830c528652a27a383f48ab92d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:34.297641+00:00", + "completedAt": "2023-11-29T20:18:34.299261+00:00" + }, + { + "id": "a6edc649-ffd9-4897-8899-29f0390395f4", + "createdAt": "2023-11-29T20:18:34.300194+00:00", + "commandType": "aspirate", + "key": "34e209a2fcee68b4a8f22c12d21340f2", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:34.300346+00:00", + "completedAt": "2023-11-29T20:18:34.302664+00:00" + }, + { + "id": "e3383890-14e5-4d19-89e8-1d00e63055db", + "createdAt": "2023-11-29T20:18:34.303349+00:00", + "commandType": "moveToWell", + "key": "fe5094e1d8837eeab717c6b178b3a32a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.303405+00:00", + "completedAt": "2023-11-29T20:18:34.304632+00:00" + }, + { + "id": "24c377dd-b240-431f-8565-4855e12388ee", + "createdAt": "2023-11-29T20:18:34.305148+00:00", + "commandType": "touchTip", + "key": "b2f1eaf99dbc9e70b8c2efee1159c822", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.305204+00:00", + "completedAt": "2023-11-29T20:18:34.312065+00:00" + }, + { + "id": "bdeff978-e7bc-4f79-b19a-faba6bd568e8", + "createdAt": "2023-11-29T20:18:34.312690+00:00", + "commandType": "dispense", + "key": "5bd444952e6fd9eb873bfda27802dbcd", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:34.312751+00:00", + "completedAt": "2023-11-29T20:18:34.318186+00:00" + }, + { + "id": "25d30033-4aed-486b-b336-e49e41742f6d", + "createdAt": "2023-11-29T20:18:34.318751+00:00", + "commandType": "waitForDuration", + "key": "5098fd25396213f5b949ac65c4696b91", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.318871+00:00", + "completedAt": "2023-11-29T20:18:34.318975+00:00" + }, + { + "id": "029dd878-ecfc-4573-9d10-9ffd5cb182c8", + "createdAt": "2023-11-29T20:18:34.319587+00:00", + "commandType": "blowout", + "key": "92833bdd0cc11c3de6c84688b4e36713", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.319652+00:00", + "completedAt": "2023-11-29T20:18:34.321669+00:00" + }, + { + "id": "29ab5ee8-da40-43aa-b027-e3db478615f3", + "createdAt": "2023-11-29T20:18:34.322321+00:00", + "commandType": "moveToWell", + "key": "7340a7e3f4f1ab77c2480c1a9af3c7eb", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 272.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.322382+00:00", + "completedAt": "2023-11-29T20:18:34.323723+00:00" + }, + { + "id": "a9bd1000-d857-44f3-9788-1703d1949c35", + "createdAt": "2023-11-29T20:18:34.324370+00:00", + "commandType": "moveToWell", + "key": "7cf7fa411003ed754a2989445f08c532", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 264.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.324440+00:00", + "completedAt": "2023-11-29T20:18:34.326144+00:00" + }, + { + "id": "f9393da9-e04e-40b3-8f42-ed0a018024e0", + "createdAt": "2023-11-29T20:18:34.327077+00:00", + "commandType": "moveToWell", + "key": "f3257eb7ecded6c5c042bb38954d65e5", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.327145+00:00", + "completedAt": "2023-11-29T20:18:34.328576+00:00" + }, + { + "id": "e18fd0af-8e93-4f22-a93f-e3de6d7e684c", + "createdAt": "2023-11-29T20:18:34.329026+00:00", + "commandType": "moveToWell", + "key": "a131812b93e42067128099df078002fc", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.329118+00:00", + "completedAt": "2023-11-29T20:18:34.330463+00:00" + }, + { + "id": "18dac7c4-8e9f-4b0e-b27a-9a48b0103ae1", + "createdAt": "2023-11-29T20:18:34.330935+00:00", + "commandType": "dropTip", + "key": "a9ddbc3bb8e1d89f24ba039a4abaa15d", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.331014+00:00", + "completedAt": "2023-11-29T20:18:34.337407+00:00" + }, + { + "id": "8196d555-90b1-47d4-83e1-244f3b03ff8a", + "createdAt": "2023-11-29T20:18:34.338225+00:00", + "commandType": "pickUpTip", + "key": "9623579da101cc8af0ab03f2cc868060", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 250.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:34.338319+00:00", + "completedAt": "2023-11-29T20:18:34.349740+00:00" + }, + { + "id": "7ccc1a09-49cb-4cbe-99ac-15d1726a51b5", + "createdAt": "2023-11-29T20:18:34.350539+00:00", + "commandType": "moveToWell", + "key": "e09dc7769b1a03afd21876173dd5cdad", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:34.350605+00:00", + "completedAt": "2023-11-29T20:18:34.355296+00:00" + }, + { + "id": "22013e59-47fe-4337-8c79-40cf903b2bbb", + "createdAt": "2023-11-29T20:18:34.356057+00:00", + "commandType": "aspirate", + "key": "b629b9beacc9af69e9c1b6dc5d77ec3f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:34.356123+00:00", + "completedAt": "2023-11-29T20:18:34.358234+00:00" + }, + { + "id": "205ef285-25cc-418d-b215-b2582be2f78e", + "createdAt": "2023-11-29T20:18:34.358555+00:00", + "commandType": "waitForDuration", + "key": "f8df7761115e68b5e294b5f3a24eadd2", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.358614+00:00", + "completedAt": "2023-11-29T20:18:34.358674+00:00" + }, + { + "id": "0bebd192-b025-4997-b4bb-0125fb10d6f6", + "createdAt": "2023-11-29T20:18:34.359385+00:00", + "commandType": "moveToWell", + "key": "364fa7e0d56d4ac8e95fecd0e4c5fda2", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:34.359446+00:00", + "completedAt": "2023-11-29T20:18:34.360843+00:00" + }, + { + "id": "98f2cfa4-dbfb-428c-9b96-9465a6102288", + "createdAt": "2023-11-29T20:18:34.361715+00:00", + "commandType": "aspirate", + "key": "75fb115f753b968961273b0e36aa3ef6", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:34.361813+00:00", + "completedAt": "2023-11-29T20:18:34.364021+00:00" + }, + { + "id": "60c15baa-875a-4ef1-b4b7-52c9d510cbef", + "createdAt": "2023-11-29T20:18:34.364780+00:00", + "commandType": "moveToWell", + "key": "94ac80da66d9553c1757bd1a49e6e2ef", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.364845+00:00", + "completedAt": "2023-11-29T20:18:34.366162+00:00" + }, + { + "id": "25761da2-8830-4e79-8ee9-371f74819a54", + "createdAt": "2023-11-29T20:18:34.366840+00:00", + "commandType": "touchTip", + "key": "8c5657b31c5178b44b6ca942fb4f04c3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.366912+00:00", + "completedAt": "2023-11-29T20:18:34.373673+00:00" + }, + { + "id": "ea453e3d-b641-4065-84bb-aa5b3586141e", + "createdAt": "2023-11-29T20:18:34.374396+00:00", + "commandType": "dispense", + "key": "e5a01d4bf47e976c1daf2653ff698cf5", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:34.374472+00:00", + "completedAt": "2023-11-29T20:18:34.380069+00:00" + }, + { + "id": "c2531da2-7f70-490b-9508-0852445b1273", + "createdAt": "2023-11-29T20:18:34.380498+00:00", + "commandType": "waitForDuration", + "key": "7375d355d225a451e62967ac6b334ba5", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.380625+00:00", + "completedAt": "2023-11-29T20:18:34.380705+00:00" + }, + { + "id": "5fba2dd8-b0c0-4e13-801f-c848ff823408", + "createdAt": "2023-11-29T20:18:34.381308+00:00", + "commandType": "blowout", + "key": "7375ae5b856e4addfba853a78f77903b", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.381419+00:00", + "completedAt": "2023-11-29T20:18:34.383526+00:00" + }, + { + "id": "fecbd656-2d6c-465e-98d0-90f5680677cd", + "createdAt": "2023-11-29T20:18:34.384216+00:00", + "commandType": "moveToWell", + "key": "99be6fc85ad0a96f8a62478892d8789d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 272.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.384285+00:00", + "completedAt": "2023-11-29T20:18:34.385683+00:00" + }, + { + "id": "3aafb7b8-d6ea-4266-98fd-773ce1e90bfd", + "createdAt": "2023-11-29T20:18:34.386269+00:00", + "commandType": "moveToWell", + "key": "3d06d69606881addc48899c550cad603", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 264.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.386360+00:00", + "completedAt": "2023-11-29T20:18:34.387709+00:00" + }, + { + "id": "b28a6376-c3f9-4bc5-9f43-e5365cfba134", + "createdAt": "2023-11-29T20:18:34.388286+00:00", + "commandType": "moveToWell", + "key": "e7693a98ff5d9cb62b955811088181d5", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.388369+00:00", + "completedAt": "2023-11-29T20:18:34.389591+00:00" + }, + { + "id": "b4c4b0c7-8e16-4cfc-873d-72eb0c71d69c", + "createdAt": "2023-11-29T20:18:34.389945+00:00", + "commandType": "moveToWell", + "key": "599b3de85a648997e3dbb7f4ff76b4d8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:34.390031+00:00", + "completedAt": "2023-11-29T20:18:34.391465+00:00" + }, + { + "id": "b07565bd-41dd-4737-912b-513fe559aa51", + "createdAt": "2023-11-29T20:18:34.391865+00:00", + "commandType": "dropTip", + "key": "b9f8e623fae1b1c0c1762c3fa7d24ad3", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.391924+00:00", + "completedAt": "2023-11-29T20:18:34.397915+00:00" + }, + { + "id": "af2a8e8e-1f3c-4c77-9d8d-0ecc6e3ad324", + "createdAt": "2023-11-29T20:18:34.398460+00:00", + "commandType": "waitForDuration", + "key": "07972d3f9193e887d6a16548b1082ee3", + "status": "succeeded", + "params": { "seconds": 60.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.398562+00:00", + "completedAt": "2023-11-29T20:18:34.398640+00:00" + }, + { + "id": "dc3a4197-b7a4-48fe-842e-4167878ffccb", + "createdAt": "2023-11-29T20:18:34.399255+00:00", + "commandType": "custom", + "key": "0f0c91188caa08e91a1f326943ea7240", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Removing Residual Wash" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.399321+00:00", + "completedAt": "2023-11-29T20:18:34.399375+00:00" + }, + { + "id": "c88baa47-38bf-40d0-aeb8-6e74e1737e69", + "createdAt": "2023-11-29T20:18:34.400034+00:00", + "commandType": "pickUpTip", + "key": "c2f6ad43a9563c060d739016b31c6167", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:34.400141+00:00", + "completedAt": "2023-11-29T20:18:34.411388+00:00" + }, + { + "id": "a41697f0-93cc-430a-950f-fa1f74a64ddf", + "createdAt": "2023-11-29T20:18:34.412153+00:00", + "commandType": "moveToWell", + "key": "4b3f4de07250c3589d6bdbac8b49b791", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:34.412232+00:00", + "completedAt": "2023-11-29T20:18:34.416784+00:00" + }, + { + "id": "d3049bd1-3eb1-479d-8762-e90b3b87416f", + "createdAt": "2023-11-29T20:18:34.417638+00:00", + "commandType": "aspirate", + "key": "5217b044e5fd18e6eeeeed726dfd0202", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 40.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:34.417708+00:00", + "completedAt": "2023-11-29T20:18:34.419959+00:00" + }, + { + "id": "f648c780-65f2-4705-89b4-f5bdf98cb75b", + "createdAt": "2023-11-29T20:18:34.420346+00:00", + "commandType": "dropTip", + "key": "0a9e547130736c72563d90e871594c4d", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.420472+00:00", + "completedAt": "2023-11-29T20:18:34.428744+00:00" + }, + { + "id": "2ece9ff6-7d64-4cd7-aac2-c2471381a4e7", + "createdAt": "2023-11-29T20:18:34.429563+00:00", + "commandType": "pickUpTip", + "key": "dc4f65ffa2d899c4bf8dea551d63f3ca", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:34.429686+00:00", + "completedAt": "2023-11-29T20:18:34.440786+00:00" + }, + { + "id": "2ecf77df-5a0b-48ad-92e1-193c3b6d46df", + "createdAt": "2023-11-29T20:18:34.441569+00:00", + "commandType": "moveToWell", + "key": "195b4f35254050eba727ee70ef9f33b5", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:34.441686+00:00", + "completedAt": "2023-11-29T20:18:34.447039+00:00" + }, + { + "id": "f7672e6c-4320-4b56-b124-570b76737bd4", + "createdAt": "2023-11-29T20:18:34.447943+00:00", + "commandType": "aspirate", + "key": "37a695732fb32fcf75ec905a8e2da1a6", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 40.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:34.448013+00:00", + "completedAt": "2023-11-29T20:18:34.450187+00:00" + }, + { + "id": "d4eaa105-1085-4982-bd05-dd4960e7acc8", + "createdAt": "2023-11-29T20:18:34.450665+00:00", + "commandType": "dropTip", + "key": "7b8bade4555268c4c23a03036a199498", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.450743+00:00", + "completedAt": "2023-11-29T20:18:34.458767+00:00" + }, + { + "id": "ab0581ac-f21a-4414-8139-81efd828251a", + "createdAt": "2023-11-29T20:18:34.459576+00:00", + "commandType": "pickUpTip", + "key": "3b13d37e19c2d3060e1dc7b51aba7669", + "status": "succeeded", + "params": { + "labwareId": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:34.459686+00:00", + "completedAt": "2023-11-29T20:18:34.470901+00:00" + }, + { + "id": "c1b1c8ad-c830-43be-9887-c3a8ed84a8a0", + "createdAt": "2023-11-29T20:18:34.471673+00:00", + "commandType": "moveToWell", + "key": "de5eb1e2080f9f9dd49fb75be691da28", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:34.471756+00:00", + "completedAt": "2023-11-29T20:18:34.476600+00:00" + }, + { + "id": "5ebf7f3b-b40a-426e-99ca-5af3e3e25991", + "createdAt": "2023-11-29T20:18:34.477541+00:00", + "commandType": "aspirate", + "key": "ad4f7a35c2806a72790194a1ffe4ef72", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 40.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:34.477606+00:00", + "completedAt": "2023-11-29T20:18:34.479977+00:00" + }, + { + "id": "0a895f3e-49aa-4765-925b-626df5e27ef6", + "createdAt": "2023-11-29T20:18:34.480380+00:00", + "commandType": "dropTip", + "key": "3d4584afd8a4206366250e13db42363f", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.480463+00:00", + "completedAt": "2023-11-29T20:18:34.488731+00:00" + }, + { + "id": "37050400-3796-4460-bf8d-fdb4c59e465c", + "createdAt": "2023-11-29T20:18:34.489099+00:00", + "commandType": "waitForDuration", + "key": "1cec59343fff33512f63e9bd4dd3548a", + "status": "succeeded", + "params": { "seconds": 30.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.489158+00:00", + "completedAt": "2023-11-29T20:18:34.489218+00:00" + }, + { + "id": "9fba678d-5aa7-40cf-8801-0578986e4ef3", + "createdAt": "2023-11-29T20:18:34.489409+00:00", + "commandType": "heaterShaker/openLabwareLatch", + "key": "df9f1fe9cd151c46241ec5809a33b26a", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:34.489458+00:00", + "completedAt": "2023-11-29T20:18:34.489546+00:00" + }, + { + "id": "ea5ae293-85a2-45f6-90f5-10d3412a8fd2", + "createdAt": "2023-11-29T20:18:34.489786+00:00", + "commandType": "moveLabware", + "key": "beeb4b1232afa0294e48b6cd5e244d42", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "newLocation": { "labwareId": "3787af65-0305-4b08-bf02-a2c6596a10e5" }, + "strategy": "usingGripper", + "pickUpOffset": { "x": 0.0, "y": -2.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": -2.0, "z": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.489838+00:00", + "completedAt": "2023-11-29T20:18:34.490047+00:00" + }, + { + "id": "e83e2c0d-6f80-415f-8446-9e075d1cc995", + "createdAt": "2023-11-29T20:18:34.490330+00:00", + "commandType": "heaterShaker/closeLabwareLatch", + "key": "7d690a4611b8abe2db19a0b4c242a9b1", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.490452+00:00", + "completedAt": "2023-11-29T20:18:34.490547+00:00" + }, + { + "id": "871ecfc3-b708-4ee2-9dfd-3c3803b3d6de", + "createdAt": "2023-11-29T20:18:34.491193+00:00", + "commandType": "custom", + "key": "3a6351eacc5182112147534d8b47b4ae", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Adding RSB" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.491267+00:00", + "completedAt": "2023-11-29T20:18:34.491333+00:00" + }, + { + "id": "6cfc8bd4-ccca-4790-9ba6-65cf6d6b624b", + "createdAt": "2023-11-29T20:18:34.491883+00:00", + "commandType": "pickUpTip", + "key": "41cb323723db177293130f2a22818133", + "status": "succeeded", + "params": { + "labwareId": "e5b35230-f2df-4afa-b7c1-3b15c174733f", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 259.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:34.491949+00:00", + "completedAt": "2023-11-29T20:18:34.503839+00:00" + }, + { + "id": "78ed1052-7eb9-4dbe-b079-d36bd3691e27", + "createdAt": "2023-11-29T20:18:34.504593+00:00", + "commandType": "aspirate", + "key": "7a1712353f798a908ba1a2d84168045a", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 2.0, + "volume": 24.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 42.78, "z": 5.55 }, + "volume": 24.0 + }, + "startedAt": "2023-11-29T20:18:34.504669+00:00", + "completedAt": "2023-11-29T20:18:34.510030+00:00" + }, + { + "id": "4383f157-b9ce-435c-896a-1344631a4396", + "createdAt": "2023-11-29T20:18:34.510831+00:00", + "commandType": "dispense", + "key": "5d179ce76d363e077363e21518a54442", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 2.0, + "volume": 2.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 42.78, "z": 5.55 }, + "volume": 2.0 + }, + "startedAt": "2023-11-29T20:18:34.510900+00:00", + "completedAt": "2023-11-29T20:18:34.512941+00:00" + }, + { + "id": "7c630fab-d1f2-4cba-a152-9773fb1a4918", + "createdAt": "2023-11-29T20:18:34.513743+00:00", + "commandType": "moveToWell", + "key": "27372954bca86436a4869f69140bc61b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 23.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:34.513827+00:00", + "completedAt": "2023-11-29T20:18:34.517963+00:00" + }, + { + "id": "e117481c-8996-409d-b7e4-dcec08316619", + "createdAt": "2023-11-29T20:18:34.519221+00:00", + "commandType": "dispense", + "key": "57096fb342a8699949faa52e26a8efd0", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "flowRate": 4.0, + "volume": 22.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 23.90000000000001 }, + "volume": 22.0 + }, + "startedAt": "2023-11-29T20:18:34.519301+00:00", + "completedAt": "2023-11-29T20:18:34.521469+00:00" + }, + { + "id": "bc4ea48d-c1e4-46b3-a58a-437e5d49a6d1", + "createdAt": "2023-11-29T20:18:34.522236+00:00", + "commandType": "blowout", + "key": "5ded8365dedb6590ddc67cf943d857a9", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 4.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 41.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.522309+00:00", + "completedAt": "2023-11-29T20:18:34.525348+00:00" + }, + { + "id": "4efcec6d-2399-4501-934f-3a9dbcf875ac", + "createdAt": "2023-11-29T20:18:34.525893+00:00", + "commandType": "dropTip", + "key": "a6ee46eca762ab2d576ddff0d22168be", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.526086+00:00", + "completedAt": "2023-11-29T20:18:34.533810+00:00" + }, + { + "id": "32eb04a5-5f72-40f2-b7ca-5da0a087402e", + "createdAt": "2023-11-29T20:18:34.534554+00:00", + "commandType": "pickUpTip", + "key": "725f80eba9e62c8bffd512fc1487c7d8", + "status": "succeeded", + "params": { + "labwareId": "e5b35230-f2df-4afa-b7c1-3b15c174733f", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 268.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:34.534666+00:00", + "completedAt": "2023-11-29T20:18:34.546008+00:00" + }, + { + "id": "523b1c8f-e3af-4f3d-8396-2852c2821b9d", + "createdAt": "2023-11-29T20:18:34.546662+00:00", + "commandType": "aspirate", + "key": "5b683611cf8357c209b13d64d09fcb52", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 2.0, + "volume": 24.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 42.78, "z": 5.55 }, + "volume": 24.0 + }, + "startedAt": "2023-11-29T20:18:34.546754+00:00", + "completedAt": "2023-11-29T20:18:34.552408+00:00" + }, + { + "id": "199f2f14-80d3-4434-a549-288b1370279a", + "createdAt": "2023-11-29T20:18:34.553236+00:00", + "commandType": "dispense", + "key": "4f8765b769f63476809e5be989254324", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 2.0, + "volume": 2.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 42.78, "z": 5.55 }, + "volume": 2.0 + }, + "startedAt": "2023-11-29T20:18:34.553306+00:00", + "completedAt": "2023-11-29T20:18:34.555402+00:00" + }, + { + "id": "bd3c08ba-4b40-40dd-bed1-7a0ebabde3e4", + "createdAt": "2023-11-29T20:18:34.556076+00:00", + "commandType": "moveToWell", + "key": "4fc0d1ca00ed3c03cb73be27c8c60514", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 23.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:34.556147+00:00", + "completedAt": "2023-11-29T20:18:34.560199+00:00" + }, + { + "id": "3b936ec6-3bc2-45e2-984b-badbce32da3a", + "createdAt": "2023-11-29T20:18:34.561595+00:00", + "commandType": "dispense", + "key": "56f1ec97946cac7b14e12db0c2527d8f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "flowRate": 4.0, + "volume": 22.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 23.90000000000001 }, + "volume": 22.0 + }, + "startedAt": "2023-11-29T20:18:34.561710+00:00", + "completedAt": "2023-11-29T20:18:34.564212+00:00" + }, + { + "id": "ebe87d42-b73e-41e4-b812-104fb9a6b551", + "createdAt": "2023-11-29T20:18:34.564892+00:00", + "commandType": "blowout", + "key": "765933158e3bd140b867180d232ad6b1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 4.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 50.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.564959+00:00", + "completedAt": "2023-11-29T20:18:34.568157+00:00" + }, + { + "id": "8e9ed121-b879-4306-88e4-7be2e1e170b8", + "createdAt": "2023-11-29T20:18:34.568689+00:00", + "commandType": "dropTip", + "key": "6f59c1d680416ea45138105e690f4af4", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 509.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.568795+00:00", + "completedAt": "2023-11-29T20:18:34.576328+00:00" + }, + { + "id": "3bd047dc-ca32-45d4-84ce-77505017121c", + "createdAt": "2023-11-29T20:18:34.577111+00:00", + "commandType": "pickUpTip", + "key": "a97a5a42e58a00504358b54815f70ab7", + "status": "succeeded", + "params": { + "labwareId": "e5b35230-f2df-4afa-b7c1-3b15c174733f", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 277.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:34.577204+00:00", + "completedAt": "2023-11-29T20:18:34.588468+00:00" + }, + { + "id": "ffdb7261-3bff-4b51-854e-2259c6ac2490", + "createdAt": "2023-11-29T20:18:34.589112+00:00", + "commandType": "aspirate", + "key": "c53e7449c2f5f0e42614672479ed9b05", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 2.0, + "volume": 24.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 42.78, "z": 5.55 }, + "volume": 24.0 + }, + "startedAt": "2023-11-29T20:18:34.589225+00:00", + "completedAt": "2023-11-29T20:18:34.594886+00:00" + }, + { + "id": "3f7042aa-89ce-4d48-aad2-fa018f83d1a1", + "createdAt": "2023-11-29T20:18:34.595837+00:00", + "commandType": "dispense", + "key": "20716195634f35070eb7e8b687cc6f52", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 2.0, + "volume": 2.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 42.78, "z": 5.55 }, + "volume": 2.0 + }, + "startedAt": "2023-11-29T20:18:34.595917+00:00", + "completedAt": "2023-11-29T20:18:34.597944+00:00" + }, + { + "id": "4dcec0fc-7919-4a74-aeb8-3e1641b83cf8", + "createdAt": "2023-11-29T20:18:34.598689+00:00", + "commandType": "moveToWell", + "key": "bc7a433bda22b9f347cf82e9d5f84ac3", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 23.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:34.598756+00:00", + "completedAt": "2023-11-29T20:18:34.602909+00:00" + }, + { + "id": "b3c30db5-e26d-45c9-8e2b-268d5ff62af3", + "createdAt": "2023-11-29T20:18:34.604009+00:00", + "commandType": "dispense", + "key": "252b87cf1a3037284aaeff3ad9b654c1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "flowRate": 4.0, + "volume": 22.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 23.90000000000001 }, + "volume": 22.0 + }, + "startedAt": "2023-11-29T20:18:34.604103+00:00", + "completedAt": "2023-11-29T20:18:34.606300+00:00" + }, + { + "id": "feafebf5-317b-4bf8-98bc-549dd85df30b", + "createdAt": "2023-11-29T20:18:34.607251+00:00", + "commandType": "blowout", + "key": "b53937f9caab412dc479f9d7ffd10b09", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 4.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 59.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:34.607350+00:00", + "completedAt": "2023-11-29T20:18:34.610508+00:00" + }, + { + "id": "1114f7a0-fda8-46e9-9d6c-3a5ce3804ff4", + "createdAt": "2023-11-29T20:18:34.611016+00:00", + "commandType": "dropTip", + "key": "41ea15c2c90cbb16c42e62cd307c32c8", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.611143+00:00", + "completedAt": "2023-11-29T20:18:34.618917+00:00" + }, + { + "id": "dcdcb44e-c22a-4875-9b95-5d9f67002985", + "createdAt": "2023-11-29T20:18:34.619449+00:00", + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "key": "33cb50e6c9f539d2176744e1d20a6cd5", + "status": "succeeded", + "params": { + "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5", + "rpm": 2000.0 + }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:34.619518+00:00", + "completedAt": "2023-11-29T20:18:34.619664+00:00" + }, + { + "id": "4ded86f9-cd83-432a-906d-b736fe9dbc5f", + "createdAt": "2023-11-29T20:18:34.620032+00:00", + "commandType": "waitForDuration", + "key": "be58c80007a8c41ffbeb498ce1bebe94", + "status": "succeeded", + "params": { "seconds": 300.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.620091+00:00", + "completedAt": "2023-11-29T20:18:34.620148+00:00" + }, + { + "id": "599dc4ac-d6bb-4929-8e0e-af1b0c2dfdca", + "createdAt": "2023-11-29T20:18:34.620355+00:00", + "commandType": "heaterShaker/deactivateShaker", + "key": "5e601a47cd851cb0af26b415100e93c3", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.620404+00:00", + "completedAt": "2023-11-29T20:18:34.620452+00:00" + }, + { + "id": "e4db1767-4a53-4ca4-b0c3-d59646652601", + "createdAt": "2023-11-29T20:18:34.620668+00:00", + "commandType": "heaterShaker/openLabwareLatch", + "key": "be069f78c5b1f5c261fb8e2e23b8c7b7", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:34.620724+00:00", + "completedAt": "2023-11-29T20:18:34.620798+00:00" + }, + { + "id": "2e040cef-8c7f-4ed2-9f9e-72e1df511d7b", + "createdAt": "2023-11-29T20:18:34.621096+00:00", + "commandType": "moveLabware", + "key": "355ae7a686ab3f181ff8ff1033f14d68", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "newLocation": { "moduleId": "dc2de112-b2b7-4811-9cf5-501f1fee6878" }, + "strategy": "usingGripper", + "pickUpOffset": { "x": 0.0, "y": -2.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": 0.0, "z": 0.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.621151+00:00", + "completedAt": "2023-11-29T20:18:34.621330+00:00" + }, + { + "id": "bd7a2e39-3430-45d8-9f1a-1aac2afa35ac", + "createdAt": "2023-11-29T20:18:34.621549+00:00", + "commandType": "heaterShaker/closeLabwareLatch", + "key": "c149369c26b8904d9d5fd0a7261366b6", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.621597+00:00", + "completedAt": "2023-11-29T20:18:34.621641+00:00" + }, + { + "id": "8bfab46c-5b8b-4656-a933-ef077ad614ff", + "createdAt": "2023-11-29T20:18:34.621856+00:00", + "commandType": "waitForDuration", + "key": "8f880aa7562df2cfbb2aa4e187682724", + "status": "succeeded", + "params": { "seconds": 180.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.621901+00:00", + "completedAt": "2023-11-29T20:18:34.621942+00:00" + }, + { + "id": "08f5274d-d686-4094-997b-0cdd198f74e6", + "createdAt": "2023-11-29T20:18:34.622406+00:00", + "commandType": "custom", + "key": "62992a0d5bad4aca1a6feb8c491194ca", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Transferring Supernatant" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.622458+00:00", + "completedAt": "2023-11-29T20:18:34.622505+00:00" + }, + { + "id": "960b7bab-e0c2-4e13-a311-29c6ce1eb1ae", + "createdAt": "2023-11-29T20:18:34.622949+00:00", + "commandType": "pickUpTip", + "key": "9aac68cf04c5166b7e508e5b8578df76", + "status": "succeeded", + "params": { + "labwareId": "d743c482-b98f-4d7f-8b1f-8193eff63a00", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 342.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:34.623005+00:00", + "completedAt": "2023-11-29T20:18:34.634124+00:00" + }, + { + "id": "ad660c6c-4542-4530-ba15-d8e089a11b07", + "createdAt": "2023-11-29T20:18:34.635032+00:00", + "commandType": "moveToWell", + "key": "1ebc3411592caf07ce1e444990af10a8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:34.635148+00:00", + "completedAt": "2023-11-29T20:18:34.639301+00:00" + }, + { + "id": "da8e78c0-4a08-4566-a426-f8f35c1f144f", + "createdAt": "2023-11-29T20:18:34.640062+00:00", + "commandType": "aspirate", + "key": "f0c14188082aa3cb9fe09d1999f200d3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 2.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.640135+00:00", + "completedAt": "2023-11-29T20:18:34.642400+00:00" + }, + { + "id": "b7e08bc5-a0c8-4dd9-b76e-278d56e59351", + "createdAt": "2023-11-29T20:18:34.642838+00:00", + "commandType": "waitForDuration", + "key": "ba87340a1544dd311663cb7e7dcccbc9", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.642983+00:00", + "completedAt": "2023-11-29T20:18:34.643072+00:00" + }, + { + "id": "88a606e6-33a0-4dc9-9d2c-619c2be019d9", + "createdAt": "2023-11-29T20:18:34.643735+00:00", + "commandType": "moveToWell", + "key": "0b640d48b0274e747d858007ba55e00c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:34.643804+00:00", + "completedAt": "2023-11-29T20:18:34.645377+00:00" + }, + { + "id": "b48b0e8e-164f-4772-a5f1-b75eb898bbf2", + "createdAt": "2023-11-29T20:18:34.646263+00:00", + "commandType": "aspirate", + "key": "e44c43f8bd7f12b9f8669f0228334421", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 2.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 41.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.646347+00:00", + "completedAt": "2023-11-29T20:18:34.648471+00:00" + }, + { + "id": "e649f269-455a-4e70-b1e0-7b4b2ba3ac99", + "createdAt": "2023-11-29T20:18:34.649272+00:00", + "commandType": "dispense", + "key": "c91879c8c76b2f8342bd5aa04c2781c3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999996 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 36.510000000000005 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:34.649334+00:00", + "completedAt": "2023-11-29T20:18:34.654028+00:00" + }, + { + "id": "d0fece43-51fa-46af-ab95-d1a10e71e86c", + "createdAt": "2023-11-29T20:18:34.654459+00:00", + "commandType": "dropTip", + "key": "0f3661a02957145d8377c3e788d7bc4b", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 509.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.654519+00:00", + "completedAt": "2023-11-29T20:18:34.662202+00:00" + }, + { + "id": "e11ab2cc-f799-4324-9a37-696569d3b112", + "createdAt": "2023-11-29T20:18:34.662918+00:00", + "commandType": "pickUpTip", + "key": "998b5046b09212bdc24f8d1aee01e240", + "status": "succeeded", + "params": { + "labwareId": "d743c482-b98f-4d7f-8b1f-8193eff63a00", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 351.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:34.662991+00:00", + "completedAt": "2023-11-29T20:18:34.673837+00:00" + }, + { + "id": "86c8330b-a671-43fe-9f78-9cf147d74cf4", + "createdAt": "2023-11-29T20:18:34.674730+00:00", + "commandType": "moveToWell", + "key": "89f262983f94dc5fafb24ba9ced61738", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:34.674818+00:00", + "completedAt": "2023-11-29T20:18:34.679311+00:00" + }, + { + "id": "825bbefc-fa5f-43ec-b000-5df30070586a", + "createdAt": "2023-11-29T20:18:34.680143+00:00", + "commandType": "aspirate", + "key": "77c4531c4c011a4df4d66bef9f8e6675", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 2.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.680210+00:00", + "completedAt": "2023-11-29T20:18:34.682467+00:00" + }, + { + "id": "c923e435-2a34-48bd-b392-a485b0e7258b", + "createdAt": "2023-11-29T20:18:34.682865+00:00", + "commandType": "waitForDuration", + "key": "91c5ee993bbf636d8cd27ee7d3b1c4d9", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.682962+00:00", + "completedAt": "2023-11-29T20:18:34.683024+00:00" + }, + { + "id": "edc8e00e-59f2-4cba-ba2a-167e2d370e93", + "createdAt": "2023-11-29T20:18:34.683583+00:00", + "commandType": "moveToWell", + "key": "129190f4fdd66dd814e9c3255f7b5d15", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:34.683642+00:00", + "completedAt": "2023-11-29T20:18:34.685078+00:00" + }, + { + "id": "ebcf1f12-8bb5-4026-a96d-31e50d8bf1aa", + "createdAt": "2023-11-29T20:18:34.685747+00:00", + "commandType": "aspirate", + "key": "10f03bba0a59f0fe247b9b94ee63e2f3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 2.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 50.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.685806+00:00", + "completedAt": "2023-11-29T20:18:34.687717+00:00" + }, + { + "id": "e01a3907-19af-4dce-9083-bcb2f4d3f932", + "createdAt": "2023-11-29T20:18:34.688430+00:00", + "commandType": "dispense", + "key": "8889f6285ac2515cf5e2a1e68a5e1159", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999996 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 36.510000000000005 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:34.688495+00:00", + "completedAt": "2023-11-29T20:18:34.692928+00:00" + }, + { + "id": "d83329cc-fcc1-4a44-9448-25a9384e1db0", + "createdAt": "2023-11-29T20:18:34.693492+00:00", + "commandType": "dropTip", + "key": "09be57caeb490689e1ff7c100b3f44c7", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.693640+00:00", + "completedAt": "2023-11-29T20:18:34.701411+00:00" + }, + { + "id": "9e9481ea-ef7e-4468-b57e-5f8a79275686", + "createdAt": "2023-11-29T20:18:34.702107+00:00", + "commandType": "pickUpTip", + "key": "5ae48179c927f4c16455b91418a2d0c1", + "status": "succeeded", + "params": { + "labwareId": "d743c482-b98f-4d7f-8b1f-8193eff63a00", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 360.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:34.702179+00:00", + "completedAt": "2023-11-29T20:18:34.713350+00:00" + }, + { + "id": "38e3e1bf-2413-480e-92ee-1b05a22cd686", + "createdAt": "2023-11-29T20:18:34.714190+00:00", + "commandType": "moveToWell", + "key": "6e5437f5a5cc43cdd17eb289355dde14", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:34.714280+00:00", + "completedAt": "2023-11-29T20:18:34.718497+00:00" + }, + { + "id": "c6da4441-7ba2-40d4-b2fc-2d083ea5875a", + "createdAt": "2023-11-29T20:18:34.719307+00:00", + "commandType": "aspirate", + "key": "008a86fb81bf05a61ef271016bb38a4a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 2.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.719373+00:00", + "completedAt": "2023-11-29T20:18:34.721446+00:00" + }, + { + "id": "699f814e-84e8-422f-92aa-8b973afdfd2c", + "createdAt": "2023-11-29T20:18:34.721868+00:00", + "commandType": "waitForDuration", + "key": "3612c6a5fa34dcd72008648aa4967004", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.721976+00:00", + "completedAt": "2023-11-29T20:18:34.722048+00:00" + }, + { + "id": "c5a9d9d0-f7e7-4698-b19c-c95a9060278c", + "createdAt": "2023-11-29T20:18:34.722751+00:00", + "commandType": "moveToWell", + "key": "bf95708995b0d320b4176b9fab4a2df8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:34.722816+00:00", + "completedAt": "2023-11-29T20:18:34.724342+00:00" + }, + { + "id": "40246caf-46cc-4394-b269-4ee1827d408d", + "createdAt": "2023-11-29T20:18:34.725033+00:00", + "commandType": "aspirate", + "key": "a0e1cb4eec9908e6175b4c8d7eac0ae2", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 2.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 59.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.725132+00:00", + "completedAt": "2023-11-29T20:18:34.727478+00:00" + }, + { + "id": "ad918d91-0ad5-4632-9793-11840f9dfb93", + "createdAt": "2023-11-29T20:18:34.728194+00:00", + "commandType": "dispense", + "key": "138b35b2536fbe810fec2ebdaff6914b", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999996 } + }, + "flowRate": 4.0, + "volume": 20.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 36.510000000000005 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:34.728298+00:00", + "completedAt": "2023-11-29T20:18:34.732950+00:00" + }, + { + "id": "e7f4b771-611e-4549-8479-88cd6161b424", + "createdAt": "2023-11-29T20:18:34.733426+00:00", + "commandType": "dropTip", + "key": "070bbd68f79c3bde6b92a90c1cc9db36", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 509.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.733494+00:00", + "completedAt": "2023-11-29T20:18:34.740757+00:00" + }, + { + "id": "cd1a319f-8ba7-4f9e-a9aa-ab23f9f7b118", + "createdAt": "2023-11-29T20:18:34.741220+00:00", + "commandType": "heaterShaker/openLabwareLatch", + "key": "a92d9b1e9495fd9f6aee124f4048dca0", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:34.741295+00:00", + "completedAt": "2023-11-29T20:18:34.741397+00:00" + }, + { + "id": "1125a7ed-06cc-4cc1-b57b-22e3b9eff38b", + "createdAt": "2023-11-29T20:18:34.741720+00:00", + "commandType": "moveLabware", + "key": "377d52fac83f205aa824ea2efd0bcfb1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "newLocation": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "strategy": "usingGripper", + "pickUpOffset": { "x": 0.0, "y": -2.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.741773+00:00", + "completedAt": "2023-11-29T20:18:34.741960+00:00" + }, + { + "id": "f728810f-50fe-43a3-be7a-e74fa06a867f", + "createdAt": "2023-11-29T20:18:34.742198+00:00", + "commandType": "heaterShaker/closeLabwareLatch", + "key": "aa5b06404efb832776abc7a79d1f1ed3", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.742260+00:00", + "completedAt": "2023-11-29T20:18:34.742314+00:00" + }, + { + "id": "3a95344c-b7a8-47b9-8abe-9dc2198e032b", + "createdAt": "2023-11-29T20:18:34.742960+00:00", + "commandType": "custom", + "key": "1c8b0c3f96b937d00af16a1e906348ee", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "==============================================" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.743044+00:00", + "completedAt": "2023-11-29T20:18:34.743098+00:00" + }, + { + "id": "27de1c1a-92e3-4bbf-8ee4-2f61bcbe5246", + "createdAt": "2023-11-29T20:18:34.743608+00:00", + "commandType": "custom", + "key": "2c5cbd98f2eea039abdf921fe8b148c2", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Amplification" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.743667+00:00", + "completedAt": "2023-11-29T20:18:34.743717+00:00" + }, + { + "id": "139bbe1c-faa8-4683-bc6d-0a3d62ab314b", + "createdAt": "2023-11-29T20:18:34.744279+00:00", + "commandType": "custom", + "key": "9b099d0f45dbb1cb1090405c261b7591", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "==============================================" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.744339+00:00", + "completedAt": "2023-11-29T20:18:34.744387+00:00" + }, + { + "id": "0f1e8dbf-56ab-4914-b362-c98e76921943", + "createdAt": "2023-11-29T20:18:34.744785+00:00", + "commandType": "custom", + "key": "e3082509c6a6cd36f39300629b1a9a44", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Adding Primer" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.744835+00:00", + "completedAt": "2023-11-29T20:18:34.744879+00:00" + }, + { + "id": "1935a89e-a7bb-480c-8edf-8fa11216971c", + "createdAt": "2023-11-29T20:18:34.745299+00:00", + "commandType": "pickUpTip", + "key": "4f179fa471715f24b4b93a0c4bf09572", + "status": "succeeded", + "params": { + "labwareId": "d743c482-b98f-4d7f-8b1f-8193eff63a00", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 369.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:34.745354+00:00", + "completedAt": "2023-11-29T20:18:34.756036+00:00" + }, + { + "id": "4a818f9d-2426-40b6-90ee-8ece41aaa349", + "createdAt": "2023-11-29T20:18:34.756971+00:00", + "commandType": "aspirate", + "key": "70c8ddad672adb61c4a1ed555de951ee", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 2.0, + "volume": 5.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 360.38, "y": 74.24, "z": 16.8 }, + "volume": 5.0 + }, + "startedAt": "2023-11-29T20:18:34.757092+00:00", + "completedAt": "2023-11-29T20:18:34.762622+00:00" + }, + { + "id": "72addd4b-a6ab-49ef-a55c-04ae1bc1fc31", + "createdAt": "2023-11-29T20:18:34.763402+00:00", + "commandType": "dispense", + "key": "a5a49b417768901b56e151e593b32285", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 2.0, + "volume": 5.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 5.0 + }, + "startedAt": "2023-11-29T20:18:34.763474+00:00", + "completedAt": "2023-11-29T20:18:34.768962+00:00" + }, + { + "id": "6dc89ca8-a511-4a6d-9034-5de172d4fd99", + "createdAt": "2023-11-29T20:18:34.769867+00:00", + "commandType": "aspirate", + "key": "d2aa342ab55ad3e485e8e64cb26f9b2f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 4.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.769997+00:00", + "completedAt": "2023-11-29T20:18:34.775362+00:00" + }, + { + "id": "9416ea98-75c3-43f4-8a52-a027f2b038df", + "createdAt": "2023-11-29T20:18:34.776503+00:00", + "commandType": "dispense", + "key": "b72d4e24636a66163c0b5060435d298c", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 4.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.776578+00:00", + "completedAt": "2023-11-29T20:18:34.778871+00:00" + }, + { + "id": "7a75a0ff-989a-4502-96ee-7a9b408da5ea", + "createdAt": "2023-11-29T20:18:34.779654+00:00", + "commandType": "aspirate", + "key": "6d610b1e5526c7c0e84fca2f0b2ee7b0", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 4.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.779721+00:00", + "completedAt": "2023-11-29T20:18:34.784863+00:00" + }, + { + "id": "d3f6b23a-7a2e-4694-9480-5e50380af66e", + "createdAt": "2023-11-29T20:18:34.785743+00:00", + "commandType": "dispense", + "key": "d6751401c6459843d9e1b02dc389267e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 4.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.785833+00:00", + "completedAt": "2023-11-29T20:18:34.788170+00:00" + }, + { + "id": "11f6a83c-bb7d-4086-aa58-71a7b26f9513", + "createdAt": "2023-11-29T20:18:34.788554+00:00", + "commandType": "dropTip", + "key": "9bbc104cfe4675509451ddcdf561eafa", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.788645+00:00", + "completedAt": "2023-11-29T20:18:34.795587+00:00" + }, + { + "id": "2d76b8e4-e9ce-49dc-83e7-5cafbe7e2b83", + "createdAt": "2023-11-29T20:18:34.796234+00:00", + "commandType": "pickUpTip", + "key": "62f1ef88e15d07458d0448f7aa3f4b0d", + "status": "succeeded", + "params": { + "labwareId": "d743c482-b98f-4d7f-8b1f-8193eff63a00", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 378.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:34.796326+00:00", + "completedAt": "2023-11-29T20:18:34.806931+00:00" + }, + { + "id": "ca917984-1113-4296-8b50-da473f776617", + "createdAt": "2023-11-29T20:18:34.807786+00:00", + "commandType": "aspirate", + "key": "237643c6e59c800185e479173d8e83ed", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 2.0, + "volume": 5.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 360.38, "y": 74.24, "z": 16.8 }, + "volume": 5.0 + }, + "startedAt": "2023-11-29T20:18:34.807884+00:00", + "completedAt": "2023-11-29T20:18:34.813525+00:00" + }, + { + "id": "a1eda049-7771-4d38-80e1-82796c7a13c9", + "createdAt": "2023-11-29T20:18:34.814324+00:00", + "commandType": "dispense", + "key": "7e02dff9d9ee8c5d93a2cee2b15e7300", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 2.0, + "volume": 5.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 5.0 + }, + "startedAt": "2023-11-29T20:18:34.814399+00:00", + "completedAt": "2023-11-29T20:18:34.819606+00:00" + }, + { + "id": "d752fa57-98e2-42ed-9de3-bc2ec63f9a05", + "createdAt": "2023-11-29T20:18:34.820381+00:00", + "commandType": "aspirate", + "key": "9bb8be0b73790d35565e603101f2b2f5", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 4.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.820442+00:00", + "completedAt": "2023-11-29T20:18:34.825360+00:00" + }, + { + "id": "a8b592ac-dcbf-4870-a7db-615ed902ff33", + "createdAt": "2023-11-29T20:18:34.826161+00:00", + "commandType": "dispense", + "key": "29a7aa028d422d7f59ab003b8675325d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 4.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.826225+00:00", + "completedAt": "2023-11-29T20:18:34.828191+00:00" + }, + { + "id": "b6781f0f-8447-4b95-b722-b55d533c4c76", + "createdAt": "2023-11-29T20:18:34.828991+00:00", + "commandType": "aspirate", + "key": "e8998f3925f70d653413ca28e69e05a2", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 4.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.829118+00:00", + "completedAt": "2023-11-29T20:18:34.834733+00:00" + }, + { + "id": "88a4233e-6fb5-448b-9404-c509146c3796", + "createdAt": "2023-11-29T20:18:34.835699+00:00", + "commandType": "dispense", + "key": "8db2d598e02b1a9dc0283bd098d50cbc", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 4.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.835777+00:00", + "completedAt": "2023-11-29T20:18:34.837817+00:00" + }, + { + "id": "accacaa2-f1f1-4d1b-acd8-0298e4d3a464", + "createdAt": "2023-11-29T20:18:34.838130+00:00", + "commandType": "dropTip", + "key": "9622d320b1ffa6fa60d8e153700b12a1", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 509.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.838199+00:00", + "completedAt": "2023-11-29T20:18:34.844966+00:00" + }, + { + "id": "91382eca-792c-4200-987c-2dfbc991ef31", + "createdAt": "2023-11-29T20:18:34.845709+00:00", + "commandType": "pickUpTip", + "key": "59222da0a94f38c99ae76ccde265a3d9", + "status": "succeeded", + "params": { + "labwareId": "d743c482-b98f-4d7f-8b1f-8193eff63a00", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 387.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:34.845809+00:00", + "completedAt": "2023-11-29T20:18:34.856530+00:00" + }, + { + "id": "5a1f092b-ada2-42f1-b8c5-c0f1ce1c32f0", + "createdAt": "2023-11-29T20:18:34.857463+00:00", + "commandType": "aspirate", + "key": "478a5ca1bcc3411b1fc4162edb7bc6e3", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 2.0, + "volume": 5.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 360.38, "y": 74.24, "z": 16.8 }, + "volume": 5.0 + }, + "startedAt": "2023-11-29T20:18:34.857540+00:00", + "completedAt": "2023-11-29T20:18:34.862929+00:00" + }, + { + "id": "2a17b6ab-725f-40fa-a1ca-c1961ec2e5e7", + "createdAt": "2023-11-29T20:18:34.863611+00:00", + "commandType": "dispense", + "key": "5bc9a61bd221cace13166c6c66555e73", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 2.0, + "volume": 5.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 5.0 + }, + "startedAt": "2023-11-29T20:18:34.863676+00:00", + "completedAt": "2023-11-29T20:18:34.868929+00:00" + }, + { + "id": "d1c0393f-0bc6-412f-b73a-7480d502e961", + "createdAt": "2023-11-29T20:18:34.869964+00:00", + "commandType": "aspirate", + "key": "9295a2b9a0a8dddc98cffcc48e0d8827", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 4.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.870043+00:00", + "completedAt": "2023-11-29T20:18:34.875020+00:00" + }, + { + "id": "c9480ce0-3961-4679-9067-91d087db5976", + "createdAt": "2023-11-29T20:18:34.875906+00:00", + "commandType": "dispense", + "key": "56e4c30822ecc1e3abc1a0c92e42a810", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 4.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.876039+00:00", + "completedAt": "2023-11-29T20:18:34.878414+00:00" + }, + { + "id": "bc81d2bd-0e71-440b-bcda-42b9ebbd7575", + "createdAt": "2023-11-29T20:18:34.879307+00:00", + "commandType": "aspirate", + "key": "e44f8e2aae8ccb055b7abb08551f000b", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 4.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.879377+00:00", + "completedAt": "2023-11-29T20:18:34.884547+00:00" + }, + { + "id": "edac0574-6462-4430-959a-f873b4d789af", + "createdAt": "2023-11-29T20:18:34.885456+00:00", + "commandType": "dispense", + "key": "6e83c53ff8ae8847faf4273c5fb535f9", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 4.0, + "volume": 10.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 10.0 + }, + "startedAt": "2023-11-29T20:18:34.885536+00:00", + "completedAt": "2023-11-29T20:18:34.887653+00:00" + }, + { + "id": "58257ed5-90d4-4fb0-ad26-f6cda56cab2c", + "createdAt": "2023-11-29T20:18:34.888076+00:00", + "commandType": "dropTip", + "key": "bef745b109763ce204382a3a57080937", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:34.888148+00:00", + "completedAt": "2023-11-29T20:18:34.895334+00:00" + }, + { + "id": "41677242-ecc1-4ec7-bf8d-ad5c68f15fd7", + "createdAt": "2023-11-29T20:18:34.896066+00:00", + "commandType": "custom", + "key": "21f60cd7654ecf88dc0dc141359cbdba", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Adding PCR" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:34.896156+00:00", + "completedAt": "2023-11-29T20:18:34.896238+00:00" + }, + { + "id": "7b32bd82-0357-42c5-8310-da312d723bdd", + "createdAt": "2023-11-29T20:18:34.896857+00:00", + "commandType": "pickUpTip", + "key": "4eaea92870cc654f5247d3d9d5a56aa4", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 342.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:34.896919+00:00", + "completedAt": "2023-11-29T20:18:34.907774+00:00" + }, + { + "id": "b3885dd5-6cba-405d-9dc7-e05117eab7ab", + "createdAt": "2023-11-29T20:18:34.908840+00:00", + "commandType": "aspirate", + "key": "81de92bbb9b4bbb53ac692cde30ea1e6", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 74.24, "z": 16.8 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:34.908928+00:00", + "completedAt": "2023-11-29T20:18:34.914029+00:00" + }, + { + "id": "b7d6b278-1c18-4542-8951-03a70b3f6bb9", + "createdAt": "2023-11-29T20:18:34.914928+00:00", + "commandType": "dispense", + "key": "0a6ad4d5c132df5272469da5754a14f6", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 74.24, "z": 16.8 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:34.915015+00:00", + "completedAt": "2023-11-29T20:18:34.917431+00:00" + }, + { + "id": "9b766348-4681-4de8-8306-ae180c50d3bf", + "createdAt": "2023-11-29T20:18:34.918498+00:00", + "commandType": "aspirate", + "key": "ce520e2b6713069fa470321e754bb3ef", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 74.24, "z": 16.8 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:34.918585+00:00", + "completedAt": "2023-11-29T20:18:34.923777+00:00" + }, + { + "id": "cc44def7-52de-4ee1-915b-69c25deae1d9", + "createdAt": "2023-11-29T20:18:34.924686+00:00", + "commandType": "dispense", + "key": "0c96bb88ea8151037321a6719a56e37a", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 74.24, "z": 16.8 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:34.924776+00:00", + "completedAt": "2023-11-29T20:18:34.927068+00:00" + }, + { + "id": "a5b13943-3ed2-4fe7-b8c8-4ae07263a30c", + "createdAt": "2023-11-29T20:18:34.928258+00:00", + "commandType": "aspirate", + "key": "d93dcb8965c1331c42b130c2bbaa5c8e", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 74.24, "z": 16.8 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:34.928411+00:00", + "completedAt": "2023-11-29T20:18:34.933643+00:00" + }, + { + "id": "07518e8a-8a12-4673-acc4-6e28b6e9be04", + "createdAt": "2023-11-29T20:18:34.934451+00:00", + "commandType": "dispense", + "key": "b6e42308942999d07de56b0b0722de03", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:34.934565+00:00", + "completedAt": "2023-11-29T20:18:34.939994+00:00" + }, + { + "id": "c5d2f1a4-50ba-48fa-80ff-e643d63f432a", + "createdAt": "2023-11-29T20:18:34.941110+00:00", + "commandType": "aspirate", + "key": "5b935a24e33e38da5f4a1d7ee1a5cf86", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:34.941234+00:00", + "completedAt": "2023-11-29T20:18:34.946146+00:00" + }, + { + "id": "b9a3ce8d-9a90-472e-9ad8-bd3aaf88ae2f", + "createdAt": "2023-11-29T20:18:34.946883+00:00", + "commandType": "dispense", + "key": "f6f5e94d9d50304c19c52379e1e310ea", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:34.946943+00:00", + "completedAt": "2023-11-29T20:18:34.949060+00:00" + }, + { + "id": "f0dd1d14-671d-4c3c-8764-5811b577a0ab", + "createdAt": "2023-11-29T20:18:34.950071+00:00", + "commandType": "aspirate", + "key": "371b6dca4c469da76f72dd96e08c1c15", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:34.950180+00:00", + "completedAt": "2023-11-29T20:18:34.955483+00:00" + }, + { + "id": "c260322f-7572-42a8-b612-6ccf9b320390", + "createdAt": "2023-11-29T20:18:34.956356+00:00", + "commandType": "dispense", + "key": "a32b230516177a003c8b4a7c55d73161", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:34.956546+00:00", + "completedAt": "2023-11-29T20:18:34.959142+00:00" + }, + { + "id": "90c67b8f-599d-4749-85ed-b0e000cf75ee", + "createdAt": "2023-11-29T20:18:34.960145+00:00", + "commandType": "aspirate", + "key": "d31569400dd1807afa098c4a101664a8", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:34.960223+00:00", + "completedAt": "2023-11-29T20:18:34.965699+00:00" + }, + { + "id": "d984a0e6-c726-4ff0-adf3-16160ad473b1", + "createdAt": "2023-11-29T20:18:34.966638+00:00", + "commandType": "dispense", + "key": "1ea406d392fcc46d8fcd01d476b926f2", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:34.966727+00:00", + "completedAt": "2023-11-29T20:18:34.969514+00:00" + }, + { + "id": "4f01f336-7c63-4d5b-9822-cc1a3d4f92cd", + "createdAt": "2023-11-29T20:18:34.970369+00:00", + "commandType": "aspirate", + "key": "041a67a26eac5ac8d68b687fc8185ee7", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:34.970435+00:00", + "completedAt": "2023-11-29T20:18:34.975236+00:00" + }, + { + "id": "222b0a52-7411-45f9-a53f-c01fa9adf763", + "createdAt": "2023-11-29T20:18:34.976110+00:00", + "commandType": "dispense", + "key": "9144c0f21b3f24195e02b65ba342d0f5", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:34.976230+00:00", + "completedAt": "2023-11-29T20:18:34.978334+00:00" + }, + { + "id": "ef948aa0-14d2-49e3-a54c-f0d3dc682106", + "createdAt": "2023-11-29T20:18:34.979005+00:00", + "commandType": "aspirate", + "key": "258034e7571e9331780b7b5ddc2a34dd", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:34.979064+00:00", + "completedAt": "2023-11-29T20:18:34.984103+00:00" + }, + { + "id": "ab72ceca-c4d7-4935-ace5-0b88716948be", + "createdAt": "2023-11-29T20:18:34.985020+00:00", + "commandType": "dispense", + "key": "69a543db046c3926d5347b3e93cec83a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:34.985094+00:00", + "completedAt": "2023-11-29T20:18:34.987108+00:00" + }, + { + "id": "e9379140-c08f-43fb-b518-1b9ea96d901e", + "createdAt": "2023-11-29T20:18:34.987811+00:00", + "commandType": "aspirate", + "key": "f390d7c15660072d29f9cc7c2b764602", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:34.987894+00:00", + "completedAt": "2023-11-29T20:18:34.992987+00:00" + }, + { + "id": "cff687c7-df48-4261-965b-0685e61c19cc", + "createdAt": "2023-11-29T20:18:34.994040+00:00", + "commandType": "dispense", + "key": "3355848375b11d1691ba09812046d863", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:34.994180+00:00", + "completedAt": "2023-11-29T20:18:34.996759+00:00" + }, + { + "id": "a9b54738-431d-43ec-a374-4ad533d0afa6", + "createdAt": "2023-11-29T20:18:34.997620+00:00", + "commandType": "aspirate", + "key": "d081fa986c8ade9bf1235d8dcde06193", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:34.997700+00:00", + "completedAt": "2023-11-29T20:18:35.002667+00:00" + }, + { + "id": "9bdc2295-dbb9-47ff-b781-278d71f2923e", + "createdAt": "2023-11-29T20:18:35.003559+00:00", + "commandType": "dispense", + "key": "e5ba16ade3b914590128054f78e2903f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.003627+00:00", + "completedAt": "2023-11-29T20:18:35.005605+00:00" + }, + { + "id": "42a3f71b-12c6-4033-8d36-79628b4663ec", + "createdAt": "2023-11-29T20:18:35.006493+00:00", + "commandType": "aspirate", + "key": "5da8ee613f24fc122d35422c2b8e3114", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.006565+00:00", + "completedAt": "2023-11-29T20:18:35.011285+00:00" + }, + { + "id": "98ace902-5389-4c01-8383-972aa8fc18d4", + "createdAt": "2023-11-29T20:18:35.012200+00:00", + "commandType": "dispense", + "key": "5fd17092a3340eb2c79e8331dec0af2b", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.012270+00:00", + "completedAt": "2023-11-29T20:18:35.014463+00:00" + }, + { + "id": "47f9a2e2-3adc-44b0-8e46-20ff1dad44bb", + "createdAt": "2023-11-29T20:18:35.015211+00:00", + "commandType": "aspirate", + "key": "7043eba187f7cc8b8e60542e0f7689b0", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.015337+00:00", + "completedAt": "2023-11-29T20:18:35.020564+00:00" + }, + { + "id": "f79e7b84-0409-4383-8d12-ef22ec939f20", + "createdAt": "2023-11-29T20:18:35.021421+00:00", + "commandType": "dispense", + "key": "4b8c1389cecb87e830ade74cbdda10f4", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.021483+00:00", + "completedAt": "2023-11-29T20:18:35.023463+00:00" + }, + { + "id": "3f35c41e-75c5-47c6-88c8-65709f9f9770", + "createdAt": "2023-11-29T20:18:35.024194+00:00", + "commandType": "aspirate", + "key": "309590cafa3e310b0dc9c516781d7f3b", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.024266+00:00", + "completedAt": "2023-11-29T20:18:35.029143+00:00" + }, + { + "id": "eeccca2d-5d55-4f25-912a-64fa6386dfaa", + "createdAt": "2023-11-29T20:18:35.029882+00:00", + "commandType": "dispense", + "key": "7f4c76afbc0da3caa745d9be3970eb0f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.029942+00:00", + "completedAt": "2023-11-29T20:18:35.031950+00:00" + }, + { + "id": "b5a2aebd-7543-43c6-98f9-4628b13b95dd", + "createdAt": "2023-11-29T20:18:35.032767+00:00", + "commandType": "moveToWell", + "key": "f89f023ae857de915b3752aa54b1556e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 13.259999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.032880+00:00", + "completedAt": "2023-11-29T20:18:35.034426+00:00" + }, + { + "id": "b9d6d1fa-b907-4f5a-bb52-db0f7b9f4638", + "createdAt": "2023-11-29T20:18:35.034760+00:00", + "commandType": "waitForDuration", + "key": "adadbd08c03ce6a2a95f00ab2880792b", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.034848+00:00", + "completedAt": "2023-11-29T20:18:35.034907+00:00" + }, + { + "id": "77c0f8a8-8000-4bcf-8777-9989596fb821", + "createdAt": "2023-11-29T20:18:35.035835+00:00", + "commandType": "blowout", + "key": "243868c9e372f7adcf7a28f7b4569a2f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 48.375, "y": 356.2, "z": 13.259999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.035895+00:00", + "completedAt": "2023-11-29T20:18:35.038013+00:00" + }, + { + "id": "79236147-bc61-4fc7-b59e-3f5884abab83", + "createdAt": "2023-11-29T20:18:35.038321+00:00", + "commandType": "dropTip", + "key": "130cf6eca7e9d53d6d61941362b282ae", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:35.038379+00:00", + "completedAt": "2023-11-29T20:18:35.044691+00:00" + }, + { + "id": "f71aa172-fda9-4d47-bc0c-3bb960949931", + "createdAt": "2023-11-29T20:18:35.045489+00:00", + "commandType": "pickUpTip", + "key": "ef70ec8f27a11c5c8c5342c37d4a94d9", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 351.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:35.045568+00:00", + "completedAt": "2023-11-29T20:18:35.055723+00:00" + }, + { + "id": "731cccd9-03e0-4a05-a2d8-4a76c23d0d60", + "createdAt": "2023-11-29T20:18:35.056628+00:00", + "commandType": "aspirate", + "key": "b1665d946d6e7d38413cbdfcb7eab768", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 74.24, "z": 16.8 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:35.056721+00:00", + "completedAt": "2023-11-29T20:18:35.062223+00:00" + }, + { + "id": "ca100630-f73b-4003-92d4-79305dd26fa3", + "createdAt": "2023-11-29T20:18:35.063224+00:00", + "commandType": "dispense", + "key": "4bbed6a391d23ed6eea57e645bb9304d", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 74.24, "z": 16.8 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:35.063301+00:00", + "completedAt": "2023-11-29T20:18:35.065643+00:00" + }, + { + "id": "818746f2-edb1-4ff9-8e76-79e9d4b89d39", + "createdAt": "2023-11-29T20:18:35.066570+00:00", + "commandType": "aspirate", + "key": "67389805d60b99623d2bc20e71870511", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 74.24, "z": 16.8 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:35.066637+00:00", + "completedAt": "2023-11-29T20:18:35.071697+00:00" + }, + { + "id": "59a327a1-8937-441b-9a43-14420b48cbb9", + "createdAt": "2023-11-29T20:18:35.072691+00:00", + "commandType": "dispense", + "key": "9c714f11f872f8cec1f17e178d803abc", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 74.24, "z": 16.8 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:35.072815+00:00", + "completedAt": "2023-11-29T20:18:35.075006+00:00" + }, + { + "id": "78af2c9f-b135-4c3e-ae45-4b266e773a3b", + "createdAt": "2023-11-29T20:18:35.076038+00:00", + "commandType": "aspirate", + "key": "cd704eacae64a63a572a9f623df3a0b9", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 74.24, "z": 16.8 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:35.076129+00:00", + "completedAt": "2023-11-29T20:18:35.081064+00:00" + }, + { + "id": "168507ff-2e06-4e76-8098-7116752bb9e3", + "createdAt": "2023-11-29T20:18:35.081807+00:00", + "commandType": "dispense", + "key": "63c243dab6aaf9b74cc5df50c029b0cb", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:35.081912+00:00", + "completedAt": "2023-11-29T20:18:35.087211+00:00" + }, + { + "id": "6cfea7f5-fd74-4703-b0bc-dc2f810f108c", + "createdAt": "2023-11-29T20:18:35.088085+00:00", + "commandType": "aspirate", + "key": "eb49076d37067be419664ebf6ad4138b", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.088187+00:00", + "completedAt": "2023-11-29T20:18:35.093237+00:00" + }, + { + "id": "35568d08-c05b-4c13-a8ef-fc10d08587b6", + "createdAt": "2023-11-29T20:18:35.094083+00:00", + "commandType": "dispense", + "key": "bfb33a4ac6bedaa1fb160193d96c3ffb", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.094209+00:00", + "completedAt": "2023-11-29T20:18:35.096294+00:00" + }, + { + "id": "be84e1ae-50a8-4b20-b2c8-f92098c01eaf", + "createdAt": "2023-11-29T20:18:35.097149+00:00", + "commandType": "aspirate", + "key": "fffc01949ee7274bf8f1d172883cd322", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.097229+00:00", + "completedAt": "2023-11-29T20:18:35.102220+00:00" + }, + { + "id": "79b2690c-d5db-4e05-a028-da27786d2030", + "createdAt": "2023-11-29T20:18:35.103137+00:00", + "commandType": "dispense", + "key": "0ec04f678393fc6873e06c277286a778", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.103214+00:00", + "completedAt": "2023-11-29T20:18:35.105294+00:00" + }, + { + "id": "82955360-7d43-4622-8f8a-a3998054d40b", + "createdAt": "2023-11-29T20:18:35.106149+00:00", + "commandType": "aspirate", + "key": "5da402cf7e478b9f417af925f7883d20", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.106227+00:00", + "completedAt": "2023-11-29T20:18:35.111590+00:00" + }, + { + "id": "e0eecc55-5a9a-42f1-a31c-5c22837c82df", + "createdAt": "2023-11-29T20:18:35.112551+00:00", + "commandType": "dispense", + "key": "850a2963e6786e3376f3dd894c3905f9", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.112684+00:00", + "completedAt": "2023-11-29T20:18:35.114984+00:00" + }, + { + "id": "74cd3c47-2f53-4384-9d11-f1108a69ef83", + "createdAt": "2023-11-29T20:18:35.115801+00:00", + "commandType": "aspirate", + "key": "66db52d20c6af50ac8195f5f27c15346", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.115889+00:00", + "completedAt": "2023-11-29T20:18:35.121050+00:00" + }, + { + "id": "54805655-d9d6-46a5-b180-26c7f5dc5269", + "createdAt": "2023-11-29T20:18:35.121914+00:00", + "commandType": "dispense", + "key": "503305bb32a177bc4e7b7650087cf39a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.121983+00:00", + "completedAt": "2023-11-29T20:18:35.124179+00:00" + }, + { + "id": "6fc58982-c351-43c7-9edc-f7eb60fc087f", + "createdAt": "2023-11-29T20:18:35.125123+00:00", + "commandType": "aspirate", + "key": "9cb9f36c4f82459709fd8ce97a48e799", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.125236+00:00", + "completedAt": "2023-11-29T20:18:35.130014+00:00" + }, + { + "id": "404921bd-3e97-441e-a66e-cdf656a45ab1", + "createdAt": "2023-11-29T20:18:35.130910+00:00", + "commandType": "dispense", + "key": "1707304be6ae142b7888598cc0a1bf20", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.131002+00:00", + "completedAt": "2023-11-29T20:18:35.133119+00:00" + }, + { + "id": "08eb735b-4e3c-4cf5-9bf6-02563a3f3889", + "createdAt": "2023-11-29T20:18:35.133945+00:00", + "commandType": "aspirate", + "key": "162ff0a6140edb07d8b825376696f969", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.134013+00:00", + "completedAt": "2023-11-29T20:18:35.138766+00:00" + }, + { + "id": "d5c176b5-e290-49ee-8414-f5272378808c", + "createdAt": "2023-11-29T20:18:35.139527+00:00", + "commandType": "dispense", + "key": "061c05629d8e701fa9933af9ba56bbde", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.139594+00:00", + "completedAt": "2023-11-29T20:18:35.141615+00:00" + }, + { + "id": "d70f3bbb-9f15-4c51-8d8f-85abf00b851f", + "createdAt": "2023-11-29T20:18:35.142393+00:00", + "commandType": "aspirate", + "key": "8ad496b62ef16e05950dd0e6dd258a56", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.142514+00:00", + "completedAt": "2023-11-29T20:18:35.147953+00:00" + }, + { + "id": "d82c1270-93a4-445b-a4e3-4712d2d37402", + "createdAt": "2023-11-29T20:18:35.149050+00:00", + "commandType": "dispense", + "key": "690f5cc0138fa2972ea66cfd24b22688", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.149141+00:00", + "completedAt": "2023-11-29T20:18:35.151373+00:00" + }, + { + "id": "000faa87-4508-4321-98ce-9843c880b354", + "createdAt": "2023-11-29T20:18:35.152218+00:00", + "commandType": "aspirate", + "key": "be80557eb5bcc770c4e5ab6e735a62d4", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.152311+00:00", + "completedAt": "2023-11-29T20:18:35.157398+00:00" + }, + { + "id": "d8f75404-eb44-4e10-8b6a-a031af7e6578", + "createdAt": "2023-11-29T20:18:35.158414+00:00", + "commandType": "dispense", + "key": "b02d9dd744f10e80a1bebce0dc2caa79", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.158493+00:00", + "completedAt": "2023-11-29T20:18:35.160774+00:00" + }, + { + "id": "d95667d0-fd5f-460d-83d9-81d2b4c9f17a", + "createdAt": "2023-11-29T20:18:35.161846+00:00", + "commandType": "aspirate", + "key": "46cc5c40310ddacaf6c50b15647ee7a5", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.161917+00:00", + "completedAt": "2023-11-29T20:18:35.167240+00:00" + }, + { + "id": "4557514a-1c84-4274-9aee-9890d8833172", + "createdAt": "2023-11-29T20:18:35.168191+00:00", + "commandType": "dispense", + "key": "2cb377d5e8df80148807c200ff28c5cf", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.168267+00:00", + "completedAt": "2023-11-29T20:18:35.170261+00:00" + }, + { + "id": "503623e8-3c75-4296-83a0-d5456675bf53", + "createdAt": "2023-11-29T20:18:35.170962+00:00", + "commandType": "aspirate", + "key": "cd0160948e397fde48d9027f12a962e0", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.171020+00:00", + "completedAt": "2023-11-29T20:18:35.175687+00:00" + }, + { + "id": "599a261e-587b-4e79-864e-6c166a599732", + "createdAt": "2023-11-29T20:18:35.176715+00:00", + "commandType": "dispense", + "key": "69452a9760f3cfee29051b0b143ed7d5", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.176805+00:00", + "completedAt": "2023-11-29T20:18:35.179069+00:00" + }, + { + "id": "482e4461-1f28-46a5-91b8-d3a7f64efeac", + "createdAt": "2023-11-29T20:18:35.179739+00:00", + "commandType": "moveToWell", + "key": "164626d76c53160fd94666494319469b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 13.259999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.179848+00:00", + "completedAt": "2023-11-29T20:18:35.181318+00:00" + }, + { + "id": "d7c374a5-df86-48cf-88b7-42b5b1c5114a", + "createdAt": "2023-11-29T20:18:35.181711+00:00", + "commandType": "waitForDuration", + "key": "906ab9cf2fca2b45b22ca8dd0d990f2e", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.181809+00:00", + "completedAt": "2023-11-29T20:18:35.181879+00:00" + }, + { + "id": "868ec6e7-5981-44d5-b99b-70340d62824d", + "createdAt": "2023-11-29T20:18:35.182774+00:00", + "commandType": "blowout", + "key": "f4637ed6c479221021010c355754a691", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 57.375, "y": 356.2, "z": 13.259999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.182851+00:00", + "completedAt": "2023-11-29T20:18:35.185223+00:00" + }, + { + "id": "084e08ac-2a03-4b3c-9ba6-c575c5852a9b", + "createdAt": "2023-11-29T20:18:35.185762+00:00", + "commandType": "dropTip", + "key": "f76da9d75c413ec91cde23a806df3e03", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:35.185829+00:00", + "completedAt": "2023-11-29T20:18:35.191862+00:00" + }, + { + "id": "4acfb245-d318-4b2c-a0fe-2cad2ac760d2", + "createdAt": "2023-11-29T20:18:35.192704+00:00", + "commandType": "pickUpTip", + "key": "9d46a051b0af7bd86d03d7173912d1a8", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 360.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:35.192817+00:00", + "completedAt": "2023-11-29T20:18:35.203919+00:00" + }, + { + "id": "e4456a6d-49ea-4b42-b67f-a441d38e3415", + "createdAt": "2023-11-29T20:18:35.204781+00:00", + "commandType": "aspirate", + "key": "b13e58d453b5407e54c29940ab549749", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 74.24, "z": 16.8 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:35.204847+00:00", + "completedAt": "2023-11-29T20:18:35.210152+00:00" + }, + { + "id": "efcfdb6c-3678-41d5-a86c-c5105a6961d7", + "createdAt": "2023-11-29T20:18:35.211182+00:00", + "commandType": "dispense", + "key": "9f4f5de8b86f5f080c96786b0d20b6cb", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 74.24, "z": 16.8 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:35.211340+00:00", + "completedAt": "2023-11-29T20:18:35.213708+00:00" + }, + { + "id": "604c8417-6f91-404e-9a19-940e7b00a9e5", + "createdAt": "2023-11-29T20:18:35.214594+00:00", + "commandType": "aspirate", + "key": "b070b6fddab7ff8f4a0de499080f3cf2", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 74.24, "z": 16.8 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:35.214677+00:00", + "completedAt": "2023-11-29T20:18:35.219657+00:00" + }, + { + "id": "4845468c-b421-4469-a5f4-d1fb94fd45fc", + "createdAt": "2023-11-29T20:18:35.220599+00:00", + "commandType": "dispense", + "key": "60b6d17bd8136f4de3260ef6d9a56744", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 74.24, "z": 16.8 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:35.220663+00:00", + "completedAt": "2023-11-29T20:18:35.222655+00:00" + }, + { + "id": "140bec71-98c8-4ea3-82bf-0efdc6ad1875", + "createdAt": "2023-11-29T20:18:35.223864+00:00", + "commandType": "aspirate", + "key": "2a822ee34f2a58ea62cad833fff9be60", + "status": "succeeded", + "params": { + "labwareId": "64598ef1-c390-4094-90ec-b8aafc688085", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.45 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 74.24, "z": 16.8 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:35.223960+00:00", + "completedAt": "2023-11-29T20:18:35.229437+00:00" + }, + { + "id": "34a0978e-1dd0-4713-960f-b88225c61f6f", + "createdAt": "2023-11-29T20:18:35.230307+00:00", + "commandType": "dispense", + "key": "3d1a4e164a8118dae3cd273922e7fe2f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 40.0, + "volume": 25.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:35.230386+00:00", + "completedAt": "2023-11-29T20:18:35.236570+00:00" + }, + { + "id": "1b0eda48-6ad5-45f5-88d4-f260da1da59e", + "createdAt": "2023-11-29T20:18:35.237592+00:00", + "commandType": "aspirate", + "key": "8b6fcbc2cb3b06d34e6c2d57b0b11023", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.237697+00:00", + "completedAt": "2023-11-29T20:18:35.242947+00:00" + }, + { + "id": "0c60af66-8c99-4ae6-98cb-3f22f50014f5", + "createdAt": "2023-11-29T20:18:35.243860+00:00", + "commandType": "dispense", + "key": "289a157286b107c7fe056ee0f663283e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.244020+00:00", + "completedAt": "2023-11-29T20:18:35.246247+00:00" + }, + { + "id": "adbf321e-9b3c-44a6-a41f-97486ddf17e7", + "createdAt": "2023-11-29T20:18:35.247010+00:00", + "commandType": "aspirate", + "key": "92e3ce74cbe7a596f0db2f5353eb0dfb", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.247082+00:00", + "completedAt": "2023-11-29T20:18:35.252481+00:00" + }, + { + "id": "b97db400-64bb-47c0-8aa9-7e9e7eb03185", + "createdAt": "2023-11-29T20:18:35.253418+00:00", + "commandType": "dispense", + "key": "e8c322c9ddacbbc0883f760739b253e6", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.253515+00:00", + "completedAt": "2023-11-29T20:18:35.255774+00:00" + }, + { + "id": "d77f0cce-1ad0-4061-bc27-82194bce5787", + "createdAt": "2023-11-29T20:18:35.256571+00:00", + "commandType": "aspirate", + "key": "bee0bf46a227f8f910bd25670ce90d12", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.256636+00:00", + "completedAt": "2023-11-29T20:18:35.261770+00:00" + }, + { + "id": "7eebb2ed-f356-4f2b-9fef-8429f8858b77", + "createdAt": "2023-11-29T20:18:35.262626+00:00", + "commandType": "dispense", + "key": "99d27b5d940b5a9ddd4074878a7c0b86", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.262755+00:00", + "completedAt": "2023-11-29T20:18:35.265082+00:00" + }, + { + "id": "d193d981-7eda-43fc-9ffe-e0e020044653", + "createdAt": "2023-11-29T20:18:35.265843+00:00", + "commandType": "aspirate", + "key": "698451fd4449b4a01c8b408e0306c4f7", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.265961+00:00", + "completedAt": "2023-11-29T20:18:35.271164+00:00" + }, + { + "id": "1d6ed95c-1d31-4f4d-a0b7-cb5d257d2554", + "createdAt": "2023-11-29T20:18:35.271981+00:00", + "commandType": "dispense", + "key": "a9f266fdf19f5e982006daf3527bd18e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.272074+00:00", + "completedAt": "2023-11-29T20:18:35.274238+00:00" + }, + { + "id": "39532ae3-4a83-4cdd-9df5-8605c5325f1f", + "createdAt": "2023-11-29T20:18:35.275174+00:00", + "commandType": "aspirate", + "key": "c27c7b7867bbcc019298ae8d875e83ea", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.275262+00:00", + "completedAt": "2023-11-29T20:18:35.280392+00:00" + }, + { + "id": "b2528e7e-d589-4455-a605-a23638662541", + "createdAt": "2023-11-29T20:18:35.281237+00:00", + "commandType": "dispense", + "key": "a3b4691d58c1e5829f8256b558d377ce", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.281401+00:00", + "completedAt": "2023-11-29T20:18:35.283481+00:00" + }, + { + "id": "c0420c90-9240-40da-b83c-2b8605712df7", + "createdAt": "2023-11-29T20:18:35.284225+00:00", + "commandType": "aspirate", + "key": "52a94b36c8caff1c8a56723b6301d98b", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.284322+00:00", + "completedAt": "2023-11-29T20:18:35.289325+00:00" + }, + { + "id": "6109360d-7cf0-4f7f-b949-c0c6f6ce1f9c", + "createdAt": "2023-11-29T20:18:35.290123+00:00", + "commandType": "dispense", + "key": "dc7eb9bf42615e69b00863b917770ed4", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.290236+00:00", + "completedAt": "2023-11-29T20:18:35.292823+00:00" + }, + { + "id": "3b3de0a7-92c1-4433-a79e-255dbf109b97", + "createdAt": "2023-11-29T20:18:35.294244+00:00", + "commandType": "aspirate", + "key": "f972687185feb5c56ec96ebaa4883b5e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.294354+00:00", + "completedAt": "2023-11-29T20:18:35.299900+00:00" + }, + { + "id": "4e9a2554-f7eb-4491-a844-430d69059686", + "createdAt": "2023-11-29T20:18:35.300792+00:00", + "commandType": "dispense", + "key": "8cb1c4c42089e504fc9f2b0c4e0d1800", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.300910+00:00", + "completedAt": "2023-11-29T20:18:35.303236+00:00" + }, + { + "id": "52c9d616-d592-499c-a118-3e342694366c", + "createdAt": "2023-11-29T20:18:35.304025+00:00", + "commandType": "aspirate", + "key": "169056850359b93f84f83f2e764a7f73", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.304114+00:00", + "completedAt": "2023-11-29T20:18:35.309349+00:00" + }, + { + "id": "682e5a9d-bf7e-4963-b43d-c12bd8d26cde", + "createdAt": "2023-11-29T20:18:35.310671+00:00", + "commandType": "dispense", + "key": "3d72decd9fcdfe1a220d4f5ee66d870b", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.310818+00:00", + "completedAt": "2023-11-29T20:18:35.313333+00:00" + }, + { + "id": "1dabfcae-f5c1-4e25-b32a-96bfaa74c9a9", + "createdAt": "2023-11-29T20:18:35.314161+00:00", + "commandType": "aspirate", + "key": "f515047de7a4f166f9aed9fc09a8ec94", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.314334+00:00", + "completedAt": "2023-11-29T20:18:35.319803+00:00" + }, + { + "id": "f63b0361-9373-4b1c-9395-1597bb3561cb", + "createdAt": "2023-11-29T20:18:35.320715+00:00", + "commandType": "dispense", + "key": "bb83e8baf18f6cbd2ba33237c5334de1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.320833+00:00", + "completedAt": "2023-11-29T20:18:35.323344+00:00" + }, + { + "id": "75eafd1d-6724-45fb-98d8-293df2924ac0", + "createdAt": "2023-11-29T20:18:35.324214+00:00", + "commandType": "aspirate", + "key": "7106e7e47b8b0122e65768b9300d22d8", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.324340+00:00", + "completedAt": "2023-11-29T20:18:35.330093+00:00" + }, + { + "id": "dfdbcd43-d24f-4657-979f-3344b19f4150", + "createdAt": "2023-11-29T20:18:35.331126+00:00", + "commandType": "dispense", + "key": "2476b5aac20d2f59db3b561d0dde0f15", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.95 } + }, + "flowRate": 80.0, + "volume": 45.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 2.3099999999999943 }, + "volume": 45.0 + }, + "startedAt": "2023-11-29T20:18:35.331231+00:00", + "completedAt": "2023-11-29T20:18:35.333787+00:00" + }, + { + "id": "72695062-38c3-423c-bb68-fa50d0f66092", + "createdAt": "2023-11-29T20:18:35.335084+00:00", + "commandType": "moveToWell", + "key": "24cc344322569d2d4920522021d428a4", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 13.259999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.335403+00:00", + "completedAt": "2023-11-29T20:18:35.337133+00:00" + }, + { + "id": "be83b8a1-bf2f-4335-ae57-164773bde61f", + "createdAt": "2023-11-29T20:18:35.337564+00:00", + "commandType": "waitForDuration", + "key": "a5f5f88d84650cff1f31407ed4c78436", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.337763+00:00", + "completedAt": "2023-11-29T20:18:35.337842+00:00" + }, + { + "id": "8398b959-ddde-48c7-aac0-01be656afc33", + "createdAt": "2023-11-29T20:18:35.338735+00:00", + "commandType": "blowout", + "key": "a890a3f5bfa037a7efa114cfd7b0ba4d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 66.375, "y": 356.2, "z": 13.259999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.338816+00:00", + "completedAt": "2023-11-29T20:18:35.341063+00:00" + }, + { + "id": "88b8b467-cc03-4848-8e0b-d41d44190bc7", + "createdAt": "2023-11-29T20:18:35.341596+00:00", + "commandType": "dropTip", + "key": "4b2f06f259bb93e67782a27207c8958c", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:35.341681+00:00", + "completedAt": "2023-11-29T20:18:35.348425+00:00" + }, + { + "id": "c47ceb16-bc57-46ec-9cf7-262a7ab6df7c", + "createdAt": "2023-11-29T20:18:35.348843+00:00", + "commandType": "thermocycler/closeLid", + "key": "e19a3770d0eb228b773b48322b36fad3", + "status": "succeeded", + "params": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.348909+00:00", + "completedAt": "2023-11-29T20:18:35.351934+00:00" + }, + { + "id": "581291a4-1fe7-41d3-a965-e3621882d1dc", + "createdAt": "2023-11-29T20:18:35.352388+00:00", + "commandType": "thermocycler/runProfile", + "key": "01efc980ce11520fd1340ee191191906", + "status": "succeeded", + "params": { + "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3", + "profile": [{ "celsius": 98.0, "holdSeconds": 45.0 }], + "blockMaxVolumeUl": 50.0 + }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.352525+00:00", + "completedAt": "2023-11-29T20:18:35.352654+00:00" + }, + { + "id": "eb52c118-9fd2-4bb1-bc51-6ae29f7aecf4", + "createdAt": "2023-11-29T20:18:35.353134+00:00", + "commandType": "thermocycler/runProfile", + "key": "052156467ca36ac671a51d56ee60efa7", + "status": "succeeded", + "params": { + "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3", + "profile": [ + { "celsius": 98.0, "holdSeconds": 15.0 }, + { "celsius": 60.0, "holdSeconds": 30.0 }, + { "celsius": 72.0, "holdSeconds": 30.0 }, + { "celsius": 98.0, "holdSeconds": 15.0 }, + { "celsius": 60.0, "holdSeconds": 30.0 }, + { "celsius": 72.0, "holdSeconds": 30.0 }, + { "celsius": 98.0, "holdSeconds": 15.0 }, + { "celsius": 60.0, "holdSeconds": 30.0 }, + { "celsius": 72.0, "holdSeconds": 30.0 }, + { "celsius": 98.0, "holdSeconds": 15.0 }, + { "celsius": 60.0, "holdSeconds": 30.0 }, + { "celsius": 72.0, "holdSeconds": 30.0 }, + { "celsius": 98.0, "holdSeconds": 15.0 }, + { "celsius": 60.0, "holdSeconds": 30.0 }, + { "celsius": 72.0, "holdSeconds": 30.0 }, + { "celsius": 98.0, "holdSeconds": 15.0 }, + { "celsius": 60.0, "holdSeconds": 30.0 }, + { "celsius": 72.0, "holdSeconds": 30.0 } + ], + "blockMaxVolumeUl": 50.0 + }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.353227+00:00", + "completedAt": "2023-11-29T20:18:35.353349+00:00" + }, + { + "id": "56457a9e-7195-4989-93bc-9255844455ff", + "createdAt": "2023-11-29T20:18:35.353598+00:00", + "commandType": "thermocycler/runProfile", + "key": "f705c1f87233b3054f8fe3d5ce4d1f5d", + "status": "succeeded", + "params": { + "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3", + "profile": [{ "celsius": 72.0, "holdSeconds": 60.0 }], + "blockMaxVolumeUl": 50.0 + }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.353652+00:00", + "completedAt": "2023-11-29T20:18:35.353709+00:00" + }, + { + "id": "ba99cfdf-5375-44c3-8990-630bd80cd874", + "createdAt": "2023-11-29T20:18:35.353933+00:00", + "commandType": "thermocycler/setTargetBlockTemperature", + "key": "28c33cb6fdade8c1850a9075995e8faa", + "status": "succeeded", + "params": { + "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3", + "celsius": 4.0, + "holdTimeSeconds": 0.0 + }, + "result": { "targetBlockTemperature": 4.0 }, + "startedAt": "2023-11-29T20:18:35.353989+00:00", + "completedAt": "2023-11-29T20:18:35.354044+00:00" + }, + { + "id": "c00bd9eb-aadf-4cfc-9dc2-a4ca68593f53", + "createdAt": "2023-11-29T20:18:35.354224+00:00", + "commandType": "thermocycler/waitForBlockTemperature", + "key": "bb0114f9f1c7c6678279c8ded7e6bf02", + "status": "succeeded", + "params": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.354280+00:00", + "completedAt": "2023-11-29T20:18:35.354331+00:00" + }, + { + "id": "7edfe5f2-7d8f-408a-a7e9-fa6211425113", + "createdAt": "2023-11-29T20:18:35.354527+00:00", + "commandType": "thermocycler/openLid", + "key": "1a43898cf3cf9bd8e545241d4139a153", + "status": "succeeded", + "params": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.354577+00:00", + "completedAt": "2023-11-29T20:18:35.356178+00:00" + }, + { + "id": "cf20272d-97e5-4c27-90d3-8b27c24e5d42", + "createdAt": "2023-11-29T20:18:35.356663+00:00", + "commandType": "custom", + "key": "c8c20c55c470ad833a9adb10e528036b", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "==============================================" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.356722+00:00", + "completedAt": "2023-11-29T20:18:35.356772+00:00" + }, + { + "id": "0de8d335-46cc-4728-9200-092cf5e5b55f", + "createdAt": "2023-11-29T20:18:35.357203+00:00", + "commandType": "custom", + "key": "f35bbad7fd0cf81b1bfbfb2e17807cb3", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Cleanup 3" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.357255+00:00", + "completedAt": "2023-11-29T20:18:35.357301+00:00" + }, + { + "id": "b50e603e-c008-453b-83f4-5ee6d8034e66", + "createdAt": "2023-11-29T20:18:35.357665+00:00", + "commandType": "custom", + "key": "098a60a6792d6fba6bcc0a73e2505507", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "==============================================" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.357713+00:00", + "completedAt": "2023-11-29T20:18:35.357756+00:00" + }, + { + "id": "83e80a79-7b7f-4225-8c2d-3d6fd1f682fd", + "createdAt": "2023-11-29T20:18:35.357982+00:00", + "commandType": "heaterShaker/openLabwareLatch", + "key": "c1f05d61d4defc8548d072284eb3531e", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": { "pipetteRetracted": true }, + "startedAt": "2023-11-29T20:18:35.358179+00:00", + "completedAt": "2023-11-29T20:18:35.361715+00:00" + }, + { + "id": "7991f7e5-58a6-4e86-a36f-38f3b81f024a", + "createdAt": "2023-11-29T20:18:35.362254+00:00", + "commandType": "moveLabware", + "key": "878c5a26b3ffa8862f7d3f3632a50933", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "newLocation": { "labwareId": "3787af65-0305-4b08-bf02-a2c6596a10e5" }, + "strategy": "usingGripper", + "pickUpOffset": { "x": 0.0, "y": 0.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": -2.0, "z": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.362333+00:00", + "completedAt": "2023-11-29T20:18:35.362578+00:00" + }, + { + "id": "ae42fbbc-416a-4d36-bc06-06f734a59d8c", + "createdAt": "2023-11-29T20:18:35.362847+00:00", + "commandType": "heaterShaker/closeLabwareLatch", + "key": "76fa877c68446ff5170b68a9f0ed085c", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.362902+00:00", + "completedAt": "2023-11-29T20:18:35.362951+00:00" + }, + { + "id": "3fffa8cf-3612-4a69-9316-03bc5ec1e9d9", + "createdAt": "2023-11-29T20:18:35.364601+00:00", + "commandType": "custom", + "key": "2e7cb9568a50d00a551240005ec8eb47", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> ADDING AMPure (0.8x)" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.364754+00:00", + "completedAt": "2023-11-29T20:18:35.364845+00:00" + }, + { + "id": "80298d09-e50a-4a87-9d10-e6f67dc2f500", + "createdAt": "2023-11-29T20:18:35.365456+00:00", + "commandType": "pickUpTip", + "key": "6113f614af4d5a1a804c3200ab0b3da1", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 369.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:35.365521+00:00", + "completedAt": "2023-11-29T20:18:35.377652+00:00" + }, + { + "id": "1b98ca36-25b1-4792-987f-37f04d74e6b7", + "createdAt": "2023-11-29T20:18:35.378437+00:00", + "commandType": "aspirate", + "key": "85edc302f3b08ac18b948c057dc0a70e", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.378539+00:00", + "completedAt": "2023-11-29T20:18:35.384378+00:00" + }, + { + "id": "9f523599-1af6-4094-a05f-60cb77526c29", + "createdAt": "2023-11-29T20:18:35.385025+00:00", + "commandType": "dispense", + "key": "9bcec355826e53bb2de0f1b164965f1e", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.385124+00:00", + "completedAt": "2023-11-29T20:18:35.387065+00:00" + }, + { + "id": "1ce49282-5219-4f78-9212-6a564addbd9c", + "createdAt": "2023-11-29T20:18:35.387794+00:00", + "commandType": "aspirate", + "key": "f9580c71624da46f6cf03227ffa79dd7", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.387908+00:00", + "completedAt": "2023-11-29T20:18:35.392930+00:00" + }, + { + "id": "a07a3a70-4e9e-4170-ac5e-ea9a12a79f3a", + "createdAt": "2023-11-29T20:18:35.393733+00:00", + "commandType": "dispense", + "key": "dac612616fbcd82886b79121410106f8", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.393820+00:00", + "completedAt": "2023-11-29T20:18:35.395929+00:00" + }, + { + "id": "9744f37f-b54a-4a56-a222-c63b959ca57b", + "createdAt": "2023-11-29T20:18:35.396642+00:00", + "commandType": "aspirate", + "key": "7c1739de58c4ffdd06da4c4aff28b6c3", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.396766+00:00", + "completedAt": "2023-11-29T20:18:35.401819+00:00" + }, + { + "id": "cc9c8d13-367d-4407-8820-d7638eed4254", + "createdAt": "2023-11-29T20:18:35.402541+00:00", + "commandType": "dispense", + "key": "2bcf27f1cdd3755f5bb46b4717c362b7", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.402610+00:00", + "completedAt": "2023-11-29T20:18:35.404524+00:00" + }, + { + "id": "f03976c2-efd9-403a-a69a-e9d8256e9960", + "createdAt": "2023-11-29T20:18:35.405074+00:00", + "commandType": "aspirate", + "key": "db066259cdc91149860bbb7ca1370650", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.405131+00:00", + "completedAt": "2023-11-29T20:18:35.409476+00:00" + }, + { + "id": "0b21c182-15b9-4b6b-87e6-3bdfa5d3bfb5", + "createdAt": "2023-11-29T20:18:35.410227+00:00", + "commandType": "dispense", + "key": "a0dfd05129ed015c7938db1497826d00", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 3.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 3.0 + }, + "startedAt": "2023-11-29T20:18:35.410302+00:00", + "completedAt": "2023-11-29T20:18:35.412462+00:00" + }, + { + "id": "e0b38e31-740a-4e90-9be0-73bdc01588ea", + "createdAt": "2023-11-29T20:18:35.413150+00:00", + "commandType": "moveToWell", + "key": "cea03d039909c69d8c4a724354e8bb11", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.413252+00:00", + "completedAt": "2023-11-29T20:18:35.414604+00:00" + }, + { + "id": "5b994f48-b7b2-4052-92b3-d1b3ff5e63aa", + "createdAt": "2023-11-29T20:18:35.415327+00:00", + "commandType": "moveToWell", + "key": "b657cbe4027e2960d5175f5174f0ecf8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 182.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.415392+00:00", + "completedAt": "2023-11-29T20:18:35.416885+00:00" + }, + { + "id": "0d4ddaed-c655-4135-90b2-6147961a622e", + "createdAt": "2023-11-29T20:18:35.417404+00:00", + "commandType": "moveToWell", + "key": "0517ad27a79fa1980cc1fe1ad50bf8b1", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 174.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.417519+00:00", + "completedAt": "2023-11-29T20:18:35.419069+00:00" + }, + { + "id": "0bf78309-f6a7-4ebe-bf5c-887e2d874f4f", + "createdAt": "2023-11-29T20:18:35.420108+00:00", + "commandType": "dispense", + "key": "c131f57e1eff3dc1371f02ddb1ed0af3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 40.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:35.420177+00:00", + "completedAt": "2023-11-29T20:18:35.425711+00:00" + }, + { + "id": "7c6d42a7-04d7-4492-88a9-7192b885e255", + "createdAt": "2023-11-29T20:18:35.426892+00:00", + "commandType": "moveToWell", + "key": "c3f16d6e8d474b6457bfbcb614afa05d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:35.427050+00:00", + "completedAt": "2023-11-29T20:18:35.428674+00:00" + }, + { + "id": "b3155034-ce49-4384-88e5-d895bfe70b92", + "createdAt": "2023-11-29T20:18:35.429646+00:00", + "commandType": "aspirate", + "key": "f37d132cb5b6ce64209309853c42be3e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:35.429743+00:00", + "completedAt": "2023-11-29T20:18:35.434779+00:00" + }, + { + "id": "c124eb46-ff82-4dd3-9814-29c618d5a815", + "createdAt": "2023-11-29T20:18:35.435523+00:00", + "commandType": "moveToWell", + "key": "0c88530edff40c8f500b467a3b0753e5", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:35.435702+00:00", + "completedAt": "2023-11-29T20:18:35.437162+00:00" + }, + { + "id": "26fd2204-8e03-4282-916f-1caaa0dba8ba", + "createdAt": "2023-11-29T20:18:35.438285+00:00", + "commandType": "aspirate", + "key": "2500ec3545fb5b264c5cfe336937d6fd", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:35.438367+00:00", + "completedAt": "2023-11-29T20:18:35.440653+00:00" + }, + { + "id": "82b5bfd6-b157-4502-b1a3-fd513ed5f115", + "createdAt": "2023-11-29T20:18:35.441525+00:00", + "commandType": "dispense", + "key": "943e29411f97fa5d7f4fc3ed8a375fba", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:35.441613+00:00", + "completedAt": "2023-11-29T20:18:35.443847+00:00" + }, + { + "id": "921ea3a5-2515-47a3-959c-cd499f192e40", + "createdAt": "2023-11-29T20:18:35.444671+00:00", + "commandType": "moveToWell", + "key": "05acf4ca14b2c72c193072acb32534a1", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:35.444799+00:00", + "completedAt": "2023-11-29T20:18:35.446240+00:00" + }, + { + "id": "1bf6ceaf-0230-4423-9c48-cc9ec3ea2ab2", + "createdAt": "2023-11-29T20:18:35.447130+00:00", + "commandType": "dispense", + "key": "7d205f722910301c507c59e6d7ac03cc", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:35.447202+00:00", + "completedAt": "2023-11-29T20:18:35.449239+00:00" + }, + { + "id": "c8a4073c-02a2-4018-a52d-60ba60bae957", + "createdAt": "2023-11-29T20:18:35.450093+00:00", + "commandType": "aspirate", + "key": "080827b3f4426c04d0a897e05a8713e0", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:35.450216+00:00", + "completedAt": "2023-11-29T20:18:35.455131+00:00" + }, + { + "id": "7da9148a-e416-4a2d-8ae3-01eeb72e109b", + "createdAt": "2023-11-29T20:18:35.455828+00:00", + "commandType": "moveToWell", + "key": "be5db379a04d580cf751a3eb0b89aa17", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:35.455888+00:00", + "completedAt": "2023-11-29T20:18:35.457330+00:00" + }, + { + "id": "7434fe46-9539-4a8d-87ee-3dd5577dcdc3", + "createdAt": "2023-11-29T20:18:35.458370+00:00", + "commandType": "aspirate", + "key": "0b2c364769828e779991ead689fbbc67", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:35.458451+00:00", + "completedAt": "2023-11-29T20:18:35.460930+00:00" + }, + { + "id": "8f03684d-b62b-4875-b4c8-7d423129ba50", + "createdAt": "2023-11-29T20:18:35.461956+00:00", + "commandType": "dispense", + "key": "cedccc422c129cb4d7b19313d42e5192", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:35.462034+00:00", + "completedAt": "2023-11-29T20:18:35.464172+00:00" + }, + { + "id": "4972f044-ed46-4d85-9932-383235d0239b", + "createdAt": "2023-11-29T20:18:35.464804+00:00", + "commandType": "moveToWell", + "key": "831f4dbd60846846e5217eb739a15c18", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:35.464867+00:00", + "completedAt": "2023-11-29T20:18:35.466316+00:00" + }, + { + "id": "da10a9c0-e9e7-477a-8afe-5f0c8b06b068", + "createdAt": "2023-11-29T20:18:35.467243+00:00", + "commandType": "dispense", + "key": "4e24fe9d93aa45ee8d74b637c87eb8ad", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:35.467362+00:00", + "completedAt": "2023-11-29T20:18:35.469903+00:00" + }, + { + "id": "6c395c11-576e-4e06-85ef-0383130d1f3f", + "createdAt": "2023-11-29T20:18:35.470841+00:00", + "commandType": "moveToWell", + "key": "7489db358ba6520b42de8faecf80f5ee", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.470925+00:00", + "completedAt": "2023-11-29T20:18:35.472533+00:00" + }, + { + "id": "e4d96689-b31d-4bfc-932c-3cc07978aa25", + "createdAt": "2023-11-29T20:18:35.473016+00:00", + "commandType": "waitForDuration", + "key": "3620c3b27800325439c6e50ae3c673ba", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.473132+00:00", + "completedAt": "2023-11-29T20:18:35.473221+00:00" + }, + { + "id": "1a844846-ba53-4261-9e76-59813b0b3d45", + "createdAt": "2023-11-29T20:18:35.474167+00:00", + "commandType": "blowout", + "key": "d820c565e55dd99bde37ff908560923f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.474230+00:00", + "completedAt": "2023-11-29T20:18:35.476547+00:00" + }, + { + "id": "3614610d-786e-47e9-b97c-029592b27810", + "createdAt": "2023-11-29T20:18:35.477297+00:00", + "commandType": "touchTip", + "key": "7759283ffdd9a73fcee4a036f28efc86", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 36.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.477386+00:00", + "completedAt": "2023-11-29T20:18:35.483692+00:00" + }, + { + "id": "620f2321-45b1-4fb7-b6c3-47ae6e36d840", + "createdAt": "2023-11-29T20:18:35.484907+00:00", + "commandType": "moveToWell", + "key": "3397f2d8cac16a27322236ea9ffaee7e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.485024+00:00", + "completedAt": "2023-11-29T20:18:35.486812+00:00" + }, + { + "id": "eaf1546f-8af6-40fb-9f60-f8815d365fee", + "createdAt": "2023-11-29T20:18:35.487538+00:00", + "commandType": "moveToWell", + "key": "aa35f51821ff917ced3e6223833ce0ff", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 37.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.487675+00:00", + "completedAt": "2023-11-29T20:18:35.489198+00:00" + }, + { + "id": "721a3f55-4ae2-440a-be4f-b2e40fe09e83", + "createdAt": "2023-11-29T20:18:35.489951+00:00", + "commandType": "moveToWell", + "key": "1e3da2e083d6a07dd2fa0df85324a44c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.490029+00:00", + "completedAt": "2023-11-29T20:18:35.491764+00:00" + }, + { + "id": "9762970a-9f16-41ff-86e8-643b8cb20000", + "createdAt": "2023-11-29T20:18:35.492243+00:00", + "commandType": "dropTip", + "key": "7c33371336e2ce483611ab2f9afee1fd", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:35.492323+00:00", + "completedAt": "2023-11-29T20:18:35.500360+00:00" + }, + { + "id": "27a803c5-d0e4-46e6-a28f-57d13d5a6288", + "createdAt": "2023-11-29T20:18:35.501486+00:00", + "commandType": "pickUpTip", + "key": "a540e881a27d994bfcb0fee09d96f88e", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 378.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:35.501578+00:00", + "completedAt": "2023-11-29T20:18:35.512429+00:00" + }, + { + "id": "7978d4c4-4ec5-42e3-aa76-aeccc7a49a16", + "createdAt": "2023-11-29T20:18:35.513177+00:00", + "commandType": "aspirate", + "key": "7cad9a416a5ba2894b72915c9ef7041a", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.513273+00:00", + "completedAt": "2023-11-29T20:18:35.518812+00:00" + }, + { + "id": "1e564f25-39a7-43a9-8899-2686c7892e13", + "createdAt": "2023-11-29T20:18:35.519622+00:00", + "commandType": "dispense", + "key": "1d1564290fe25eabe651f385fe1d1d32", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.519731+00:00", + "completedAt": "2023-11-29T20:18:35.521676+00:00" + }, + { + "id": "ea42c626-0635-49be-acb0-3050891c9582", + "createdAt": "2023-11-29T20:18:35.522263+00:00", + "commandType": "aspirate", + "key": "33ae66373976d47d6a2866bb3019bfbf", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.522320+00:00", + "completedAt": "2023-11-29T20:18:35.527223+00:00" + }, + { + "id": "f2d159a5-48ce-4320-8ec0-5e49bd1e8c6d", + "createdAt": "2023-11-29T20:18:35.527989+00:00", + "commandType": "dispense", + "key": "dcc7c2d7be475297e6cf7e331c457728", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.528124+00:00", + "completedAt": "2023-11-29T20:18:35.530346+00:00" + }, + { + "id": "f8e7210e-ada4-4b38-9560-02f9db89eabd", + "createdAt": "2023-11-29T20:18:35.530941+00:00", + "commandType": "aspirate", + "key": "b5149766608d5b1b56e9a6de11cabd34", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.531001+00:00", + "completedAt": "2023-11-29T20:18:35.535746+00:00" + }, + { + "id": "1eef2b87-c487-489f-9c9d-15e549ac857b", + "createdAt": "2023-11-29T20:18:35.536459+00:00", + "commandType": "dispense", + "key": "bdeacd0968af0f3dde0bfca1061158c2", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.536526+00:00", + "completedAt": "2023-11-29T20:18:35.538347+00:00" + }, + { + "id": "b752a773-bd2f-4266-8263-e5b170997ab7", + "createdAt": "2023-11-29T20:18:35.538888+00:00", + "commandType": "aspirate", + "key": "c5e28e6dae5e3550c94a9e5ccbf6843c", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.538945+00:00", + "completedAt": "2023-11-29T20:18:35.543524+00:00" + }, + { + "id": "84b9d6fc-7c55-4147-8f34-0ef3c8069109", + "createdAt": "2023-11-29T20:18:35.544470+00:00", + "commandType": "dispense", + "key": "51c599996ad2623c4cec39af6f24cc64", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 3.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 3.0 + }, + "startedAt": "2023-11-29T20:18:35.544554+00:00", + "completedAt": "2023-11-29T20:18:35.546639+00:00" + }, + { + "id": "712f528d-0261-4138-9d00-7c454cec5568", + "createdAt": "2023-11-29T20:18:35.547338+00:00", + "commandType": "moveToWell", + "key": "9755aef2fea5870f10bb1e89593c64dc", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.547402+00:00", + "completedAt": "2023-11-29T20:18:35.548591+00:00" + }, + { + "id": "e955d4f5-ef58-4c1c-8a05-4f8a4043e749", + "createdAt": "2023-11-29T20:18:35.549224+00:00", + "commandType": "moveToWell", + "key": "3fdaabbf9ed37bc0521bd836f0f51a69", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 182.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.549323+00:00", + "completedAt": "2023-11-29T20:18:35.550718+00:00" + }, + { + "id": "54635232-ce4c-463b-8e0a-fa49914d782b", + "createdAt": "2023-11-29T20:18:35.551386+00:00", + "commandType": "moveToWell", + "key": "a5d8b12276a2b8eed231198664de7023", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 174.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.551471+00:00", + "completedAt": "2023-11-29T20:18:35.552925+00:00" + }, + { + "id": "d331506a-7e80-409f-8d35-ca02f7026714", + "createdAt": "2023-11-29T20:18:35.553873+00:00", + "commandType": "dispense", + "key": "07bead326f4c7ad4137e861230bda671", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 40.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:35.553936+00:00", + "completedAt": "2023-11-29T20:18:35.559199+00:00" + }, + { + "id": "3f7b29eb-dffe-45b7-83eb-e0d8555ffdf5", + "createdAt": "2023-11-29T20:18:35.560342+00:00", + "commandType": "moveToWell", + "key": "a3cf234bbb511d5e4d3b39adb0235b0a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:35.560418+00:00", + "completedAt": "2023-11-29T20:18:35.562043+00:00" + }, + { + "id": "1f23c289-e4ea-47a7-ada5-c25c18723ab7", + "createdAt": "2023-11-29T20:18:35.562882+00:00", + "commandType": "aspirate", + "key": "d409448232254d4aeb21de0bff535ad8", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:35.562961+00:00", + "completedAt": "2023-11-29T20:18:35.567837+00:00" + }, + { + "id": "ad7b57a6-ea0b-47d6-8413-ede4b7102ded", + "createdAt": "2023-11-29T20:18:35.568710+00:00", + "commandType": "moveToWell", + "key": "5bf3693418dfb751ddb8fa96b30d9224", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:35.568793+00:00", + "completedAt": "2023-11-29T20:18:35.570184+00:00" + }, + { + "id": "fa7007ee-3eb4-4cbc-b538-e9fb7b530f67", + "createdAt": "2023-11-29T20:18:35.570906+00:00", + "commandType": "aspirate", + "key": "008918fd861f68f62430b9cd30bab13c", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:35.570962+00:00", + "completedAt": "2023-11-29T20:18:35.572989+00:00" + }, + { + "id": "c2672450-6bea-4d39-88b5-e23a5c067504", + "createdAt": "2023-11-29T20:18:35.573765+00:00", + "commandType": "dispense", + "key": "7d283f5bf59eb86d48f868ca8be1bf8c", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:35.573832+00:00", + "completedAt": "2023-11-29T20:18:35.576061+00:00" + }, + { + "id": "8769c166-36e4-4253-bce1-5fbb2b63ee5c", + "createdAt": "2023-11-29T20:18:35.576995+00:00", + "commandType": "moveToWell", + "key": "eb78b97b76861580d990f9272c6d8144", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:35.577089+00:00", + "completedAt": "2023-11-29T20:18:35.578675+00:00" + }, + { + "id": "7c16bfd6-a75c-46aa-ad96-c7f838753d4e", + "createdAt": "2023-11-29T20:18:35.579556+00:00", + "commandType": "dispense", + "key": "77a501713098c7fe3c2291be5e8ff03e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:35.579665+00:00", + "completedAt": "2023-11-29T20:18:35.581775+00:00" + }, + { + "id": "2219b88e-73f4-48ea-8abd-bc9f867003df", + "createdAt": "2023-11-29T20:18:35.582624+00:00", + "commandType": "aspirate", + "key": "3cc166dafaa7c01566d532da5d3a304f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:35.582695+00:00", + "completedAt": "2023-11-29T20:18:35.587725+00:00" + }, + { + "id": "b1f36e20-d5e2-4e67-a5db-8be37f888fc5", + "createdAt": "2023-11-29T20:18:35.588529+00:00", + "commandType": "moveToWell", + "key": "7c35ef599a043a2a1fbcf34fa97f3a15", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:35.588625+00:00", + "completedAt": "2023-11-29T20:18:35.590132+00:00" + }, + { + "id": "c40551c6-261b-4352-8ade-d4a51a9ebc6d", + "createdAt": "2023-11-29T20:18:35.591035+00:00", + "commandType": "aspirate", + "key": "201f3631177ca4cd4d838c4945e6efa5", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:35.591116+00:00", + "completedAt": "2023-11-29T20:18:35.593504+00:00" + }, + { + "id": "04d3744f-b63c-4060-96c6-74c44891c49f", + "createdAt": "2023-11-29T20:18:35.594358+00:00", + "commandType": "dispense", + "key": "2d431e0fa7292fe98844084a102f3ec3", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:35.594494+00:00", + "completedAt": "2023-11-29T20:18:35.596705+00:00" + }, + { + "id": "0e9b3278-7c59-4dd1-92c9-73b3dce69a36", + "createdAt": "2023-11-29T20:18:35.597563+00:00", + "commandType": "moveToWell", + "key": "b7e57147d8db0fa374641924be79d4d8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:35.597702+00:00", + "completedAt": "2023-11-29T20:18:35.599260+00:00" + }, + { + "id": "a12a39e4-c86f-4daf-9723-62ec5f713d0a", + "createdAt": "2023-11-29T20:18:35.600210+00:00", + "commandType": "dispense", + "key": "47d3d4d740f89832029a83da56d4c0dc", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:35.600284+00:00", + "completedAt": "2023-11-29T20:18:35.602623+00:00" + }, + { + "id": "ef74fc6a-b03c-4d9d-a2e3-e9ace6ae781f", + "createdAt": "2023-11-29T20:18:35.603294+00:00", + "commandType": "moveToWell", + "key": "23a315af34b1173f30fe97ee10ae1d0a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.603370+00:00", + "completedAt": "2023-11-29T20:18:35.604765+00:00" + }, + { + "id": "add6dc77-63a9-4f9b-aac1-bb855d1283a2", + "createdAt": "2023-11-29T20:18:35.605094+00:00", + "commandType": "waitForDuration", + "key": "0bb83f63ee3d8d87153cb698ae2fd93c", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.605157+00:00", + "completedAt": "2023-11-29T20:18:35.605217+00:00" + }, + { + "id": "f3ba286e-d7be-4c87-9e85-9b525bfa8c85", + "createdAt": "2023-11-29T20:18:35.606240+00:00", + "commandType": "blowout", + "key": "e8409403839c3ebca9b942dfbf5ba95e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.606319+00:00", + "completedAt": "2023-11-29T20:18:35.608605+00:00" + }, + { + "id": "8ba38cb2-c33b-41ef-871e-72425c8c0b70", + "createdAt": "2023-11-29T20:18:35.609242+00:00", + "commandType": "touchTip", + "key": "9be3f140535a95110651d3d9ca2e5a6c", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 36.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.609306+00:00", + "completedAt": "2023-11-29T20:18:35.615966+00:00" + }, + { + "id": "1de22e91-28ba-4a8c-9ed5-9506c8e6f623", + "createdAt": "2023-11-29T20:18:35.616923+00:00", + "commandType": "moveToWell", + "key": "69ca0f9d18634a20f74870f9899b283d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.616994+00:00", + "completedAt": "2023-11-29T20:18:35.618538+00:00" + }, + { + "id": "b128ef85-6c96-489a-af50-1f4937f06b74", + "createdAt": "2023-11-29T20:18:35.619376+00:00", + "commandType": "moveToWell", + "key": "f325f6f6e51308596c1c7c01973c6f38", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 37.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.619457+00:00", + "completedAt": "2023-11-29T20:18:35.620919+00:00" + }, + { + "id": "81e776f5-0937-4774-880d-efa096f0c58f", + "createdAt": "2023-11-29T20:18:35.621554+00:00", + "commandType": "moveToWell", + "key": "3236013eb7f15b9bea65dcba6a2b34dd", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.621613+00:00", + "completedAt": "2023-11-29T20:18:35.622970+00:00" + }, + { + "id": "006988e3-1172-45dc-a7f6-15a88d70aa7e", + "createdAt": "2023-11-29T20:18:35.623304+00:00", + "commandType": "dropTip", + "key": "f96feb1cb4b70c93b0b1e9208aefbc33", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:35.623482+00:00", + "completedAt": "2023-11-29T20:18:35.631177+00:00" + }, + { + "id": "9925b0df-0f72-4151-9521-0919d3f077d9", + "createdAt": "2023-11-29T20:18:35.631942+00:00", + "commandType": "pickUpTip", + "key": "28042263c49b1929c12b062d4bec4ad0", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 387.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:35.632032+00:00", + "completedAt": "2023-11-29T20:18:35.642854+00:00" + }, + { + "id": "c9b3b3ed-2430-4e92-822a-7354bdda218e", + "createdAt": "2023-11-29T20:18:35.643614+00:00", + "commandType": "aspirate", + "key": "9898cf0a2322ca3aa7c21aebceab2731", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.643735+00:00", + "completedAt": "2023-11-29T20:18:35.649122+00:00" + }, + { + "id": "7f356726-42a2-433c-a39c-c53763ccce53", + "createdAt": "2023-11-29T20:18:35.649834+00:00", + "commandType": "dispense", + "key": "203411f0086ba18b4ac6715ac8b5002b", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.649974+00:00", + "completedAt": "2023-11-29T20:18:35.652182+00:00" + }, + { + "id": "d12b107b-0fdf-47eb-891b-5ac04cf8c1af", + "createdAt": "2023-11-29T20:18:35.652972+00:00", + "commandType": "aspirate", + "key": "8c25e7cb247258d7268b30b98da56bb7", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.653049+00:00", + "completedAt": "2023-11-29T20:18:35.657625+00:00" + }, + { + "id": "e057614a-abbb-43f4-b163-fd3d7513eb38", + "createdAt": "2023-11-29T20:18:35.658379+00:00", + "commandType": "dispense", + "key": "70cf421bead2adf292a6302a38a56a62", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.658443+00:00", + "completedAt": "2023-11-29T20:18:35.660457+00:00" + }, + { + "id": "b735d11c-0a4e-4a4a-8c87-e7f626fd3006", + "createdAt": "2023-11-29T20:18:35.661002+00:00", + "commandType": "aspirate", + "key": "57cd8b936cdf4b164372c6db94dab80a", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.661063+00:00", + "completedAt": "2023-11-29T20:18:35.665335+00:00" + }, + { + "id": "4a34a849-48f7-48e2-b10b-7d39ebd9b91a", + "createdAt": "2023-11-29T20:18:35.666027+00:00", + "commandType": "dispense", + "key": "887f39c787669366ed1bb2dd529dc047", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.666110+00:00", + "completedAt": "2023-11-29T20:18:35.668245+00:00" + }, + { + "id": "5998c5be-f97b-40a3-90ef-e25962b6bf4d", + "createdAt": "2023-11-29T20:18:35.668949+00:00", + "commandType": "aspirate", + "key": "89dd2bc6e84100899abf715f4606b26c", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 53.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 53.0 + }, + "startedAt": "2023-11-29T20:18:35.669024+00:00", + "completedAt": "2023-11-29T20:18:35.673386+00:00" + }, + { + "id": "d3fed937-1db2-4346-8f84-ad334a7d0267", + "createdAt": "2023-11-29T20:18:35.674105+00:00", + "commandType": "dispense", + "key": "063bbf03d86f43a657cc4f66a61b1851", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 40.0, + "volume": 3.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 5.55 }, + "volume": 3.0 + }, + "startedAt": "2023-11-29T20:18:35.674207+00:00", + "completedAt": "2023-11-29T20:18:35.676425+00:00" + }, + { + "id": "3d92b110-2a87-4fe5-b8dd-412a16fb1af8", + "createdAt": "2023-11-29T20:18:35.677270+00:00", + "commandType": "moveToWell", + "key": "6ef31f355738010011f1034d0f35d260", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.677353+00:00", + "completedAt": "2023-11-29T20:18:35.678720+00:00" + }, + { + "id": "96ae2983-a8f5-4292-8484-7b3aaa6d263b", + "createdAt": "2023-11-29T20:18:35.679419+00:00", + "commandType": "moveToWell", + "key": "e152d2f158f9b14e9a8870729715f995", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 182.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.679496+00:00", + "completedAt": "2023-11-29T20:18:35.680739+00:00" + }, + { + "id": "60b354ae-21fc-41b9-afd7-0052886e1313", + "createdAt": "2023-11-29T20:18:35.681172+00:00", + "commandType": "moveToWell", + "key": "5f77fb4be0162d18e8fb3c31516e2407", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 174.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.681227+00:00", + "completedAt": "2023-11-29T20:18:35.682448+00:00" + }, + { + "id": "81f8ea1b-1cc1-4357-b230-5c9814243697", + "createdAt": "2023-11-29T20:18:35.683409+00:00", + "commandType": "dispense", + "key": "dd97c81995705fd67e2c90c789506ccb", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 40.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:35.683476+00:00", + "completedAt": "2023-11-29T20:18:35.688687+00:00" + }, + { + "id": "8f601de0-bc9f-46e5-bb75-9ffb90679ebc", + "createdAt": "2023-11-29T20:18:35.689651+00:00", + "commandType": "moveToWell", + "key": "ac6868197f20ff433ac0612230330b69", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:35.689744+00:00", + "completedAt": "2023-11-29T20:18:35.691367+00:00" + }, + { + "id": "4d556004-10d4-4571-9a69-45c26f55effa", + "createdAt": "2023-11-29T20:18:35.692402+00:00", + "commandType": "aspirate", + "key": "0ede8766d40484fd97c11ed02c65e27e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:35.692548+00:00", + "completedAt": "2023-11-29T20:18:35.697633+00:00" + }, + { + "id": "9581599b-3b1b-4a9f-a266-dbe5624f5e2c", + "createdAt": "2023-11-29T20:18:35.698435+00:00", + "commandType": "moveToWell", + "key": "048bf0010979b4748a0c971d2ed6fed2", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:35.698504+00:00", + "completedAt": "2023-11-29T20:18:35.699910+00:00" + }, + { + "id": "de7e3148-8a4e-4646-8902-aed987aeac9d", + "createdAt": "2023-11-29T20:18:35.700711+00:00", + "commandType": "aspirate", + "key": "5009589cff5abb73b2a5f3e1f4fd310d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:35.700793+00:00", + "completedAt": "2023-11-29T20:18:35.703030+00:00" + }, + { + "id": "b63a49c8-343a-4cb5-8da2-4af3b00bffaa", + "createdAt": "2023-11-29T20:18:35.703840+00:00", + "commandType": "dispense", + "key": "a358948e8153102edf53862c3131fd88", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:35.703900+00:00", + "completedAt": "2023-11-29T20:18:35.705988+00:00" + }, + { + "id": "6e7eb918-6e1b-441d-b672-8c3c37ac6ab7", + "createdAt": "2023-11-29T20:18:35.706682+00:00", + "commandType": "moveToWell", + "key": "27435c58dee714f6bd348b4ab3f8d97f", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:35.706751+00:00", + "completedAt": "2023-11-29T20:18:35.708173+00:00" + }, + { + "id": "e422486e-8720-4541-b634-4b2c2e0cc257", + "createdAt": "2023-11-29T20:18:35.709186+00:00", + "commandType": "dispense", + "key": "bda7ff2a56817e1b4de735a655167ff1", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:35.709281+00:00", + "completedAt": "2023-11-29T20:18:35.712070+00:00" + }, + { + "id": "b4134704-f5ad-4de5-bb13-04b35fb323df", + "createdAt": "2023-11-29T20:18:35.712977+00:00", + "commandType": "aspirate", + "key": "6fca4d1c9855f9a720fcb74b78c52b37", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:35.713042+00:00", + "completedAt": "2023-11-29T20:18:35.717795+00:00" + }, + { + "id": "b6ebd3ef-1a2f-4c9c-92ce-439ae634966d", + "createdAt": "2023-11-29T20:18:35.718684+00:00", + "commandType": "moveToWell", + "key": "25369079fbc1d9ccaa777d4e4da64d18", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 23.15000000000001 } + }, + "startedAt": "2023-11-29T20:18:35.718815+00:00", + "completedAt": "2023-11-29T20:18:35.720270+00:00" + }, + { + "id": "c1cc0485-7dd4-4933-bdfd-8a3d9afb0aa4", + "createdAt": "2023-11-29T20:18:35.721175+00:00", + "commandType": "aspirate", + "key": "02082e02dde565997ccee2d68bc64c9b", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:35.721249+00:00", + "completedAt": "2023-11-29T20:18:35.723461+00:00" + }, + { + "id": "2bc05531-3063-4248-8f6e-7e65c6306428", + "createdAt": "2023-11-29T20:18:35.724567+00:00", + "commandType": "dispense", + "key": "57fc918a12a47e93dad3ac8c82b7839c", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.699999999999992 } + }, + "flowRate": 80.0, + "volume": 20.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 23.15000000000001 }, + "volume": 20.0 + }, + "startedAt": "2023-11-29T20:18:35.724660+00:00", + "completedAt": "2023-11-29T20:18:35.727078+00:00" + }, + { + "id": "bd333336-feee-47d9-a82d-3896e80ff253", + "createdAt": "2023-11-29T20:18:35.727857+00:00", + "commandType": "moveToWell", + "key": "48ad47b509f6cad8ea9488acb81b90ab", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 25.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:35.727927+00:00", + "completedAt": "2023-11-29T20:18:35.729306+00:00" + }, + { + "id": "8d6ae696-cdc1-4d11-bee8-1739e9edb0b2", + "createdAt": "2023-11-29T20:18:35.730287+00:00", + "commandType": "dispense", + "key": "14b12616366170cc71f921b945d4663d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999992 } + }, + "flowRate": 80.0, + "volume": 70.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 25.90000000000001 }, + "volume": 70.0 + }, + "startedAt": "2023-11-29T20:18:35.730379+00:00", + "completedAt": "2023-11-29T20:18:35.732451+00:00" + }, + { + "id": "110d33e5-d0d6-4de6-ae44-1a9828f6a8fc", + "createdAt": "2023-11-29T20:18:35.733235+00:00", + "commandType": "moveToWell", + "key": "9afd229ac0b30cdbd435e1e997b75159", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.733326+00:00", + "completedAt": "2023-11-29T20:18:35.734822+00:00" + }, + { + "id": "70e47b3b-379b-4b9e-a7d9-e9d121acfd11", + "createdAt": "2023-11-29T20:18:35.735171+00:00", + "commandType": "waitForDuration", + "key": "178f22f8cb73cd0c1509eef3c0bde2ac", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.735236+00:00", + "completedAt": "2023-11-29T20:18:35.735301+00:00" + }, + { + "id": "2739d590-6e2f-44ca-9d90-6e74e9c18044", + "createdAt": "2023-11-29T20:18:35.736192+00:00", + "commandType": "blowout", + "key": "fbf552c5c9b84ddafefef594f7af6c14", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.736248+00:00", + "completedAt": "2023-11-29T20:18:35.738284+00:00" + }, + { + "id": "105e6a9d-788c-482c-b019-b213bda37e7d", + "createdAt": "2023-11-29T20:18:35.738838+00:00", + "commandType": "touchTip", + "key": "09084be5011a1faa95708f36087da90c", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 36.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.738904+00:00", + "completedAt": "2023-11-29T20:18:35.745140+00:00" + }, + { + "id": "cbdb5600-9a39-42e8-a3c9-4b77542f2680", + "createdAt": "2023-11-29T20:18:35.746120+00:00", + "commandType": "moveToWell", + "key": "1e42b247146c5cd882d8b4ada80c40c9", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.746183+00:00", + "completedAt": "2023-11-29T20:18:35.747565+00:00" + }, + { + "id": "2b1b32f7-8b8e-466a-945c-e8b1b2586725", + "createdAt": "2023-11-29T20:18:35.748110+00:00", + "commandType": "moveToWell", + "key": "31ecbdf56cab6d7e1d8df8c303d20067", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 37.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.748271+00:00", + "completedAt": "2023-11-29T20:18:35.749856+00:00" + }, + { + "id": "3fed9437-b461-4ea5-9bb8-5e846b8c3958", + "createdAt": "2023-11-29T20:18:35.750646+00:00", + "commandType": "moveToWell", + "key": "c74a49012811d2aa350f29adb42025d3", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 42.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.750708+00:00", + "completedAt": "2023-11-29T20:18:35.752170+00:00" + }, + { + "id": "8012f669-4c06-4c03-9dbf-3fe8e4f9a41e", + "createdAt": "2023-11-29T20:18:35.752512+00:00", + "commandType": "dropTip", + "key": "235bc7261301c2120bb1d71d1c9e60f4", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:35.752574+00:00", + "completedAt": "2023-11-29T20:18:35.759669+00:00" + }, + { + "id": "8030d348-611e-44da-b652-b10552a17146", + "createdAt": "2023-11-29T20:18:35.760064+00:00", + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "key": "d8668a908d4abc3490e019ffe70d45ea", + "status": "succeeded", + "params": { + "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5", + "rpm": 1600.0 + }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:35.760126+00:00", + "completedAt": "2023-11-29T20:18:35.760228+00:00" + }, + { + "id": "ba1c3933-89c0-41c8-8625-97e2e75522a9", + "createdAt": "2023-11-29T20:18:35.760445+00:00", + "commandType": "waitForDuration", + "key": "4c8c5f2a2bea6d423300a8682deb0b53", + "status": "succeeded", + "params": { "seconds": 300.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.760508+00:00", + "completedAt": "2023-11-29T20:18:35.760557+00:00" + }, + { + "id": "01649e6b-43fe-45b3-9308-992d270f0bc0", + "createdAt": "2023-11-29T20:18:35.760745+00:00", + "commandType": "heaterShaker/deactivateShaker", + "key": "106b4e4bbcd2ad81bb874de05e375c79", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.760807+00:00", + "completedAt": "2023-11-29T20:18:35.760867+00:00" + }, + { + "id": "78cdcda8-e8b7-44d4-8869-beadabb9fe03", + "createdAt": "2023-11-29T20:18:35.761090+00:00", + "commandType": "heaterShaker/openLabwareLatch", + "key": "f6f73fcb5176e06dd76d16758c06daf7", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:35.761141+00:00", + "completedAt": "2023-11-29T20:18:35.761205+00:00" + }, + { + "id": "3abf4329-7f21-43fb-8bec-0aca1ffd50fc", + "createdAt": "2023-11-29T20:18:35.761442+00:00", + "commandType": "moveLabware", + "key": "370a02ad8a7f82e06ed9aeacf122822e", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "newLocation": { "moduleId": "dc2de112-b2b7-4811-9cf5-501f1fee6878" }, + "strategy": "usingGripper", + "pickUpOffset": { "x": 0.0, "y": -2.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": 0.0, "z": 0.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.761495+00:00", + "completedAt": "2023-11-29T20:18:35.761676+00:00" + }, + { + "id": "7f2543fe-a534-48ec-ba71-4bac4d4c99be", + "createdAt": "2023-11-29T20:18:35.761873+00:00", + "commandType": "heaterShaker/closeLabwareLatch", + "key": "150003cf9be7dc05b3d8a423a28b92ca", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.761925+00:00", + "completedAt": "2023-11-29T20:18:35.761972+00:00" + }, + { + "id": "fadebbe7-0db3-42be-9610-fa9d7f4bd0dd", + "createdAt": "2023-11-29T20:18:35.762162+00:00", + "commandType": "waitForDuration", + "key": "6134c6abd71f6e6c015841d12a84902f", + "status": "succeeded", + "params": { "seconds": 240.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.762208+00:00", + "completedAt": "2023-11-29T20:18:35.762250+00:00" + }, + { + "id": "63e61fd7-23d4-4e92-883b-bbabd3d692ca", + "createdAt": "2023-11-29T20:18:35.762693+00:00", + "commandType": "custom", + "key": "43f958184177f47e0653aa5395081289", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Removing Supernatant" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.762771+00:00", + "completedAt": "2023-11-29T20:18:35.762818+00:00" + }, + { + "id": "88932f04-2d90-4132-9e72-b1239dfa207a", + "createdAt": "2023-11-29T20:18:35.763345+00:00", + "commandType": "pickUpTip", + "key": "aef86313847bc3adec05669323499c91", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 396.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:35.763400+00:00", + "completedAt": "2023-11-29T20:18:35.774777+00:00" + }, + { + "id": "b2bb9abf-21bd-477b-ba05-75e8c6d5b350", + "createdAt": "2023-11-29T20:18:35.775516+00:00", + "commandType": "moveToWell", + "key": "e88514412373f3fab0757aadb0dec63e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:35.775590+00:00", + "completedAt": "2023-11-29T20:18:35.780604+00:00" + }, + { + "id": "1baa9a08-a69b-4fa9-96e3-49e8608b3187", + "createdAt": "2023-11-29T20:18:35.781516+00:00", + "commandType": "aspirate", + "key": "662d630b81e4ffaae295fd3d91e21fbd", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:35.781607+00:00", + "completedAt": "2023-11-29T20:18:35.783840+00:00" + }, + { + "id": "2e82de35-3c61-4e11-a4d8-2e6f461488c4", + "createdAt": "2023-11-29T20:18:35.784190+00:00", + "commandType": "waitForDuration", + "key": "f4b2d6b554c6f422704fe26d0b678a06", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.784324+00:00", + "completedAt": "2023-11-29T20:18:35.784416+00:00" + }, + { + "id": "f28809f6-fab3-4dc0-8e85-3051775d5737", + "createdAt": "2023-11-29T20:18:35.785027+00:00", + "commandType": "moveToWell", + "key": "f9e81350b667bab2f709bb3d95896bb7", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:35.785091+00:00", + "completedAt": "2023-11-29T20:18:35.786614+00:00" + }, + { + "id": "f84f1e5f-3f4a-49a2-9b37-301203b385e4", + "createdAt": "2023-11-29T20:18:35.787458+00:00", + "commandType": "aspirate", + "key": "fbb953ca133a5c3837c96eae5fa93fcb", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:35.787557+00:00", + "completedAt": "2023-11-29T20:18:35.789711+00:00" + }, + { + "id": "c1789e73-d71c-4650-b88a-6a61a2b7e6a1", + "createdAt": "2023-11-29T20:18:35.790597+00:00", + "commandType": "moveToWell", + "key": "2da21d0283ffd70e7c32ae92060e7c6f", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.790670+00:00", + "completedAt": "2023-11-29T20:18:35.792101+00:00" + }, + { + "id": "38f668e4-63dd-4b3f-8b1a-d7d5479b93b3", + "createdAt": "2023-11-29T20:18:35.792825+00:00", + "commandType": "touchTip", + "key": "ba017ef7c6b776f2523dbb17b3d22d5b", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.792911+00:00", + "completedAt": "2023-11-29T20:18:35.799815+00:00" + }, + { + "id": "6b77d85f-a8b5-418a-ade8-9f20e98adf48", + "createdAt": "2023-11-29T20:18:35.800497+00:00", + "commandType": "dispense", + "key": "40e81b437422a2027c6a14063e106b14", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:35.800561+00:00", + "completedAt": "2023-11-29T20:18:35.805774+00:00" + }, + { + "id": "9c83b40a-8567-474e-b2aa-042afcf09480", + "createdAt": "2023-11-29T20:18:35.806183+00:00", + "commandType": "waitForDuration", + "key": "434cdbbf546e8364f022c695aca92062", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.806310+00:00", + "completedAt": "2023-11-29T20:18:35.806389+00:00" + }, + { + "id": "9c831196-0c98-4da0-8fa4-defd610634ad", + "createdAt": "2023-11-29T20:18:35.806996+00:00", + "commandType": "blowout", + "key": "bc55815b3519bc9927c6eecb1ce2440a", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.807074+00:00", + "completedAt": "2023-11-29T20:18:35.809276+00:00" + }, + { + "id": "100340dd-f97f-432c-8dce-69e56cea7477", + "createdAt": "2023-11-29T20:18:35.810041+00:00", + "commandType": "moveToWell", + "key": "1ab8e95a4103506bf99b61ed4531fb5d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 263.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.810116+00:00", + "completedAt": "2023-11-29T20:18:35.811550+00:00" + }, + { + "id": "e3635536-2860-4788-819f-1d289fc7a92b", + "createdAt": "2023-11-29T20:18:35.812205+00:00", + "commandType": "moveToWell", + "key": "9fcc4069b3812e0528724711d6b5e673", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 255.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.812319+00:00", + "completedAt": "2023-11-29T20:18:35.813788+00:00" + }, + { + "id": "fe907ca5-c270-4686-8d14-a4100f2127a0", + "createdAt": "2023-11-29T20:18:35.814518+00:00", + "commandType": "moveToWell", + "key": "4665c330e600034b320ff869e751e228", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.814640+00:00", + "completedAt": "2023-11-29T20:18:35.816172+00:00" + }, + { + "id": "13564ae7-0e4d-4b4a-9c04-a3eae810d04f", + "createdAt": "2023-11-29T20:18:35.816670+00:00", + "commandType": "moveToWell", + "key": "897c54d05cd17906cb8bce9418818865", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.816738+00:00", + "completedAt": "2023-11-29T20:18:35.818156+00:00" + }, + { + "id": "bf332d05-f1d8-468f-b5d7-64c5cd5ab834", + "createdAt": "2023-11-29T20:18:35.818632+00:00", + "commandType": "dropTip", + "key": "6ab42a2193477584f23a9b0b08ffed46", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:35.818713+00:00", + "completedAt": "2023-11-29T20:18:35.825502+00:00" + }, + { + "id": "671e43bd-1643-467c-af8d-702d5fe444f3", + "createdAt": "2023-11-29T20:18:35.826293+00:00", + "commandType": "pickUpTip", + "key": "0bbd63d3f152c6cb0ab98e8c5a081f7a", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 405.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:35.826589+00:00", + "completedAt": "2023-11-29T20:18:35.838188+00:00" + }, + { + "id": "bf016aef-20f4-4577-8c70-932cf5edad8f", + "createdAt": "2023-11-29T20:18:35.838954+00:00", + "commandType": "moveToWell", + "key": "9a551a76472c86c935d0e90232d42450", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:35.839024+00:00", + "completedAt": "2023-11-29T20:18:35.844103+00:00" + }, + { + "id": "ef8c2a4f-1e30-403b-bebf-385d942b30e4", + "createdAt": "2023-11-29T20:18:35.845037+00:00", + "commandType": "aspirate", + "key": "ab665e0cd7a2cbf9248a6be5e33a3a60", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:35.845174+00:00", + "completedAt": "2023-11-29T20:18:35.847519+00:00" + }, + { + "id": "3a053d2a-3666-4cb4-9eee-a035d11b38f8", + "createdAt": "2023-11-29T20:18:35.847842+00:00", + "commandType": "waitForDuration", + "key": "5b246e0f813f903ff2f3b3f19870c25f", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.847899+00:00", + "completedAt": "2023-11-29T20:18:35.847952+00:00" + }, + { + "id": "1baa40f8-6957-4f70-a016-86a7a02d752d", + "createdAt": "2023-11-29T20:18:35.848579+00:00", + "commandType": "moveToWell", + "key": "832a39f5c266826cece2863aad959fbb", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:35.848647+00:00", + "completedAt": "2023-11-29T20:18:35.850238+00:00" + }, + { + "id": "42444b88-55ab-4438-a3b7-36663980daac", + "createdAt": "2023-11-29T20:18:35.851208+00:00", + "commandType": "aspirate", + "key": "1d5fbaa1b66c0d6c0301fb10ab76794a", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:35.851332+00:00", + "completedAt": "2023-11-29T20:18:35.853821+00:00" + }, + { + "id": "be8f3eeb-33c1-442a-99df-35141883b95b", + "createdAt": "2023-11-29T20:18:35.854758+00:00", + "commandType": "moveToWell", + "key": "a9a0f69821af6c8d482c79a3f91db9f1", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.854848+00:00", + "completedAt": "2023-11-29T20:18:35.856224+00:00" + }, + { + "id": "f181bf53-35f2-4c7a-a6ef-ca1ea1cd2f1b", + "createdAt": "2023-11-29T20:18:35.856987+00:00", + "commandType": "touchTip", + "key": "e30ef69c949002f2d5549621f208fdc8", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.857046+00:00", + "completedAt": "2023-11-29T20:18:35.864013+00:00" + }, + { + "id": "2b6ac195-ca29-4e8b-a50c-6987f78d844e", + "createdAt": "2023-11-29T20:18:35.864732+00:00", + "commandType": "dispense", + "key": "775dcbbf932001d275594e992d1cee51", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:35.864828+00:00", + "completedAt": "2023-11-29T20:18:35.870431+00:00" + }, + { + "id": "e1f5db70-8175-488f-849f-eda9660ba1da", + "createdAt": "2023-11-29T20:18:35.870998+00:00", + "commandType": "waitForDuration", + "key": "37164aa2e309093d234b9b2363eab73b", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.871071+00:00", + "completedAt": "2023-11-29T20:18:35.871138+00:00" + }, + { + "id": "f059b9a9-cff8-4a0e-999e-ee70317d9acc", + "createdAt": "2023-11-29T20:18:35.871771+00:00", + "commandType": "blowout", + "key": "748fe2d01c56646bbf865aef00fdffb6", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.871850+00:00", + "completedAt": "2023-11-29T20:18:35.873796+00:00" + }, + { + "id": "75ca3aca-6ca0-42d9-b71b-6c5bd3306024", + "createdAt": "2023-11-29T20:18:35.874374+00:00", + "commandType": "moveToWell", + "key": "7da28123c49b30323fb6b0c514ffcd1c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 263.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.874444+00:00", + "completedAt": "2023-11-29T20:18:35.875644+00:00" + }, + { + "id": "f4e4039e-a334-46b0-bb1f-a05830808a80", + "createdAt": "2023-11-29T20:18:35.876313+00:00", + "commandType": "moveToWell", + "key": "85a73bbfcc743b3574cfed63ea5875a1", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 255.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.876399+00:00", + "completedAt": "2023-11-29T20:18:35.877954+00:00" + }, + { + "id": "5dbada34-959d-402f-bd74-46449f0eea6e", + "createdAt": "2023-11-29T20:18:35.878602+00:00", + "commandType": "moveToWell", + "key": "a31648132d0945088f44da9ec319340c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.878684+00:00", + "completedAt": "2023-11-29T20:18:35.880286+00:00" + }, + { + "id": "4a3a3c96-efb2-4b21-8e72-8e39115425dd", + "createdAt": "2023-11-29T20:18:35.880902+00:00", + "commandType": "moveToWell", + "key": "93d67db8570d4233d8510195c349c337", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.880976+00:00", + "completedAt": "2023-11-29T20:18:35.882357+00:00" + }, + { + "id": "8e0a2a47-6970-4af4-9e29-1ea686ba4f1f", + "createdAt": "2023-11-29T20:18:35.882775+00:00", + "commandType": "dropTip", + "key": "f84a9f1ce6f7d528a3346d1acb4c3c54", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:35.882839+00:00", + "completedAt": "2023-11-29T20:18:35.889776+00:00" + }, + { + "id": "600cb538-b8da-4120-9068-159cdc902225", + "createdAt": "2023-11-29T20:18:35.890680+00:00", + "commandType": "pickUpTip", + "key": "55fd6184d59addea6a74474262a5537c", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 414.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:35.890766+00:00", + "completedAt": "2023-11-29T20:18:35.902950+00:00" + }, + { + "id": "fe3252fb-3eca-4791-8718-b2748ba90dd1", + "createdAt": "2023-11-29T20:18:35.903741+00:00", + "commandType": "moveToWell", + "key": "2a5c73de422075c8c83d602655a30578", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:35.903923+00:00", + "completedAt": "2023-11-29T20:18:35.909120+00:00" + }, + { + "id": "8334d910-8122-4a50-ad1b-c1a3d3736623", + "createdAt": "2023-11-29T20:18:35.910347+00:00", + "commandType": "aspirate", + "key": "b31b50b23f1119843ef0e0fa56c82083", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:35.910477+00:00", + "completedAt": "2023-11-29T20:18:35.912743+00:00" + }, + { + "id": "e148ab44-ea68-4208-b924-20bff65c3e27", + "createdAt": "2023-11-29T20:18:35.913066+00:00", + "commandType": "waitForDuration", + "key": "f9247fd1a2873a7d9e2cd060b48d0175", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.913148+00:00", + "completedAt": "2023-11-29T20:18:35.913202+00:00" + }, + { + "id": "49289b84-21af-47e5-ac93-b70838debf9e", + "createdAt": "2023-11-29T20:18:35.913824+00:00", + "commandType": "moveToWell", + "key": "ca5be52c03a5972c46f07f07525d16ab", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:35.913890+00:00", + "completedAt": "2023-11-29T20:18:35.915280+00:00" + }, + { + "id": "6020233e-3c79-4b39-a5ec-b40088f1246d", + "createdAt": "2023-11-29T20:18:35.916222+00:00", + "commandType": "aspirate", + "key": "16c660e4067417b66cafa225188f9546", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:35.916311+00:00", + "completedAt": "2023-11-29T20:18:35.919146+00:00" + }, + { + "id": "d2adbe47-4168-48d5-b7b7-feb7f015fa90", + "createdAt": "2023-11-29T20:18:35.920248+00:00", + "commandType": "moveToWell", + "key": "303877825c5d6088681f92fd2c614fc2", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.920321+00:00", + "completedAt": "2023-11-29T20:18:35.921679+00:00" + }, + { + "id": "fe98cec9-2976-4ee2-9a70-5760bd41b4a2", + "createdAt": "2023-11-29T20:18:35.922324+00:00", + "commandType": "touchTip", + "key": "e3a309ff046c305f1932f94a7345b7c9", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.922385+00:00", + "completedAt": "2023-11-29T20:18:35.929898+00:00" + }, + { + "id": "bcaac3a9-e3f0-44f0-8e43-8cdf0fc7115d", + "createdAt": "2023-11-29T20:18:35.930629+00:00", + "commandType": "dispense", + "key": "63e5327ffec36298febf28b96c652812", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:35.930762+00:00", + "completedAt": "2023-11-29T20:18:35.936813+00:00" + }, + { + "id": "97628c37-b383-46d5-ba5a-1ac7925443ce", + "createdAt": "2023-11-29T20:18:35.937308+00:00", + "commandType": "waitForDuration", + "key": "32ea724f990188a7da4c3f2331a6dc85", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.937386+00:00", + "completedAt": "2023-11-29T20:18:35.937464+00:00" + }, + { + "id": "14d70b16-17f8-4622-93e8-35da5b3dde4b", + "createdAt": "2023-11-29T20:18:35.937982+00:00", + "commandType": "blowout", + "key": "5997e0015a7d58c6f5e05df14d55aa86", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.938062+00:00", + "completedAt": "2023-11-29T20:18:35.940128+00:00" + }, + { + "id": "762bea89-4a22-4460-9f34-3b9088c98bcc", + "createdAt": "2023-11-29T20:18:35.940903+00:00", + "commandType": "moveToWell", + "key": "ca6e11b68332efb33b72a685de0e3aec", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 263.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.940979+00:00", + "completedAt": "2023-11-29T20:18:35.942490+00:00" + }, + { + "id": "330987ef-0816-4772-b6c5-a2cd7d7b8c87", + "createdAt": "2023-11-29T20:18:35.943171+00:00", + "commandType": "moveToWell", + "key": "59618040bf18368e719f046c58024163", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 255.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.943258+00:00", + "completedAt": "2023-11-29T20:18:35.944711+00:00" + }, + { + "id": "00625d62-877b-47e7-86ca-b7384ef74cbd", + "createdAt": "2023-11-29T20:18:35.945397+00:00", + "commandType": "moveToWell", + "key": "853a58db7327660c1b30bfc5e61b5a65", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.945474+00:00", + "completedAt": "2023-11-29T20:18:35.946919+00:00" + }, + { + "id": "edcaec2a-6f4d-47b3-a411-c7aa49a25d8b", + "createdAt": "2023-11-29T20:18:35.947434+00:00", + "commandType": "moveToWell", + "key": "13b4e0ec2f0d9ed1312f5ed6006a2b1a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.947504+00:00", + "completedAt": "2023-11-29T20:18:35.949050+00:00" + }, + { + "id": "52130352-3fe9-458d-9125-2626f03d452e", + "createdAt": "2023-11-29T20:18:35.949687+00:00", + "commandType": "dropTip", + "key": "b838668b15016fa66779c23ba7279a93", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:35.949795+00:00", + "completedAt": "2023-11-29T20:18:35.956180+00:00" + }, + { + "id": "577d1a5a-7fab-4be4-8472-a18a2c37105f", + "createdAt": "2023-11-29T20:18:35.956881+00:00", + "commandType": "custom", + "key": "058e9bef0541f82ed4fdd49dd2ba790f", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> ETOH Wash" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.956966+00:00", + "completedAt": "2023-11-29T20:18:35.957054+00:00" + }, + { + "id": "b04b68b4-8438-49f7-836f-e4d1ab70cbad", + "createdAt": "2023-11-29T20:18:35.957769+00:00", + "commandType": "pickUpTip", + "key": "9bac81412f8ab249059de054ddec8b22", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 423.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:35.957878+00:00", + "completedAt": "2023-11-29T20:18:35.969589+00:00" + }, + { + "id": "70c6cfae-b79c-4242-b1c6-4099af6e9565", + "createdAt": "2023-11-29T20:18:35.970323+00:00", + "commandType": "aspirate", + "key": "01b2f4e3d1d64bb2eb6b22b9716e5408", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:35.970392+00:00", + "completedAt": "2023-11-29T20:18:35.976044+00:00" + }, + { + "id": "8d934fb7-e315-4eef-af26-aa15620155f8", + "createdAt": "2023-11-29T20:18:35.976691+00:00", + "commandType": "moveToWell", + "key": "9adc0bfbbfe490a0360895589ac559f8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.976772+00:00", + "completedAt": "2023-11-29T20:18:35.978186+00:00" + }, + { + "id": "e540fb1b-1836-4b20-86e2-b58383ef9c48", + "createdAt": "2023-11-29T20:18:35.978664+00:00", + "commandType": "moveToWell", + "key": "dcd5c5fd67df884c00db48120ce3a4ae", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.978724+00:00", + "completedAt": "2023-11-29T20:18:35.979936+00:00" + }, + { + "id": "f7db4217-9d0b-455e-9420-fd0f23aeba4a", + "createdAt": "2023-11-29T20:18:35.980492+00:00", + "commandType": "moveToWell", + "key": "6b89d1066300c76635f2f1fc162c86e5", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 218.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.980549+00:00", + "completedAt": "2023-11-29T20:18:35.982095+00:00" + }, + { + "id": "742df9ee-1988-49b4-8267-674011a3bced", + "createdAt": "2023-11-29T20:18:35.982816+00:00", + "commandType": "moveToWell", + "key": "42cfb982946bc7dbc4f2ce7999e05564", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 210.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:35.982903+00:00", + "completedAt": "2023-11-29T20:18:35.984515+00:00" + }, + { + "id": "f43a2888-2680-4caa-8237-43e194862033", + "createdAt": "2023-11-29T20:18:35.986260+00:00", + "commandType": "dispense", + "key": "0b1a1e733e5768ef63d24d9baea8ba45", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:35.986439+00:00", + "completedAt": "2023-11-29T20:18:35.992416+00:00" + }, + { + "id": "09482e64-627d-4c8e-98c1-be87b8e7dead", + "createdAt": "2023-11-29T20:18:35.993055+00:00", + "commandType": "waitForDuration", + "key": "9fd0cf7bda8f067d45ad2e5e318db2db", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:35.993180+00:00", + "completedAt": "2023-11-29T20:18:35.993276+00:00" + }, + { + "id": "41c5a7b8-73af-4658-90f4-95b557d292d7", + "createdAt": "2023-11-29T20:18:35.994735+00:00", + "commandType": "blowout", + "key": "8a11266b8435295c18d17fbfb41312ec", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.994866+00:00", + "completedAt": "2023-11-29T20:18:35.997253+00:00" + }, + { + "id": "445e657e-8de6-44a2-9e18-5a9c3addda01", + "createdAt": "2023-11-29T20:18:35.998136+00:00", + "commandType": "moveToWell", + "key": "39a15306cfe752417cb5d625ff76ffd8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:35.998252+00:00", + "completedAt": "2023-11-29T20:18:35.999823+00:00" + }, + { + "id": "c53ff74e-2dd9-4334-a46a-0e8fd56a08e1", + "createdAt": "2023-11-29T20:18:36.000474+00:00", + "commandType": "moveToWell", + "key": "b3b2541d2798e73d2301757b9c6306ab", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.000551+00:00", + "completedAt": "2023-11-29T20:18:36.002384+00:00" + }, + { + "id": "6ff3e0c6-ce2a-41f7-b888-70620a37ad3a", + "createdAt": "2023-11-29T20:18:36.003279+00:00", + "commandType": "moveToWell", + "key": "00500b203ebb24177495891e12fbb743", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.003360+00:00", + "completedAt": "2023-11-29T20:18:36.004992+00:00" + }, + { + "id": "a47f9b19-2358-46d6-aa58-dc5d94838936", + "createdAt": "2023-11-29T20:18:36.005430+00:00", + "commandType": "dropTip", + "key": "260b79eb59c87929f033ce8250b248b8", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.005553+00:00", + "completedAt": "2023-11-29T20:18:36.013210+00:00" + }, + { + "id": "6d4354e3-c973-424f-9447-22991f8bb45c", + "createdAt": "2023-11-29T20:18:36.014075+00:00", + "commandType": "pickUpTip", + "key": "e7b528df1b27ca73870249a101ac122a", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 432.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:36.014166+00:00", + "completedAt": "2023-11-29T20:18:36.026235+00:00" + }, + { + "id": "67a7d295-8b41-4a3a-80db-32c451806b8a", + "createdAt": "2023-11-29T20:18:36.027275+00:00", + "commandType": "aspirate", + "key": "0e443d4d801517caed66f5c913b8aed5", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:36.027424+00:00", + "completedAt": "2023-11-29T20:18:36.033262+00:00" + }, + { + "id": "cb4051aa-00dc-4d10-84d7-0ca10cb88cc1", + "createdAt": "2023-11-29T20:18:36.033881+00:00", + "commandType": "moveToWell", + "key": "44eda6837371322af90166d2a6a8915d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.033954+00:00", + "completedAt": "2023-11-29T20:18:36.035312+00:00" + }, + { + "id": "7245ef5b-f358-4ce7-98cf-25a54e2ea18b", + "createdAt": "2023-11-29T20:18:36.035912+00:00", + "commandType": "moveToWell", + "key": "293191eac2ad64b0d7055004d51012ab", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.036030+00:00", + "completedAt": "2023-11-29T20:18:36.037491+00:00" + }, + { + "id": "76273bf3-19e3-4289-9a27-3ec7d059045e", + "createdAt": "2023-11-29T20:18:36.038144+00:00", + "commandType": "moveToWell", + "key": "fed9e92f7ec6bde63489e0e09f21ded1", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 218.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.038207+00:00", + "completedAt": "2023-11-29T20:18:36.039563+00:00" + }, + { + "id": "f7fb70c6-49fa-447e-948e-373659fd1664", + "createdAt": "2023-11-29T20:18:36.040031+00:00", + "commandType": "moveToWell", + "key": "aa4fc37c8be3bcdcea5744ccc1b9613e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 210.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.040091+00:00", + "completedAt": "2023-11-29T20:18:36.041302+00:00" + }, + { + "id": "0eff850b-9a90-4b1a-970e-85543c7c91d2", + "createdAt": "2023-11-29T20:18:36.042150+00:00", + "commandType": "dispense", + "key": "f5069ae2cb0ee402ab228323b56ddbde", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:36.042214+00:00", + "completedAt": "2023-11-29T20:18:36.047944+00:00" + }, + { + "id": "b03bf4db-2172-45ee-af23-7b1c26334375", + "createdAt": "2023-11-29T20:18:36.048548+00:00", + "commandType": "waitForDuration", + "key": "1f76b127feb34fa925aaad06f19ab69a", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.048644+00:00", + "completedAt": "2023-11-29T20:18:36.048721+00:00" + }, + { + "id": "da517824-5ba7-4302-9ea6-fbd71b12fc97", + "createdAt": "2023-11-29T20:18:36.049529+00:00", + "commandType": "blowout", + "key": "580568d0b2ecb99f0788d7de3db9834c", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.049604+00:00", + "completedAt": "2023-11-29T20:18:36.051894+00:00" + }, + { + "id": "6f828327-6814-4f22-9703-9068c72bbc7a", + "createdAt": "2023-11-29T20:18:36.052832+00:00", + "commandType": "moveToWell", + "key": "e0ee9786ac1b30704b9327d2c12335c0", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.052916+00:00", + "completedAt": "2023-11-29T20:18:36.054509+00:00" + }, + { + "id": "b795ebcc-ecf8-40d9-942e-2cf2a027e4fe", + "createdAt": "2023-11-29T20:18:36.055196+00:00", + "commandType": "moveToWell", + "key": "db83388d33ff3d0a1c277e2b7a2efbd3", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.055259+00:00", + "completedAt": "2023-11-29T20:18:36.056734+00:00" + }, + { + "id": "4c62d4b7-3ba2-4b2f-9e0b-49b4fc4cda06", + "createdAt": "2023-11-29T20:18:36.057321+00:00", + "commandType": "moveToWell", + "key": "b977888193802fa85882ef97c574e2b8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.057409+00:00", + "completedAt": "2023-11-29T20:18:36.058857+00:00" + }, + { + "id": "c1114e07-5885-40b7-a58f-d1b2f1575ec1", + "createdAt": "2023-11-29T20:18:36.059247+00:00", + "commandType": "dropTip", + "key": "ed01052c1879f9e4f2cf705e00522c5b", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.059323+00:00", + "completedAt": "2023-11-29T20:18:36.066511+00:00" + }, + { + "id": "a0f4d128-87e3-47b6-af3b-5ea687be2ff6", + "createdAt": "2023-11-29T20:18:36.067313+00:00", + "commandType": "pickUpTip", + "key": "7e9f2de9a2b821f8589399bc5765758d", + "status": "succeeded", + "params": { + "labwareId": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 441.38, "y": 288.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:36.067402+00:00", + "completedAt": "2023-11-29T20:18:36.079466+00:00" + }, + { + "id": "5b7cf99e-3c2e-482a-91af-4cd5f64a28ee", + "createdAt": "2023-11-29T20:18:36.080184+00:00", + "commandType": "aspirate", + "key": "5e3452f3a4ea2a1a5e438ce3c7326f66", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:36.080256+00:00", + "completedAt": "2023-11-29T20:18:36.086148+00:00" + }, + { + "id": "2bf99f2d-9a30-43ac-bd56-f2f9292bf667", + "createdAt": "2023-11-29T20:18:36.086943+00:00", + "commandType": "moveToWell", + "key": "7bb2a82336f831d47ae9d6ed841e74f6", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.087027+00:00", + "completedAt": "2023-11-29T20:18:36.088512+00:00" + }, + { + "id": "9d4f9063-a2c6-40c5-9c05-c32adbe956d9", + "createdAt": "2023-11-29T20:18:36.088958+00:00", + "commandType": "moveToWell", + "key": "ef5290627bd421fdb57cbf8b8d7b91b3", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.089014+00:00", + "completedAt": "2023-11-29T20:18:36.090278+00:00" + }, + { + "id": "1322c5fe-b136-4acf-ae25-7cbe6f7b709e", + "createdAt": "2023-11-29T20:18:36.091023+00:00", + "commandType": "moveToWell", + "key": "cb311448ac1a2d8db9f3ef999695f84e", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 218.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.091098+00:00", + "completedAt": "2023-11-29T20:18:36.092609+00:00" + }, + { + "id": "94dc7802-5414-4694-8b45-6f8786501c60", + "createdAt": "2023-11-29T20:18:36.093192+00:00", + "commandType": "moveToWell", + "key": "60061034521276b8a280f1bb62e25636", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 210.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.093302+00:00", + "completedAt": "2023-11-29T20:18:36.094877+00:00" + }, + { + "id": "88d99901-a8d9-43ff-ba9d-20eb46671387", + "createdAt": "2023-11-29T20:18:36.096194+00:00", + "commandType": "dispense", + "key": "d63231346cae4bf053630f6929999775", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:36.096278+00:00", + "completedAt": "2023-11-29T20:18:36.101890+00:00" + }, + { + "id": "19a2db87-1b58-489f-bea3-9804dce74027", + "createdAt": "2023-11-29T20:18:36.102370+00:00", + "commandType": "waitForDuration", + "key": "72e5001d4de1e0678c096e322ec1429d", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.102442+00:00", + "completedAt": "2023-11-29T20:18:36.102522+00:00" + }, + { + "id": "a6b8aeba-b0cd-46c9-8a8a-402e63b0bc67", + "createdAt": "2023-11-29T20:18:36.103236+00:00", + "commandType": "blowout", + "key": "3de9b16b44c8ba959f10188af948a3e9", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.103351+00:00", + "completedAt": "2023-11-29T20:18:36.105711+00:00" + }, + { + "id": "8a25b64a-12ae-4f4f-8d5a-a555e5f91712", + "createdAt": "2023-11-29T20:18:36.106360+00:00", + "commandType": "moveToWell", + "key": "bb7ceed914c63ae1a93536e7ce84e070", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.106426+00:00", + "completedAt": "2023-11-29T20:18:36.108019+00:00" + }, + { + "id": "d0b485d4-ff19-4a4e-91f4-71f3ba451c95", + "createdAt": "2023-11-29T20:18:36.108886+00:00", + "commandType": "moveToWell", + "key": "3fb77d5fedd202365e8275d51a1be5f4", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.108984+00:00", + "completedAt": "2023-11-29T20:18:36.110725+00:00" + }, + { + "id": "06bce97f-9f85-478c-80f6-b0095a0bc28d", + "createdAt": "2023-11-29T20:18:36.111579+00:00", + "commandType": "moveToWell", + "key": "a5531360bee9c80f2cef70260b5c72ae", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.111654+00:00", + "completedAt": "2023-11-29T20:18:36.113350+00:00" + }, + { + "id": "15d9dfad-4534-4526-97c9-ef0acce03f89", + "createdAt": "2023-11-29T20:18:36.113843+00:00", + "commandType": "dropTip", + "key": "f1f9bdb8a40bf678bac7956f51fec0b6", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.113986+00:00", + "completedAt": "2023-11-29T20:18:36.122130+00:00" + }, + { + "id": "50a7bc8b-dfd5-4644-8394-4ac41618097f", + "createdAt": "2023-11-29T20:18:36.122633+00:00", + "commandType": "waitForDuration", + "key": "21866e67dcc8f9df602343de42f32a64", + "status": "succeeded", + "params": { "seconds": 30.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.122708+00:00", + "completedAt": "2023-11-29T20:18:36.122793+00:00" + }, + { + "id": "2db55324-c488-409c-b621-1c44d069ed43", + "createdAt": "2023-11-29T20:18:36.123319+00:00", + "commandType": "custom", + "key": "47a713ea0cbcd7b11c410317950282cd", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Remove ETOH Wash" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.123380+00:00", + "completedAt": "2023-11-29T20:18:36.123430+00:00" + }, + { + "id": "9d291542-52b3-490e-9bf0-acf3476564a1", + "createdAt": "2023-11-29T20:18:36.124151+00:00", + "commandType": "pickUpTip", + "key": "5fc211ddccd86f2b031df1ef25dc6147", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A1", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 178.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:36.124235+00:00", + "completedAt": "2023-11-29T20:18:36.136383+00:00" + }, + { + "id": "6db56670-077d-4e44-bb42-359f33e8b193", + "createdAt": "2023-11-29T20:18:36.137438+00:00", + "commandType": "moveToWell", + "key": "75f6ba91a2b5fb368590ab80bfd89a6c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:36.137551+00:00", + "completedAt": "2023-11-29T20:18:36.142441+00:00" + }, + { + "id": "46943040-891b-42ff-9186-b58fb854b310", + "createdAt": "2023-11-29T20:18:36.143688+00:00", + "commandType": "aspirate", + "key": "4177a91e5a408f0d9090fb4ea13c4cbf", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:36.143802+00:00", + "completedAt": "2023-11-29T20:18:36.146356+00:00" + }, + { + "id": "aaae6129-e211-4efd-baad-139ec73c3908", + "createdAt": "2023-11-29T20:18:36.146767+00:00", + "commandType": "waitForDuration", + "key": "77ceed6ca861af4f8cb642696736287e", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.146866+00:00", + "completedAt": "2023-11-29T20:18:36.146957+00:00" + }, + { + "id": "e22b00bc-18c3-4311-83cd-b3c31cfc5636", + "createdAt": "2023-11-29T20:18:36.147575+00:00", + "commandType": "moveToWell", + "key": "ccbfdf6105c90959e586eddacacbb36c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:36.147658+00:00", + "completedAt": "2023-11-29T20:18:36.149058+00:00" + }, + { + "id": "8573affa-4880-42b6-9530-02297c9dc5f4", + "createdAt": "2023-11-29T20:18:36.149790+00:00", + "commandType": "aspirate", + "key": "7c6a15ce7ece6c904a12449142b43768", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:36.149856+00:00", + "completedAt": "2023-11-29T20:18:36.152348+00:00" + }, + { + "id": "409c6f36-a545-4381-aa42-fbabca01bff5", + "createdAt": "2023-11-29T20:18:36.153419+00:00", + "commandType": "moveToWell", + "key": "f82937100488d12afb25a5474ae3e431", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.153522+00:00", + "completedAt": "2023-11-29T20:18:36.155136+00:00" + }, + { + "id": "a550b683-f171-46dd-9232-509ef8d499e5", + "createdAt": "2023-11-29T20:18:36.155815+00:00", + "commandType": "touchTip", + "key": "2349379da61ff6d3c997d67e02e5ad91", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.155875+00:00", + "completedAt": "2023-11-29T20:18:36.163567+00:00" + }, + { + "id": "b33ee976-8814-4da6-9520-9078a6931126", + "createdAt": "2023-11-29T20:18:36.164296+00:00", + "commandType": "dispense", + "key": "76db9038331db45b2915e22a7476a1f9", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:36.164384+00:00", + "completedAt": "2023-11-29T20:18:36.170604+00:00" + }, + { + "id": "1392f3fc-1800-43b0-8ffe-a70bc6e28c47", + "createdAt": "2023-11-29T20:18:36.171216+00:00", + "commandType": "waitForDuration", + "key": "4233bdbad78a69ffd52286d9732c0fab", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.171295+00:00", + "completedAt": "2023-11-29T20:18:36.171364+00:00" + }, + { + "id": "01236b29-abc1-4513-b319-3f0c94fb9531", + "createdAt": "2023-11-29T20:18:36.171964+00:00", + "commandType": "blowout", + "key": "de34bff47d32243349b6aa43389490bf", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.172058+00:00", + "completedAt": "2023-11-29T20:18:36.173999+00:00" + }, + { + "id": "8a1493d1-1224-437e-bb21-e9a3ba46f526", + "createdAt": "2023-11-29T20:18:36.175025+00:00", + "commandType": "moveToWell", + "key": "18442e383e373b6a8e46535d78cd3674", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 263.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.175124+00:00", + "completedAt": "2023-11-29T20:18:36.176646+00:00" + }, + { + "id": "726bb5a5-caaf-4077-a7ca-a838da3e3daf", + "createdAt": "2023-11-29T20:18:36.177280+00:00", + "commandType": "moveToWell", + "key": "9529c2d2fd28cb41aee51f33b344e8c9", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 255.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.177355+00:00", + "completedAt": "2023-11-29T20:18:36.178700+00:00" + }, + { + "id": "71755473-a5b5-472f-a656-8bffcb876ed3", + "createdAt": "2023-11-29T20:18:36.179340+00:00", + "commandType": "moveToWell", + "key": "26f7800cdcd87cc809aa9bcb9aff6e1c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.179403+00:00", + "completedAt": "2023-11-29T20:18:36.180644+00:00" + }, + { + "id": "d33db62c-f36f-4f0b-9926-9f0b7c44ed04", + "createdAt": "2023-11-29T20:18:36.181063+00:00", + "commandType": "moveToWell", + "key": "b3b9ae03d067d7039f2f856e10497c05", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.181121+00:00", + "completedAt": "2023-11-29T20:18:36.182457+00:00" + }, + { + "id": "97ca9fa2-4eba-48e2-89df-33acb7f97d8b", + "createdAt": "2023-11-29T20:18:36.182951+00:00", + "commandType": "dropTip", + "key": "239530bf2013687bb5c8f8dbb9298744", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.183058+00:00", + "completedAt": "2023-11-29T20:18:36.190181+00:00" + }, + { + "id": "2c4f6f79-e850-4762-9af3-e7718d987164", + "createdAt": "2023-11-29T20:18:36.191171+00:00", + "commandType": "pickUpTip", + "key": "140018690fbac4ba7a924e619dda04ad", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A2", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 187.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:36.191266+00:00", + "completedAt": "2023-11-29T20:18:36.202848+00:00" + }, + { + "id": "b643d140-fe2c-4246-b03a-af7baec04378", + "createdAt": "2023-11-29T20:18:36.203556+00:00", + "commandType": "moveToWell", + "key": "0d4be89c01993e0c09d4bbcb8277e67b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:36.203649+00:00", + "completedAt": "2023-11-29T20:18:36.208871+00:00" + }, + { + "id": "fad2a007-daaf-4441-bed2-89f75dd27849", + "createdAt": "2023-11-29T20:18:36.209975+00:00", + "commandType": "aspirate", + "key": "f56a01e583940fa815eca4691cd22e57", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:36.210053+00:00", + "completedAt": "2023-11-29T20:18:36.212759+00:00" + }, + { + "id": "017c9309-4b7a-4095-bab8-2375e25fb21a", + "createdAt": "2023-11-29T20:18:36.213163+00:00", + "commandType": "waitForDuration", + "key": "dfc9efa4df3a6a40e74fff4f105fe8ea", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.213230+00:00", + "completedAt": "2023-11-29T20:18:36.213289+00:00" + }, + { + "id": "b1888ed9-e48c-42d1-a2d8-d38cba2e77c5", + "createdAt": "2023-11-29T20:18:36.213894+00:00", + "commandType": "moveToWell", + "key": "4af2c835f21f93ecb2c3f71ebd49e3d6", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:36.214057+00:00", + "completedAt": "2023-11-29T20:18:36.215946+00:00" + }, + { + "id": "9248a0bf-72ab-43d2-b63f-3ea0310cad86", + "createdAt": "2023-11-29T20:18:36.216796+00:00", + "commandType": "aspirate", + "key": "8658375e26cf5b3db6f356498c19dc8c", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:36.216888+00:00", + "completedAt": "2023-11-29T20:18:36.219075+00:00" + }, + { + "id": "274754f3-8fe8-42ee-9911-4ea100cfa79f", + "createdAt": "2023-11-29T20:18:36.220014+00:00", + "commandType": "moveToWell", + "key": "1d20e7e5004c88598f9f411fc419e143", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.220086+00:00", + "completedAt": "2023-11-29T20:18:36.221606+00:00" + }, + { + "id": "407ff2dc-4808-4969-ba0f-664522242a9a", + "createdAt": "2023-11-29T20:18:36.222267+00:00", + "commandType": "touchTip", + "key": "c3d908272e76426f5b0ebb9586660b0c", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.222369+00:00", + "completedAt": "2023-11-29T20:18:36.229801+00:00" + }, + { + "id": "9200fcc6-0204-4c32-a979-afdda7017acd", + "createdAt": "2023-11-29T20:18:36.230535+00:00", + "commandType": "dispense", + "key": "2902c42a794db6ff8a7621eeaaa861ab", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:36.230639+00:00", + "completedAt": "2023-11-29T20:18:36.236548+00:00" + }, + { + "id": "ca3d3ab0-401a-4470-bb1f-13b454c685fc", + "createdAt": "2023-11-29T20:18:36.237008+00:00", + "commandType": "waitForDuration", + "key": "8236f45e0f5c54468f3d36d9506a3531", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.237135+00:00", + "completedAt": "2023-11-29T20:18:36.237208+00:00" + }, + { + "id": "f1bde573-6367-4a01-988d-d90159fd86bf", + "createdAt": "2023-11-29T20:18:36.237711+00:00", + "commandType": "blowout", + "key": "cf889d9c41ca50b57b433a0f15e75fbd", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.237769+00:00", + "completedAt": "2023-11-29T20:18:36.239954+00:00" + }, + { + "id": "969772de-ffae-4987-80e8-94fb07b8a151", + "createdAt": "2023-11-29T20:18:36.240609+00:00", + "commandType": "moveToWell", + "key": "eacaa50785f746bfdbc8c3854012496a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 263.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.240714+00:00", + "completedAt": "2023-11-29T20:18:36.242156+00:00" + }, + { + "id": "91244f4e-7115-42e6-8d39-80ab32adfafc", + "createdAt": "2023-11-29T20:18:36.242709+00:00", + "commandType": "moveToWell", + "key": "25a1ea9f301fcdcaf8265828eb122bf3", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 255.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.242776+00:00", + "completedAt": "2023-11-29T20:18:36.244213+00:00" + }, + { + "id": "39fdbe28-5747-49a5-8403-cb9f8531dc1a", + "createdAt": "2023-11-29T20:18:36.245000+00:00", + "commandType": "moveToWell", + "key": "9771aac7b7bf7e120c699cc77447a387", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.245117+00:00", + "completedAt": "2023-11-29T20:18:36.246542+00:00" + }, + { + "id": "e2000207-1203-422f-b76a-59ebec34e384", + "createdAt": "2023-11-29T20:18:36.247175+00:00", + "commandType": "moveToWell", + "key": "42452bf59adecbdd200f96ac826a3b65", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.247242+00:00", + "completedAt": "2023-11-29T20:18:36.248654+00:00" + }, + { + "id": "2b8a974b-cf80-4561-ba75-6ec20405035a", + "createdAt": "2023-11-29T20:18:36.249161+00:00", + "commandType": "dropTip", + "key": "4170fd48f1fda63e1599dcffbe8532b1", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.249245+00:00", + "completedAt": "2023-11-29T20:18:36.256463+00:00" + }, + { + "id": "c0ff2d03-f21a-483b-b5ff-83a4a55558c6", + "createdAt": "2023-11-29T20:18:36.257335+00:00", + "commandType": "pickUpTip", + "key": "5654026d1337d838a18d9770ce2512db", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A3", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 196.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:36.257484+00:00", + "completedAt": "2023-11-29T20:18:36.269088+00:00" + }, + { + "id": "bf214f39-8328-46ec-9ddb-430a5fa84220", + "createdAt": "2023-11-29T20:18:36.270020+00:00", + "commandType": "moveToWell", + "key": "8db034fa06495046e6c9aa6025a6d2c7", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:36.270106+00:00", + "completedAt": "2023-11-29T20:18:36.275014+00:00" + }, + { + "id": "7da58437-df01-47ce-af35-75ff245252bf", + "createdAt": "2023-11-29T20:18:36.275997+00:00", + "commandType": "aspirate", + "key": "7367676816298f8c252ee33b0bbc61d5", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:36.276103+00:00", + "completedAt": "2023-11-29T20:18:36.278692+00:00" + }, + { + "id": "2382fda5-2d93-43d9-a661-45316eb2d33a", + "createdAt": "2023-11-29T20:18:36.279171+00:00", + "commandType": "waitForDuration", + "key": "560902b3c237ac9d8f46b07703f6b8ee", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.279278+00:00", + "completedAt": "2023-11-29T20:18:36.279367+00:00" + }, + { + "id": "9ee36b86-ed40-40a8-ab35-7e54def8c95d", + "createdAt": "2023-11-29T20:18:36.280014+00:00", + "commandType": "moveToWell", + "key": "038c566301b29e327662519c42788598", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:36.280183+00:00", + "completedAt": "2023-11-29T20:18:36.281616+00:00" + }, + { + "id": "9120eec8-8da9-4229-95d2-1b469d3fceae", + "createdAt": "2023-11-29T20:18:36.282348+00:00", + "commandType": "aspirate", + "key": "52ee2ecee84deb908a1d3e396c68b9bb", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:36.282406+00:00", + "completedAt": "2023-11-29T20:18:36.284750+00:00" + }, + { + "id": "2d13c04d-b08c-48a9-b0b0-9c8b529fcb29", + "createdAt": "2023-11-29T20:18:36.285769+00:00", + "commandType": "moveToWell", + "key": "c0844b01847867621fddfe07a38885d8", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.285844+00:00", + "completedAt": "2023-11-29T20:18:36.287374+00:00" + }, + { + "id": "8cef9e02-f484-40b9-9137-e57acafad2d3", + "createdAt": "2023-11-29T20:18:36.288062+00:00", + "commandType": "touchTip", + "key": "a2cfedde95db91ca6a2b9a1defb1b364", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.288127+00:00", + "completedAt": "2023-11-29T20:18:36.294933+00:00" + }, + { + "id": "b8ce49ee-a0e5-4138-9a82-a07e72889ecc", + "createdAt": "2023-11-29T20:18:36.295730+00:00", + "commandType": "dispense", + "key": "32dd06994610599310228a627e5f9757", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:36.295816+00:00", + "completedAt": "2023-11-29T20:18:36.301316+00:00" + }, + { + "id": "dac3a9f9-a614-4936-8d26-ed2439d2fe09", + "createdAt": "2023-11-29T20:18:36.302003+00:00", + "commandType": "waitForDuration", + "key": "2df150a8460de52a9651b45e2c63645f", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.302073+00:00", + "completedAt": "2023-11-29T20:18:36.302139+00:00" + }, + { + "id": "0f38fa2c-5ef0-4a6d-8052-590413bb9d71", + "createdAt": "2023-11-29T20:18:36.302679+00:00", + "commandType": "blowout", + "key": "84b6c60caf0504733d6e602a0ca1b8da", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.302738+00:00", + "completedAt": "2023-11-29T20:18:36.304919+00:00" + }, + { + "id": "b685919f-fcfc-454c-8bbb-269d862743bd", + "createdAt": "2023-11-29T20:18:36.305656+00:00", + "commandType": "moveToWell", + "key": "cfff8b24e446a24ac026dcb3e8ba3606", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 263.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.305719+00:00", + "completedAt": "2023-11-29T20:18:36.307007+00:00" + }, + { + "id": "78eb0b5b-9599-4288-9a87-a19286b54f6d", + "createdAt": "2023-11-29T20:18:36.307500+00:00", + "commandType": "moveToWell", + "key": "c7906c23e5ef8a40fae67cca813af17b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 255.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.307559+00:00", + "completedAt": "2023-11-29T20:18:36.309013+00:00" + }, + { + "id": "771c5032-b5db-491f-afe0-d1fa0c8d2ecc", + "createdAt": "2023-11-29T20:18:36.309800+00:00", + "commandType": "moveToWell", + "key": "57db6a62372c68e35352df365e979866", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.309892+00:00", + "completedAt": "2023-11-29T20:18:36.311355+00:00" + }, + { + "id": "b9fd9b27-7558-4927-a29c-81b89b62518c", + "createdAt": "2023-11-29T20:18:36.312007+00:00", + "commandType": "moveToWell", + "key": "0e9bb011a2c139cd65fd6ac40ec95e99", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.312090+00:00", + "completedAt": "2023-11-29T20:18:36.313501+00:00" + }, + { + "id": "fe364ae3-3126-476e-8852-5ddafdaa6f2d", + "createdAt": "2023-11-29T20:18:36.313834+00:00", + "commandType": "dropTip", + "key": "4e6fbb80cd8f52eaa273f21381ccd1fa", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.313891+00:00", + "completedAt": "2023-11-29T20:18:36.320342+00:00" + }, + { + "id": "a5618ca5-9541-462c-99d4-fc77048141fc", + "createdAt": "2023-11-29T20:18:36.321057+00:00", + "commandType": "custom", + "key": "22b3684bf31105aac0857fe3f53db6d1", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> ETOH Wash" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.321131+00:00", + "completedAt": "2023-11-29T20:18:36.321205+00:00" + }, + { + "id": "02ccd3ff-c171-4c1e-8bf2-44d17df965f0", + "createdAt": "2023-11-29T20:18:36.321724+00:00", + "commandType": "pickUpTip", + "key": "3e144e1a29e538750418c5cebe152bc9", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A4", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 205.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:36.321805+00:00", + "completedAt": "2023-11-29T20:18:36.332876+00:00" + }, + { + "id": "928ce79f-5ef0-4056-baf3-817a1793289f", + "createdAt": "2023-11-29T20:18:36.333666+00:00", + "commandType": "aspirate", + "key": "138b263a64bec6cd3879ec2d31230e79", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:36.333773+00:00", + "completedAt": "2023-11-29T20:18:36.339363+00:00" + }, + { + "id": "df7b10ef-7f02-4994-a654-37bb6e2a00f7", + "createdAt": "2023-11-29T20:18:36.339943+00:00", + "commandType": "moveToWell", + "key": "881da55530ba37f6b46f418246ad15b0", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.340015+00:00", + "completedAt": "2023-11-29T20:18:36.341287+00:00" + }, + { + "id": "9ca32217-41c4-4dac-85cf-69026cccc21d", + "createdAt": "2023-11-29T20:18:36.341722+00:00", + "commandType": "moveToWell", + "key": "368bcc908c488924abf1c3e7d901ff24", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.341778+00:00", + "completedAt": "2023-11-29T20:18:36.343223+00:00" + }, + { + "id": "be49f7be-db54-43c5-8d36-1f128d239336", + "createdAt": "2023-11-29T20:18:36.344185+00:00", + "commandType": "moveToWell", + "key": "61ab8e1dfdecb3f3b223eb32c3071679", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 218.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.344282+00:00", + "completedAt": "2023-11-29T20:18:36.345779+00:00" + }, + { + "id": "c1426bd9-051b-4074-a035-c913c2634e9d", + "createdAt": "2023-11-29T20:18:36.346311+00:00", + "commandType": "moveToWell", + "key": "bcff18cbd4edec5556900a28f9db527b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 210.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.346423+00:00", + "completedAt": "2023-11-29T20:18:36.347630+00:00" + }, + { + "id": "62d3782e-e5b2-4839-a4ca-47a9a6c15ae6", + "createdAt": "2023-11-29T20:18:36.348389+00:00", + "commandType": "dispense", + "key": "236551e6317b0f2196095b4f5094def2", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:36.348451+00:00", + "completedAt": "2023-11-29T20:18:36.354255+00:00" + }, + { + "id": "f4118985-cc5a-4150-88af-0c5e69191409", + "createdAt": "2023-11-29T20:18:36.354621+00:00", + "commandType": "waitForDuration", + "key": "56113b27fa18985d3e5e83cacf553a51", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.354677+00:00", + "completedAt": "2023-11-29T20:18:36.354731+00:00" + }, + { + "id": "b524e751-48f9-4ac6-8cad-8a9fe291fe74", + "createdAt": "2023-11-29T20:18:36.355355+00:00", + "commandType": "blowout", + "key": "a3ab2b24086c4ea98d004700ef9c6209", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.355407+00:00", + "completedAt": "2023-11-29T20:18:36.357443+00:00" + }, + { + "id": "16b229d2-36e9-4fb1-b94b-622d5023ee68", + "createdAt": "2023-11-29T20:18:36.358181+00:00", + "commandType": "moveToWell", + "key": "34a762ba63372efc5f40fd53d54b03b0", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.358273+00:00", + "completedAt": "2023-11-29T20:18:36.359922+00:00" + }, + { + "id": "699b4acf-0fd5-47b0-a32e-6595b922dcc6", + "createdAt": "2023-11-29T20:18:36.360699+00:00", + "commandType": "moveToWell", + "key": "aeb17c563cab06c0401e13ccaf209210", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.360951+00:00", + "completedAt": "2023-11-29T20:18:36.362603+00:00" + }, + { + "id": "659ad5b9-5a1e-47c7-bdfb-bc7be9adf0f0", + "createdAt": "2023-11-29T20:18:36.363369+00:00", + "commandType": "moveToWell", + "key": "b91f2a5c1e99fe4495c240338a460eae", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.363458+00:00", + "completedAt": "2023-11-29T20:18:36.365126+00:00" + }, + { + "id": "f86f242d-ef38-45b4-aa5b-34cbe1043bda", + "createdAt": "2023-11-29T20:18:36.365583+00:00", + "commandType": "dropTip", + "key": "3fe4d361b2bda4264640f7a657bc3174", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.365652+00:00", + "completedAt": "2023-11-29T20:18:36.373251+00:00" + }, + { + "id": "6c9ced66-c8b0-4877-afc3-0fbc91f51b4c", + "createdAt": "2023-11-29T20:18:36.374022+00:00", + "commandType": "pickUpTip", + "key": "3e77ceca2c806b4d8e93e9bead1abcc4", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:36.374107+00:00", + "completedAt": "2023-11-29T20:18:36.386648+00:00" + }, + { + "id": "150e6618-afa6-4956-993e-564e2777296b", + "createdAt": "2023-11-29T20:18:36.387338+00:00", + "commandType": "aspirate", + "key": "264769afea75e4b371ba9c294dbb1c8d", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:36.387404+00:00", + "completedAt": "2023-11-29T20:18:36.392627+00:00" + }, + { + "id": "3e56f5e7-8d46-4422-bdee-d9f1ab9ee0e8", + "createdAt": "2023-11-29T20:18:36.393428+00:00", + "commandType": "moveToWell", + "key": "31e0d930f08ef607506c3e0586e4788f", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.393638+00:00", + "completedAt": "2023-11-29T20:18:36.395225+00:00" + }, + { + "id": "f9907ad4-6afd-4c5d-a353-7944bf2fcf44", + "createdAt": "2023-11-29T20:18:36.395947+00:00", + "commandType": "moveToWell", + "key": "a34008fdc9e000333b9ff1a94b9bc9f1", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.396067+00:00", + "completedAt": "2023-11-29T20:18:36.397450+00:00" + }, + { + "id": "a01e474b-41a2-479f-8a93-57e3660d251a", + "createdAt": "2023-11-29T20:18:36.398058+00:00", + "commandType": "moveToWell", + "key": "bfaa346ea85c90f1941b5012d9224e05", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 218.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.398156+00:00", + "completedAt": "2023-11-29T20:18:36.399532+00:00" + }, + { + "id": "962277c3-4eaa-4ca0-b651-80476dcd8f9b", + "createdAt": "2023-11-29T20:18:36.400133+00:00", + "commandType": "moveToWell", + "key": "4b7834f984d3f3feb358f55f97313a72", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 210.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.400224+00:00", + "completedAt": "2023-11-29T20:18:36.401864+00:00" + }, + { + "id": "dde716c1-d35b-46d0-b0bc-3dbb3dc4686e", + "createdAt": "2023-11-29T20:18:36.402704+00:00", + "commandType": "dispense", + "key": "87a302d4f03dfadd968aad356c481294", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:36.402792+00:00", + "completedAt": "2023-11-29T20:18:36.408408+00:00" + }, + { + "id": "0b6d4dbf-85f1-450c-bbe5-79c0d3646c4d", + "createdAt": "2023-11-29T20:18:36.408925+00:00", + "commandType": "waitForDuration", + "key": "9b332a4fc2104737ff42c339c6bce77b", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.409000+00:00", + "completedAt": "2023-11-29T20:18:36.409081+00:00" + }, + { + "id": "5b390c8d-ec20-4e8a-b4eb-5f60b4ffdd14", + "createdAt": "2023-11-29T20:18:36.409951+00:00", + "commandType": "blowout", + "key": "79e714e9e4eea58f0c374d8f25f08df8", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.410035+00:00", + "completedAt": "2023-11-29T20:18:36.412433+00:00" + }, + { + "id": "6635a332-5003-4071-a153-a64c64a0dbde", + "createdAt": "2023-11-29T20:18:36.413092+00:00", + "commandType": "moveToWell", + "key": "c03dee4f1c374946ad9702b392042fcd", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.413158+00:00", + "completedAt": "2023-11-29T20:18:36.414564+00:00" + }, + { + "id": "fa76d426-b31e-4bdc-8795-e77e6dcd1c60", + "createdAt": "2023-11-29T20:18:36.415095+00:00", + "commandType": "moveToWell", + "key": "af0fa2f931374f477cbf07d63a5ac252", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.415170+00:00", + "completedAt": "2023-11-29T20:18:36.416726+00:00" + }, + { + "id": "d8ee8fdb-8727-4491-a853-9308e081b000", + "createdAt": "2023-11-29T20:18:36.417423+00:00", + "commandType": "moveToWell", + "key": "0488694775a61aab545376b1c138455a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.417509+00:00", + "completedAt": "2023-11-29T20:18:36.418929+00:00" + }, + { + "id": "63e20f72-6b5f-4d9c-a9ec-0eae97c0b4a6", + "createdAt": "2023-11-29T20:18:36.419423+00:00", + "commandType": "dropTip", + "key": "dea5827b2d879eec07613e0b1e58663e", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.419493+00:00", + "completedAt": "2023-11-29T20:18:36.427100+00:00" + }, + { + "id": "0a78ab54-6df0-4b9a-8085-30afc6b53801", + "createdAt": "2023-11-29T20:18:36.427905+00:00", + "commandType": "pickUpTip", + "key": "1b6e887eb200d6d4016603db3c0e2f29", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A6", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 223.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:36.428018+00:00", + "completedAt": "2023-11-29T20:18:36.440208+00:00" + }, + { + "id": "0f2955a1-b040-4dea-9188-0b2857647f96", + "createdAt": "2023-11-29T20:18:36.440972+00:00", + "commandType": "aspirate", + "key": "225f797813e559edb97f48c406549963", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 5.55 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:36.441053+00:00", + "completedAt": "2023-11-29T20:18:36.446568+00:00" + }, + { + "id": "7aacfe92-c1c3-4418-b924-3a8c5f46c0e5", + "createdAt": "2023-11-29T20:18:36.447092+00:00", + "commandType": "moveToWell", + "key": "b1ad52239cd13a2bc29bdaae2d0fc116", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.447153+00:00", + "completedAt": "2023-11-29T20:18:36.448597+00:00" + }, + { + "id": "2575206e-3d35-4490-946a-1912784ea6e9", + "createdAt": "2023-11-29T20:18:36.449216+00:00", + "commandType": "moveToWell", + "key": "0e48eae5ba4ce70a09b71b5148f80ec0", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 214.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.449302+00:00", + "completedAt": "2023-11-29T20:18:36.450753+00:00" + }, + { + "id": "6ac49772-a5da-49ba-a61c-458f23e5b730", + "createdAt": "2023-11-29T20:18:36.451449+00:00", + "commandType": "moveToWell", + "key": "580978c5930b2ed4cad8044c3602241a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 218.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.451543+00:00", + "completedAt": "2023-11-29T20:18:36.453005+00:00" + }, + { + "id": "2fb20f8c-9d49-4aea-bc4a-a423553bb316", + "createdAt": "2023-11-29T20:18:36.453502+00:00", + "commandType": "moveToWell", + "key": "d8c1739be04179797b90fc8d578bc30d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A5", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 210.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.453568+00:00", + "completedAt": "2023-11-29T20:18:36.454944+00:00" + }, + { + "id": "62b839e3-d146-491c-b701-3c7bccca657d", + "createdAt": "2023-11-29T20:18:36.455638+00:00", + "commandType": "dispense", + "key": "eec0d1b16166e840f006632b31b20c81", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "volume": 150.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 47.459999999999994 }, + "volume": 150.0 + }, + "startedAt": "2023-11-29T20:18:36.455694+00:00", + "completedAt": "2023-11-29T20:18:36.461352+00:00" + }, + { + "id": "ebdc7194-355f-40c6-b71d-a98615d772b3", + "createdAt": "2023-11-29T20:18:36.461850+00:00", + "commandType": "waitForDuration", + "key": "2f2fa2210eb2aea122f41afa98bc7e67", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.461949+00:00", + "completedAt": "2023-11-29T20:18:36.462047+00:00" + }, + { + "id": "314e37a9-d713-4fdb-8a8b-251ea5c4cdf4", + "createdAt": "2023-11-29T20:18:36.462809+00:00", + "commandType": "blowout", + "key": "9e8a7fa3f6d9b7b21224135c890c04ac", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 47.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.462872+00:00", + "completedAt": "2023-11-29T20:18:36.465011+00:00" + }, + { + "id": "80c7f52d-d483-4468-b44a-36fbca441d3e", + "createdAt": "2023-11-29T20:18:36.465741+00:00", + "commandType": "moveToWell", + "key": "537fdbf0c4d0b13c050eb4410477eade", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.465853+00:00", + "completedAt": "2023-11-29T20:18:36.467405+00:00" + }, + { + "id": "5335b37d-6c84-4a58-b7f7-1b5e50363713", + "createdAt": "2023-11-29T20:18:36.468060+00:00", + "commandType": "moveToWell", + "key": "4f064f5b01d18b1b15ceff957d22f573", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 50.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.468152+00:00", + "completedAt": "2023-11-29T20:18:36.469751+00:00" + }, + { + "id": "17283d86-7ef3-4dd5-ba62-9aa7a7eb6a8a", + "createdAt": "2023-11-29T20:18:36.470403+00:00", + "commandType": "moveToWell", + "key": "fb2fe0b4add5487d1081323975abf593", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 55.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.470465+00:00", + "completedAt": "2023-11-29T20:18:36.471894+00:00" + }, + { + "id": "ece99ab5-3ac5-4044-89cf-986f38fd2260", + "createdAt": "2023-11-29T20:18:36.472250+00:00", + "commandType": "dropTip", + "key": "72a9cc4033c1100eaf263eec90d51513", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.472307+00:00", + "completedAt": "2023-11-29T20:18:36.480041+00:00" + }, + { + "id": "c31ce2d2-0c2b-4f34-bed4-e08f213bfe19", + "createdAt": "2023-11-29T20:18:36.480491+00:00", + "commandType": "waitForDuration", + "key": "0b48619616d672c5722062305bb475f7", + "status": "succeeded", + "params": { "seconds": 30.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.480566+00:00", + "completedAt": "2023-11-29T20:18:36.480649+00:00" + }, + { + "id": "47dedd53-5ead-4590-ac6a-f71e31c7505f", + "createdAt": "2023-11-29T20:18:36.481129+00:00", + "commandType": "custom", + "key": "d67b410e6cd6fb8b7175d48799a8c797", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Remove ETOH Wash" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.481183+00:00", + "completedAt": "2023-11-29T20:18:36.481232+00:00" + }, + { + "id": "120013b0-67ec-42e3-998d-1de8c29758fc", + "createdAt": "2023-11-29T20:18:36.481869+00:00", + "commandType": "pickUpTip", + "key": "0dd01956dc0b72ab32ac36903b847643", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 232.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:36.481990+00:00", + "completedAt": "2023-11-29T20:18:36.493192+00:00" + }, + { + "id": "1c4c0cba-68da-4a63-b667-a25012b9ff1e", + "createdAt": "2023-11-29T20:18:36.494098+00:00", + "commandType": "moveToWell", + "key": "55e63f24045317a19a3d6e00118b5201", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:36.494189+00:00", + "completedAt": "2023-11-29T20:18:36.499349+00:00" + }, + { + "id": "224e46bb-bb3e-4d07-9b5a-bd832793882f", + "createdAt": "2023-11-29T20:18:36.500380+00:00", + "commandType": "aspirate", + "key": "e0fe9e49d1baccfa82dc3492de21f249", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:36.500456+00:00", + "completedAt": "2023-11-29T20:18:36.502896+00:00" + }, + { + "id": "1bf6d81a-3788-4b8e-adf0-c45899f82e67", + "createdAt": "2023-11-29T20:18:36.503282+00:00", + "commandType": "waitForDuration", + "key": "492c32231970f30b886bd8ddc0987bc4", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.503349+00:00", + "completedAt": "2023-11-29T20:18:36.503405+00:00" + }, + { + "id": "ca32f366-c98f-4620-bec7-737ce6944b00", + "createdAt": "2023-11-29T20:18:36.504318+00:00", + "commandType": "moveToWell", + "key": "121d140b415adde7c222892c94df3dca", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:36.504408+00:00", + "completedAt": "2023-11-29T20:18:36.506020+00:00" + }, + { + "id": "029b1fd3-8c1f-45df-bbd4-a8e177156d6c", + "createdAt": "2023-11-29T20:18:36.506830+00:00", + "commandType": "aspirate", + "key": "1137ef9969cc292ac6b5741dacde0325", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:36.506914+00:00", + "completedAt": "2023-11-29T20:18:36.509052+00:00" + }, + { + "id": "ea42973e-7eda-4857-ad1a-2d3819288593", + "createdAt": "2023-11-29T20:18:36.510034+00:00", + "commandType": "moveToWell", + "key": "e186767c1a02a87ca7df13602ac82f63", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.510143+00:00", + "completedAt": "2023-11-29T20:18:36.511638+00:00" + }, + { + "id": "80a0fed4-a611-4efb-9ec9-5e23bc464fa0", + "createdAt": "2023-11-29T20:18:36.512394+00:00", + "commandType": "touchTip", + "key": "ceadd7acc5471b71fe49d075c965b2fa", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.512466+00:00", + "completedAt": "2023-11-29T20:18:36.519536+00:00" + }, + { + "id": "fc98ef1e-34ea-4017-b2a5-ddcd77337ba0", + "createdAt": "2023-11-29T20:18:36.520330+00:00", + "commandType": "dispense", + "key": "365e9b371ea7d243091ac129b196a0a4", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:36.520432+00:00", + "completedAt": "2023-11-29T20:18:36.525999+00:00" + }, + { + "id": "5b0015c1-23aa-4dfe-8fb5-ab2068b11929", + "createdAt": "2023-11-29T20:18:36.526535+00:00", + "commandType": "waitForDuration", + "key": "e28a26dca6b82ed89131b5fdc4582051", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.526626+00:00", + "completedAt": "2023-11-29T20:18:36.526719+00:00" + }, + { + "id": "ed7ab662-0094-4573-9103-8273e69bd627", + "createdAt": "2023-11-29T20:18:36.527287+00:00", + "commandType": "blowout", + "key": "52766367929299f46944337bd4b770a8", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.527414+00:00", + "completedAt": "2023-11-29T20:18:36.529493+00:00" + }, + { + "id": "86f4b25b-68bf-4c71-9503-a14317048f86", + "createdAt": "2023-11-29T20:18:36.530092+00:00", + "commandType": "moveToWell", + "key": "0f154e6225461ffad8fb86dbe7fdb93d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 263.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.530148+00:00", + "completedAt": "2023-11-29T20:18:36.531370+00:00" + }, + { + "id": "184406c0-43d8-42f0-921c-f9cd69b9ac51", + "createdAt": "2023-11-29T20:18:36.531859+00:00", + "commandType": "moveToWell", + "key": "43bd8b0e599f676d53ea83c31b1db33d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 255.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.531951+00:00", + "completedAt": "2023-11-29T20:18:36.533384+00:00" + }, + { + "id": "753792f8-86ef-46ba-a844-48de68e252e5", + "createdAt": "2023-11-29T20:18:36.533940+00:00", + "commandType": "moveToWell", + "key": "e96f2fb1de6b182547a4fd9ff1cd9dd5", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.534010+00:00", + "completedAt": "2023-11-29T20:18:36.535354+00:00" + }, + { + "id": "fa946c4c-d621-4111-8333-91ba4437c58a", + "createdAt": "2023-11-29T20:18:36.535772+00:00", + "commandType": "moveToWell", + "key": "c69bb7c64e2ed7c5bb3ed216be31a701", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.535827+00:00", + "completedAt": "2023-11-29T20:18:36.537010+00:00" + }, + { + "id": "edb41336-456c-4441-807a-23dfe97bcb06", + "createdAt": "2023-11-29T20:18:36.537305+00:00", + "commandType": "dropTip", + "key": "df55f2cd82607796789222fdd6ff762b", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.537358+00:00", + "completedAt": "2023-11-29T20:18:36.543572+00:00" + }, + { + "id": "80c7f1ca-ada7-4395-8f69-21f532c920a0", + "createdAt": "2023-11-29T20:18:36.544307+00:00", + "commandType": "pickUpTip", + "key": "5b740ac7cbac947741d807b531fd4cbe", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 241.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:36.544444+00:00", + "completedAt": "2023-11-29T20:18:36.556157+00:00" + }, + { + "id": "351e4eed-9ea9-4143-bbe4-2a0af0e59a8e", + "createdAt": "2023-11-29T20:18:36.556935+00:00", + "commandType": "moveToWell", + "key": "64b41729ad08d878e806ee7e030d5912", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:36.557002+00:00", + "completedAt": "2023-11-29T20:18:36.561936+00:00" + }, + { + "id": "771c00b8-b60a-4ce2-b672-097ba08fa822", + "createdAt": "2023-11-29T20:18:36.562806+00:00", + "commandType": "aspirate", + "key": "92b2ea940d0ce95f163a11686e274ef8", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:36.562882+00:00", + "completedAt": "2023-11-29T20:18:36.565033+00:00" + }, + { + "id": "2d7a8e9e-fb77-4534-b4ae-5ce7a0b1801f", + "createdAt": "2023-11-29T20:18:36.565520+00:00", + "commandType": "waitForDuration", + "key": "9436349f209d9640fc06cd9837543f9c", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.565604+00:00", + "completedAt": "2023-11-29T20:18:36.565690+00:00" + }, + { + "id": "3eb1ada7-ddd0-4743-a6a7-d0cb5f6ce7da", + "createdAt": "2023-11-29T20:18:36.566421+00:00", + "commandType": "moveToWell", + "key": "2af393f21519e658a530e9bd28e113c6", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:36.566519+00:00", + "completedAt": "2023-11-29T20:18:36.568041+00:00" + }, + { + "id": "5d4f48c5-123b-4b61-8c48-18bd1227ed8f", + "createdAt": "2023-11-29T20:18:36.568839+00:00", + "commandType": "aspirate", + "key": "93b5a9b7dfc1f6770446ae706efb332d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:36.568909+00:00", + "completedAt": "2023-11-29T20:18:36.571093+00:00" + }, + { + "id": "05458bce-1284-48a3-86b3-db04ca6cd60a", + "createdAt": "2023-11-29T20:18:36.571927+00:00", + "commandType": "moveToWell", + "key": "559e612ada60ab4f279128b1d409168b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.572035+00:00", + "completedAt": "2023-11-29T20:18:36.573860+00:00" + }, + { + "id": "b10c2885-c9de-44de-be67-34add18a2299", + "createdAt": "2023-11-29T20:18:36.574757+00:00", + "commandType": "touchTip", + "key": "f7a9056266ef73017a3c841105805be9", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.574891+00:00", + "completedAt": "2023-11-29T20:18:36.582292+00:00" + }, + { + "id": "7dcb8686-c1bd-47ca-9503-a7579081c8a3", + "createdAt": "2023-11-29T20:18:36.583058+00:00", + "commandType": "dispense", + "key": "1792a39e26d21035c732997eb8dee92b", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:36.583142+00:00", + "completedAt": "2023-11-29T20:18:36.588397+00:00" + }, + { + "id": "57764f95-4962-441f-a6e2-31bf7dde1b6b", + "createdAt": "2023-11-29T20:18:36.588783+00:00", + "commandType": "waitForDuration", + "key": "1e843f06b82ede623229f2035b26c681", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.588846+00:00", + "completedAt": "2023-11-29T20:18:36.588954+00:00" + }, + { + "id": "65af8f0f-70ea-491e-a248-6e5ba158f086", + "createdAt": "2023-11-29T20:18:36.589634+00:00", + "commandType": "blowout", + "key": "bfe3b474251d9924c72a3c85b39b7265", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.589707+00:00", + "completedAt": "2023-11-29T20:18:36.591950+00:00" + }, + { + "id": "e4d44e16-48ad-4c6f-bbfe-7ed46fa283c4", + "createdAt": "2023-11-29T20:18:36.592702+00:00", + "commandType": "moveToWell", + "key": "e2b13f1335ee1536df68877b312e8c52", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 263.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.592774+00:00", + "completedAt": "2023-11-29T20:18:36.594170+00:00" + }, + { + "id": "d3e0f835-8717-4f4e-b694-a7db17344c1a", + "createdAt": "2023-11-29T20:18:36.594956+00:00", + "commandType": "moveToWell", + "key": "efbe503a44f06d025124285280de3a4b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 255.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.595052+00:00", + "completedAt": "2023-11-29T20:18:36.596479+00:00" + }, + { + "id": "463e0477-fa55-4228-8905-0c715d531f13", + "createdAt": "2023-11-29T20:18:36.597043+00:00", + "commandType": "moveToWell", + "key": "6d6965a5e6515dddcee5101b33b547fb", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.597160+00:00", + "completedAt": "2023-11-29T20:18:36.598458+00:00" + }, + { + "id": "3dfe7afd-b227-416a-ae25-4efd6477b72d", + "createdAt": "2023-11-29T20:18:36.599083+00:00", + "commandType": "moveToWell", + "key": "a448dbc0aac73ff819d3e121e43f0891", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.599202+00:00", + "completedAt": "2023-11-29T20:18:36.600544+00:00" + }, + { + "id": "03e18285-35dc-4836-9568-d263ed4b7a47", + "createdAt": "2023-11-29T20:18:36.600887+00:00", + "commandType": "dropTip", + "key": "fae1f0e343d06bb145cfc0708e56410b", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.600956+00:00", + "completedAt": "2023-11-29T20:18:36.607441+00:00" + }, + { + "id": "46ac4e1a-58a7-400d-af7c-b8f890771e8a", + "createdAt": "2023-11-29T20:18:36.608375+00:00", + "commandType": "pickUpTip", + "key": "8c6c1a8e6f9396aa1ba86f25c44bd0c6", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 250.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:36.608446+00:00", + "completedAt": "2023-11-29T20:18:36.619582+00:00" + }, + { + "id": "e772fb93-542a-44df-8f4d-ff52ce982a08", + "createdAt": "2023-11-29T20:18:36.620373+00:00", + "commandType": "moveToWell", + "key": "e1a101adb470710d2ea6e71c1c7e39ac", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 38.510000000000005 } + }, + "startedAt": "2023-11-29T20:18:36.620442+00:00", + "completedAt": "2023-11-29T20:18:36.625155+00:00" + }, + { + "id": "d39c072d-ce67-41d7-a268-7c3e9d4a9474", + "createdAt": "2023-11-29T20:18:36.625996+00:00", + "commandType": "aspirate", + "key": "1b241b0093055b364c5ca7a790723dba", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -11.949999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 38.510000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:36.626074+00:00", + "completedAt": "2023-11-29T20:18:36.628104+00:00" + }, + { + "id": "fa70d8ea-b21e-4d17-8b3d-bd9c09a2a560", + "createdAt": "2023-11-29T20:18:36.628412+00:00", + "commandType": "waitForDuration", + "key": "065a71996f2c872e3cab3952a34744c7", + "status": "succeeded", + "params": { "seconds": 3.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.628470+00:00", + "completedAt": "2023-11-29T20:18:36.628522+00:00" + }, + { + "id": "514fe475-9ce9-4516-83c2-d948a089e230", + "createdAt": "2023-11-29T20:18:36.628991+00:00", + "commandType": "moveToWell", + "key": "27afaaaa20a1ad0da8b14f6d5dc0044a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 36.260000000000005 } + }, + "startedAt": "2023-11-29T20:18:36.629044+00:00", + "completedAt": "2023-11-29T20:18:36.630395+00:00" + }, + { + "id": "c4f14224-481d-4fc5-8bca-6786b2508e4b", + "createdAt": "2023-11-29T20:18:36.631027+00:00", + "commandType": "aspirate", + "key": "4a87fde75c231cd7e56cbbaecc92079f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.199999999999996 } + }, + "flowRate": 40.0, + "volume": 100.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 36.260000000000005 }, + "volume": 100.0 + }, + "startedAt": "2023-11-29T20:18:36.631082+00:00", + "completedAt": "2023-11-29T20:18:36.633375+00:00" + }, + { + "id": "67457113-cf42-44b3-a453-1d194186d3ae", + "createdAt": "2023-11-29T20:18:36.634220+00:00", + "commandType": "moveToWell", + "key": "e5b074001093e648d17dc1945032cb2d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -2.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 48.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.634293+00:00", + "completedAt": "2023-11-29T20:18:36.635636+00:00" + }, + { + "id": "003c1360-6f49-43ff-ac1a-50007ec4c4b4", + "createdAt": "2023-11-29T20:18:36.636322+00:00", + "commandType": "touchTip", + "key": "a7ec573300f51793c36470e94221d93f", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -1.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "radius": 1.0, + "speed": 80.0 + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 49.459999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.636381+00:00", + "completedAt": "2023-11-29T20:18:36.642373+00:00" + }, + { + "id": "8b2d70b3-37ba-4e51-9e48-53b2e4433bf3", + "createdAt": "2023-11-29T20:18:36.643116+00:00", + "commandType": "dispense", + "key": "3b9258c0876d84ddc909f45369b11c19", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 160.0, + "volume": 200.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 }, + "volume": 200.0 + }, + "startedAt": "2023-11-29T20:18:36.643265+00:00", + "completedAt": "2023-11-29T20:18:36.649157+00:00" + }, + { + "id": "1468967b-af06-4f21-ad97-106a1d1d2224", + "createdAt": "2023-11-29T20:18:36.649642+00:00", + "commandType": "waitForDuration", + "key": "e7ecb988dd266198d51add03f6fbb50c", + "status": "succeeded", + "params": { "seconds": 2.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.649705+00:00", + "completedAt": "2023-11-29T20:18:36.649769+00:00" + }, + { + "id": "0b9c13a0-dd73-40fe-86e6-24ae47aeb03e", + "createdAt": "2023-11-29T20:18:36.650297+00:00", + "commandType": "blowout", + "key": "9f07abeddd064b2584a8a2273e6e915d", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 80.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.650354+00:00", + "completedAt": "2023-11-29T20:18:36.652299+00:00" + }, + { + "id": "eb09eecd-d3a4-4afb-aa35-bd6455712333", + "createdAt": "2023-11-29T20:18:36.652863+00:00", + "commandType": "moveToWell", + "key": "3c278e7843371f8b489107b3deb062e1", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 263.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.652975+00:00", + "completedAt": "2023-11-29T20:18:36.654203+00:00" + }, + { + "id": "c5780349-8469-4509-81e2-00839b03b730", + "createdAt": "2023-11-29T20:18:36.654665+00:00", + "commandType": "moveToWell", + "key": "49ec612e2526d801629e23b9de961cc9", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": -4.0, "y": 0.0, "z": -3.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 255.38, "y": 42.78, "z": 28.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.654728+00:00", + "completedAt": "2023-11-29T20:18:36.655934+00:00" + }, + { + "id": "f6855a9f-57fe-4a1e-886c-7602789de8fb", + "createdAt": "2023-11-29T20:18:36.656583+00:00", + "commandType": "moveToWell", + "key": "5edabf4fb83af2848b0b7af8cc52747a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -5.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 26.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.656663+00:00", + "completedAt": "2023-11-29T20:18:36.658012+00:00" + }, + { + "id": "fdda7135-0e1a-4898-b3ed-d7e58e077d87", + "createdAt": "2023-11-29T20:18:36.658441+00:00", + "commandType": "moveToWell", + "key": "3aad761f44376bf8a1eb8c115bca095a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 42.78, "z": 31.400000000000002 } + }, + "startedAt": "2023-11-29T20:18:36.658496+00:00", + "completedAt": "2023-11-29T20:18:36.659877+00:00" + }, + { + "id": "af633e54-5458-4521-bf68-4be60462a6e1", + "createdAt": "2023-11-29T20:18:36.660290+00:00", + "commandType": "dropTip", + "key": "fd4d7a9b0c81ec683602078832a0cc46", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.660404+00:00", + "completedAt": "2023-11-29T20:18:36.666563+00:00" + }, + { + "id": "99249a25-bd71-43d7-9daf-2d78198af778", + "createdAt": "2023-11-29T20:18:36.667043+00:00", + "commandType": "waitForDuration", + "key": "068014d55a738f691a29189bf0203258", + "status": "succeeded", + "params": { "seconds": 60.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.667158+00:00", + "completedAt": "2023-11-29T20:18:36.667231+00:00" + }, + { + "id": "a054ab23-a0ce-4d5f-a222-fa5ab94e37d5", + "createdAt": "2023-11-29T20:18:36.667794+00:00", + "commandType": "custom", + "key": "440bb88474ba1b800baa32d67dbd6f56", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Removing Residual Wash" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.667860+00:00", + "completedAt": "2023-11-29T20:18:36.667933+00:00" + }, + { + "id": "a3115dc3-673e-46d1-ba23-6a7087909419", + "createdAt": "2023-11-29T20:18:36.668499+00:00", + "commandType": "pickUpTip", + "key": "3867ed1e972d1393965043a57b7a1b31", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 259.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:36.668598+00:00", + "completedAt": "2023-11-29T20:18:36.679502+00:00" + }, + { + "id": "b7b56db0-2289-483b-86b4-0bacd3dc18c3", + "createdAt": "2023-11-29T20:18:36.680214+00:00", + "commandType": "moveToWell", + "key": "00dc245b120417899621a888d0257e4b", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:36.680277+00:00", + "completedAt": "2023-11-29T20:18:36.684865+00:00" + }, + { + "id": "2b434a1b-5c1b-4388-a7dd-6b292dbb0f93", + "createdAt": "2023-11-29T20:18:36.685673+00:00", + "commandType": "aspirate", + "key": "acaea2a664d24847a641543eac0fffe2", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 40.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:36.685735+00:00", + "completedAt": "2023-11-29T20:18:36.687951+00:00" + }, + { + "id": "27633588-db21-4218-b26e-f4877b9c7ba7", + "createdAt": "2023-11-29T20:18:36.688351+00:00", + "commandType": "dropTip", + "key": "bfd1ecbac50f25e415d33c3338875f29", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.688422+00:00", + "completedAt": "2023-11-29T20:18:36.696474+00:00" + }, + { + "id": "cad914c7-6c79-4d42-8797-0286317419be", + "createdAt": "2023-11-29T20:18:36.697260+00:00", + "commandType": "pickUpTip", + "key": "6c9b3de73eeb6559d02d18c0dd30f542", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 268.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:36.697337+00:00", + "completedAt": "2023-11-29T20:18:36.708710+00:00" + }, + { + "id": "3f6c639c-e5ac-4112-8153-96d813bd3b3f", + "createdAt": "2023-11-29T20:18:36.709631+00:00", + "commandType": "moveToWell", + "key": "a5928a7f7f9354bd9d1b91e8d9b39ea4", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:36.709762+00:00", + "completedAt": "2023-11-29T20:18:36.714734+00:00" + }, + { + "id": "9efb15e3-98fe-4429-8baa-ec30bd56bc17", + "createdAt": "2023-11-29T20:18:36.715645+00:00", + "commandType": "aspirate", + "key": "b9affac3faa8cc3a8044962443339e61", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 40.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:36.715771+00:00", + "completedAt": "2023-11-29T20:18:36.718283+00:00" + }, + { + "id": "ec6c6ba9-1f85-4ab0-84c7-53e14aec458e", + "createdAt": "2023-11-29T20:18:36.718818+00:00", + "commandType": "dropTip", + "key": "7b0da74cbaecb88560bcb903d3b26b8c", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 412.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.718900+00:00", + "completedAt": "2023-11-29T20:18:36.727170+00:00" + }, + { + "id": "9838b215-14de-403e-915d-da71389f720a", + "createdAt": "2023-11-29T20:18:36.727999+00:00", + "commandType": "pickUpTip", + "key": "21a53a3cfd078a962cd28dfff5498c28", + "status": "succeeded", + "params": { + "labwareId": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 277.38, "y": 395.38, "z": 99.0 }, + "tipVolume": 200.0, + "tipLength": 48.25, + "tipDiameter": 5.59 + }, + "startedAt": "2023-11-29T20:18:36.728123+00:00", + "completedAt": "2023-11-29T20:18:36.739371+00:00" + }, + { + "id": "f7b4a8a7-8298-46f6-a86d-24a5c51f425e", + "createdAt": "2023-11-29T20:18:36.740108+00:00", + "commandType": "moveToWell", + "key": "1d38c3cc11ea893f83cd994045e22e9d", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:36.740176+00:00", + "completedAt": "2023-11-29T20:18:36.745314+00:00" + }, + { + "id": "d98c7e10-ae46-4b7d-82d2-44deb3437ef1", + "createdAt": "2023-11-29T20:18:36.746120+00:00", + "commandType": "aspirate", + "key": "8c7f87b1b164e4921fc15cca0cd0a2b6", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 40.0, + "volume": 50.0, + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 50.0 + }, + "startedAt": "2023-11-29T20:18:36.746193+00:00", + "completedAt": "2023-11-29T20:18:36.748320+00:00" + }, + { + "id": "1354038f-af6a-44e1-ace1-94ef83f202c7", + "createdAt": "2023-11-29T20:18:36.748745+00:00", + "commandType": "dropTip", + "key": "6babb4e64b5c344d46d243ada9bc95d0", + "status": "succeeded", + "params": { + "pipetteId": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.748812+00:00", + "completedAt": "2023-11-29T20:18:36.756420+00:00" + }, + { + "id": "c741cac7-a690-4bdf-8acf-956c3f3f02ab", + "createdAt": "2023-11-29T20:18:36.756829+00:00", + "commandType": "waitForDuration", + "key": "f4d75659bb67c2ea596880f7fc8be219", + "status": "succeeded", + "params": { "seconds": 30.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.756892+00:00", + "completedAt": "2023-11-29T20:18:36.756958+00:00" + }, + { + "id": "dd45d414-3946-4b87-804d-f7a01b2d4715", + "createdAt": "2023-11-29T20:18:36.757165+00:00", + "commandType": "heaterShaker/openLabwareLatch", + "key": "b67bdec835191e6a7a9e7b1f1ed4e9f0", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:36.757213+00:00", + "completedAt": "2023-11-29T20:18:36.757292+00:00" + }, + { + "id": "795dddd8-f021-4532-a924-bb2f30bbb1a5", + "createdAt": "2023-11-29T20:18:36.757620+00:00", + "commandType": "moveLabware", + "key": "519d07e3e6541439badce2d2e9060456", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "newLocation": { "labwareId": "3787af65-0305-4b08-bf02-a2c6596a10e5" }, + "strategy": "usingGripper", + "pickUpOffset": { "x": 0.0, "y": -2.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": -2.0, "z": 0.0 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.757725+00:00", + "completedAt": "2023-11-29T20:18:36.757947+00:00" + }, + { + "id": "0fb56cce-44fb-41b1-8b54-dbf59a6f97aa", + "createdAt": "2023-11-29T20:18:36.758240+00:00", + "commandType": "heaterShaker/closeLabwareLatch", + "key": "d801d69469e603aee7d616f7af663b18", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.758342+00:00", + "completedAt": "2023-11-29T20:18:36.758401+00:00" + }, + { + "id": "4cfd9c88-7925-4c9e-8efe-c3ec32239297", + "createdAt": "2023-11-29T20:18:36.758954+00:00", + "commandType": "custom", + "key": "82fc5220b1b39e0ad040ba2a0705fd62", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Adding RSB" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.759057+00:00", + "completedAt": "2023-11-29T20:18:36.759179+00:00" + }, + { + "id": "c8c12754-fe49-4d0c-9a29-c7d713fd8322", + "createdAt": "2023-11-29T20:18:36.759755+00:00", + "commandType": "pickUpTip", + "key": "907256782fd4d319b76d9b1b877b1e9a", + "status": "succeeded", + "params": { + "labwareId": "d743c482-b98f-4d7f-8b1f-8193eff63a00", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 396.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:36.759821+00:00", + "completedAt": "2023-11-29T20:18:36.770549+00:00" + }, + { + "id": "8bc14cbb-f75c-44f5-9eca-fcda6f08bb58", + "createdAt": "2023-11-29T20:18:36.771227+00:00", + "commandType": "aspirate", + "key": "588395c3ba1c1aa66b57f9496df22f94", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 2.0, + "volume": 28.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 42.78, "z": 5.55 }, + "volume": 28.0 + }, + "startedAt": "2023-11-29T20:18:36.771297+00:00", + "completedAt": "2023-11-29T20:18:36.776651+00:00" + }, + { + "id": "cad68e74-b8ef-4356-bfa5-7c0c247fb9b7", + "createdAt": "2023-11-29T20:18:36.777495+00:00", + "commandType": "dispense", + "key": "b1933b6d7aaa801075a603ecc51167b0", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 2.0, + "volume": 2.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 42.78, "z": 5.55 }, + "volume": 2.0 + }, + "startedAt": "2023-11-29T20:18:36.777673+00:00", + "completedAt": "2023-11-29T20:18:36.779596+00:00" + }, + { + "id": "fb263bce-c8e6-46f0-a53a-e55482127dfe", + "createdAt": "2023-11-29T20:18:36.780206+00:00", + "commandType": "moveToWell", + "key": "bf04124ecf25b77df275688b7685fc39", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 23.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:36.780266+00:00", + "completedAt": "2023-11-29T20:18:36.784156+00:00" + }, + { + "id": "e199c002-5cbc-440d-b78f-55656259c085", + "createdAt": "2023-11-29T20:18:36.785226+00:00", + "commandType": "dispense", + "key": "6985412cd1da4d5b6fc348a1ae831164", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "flowRate": 4.0, + "volume": 26.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 23.90000000000001 }, + "volume": 26.0 + }, + "startedAt": "2023-11-29T20:18:36.785293+00:00", + "completedAt": "2023-11-29T20:18:36.787320+00:00" + }, + { + "id": "40f904fc-4e8a-4412-ad5a-336fbba7d191", + "createdAt": "2023-11-29T20:18:36.787917+00:00", + "commandType": "blowout", + "key": "963fba074ce0cf81861e7abea57df418", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 4.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 68.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.787978+00:00", + "completedAt": "2023-11-29T20:18:36.790835+00:00" + }, + { + "id": "9911ee0f-72c4-4de0-be8b-e9df7f17453b", + "createdAt": "2023-11-29T20:18:36.791308+00:00", + "commandType": "dropTip", + "key": "490c861a16c65c000696e25c3ecf747b", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 509.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.791395+00:00", + "completedAt": "2023-11-29T20:18:36.798640+00:00" + }, + { + "id": "100307a6-7efa-4501-a24b-4a67bab4ca15", + "createdAt": "2023-11-29T20:18:36.799278+00:00", + "commandType": "pickUpTip", + "key": "f25b0a5009a23989e3ae2fcd97a89d2a", + "status": "succeeded", + "params": { + "labwareId": "d743c482-b98f-4d7f-8b1f-8193eff63a00", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 405.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:36.799353+00:00", + "completedAt": "2023-11-29T20:18:36.810211+00:00" + }, + { + "id": "5df1ed4c-4f49-4947-8c1f-c663a957c78d", + "createdAt": "2023-11-29T20:18:36.811016+00:00", + "commandType": "aspirate", + "key": "2221613690a94a59f9ff3f3dc9d80b36", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 2.0, + "volume": 28.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 42.78, "z": 5.55 }, + "volume": 28.0 + }, + "startedAt": "2023-11-29T20:18:36.811118+00:00", + "completedAt": "2023-11-29T20:18:36.816416+00:00" + }, + { + "id": "3fc6e13c-bd6b-47ac-a524-956ddc559c1e", + "createdAt": "2023-11-29T20:18:36.817213+00:00", + "commandType": "dispense", + "key": "db151dffe0bcbd5c668554c0183a7a84", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 2.0, + "volume": 2.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 42.78, "z": 5.55 }, + "volume": 2.0 + }, + "startedAt": "2023-11-29T20:18:36.817284+00:00", + "completedAt": "2023-11-29T20:18:36.819192+00:00" + }, + { + "id": "52e328e6-5b9b-49c8-b717-99ead74291e9", + "createdAt": "2023-11-29T20:18:36.819949+00:00", + "commandType": "moveToWell", + "key": "8a675cb7bf9cca7c10576291217c362a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 23.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:36.820094+00:00", + "completedAt": "2023-11-29T20:18:36.824078+00:00" + }, + { + "id": "05227517-c2f4-4c21-85c1-7e2d6691ea8b", + "createdAt": "2023-11-29T20:18:36.825323+00:00", + "commandType": "dispense", + "key": "d859eb49c144366c505283768aed335b", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "flowRate": 4.0, + "volume": 26.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 23.90000000000001 }, + "volume": 26.0 + }, + "startedAt": "2023-11-29T20:18:36.825405+00:00", + "completedAt": "2023-11-29T20:18:36.827723+00:00" + }, + { + "id": "550703bd-7d49-455d-9d86-c66be8f8a3a9", + "createdAt": "2023-11-29T20:18:36.828491+00:00", + "commandType": "blowout", + "key": "6aa85184464e66800f4ae3ad07d30981", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 4.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 77.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.828561+00:00", + "completedAt": "2023-11-29T20:18:36.831373+00:00" + }, + { + "id": "d8780e93-381c-4103-a42c-76eb6e00e27e", + "createdAt": "2023-11-29T20:18:36.831760+00:00", + "commandType": "dropTip", + "key": "c799ad746af2a64d4b29589348fda43e", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.831827+00:00", + "completedAt": "2023-11-29T20:18:36.839292+00:00" + }, + { + "id": "829f3775-a481-4230-b1b3-f9be245e8aae", + "createdAt": "2023-11-29T20:18:36.839906+00:00", + "commandType": "pickUpTip", + "key": "e4d0e92054ba1487ab99b5a07a497d26", + "status": "succeeded", + "params": { + "labwareId": "d743c482-b98f-4d7f-8b1f-8193eff63a00", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 414.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:36.840011+00:00", + "completedAt": "2023-11-29T20:18:36.850817+00:00" + }, + { + "id": "7f7752f1-dcf8-4ffb-bf6e-94bfd3d32cec", + "createdAt": "2023-11-29T20:18:36.851465+00:00", + "commandType": "aspirate", + "key": "ab7eb810fd5fc93d42c16c39ecd5cc2a", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 2.0, + "volume": 28.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 42.78, "z": 5.55 }, + "volume": 28.0 + }, + "startedAt": "2023-11-29T20:18:36.851532+00:00", + "completedAt": "2023-11-29T20:18:36.856413+00:00" + }, + { + "id": "95dd888d-04e3-4d07-9b0d-4d8ad2c2f080", + "createdAt": "2023-11-29T20:18:36.857117+00:00", + "commandType": "dispense", + "key": "061b4dde928697822d6be1ff2cc4915a", + "status": "succeeded", + "params": { + "labwareId": "74e88440-cab2-4525-9e09-2198a71b83c1", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -25.85 } + }, + "flowRate": 2.0, + "volume": 2.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 232.38, "y": 42.78, "z": 5.55 }, + "volume": 2.0 + }, + "startedAt": "2023-11-29T20:18:36.857194+00:00", + "completedAt": "2023-11-29T20:18:36.859375+00:00" + }, + { + "id": "1a8a6f5f-7aa7-41b7-91af-12827e743285", + "createdAt": "2023-11-29T20:18:36.860137+00:00", + "commandType": "moveToWell", + "key": "db202201d83e2c129b0417a51927da3c", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 23.90000000000001 } + }, + "startedAt": "2023-11-29T20:18:36.860226+00:00", + "completedAt": "2023-11-29T20:18:36.864100+00:00" + }, + { + "id": "e332dab6-cb6e-4afa-9e97-2a39efe45db2", + "createdAt": "2023-11-29T20:18:36.865252+00:00", + "commandType": "dispense", + "key": "bb1facf3a243857b820e6dc98e9781a7", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999992 } + }, + "flowRate": 4.0, + "volume": 26.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 23.90000000000001 }, + "volume": 26.0 + }, + "startedAt": "2023-11-29T20:18:36.865382+00:00", + "completedAt": "2023-11-29T20:18:36.867754+00:00" + }, + { + "id": "cb0417f1-c8b4-4957-a7e4-7475cab4ff6f", + "createdAt": "2023-11-29T20:18:36.868437+00:00", + "commandType": "blowout", + "key": "14a53bed6ab8add8a7632a4c87e0d7f9", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -3.0 } + }, + "flowRate": 4.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 86.38, "y": 74.24, "z": 34.849999999999994 } + }, + "startedAt": "2023-11-29T20:18:36.868502+00:00", + "completedAt": "2023-11-29T20:18:36.871106+00:00" + }, + { + "id": "f3acca92-803d-4b81-b777-05b16c8ce184", + "createdAt": "2023-11-29T20:18:36.871552+00:00", + "commandType": "dropTip", + "key": "56132d978364b8f27bd89da607a566f7", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 509.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.871623+00:00", + "completedAt": "2023-11-29T20:18:36.879212+00:00" + }, + { + "id": "677a929c-fc5d-4d6a-9253-e65ade527eab", + "createdAt": "2023-11-29T20:18:36.879590+00:00", + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "key": "247ea61bf85fbc51586dea7622ab8077", + "status": "succeeded", + "params": { + "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5", + "rpm": 2000.0 + }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:36.879652+00:00", + "completedAt": "2023-11-29T20:18:36.879747+00:00" + }, + { + "id": "5bbd512b-e952-487a-8054-8b5174376d12", + "createdAt": "2023-11-29T20:18:36.879966+00:00", + "commandType": "waitForDuration", + "key": "b9e1e435bdd6c13e1f3cdefe1ef733cb", + "status": "succeeded", + "params": { "seconds": 300.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.880018+00:00", + "completedAt": "2023-11-29T20:18:36.880065+00:00" + }, + { + "id": "41daf76a-51fd-4295-a0de-0e6a83761962", + "createdAt": "2023-11-29T20:18:36.880297+00:00", + "commandType": "heaterShaker/deactivateShaker", + "key": "c360483e0e20c967a2a4adfc47a4c364", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.880395+00:00", + "completedAt": "2023-11-29T20:18:36.880443+00:00" + }, + { + "id": "ced25969-62f0-4e44-9c15-f77c2062e145", + "createdAt": "2023-11-29T20:18:36.880638+00:00", + "commandType": "heaterShaker/openLabwareLatch", + "key": "fcd83950acf45fe53fb958bc767388fd", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:36.880691+00:00", + "completedAt": "2023-11-29T20:18:36.880755+00:00" + }, + { + "id": "b0f07187-02bd-41d3-98a1-95abc2daf1e1", + "createdAt": "2023-11-29T20:18:36.881070+00:00", + "commandType": "moveLabware", + "key": "4d65140ac589c74f215edeb1b896f593", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "newLocation": { "moduleId": "dc2de112-b2b7-4811-9cf5-501f1fee6878" }, + "strategy": "usingGripper", + "pickUpOffset": { "x": 0.0, "y": -2.0, "z": 0.0 }, + "dropOffset": { "x": 0.0, "y": 0.0, "z": 0.5 } + }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.881145+00:00", + "completedAt": "2023-11-29T20:18:36.881364+00:00" + }, + { + "id": "290fd4df-d6a5-40cc-9a88-72766cb9c384", + "createdAt": "2023-11-29T20:18:36.881588+00:00", + "commandType": "heaterShaker/closeLabwareLatch", + "key": "f1f88e6d48a0860d84f4a1a3638d55b1", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.881639+00:00", + "completedAt": "2023-11-29T20:18:36.881693+00:00" + }, + { + "id": "7564ee30-095e-4aa9-8f31-f581b709dd5b", + "createdAt": "2023-11-29T20:18:36.881965+00:00", + "commandType": "waitForDuration", + "key": "9f6f5b9231092e41d80ec6f8cc4a391c", + "status": "succeeded", + "params": { "seconds": 180.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.882017+00:00", + "completedAt": "2023-11-29T20:18:36.882063+00:00" + }, + { + "id": "3784eb2f-29b3-4416-8dea-a9ade2df175a", + "createdAt": "2023-11-29T20:18:36.882530+00:00", + "commandType": "custom", + "key": "e2d2ac3dc9cfb986a6590975e2988ff0", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "--> Transferring Supernatant" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.882585+00:00", + "completedAt": "2023-11-29T20:18:36.882636+00:00" + }, + { + "id": "a2c91025-ebda-4243-acde-888f644b5361", + "createdAt": "2023-11-29T20:18:36.883088+00:00", + "commandType": "pickUpTip", + "key": "d1d31aa63b623badff4c8d10efb26a20", + "status": "succeeded", + "params": { + "labwareId": "d743c482-b98f-4d7f-8b1f-8193eff63a00", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 423.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:36.883144+00:00", + "completedAt": "2023-11-29T20:18:36.894378+00:00" + }, + { + "id": "19df8259-4c1d-43d1-aff9-3d49327a1cee", + "createdAt": "2023-11-29T20:18:36.895393+00:00", + "commandType": "moveToWell", + "key": "936396c5afa3e68b33294f1a30b858db", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:36.895487+00:00", + "completedAt": "2023-11-29T20:18:36.899830+00:00" + }, + { + "id": "5e1809a0-443f-4d4b-bf2a-ae482873bb25", + "createdAt": "2023-11-29T20:18:36.900801+00:00", + "commandType": "aspirate", + "key": "6dd034f91c026343fcb654dbf52f6c9d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 2.0, + "volume": 12.5, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 12.5 + }, + "startedAt": "2023-11-29T20:18:36.900898+00:00", + "completedAt": "2023-11-29T20:18:36.903083+00:00" + }, + { + "id": "4f0500a6-7fda-410d-ae55-4ea3e224093b", + "createdAt": "2023-11-29T20:18:36.903434+00:00", + "commandType": "waitForDuration", + "key": "34439c27360da27382a318258f6136e3", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.903503+00:00", + "completedAt": "2023-11-29T20:18:36.903560+00:00" + }, + { + "id": "ee8a18b6-660e-497e-bd4c-74c9e4f07091", + "createdAt": "2023-11-29T20:18:36.904058+00:00", + "commandType": "moveToWell", + "key": "f84fb5aa63d30dada81db600b6f2ec9a", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:36.904113+00:00", + "completedAt": "2023-11-29T20:18:36.905473+00:00" + }, + { + "id": "9894164c-1129-4900-9518-3198a9df2ca9", + "createdAt": "2023-11-29T20:18:36.906151+00:00", + "commandType": "aspirate", + "key": "aa27b77a389994b770078722852f19ee", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A7", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 2.0, + "volume": 12.5, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 68.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 12.5 + }, + "startedAt": "2023-11-29T20:18:36.906211+00:00", + "completedAt": "2023-11-29T20:18:36.908340+00:00" + }, + { + "id": "c69a4d21-e984-4e83-8b13-200a38cbe4bf", + "createdAt": "2023-11-29T20:18:36.909122+00:00", + "commandType": "dispense", + "key": "c8cd2606cc3a4de317cc3873a9916964", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A10", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999996 } + }, + "flowRate": 4.0, + "volume": 25.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 95.38, "y": 181.24, "z": 36.510000000000005 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:36.909296+00:00", + "completedAt": "2023-11-29T20:18:36.914141+00:00" + }, + { + "id": "d6025569-f163-4f69-8ebc-1f6a9fb121d0", + "createdAt": "2023-11-29T20:18:36.914741+00:00", + "commandType": "dropTip", + "key": "c5a6b8d89587204693877b2f355eb264", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.914873+00:00", + "completedAt": "2023-11-29T20:18:36.921868+00:00" + }, + { + "id": "dd934140-ec96-4f9d-be80-1d1adf20d00b", + "createdAt": "2023-11-29T20:18:36.922461+00:00", + "commandType": "pickUpTip", + "key": "89f1901a678e9b3a06f641e40e148878", + "status": "succeeded", + "params": { + "labwareId": "d743c482-b98f-4d7f-8b1f-8193eff63a00", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 432.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:36.922525+00:00", + "completedAt": "2023-11-29T20:18:36.933894+00:00" + }, + { + "id": "923b32eb-e0c4-48e3-8412-152eabb13762", + "createdAt": "2023-11-29T20:18:36.934681+00:00", + "commandType": "moveToWell", + "key": "2b5e813840458bc87f8e2742a0cd4b77", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:36.934765+00:00", + "completedAt": "2023-11-29T20:18:36.938834+00:00" + }, + { + "id": "db595d07-9a3f-4844-bdff-fd3f55b5da11", + "createdAt": "2023-11-29T20:18:36.939622+00:00", + "commandType": "aspirate", + "key": "12672a32a0df48df59df94f5af65a845", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 2.0, + "volume": 12.5, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 12.5 + }, + "startedAt": "2023-11-29T20:18:36.939758+00:00", + "completedAt": "2023-11-29T20:18:36.942087+00:00" + }, + { + "id": "36d5dbeb-53d9-4e9f-a5c9-507dd9613ffb", + "createdAt": "2023-11-29T20:18:36.942413+00:00", + "commandType": "waitForDuration", + "key": "a367237a7abe859267f9345aafbeea4f", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.942492+00:00", + "completedAt": "2023-11-29T20:18:36.942560+00:00" + }, + { + "id": "0e59571f-abc7-41ca-960a-96c312da7fb6", + "createdAt": "2023-11-29T20:18:36.943282+00:00", + "commandType": "moveToWell", + "key": "cdfa812d6a79d9bba3468ab8ff4191a5", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:36.943381+00:00", + "completedAt": "2023-11-29T20:18:36.944885+00:00" + }, + { + "id": "3657266d-cdaf-4668-a325-c37e34dfd1bb", + "createdAt": "2023-11-29T20:18:36.945669+00:00", + "commandType": "aspirate", + "key": "c7baa73d74bb92fee1cc43426fbd7131", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A8", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 2.0, + "volume": 12.5, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 77.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 12.5 + }, + "startedAt": "2023-11-29T20:18:36.945729+00:00", + "completedAt": "2023-11-29T20:18:36.947819+00:00" + }, + { + "id": "bd64c764-a7e0-4038-ac1f-c60d90a37e57", + "createdAt": "2023-11-29T20:18:36.948457+00:00", + "commandType": "dispense", + "key": "ec7268af28a973239a29318ccafd6c79", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A11", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999996 } + }, + "flowRate": 4.0, + "volume": 25.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 104.38, "y": 181.24, "z": 36.510000000000005 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:36.948516+00:00", + "completedAt": "2023-11-29T20:18:36.952569+00:00" + }, + { + "id": "7aef3ad6-e80d-477e-9113-e84223022231", + "createdAt": "2023-11-29T20:18:36.952928+00:00", + "commandType": "dropTip", + "key": "6875e105d1f18d753c343c594f761ad3", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 509.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.952986+00:00", + "completedAt": "2023-11-29T20:18:36.960339+00:00" + }, + { + "id": "ca67de45-686d-43f6-9611-1e9a65324b0c", + "createdAt": "2023-11-29T20:18:36.961058+00:00", + "commandType": "pickUpTip", + "key": "1c4d940fb8e8b0b44724c7340b277a01", + "status": "succeeded", + "params": { + "labwareId": "d743c482-b98f-4d7f-8b1f-8193eff63a00", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": 0.0 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 441.38, "y": 181.38, "z": 99.0 }, + "tipVolume": 50.0, + "tipLength": 47.849999999999994, + "tipDiameter": 5.58 + }, + "startedAt": "2023-11-29T20:18:36.961154+00:00", + "completedAt": "2023-11-29T20:18:36.971856+00:00" + }, + { + "id": "539627b0-115a-4d0d-9563-ca6b6c023e2d", + "createdAt": "2023-11-29T20:18:36.972610+00:00", + "commandType": "moveToWell", + "key": "2376527010c41b0caee84ee3754355c7", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 36.010000000000005 } + }, + "startedAt": "2023-11-29T20:18:36.972705+00:00", + "completedAt": "2023-11-29T20:18:36.977075+00:00" + }, + { + "id": "b6696b72-ee5f-4a0f-9997-d5f4634fb3df", + "createdAt": "2023-11-29T20:18:36.977853+00:00", + "commandType": "aspirate", + "key": "99544118802bf922d1d892e9a045590d", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.449999999999996 } + }, + "flowRate": 2.0, + "volume": 12.5, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 36.010000000000005 }, + "volume": 12.5 + }, + "startedAt": "2023-11-29T20:18:36.977917+00:00", + "completedAt": "2023-11-29T20:18:36.979933+00:00" + }, + { + "id": "b878f7d9-27e2-415e-acc7-8ba31189edb4", + "createdAt": "2023-11-29T20:18:36.980361+00:00", + "commandType": "waitForDuration", + "key": "4b953412c3750327bf4acc139207b452", + "status": "succeeded", + "params": { "seconds": 1.0 }, + "result": {}, + "startedAt": "2023-11-29T20:18:36.980482+00:00", + "completedAt": "2023-11-29T20:18:36.980559+00:00" + }, + { + "id": "a5111849-6fd5-49cf-82d7-b282463c8daf", + "createdAt": "2023-11-29T20:18:36.981152+00:00", + "commandType": "moveToWell", + "key": "a156bcf223efc4f84456dadb84dcb718", + "status": "succeeded", + "params": { + "forceDirect": false, + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 35.71000000000001 } + }, + "startedAt": "2023-11-29T20:18:36.981278+00:00", + "completedAt": "2023-11-29T20:18:36.982873+00:00" + }, + { + "id": "ab759a21-245a-48c2-a43f-1cddef8b943e", + "createdAt": "2023-11-29T20:18:36.983785+00:00", + "commandType": "aspirate", + "key": "2ca53d414d60edc1873c7d7f5fd66fad", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A9", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -14.749999999999993 } + }, + "flowRate": 2.0, + "volume": 12.5, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 86.38, "y": 181.24, "z": 35.71000000000001 }, + "volume": 12.5 + }, + "startedAt": "2023-11-29T20:18:36.983847+00:00", + "completedAt": "2023-11-29T20:18:36.985964+00:00" + }, + { + "id": "1d549c58-b220-4223-b013-b44c82ba08ba", + "createdAt": "2023-11-29T20:18:36.986554+00:00", + "commandType": "dispense", + "key": "6c387e5f72aa73f6008a8a17797bd745", + "status": "succeeded", + "params": { + "labwareId": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "wellName": "A12", + "wellLocation": { + "origin": "top", + "offset": { "x": 0.0, "y": 0.0, "z": -13.949999999999996 } + }, + "flowRate": 4.0, + "volume": 25.0, + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4" + }, + "result": { + "position": { "x": 113.38, "y": 181.24, "z": 36.510000000000005 }, + "volume": 25.0 + }, + "startedAt": "2023-11-29T20:18:36.986613+00:00", + "completedAt": "2023-11-29T20:18:36.991083+00:00" + }, + { + "id": "73ec3f75-0bbe-4cb9-a635-8a793c6c7f06", + "createdAt": "2023-11-29T20:18:36.991531+00:00", + "commandType": "dropTip", + "key": "b53794d11c66a2718b9d014f9de99346", + "status": "succeeded", + "params": { + "pipetteId": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "labwareId": "fixedTrash", + "wellName": "A1", + "wellLocation": { + "origin": "default", + "offset": { "x": 0, "y": 0, "z": 0 } + }, + "alternateDropLocation": true + }, + "result": { "position": { "x": 359.25, "y": 364.0, "z": 40.0 } }, + "startedAt": "2023-11-29T20:18:36.991622+00:00", + "completedAt": "2023-11-29T20:18:36.999001+00:00" + }, + { + "id": "e017b923-0cbb-4df5-87a0-4c78eae85204", + "createdAt": "2023-11-29T20:18:36.999410+00:00", + "commandType": "heaterShaker/openLabwareLatch", + "key": "9110a38f18ab64eba77367d5c47d068d", + "status": "succeeded", + "params": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" }, + "result": { "pipetteRetracted": false }, + "startedAt": "2023-11-29T20:18:36.999477+00:00", + "completedAt": "2023-11-29T20:18:36.999577+00:00" + }, + { + "id": "8a1ea219-3a4d-4ef7-af3d-4b802e2cd795", + "createdAt": "2023-11-29T20:18:36.999999+00:00", + "commandType": "thermocycler/deactivateBlock", + "key": "c5bb689673e5f925569fdc6478de910c", + "status": "succeeded", + "params": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "result": {}, + "startedAt": "2023-11-29T20:18:37.000104+00:00", + "completedAt": "2023-11-29T20:18:37.000204+00:00" + }, + { + "id": "c346c636-cfd4-400a-b09c-7a8b8cb5cd56", + "createdAt": "2023-11-29T20:18:37.000564+00:00", + "commandType": "thermocycler/deactivateLid", + "key": "6e8b51c7fdd5dc4c5090c493e1691901", + "status": "succeeded", + "params": { "moduleId": "1ab50184-0380-41c8-94ef-874e99285ff3" }, + "result": {}, + "startedAt": "2023-11-29T20:18:37.000641+00:00", + "completedAt": "2023-11-29T20:18:37.000711+00:00" + }, + { + "id": "80b0cdd6-9701-41d6-893f-62ab381bd410", + "createdAt": "2023-11-29T20:18:37.001116+00:00", + "commandType": "temperatureModule/deactivate", + "key": "afa12c52a2a5f930b30dd7841c181962", + "status": "succeeded", + "params": { "moduleId": "dc893184-0c7b-4c95-80f1-627932a49ab0" }, + "result": {}, + "startedAt": "2023-11-29T20:18:37.001188+00:00", + "completedAt": "2023-11-29T20:18:37.001272+00:00" + }, + { + "id": "08e49b57-4289-4adc-93d0-ea5e4e810752", + "createdAt": "2023-11-29T20:18:37.001973+00:00", + "commandType": "custom", + "key": "3bc2cde90ded868d368b7d142098db61", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "Number of Resets: 1" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:37.002085+00:00", + "completedAt": "2023-11-29T20:18:37.002159+00:00" + }, + { + "id": "9d404a1e-09c3-48c5-bd7c-f465ce46a721", + "createdAt": "2023-11-29T20:18:37.002678+00:00", + "commandType": "custom", + "key": "8aaaf2d0f491047aba26aacfa3e3fc0d", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "Number of p200 Tips Used: 72" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:37.002735+00:00", + "completedAt": "2023-11-29T20:18:37.002782+00:00" + }, + { + "id": "45cccb78-2126-45fb-820f-77f7ac191a2e", + "createdAt": "2023-11-29T20:18:37.003176+00:00", + "commandType": "custom", + "key": "1db2a38351f024a2233b611bbb16413b", + "status": "succeeded", + "params": { + "legacyCommandType": "command.COMMENT", + "legacyCommandText": "Number of p50 Tips Used: 24" + }, + "result": {}, + "startedAt": "2023-11-29T20:18:37.003230+00:00", + "completedAt": "2023-11-29T20:18:37.003275+00:00" + } + ], + "labware": [ + { + "id": "fixedTrash", + "loadName": "opentrons_1_trash_3200ml_fixed", + "definitionUri": "opentrons/opentrons_1_trash_3200ml_fixed/1", + "location": { "slotName": "A3" } + }, + { + "id": "3787af65-0305-4b08-bf02-a2c6596a10e5", + "loadName": "opentrons_96_pcr_adapter", + "definitionUri": "opentrons/opentrons_96_pcr_adapter/1", + "location": { "moduleId": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5" } + }, + { + "id": "74e88440-cab2-4525-9e09-2198a71b83c1", + "loadName": "nest_12_reservoir_15ml", + "definitionUri": "opentrons/nest_12_reservoir_15ml/1", + "location": { "slotName": "D2" }, + "displayName": "Reservoir" + }, + { + "id": "50546a91-b698-445c-a00a-e710416ede38", + "loadName": "opentrons_96_well_aluminum_block", + "definitionUri": "opentrons/opentrons_96_well_aluminum_block/1", + "location": { "moduleId": "dc893184-0c7b-4c95-80f1-627932a49ab0" } + }, + { + "id": "64598ef1-c390-4094-90ec-b8aafc688085", + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "definitionUri": "opentrons/armadillo_96_wellplate_200ul_pcr_full_skirt/2", + "location": { "labwareId": "50546a91-b698-445c-a00a-e710416ede38" }, + "displayName": "Reagent Plate" + }, + { + "id": "e5b35230-f2df-4afa-b7c1-3b15c174733f", + "loadName": "opentrons_flex_96_tiprack_50ul", + "definitionUri": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "location": { "slotName": "C2" } + }, + { + "id": "d743c482-b98f-4d7f-8b1f-8193eff63a00", + "loadName": "opentrons_flex_96_tiprack_50ul", + "definitionUri": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "location": { "slotName": "C3" } + }, + { + "id": "878bc5ba-f81a-4aa9-94e6-06ba704d69aa", + "loadName": "armadillo_96_wellplate_200ul_pcr_full_skirt", + "definitionUri": "opentrons/armadillo_96_wellplate_200ul_pcr_full_skirt/2", + "location": { "moduleId": "dc2de112-b2b7-4811-9cf5-501f1fee6878" }, + "displayName": "Sample Plate" + }, + { + "id": "07252a85-3f73-44d3-b2b7-87f8dc1b5ded", + "loadName": "opentrons_flex_96_tiprack_200ul", + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "location": { "slotName": "B2" } + }, + { + "id": "72501571-7efc-4c27-bfa2-3b9a59f9e23e", + "loadName": "opentrons_flex_96_tiprack_200ul", + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "location": { "slotName": "B3" } + }, + { + "id": "3c5ffd03-9c03-4bf2-b9c0-63ef12cc0e6a", + "loadName": "opentrons_flex_96_tiprack_200ul", + "definitionUri": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "location": { "slotName": "A2" } + } + ], + "pipettes": [ + { + "id": "91474b07-e0ea-4d44-b785-2ffe061dffd7", + "pipetteName": "p1000_multi_flex", + "mount": "left" + }, + { + "id": "dcdefb82-d112-4d0e-92b7-d8348b445fc4", + "pipetteName": "p50_multi_flex", + "mount": "right" + } + ], + "modules": [ + { + "id": "63ed48fa-33f9-4994-b655-3fe5bc41a7b5", + "model": "heaterShakerModuleV1", + "location": { "slotName": "D1" }, + "serialNumber": "fake-serial-number-f36dcc9a-6276-42c2-a8f3-1b0ff29e4505" + }, + { + "id": "dc893184-0c7b-4c95-80f1-627932a49ab0", + "model": "temperatureModuleV2", + "location": { "slotName": "D3" }, + "serialNumber": "fake-serial-number-4ca7a615-156c-465d-a57a-0fb90878cb41" + }, + { + "id": "dc2de112-b2b7-4811-9cf5-501f1fee6878", + "model": "magneticBlockV1", + "location": { "slotName": "C1" } + }, + { + "id": "1ab50184-0380-41c8-94ef-874e99285ff3", + "model": "thermocyclerModuleV2", + "location": { "slotName": "B1" }, + "serialNumber": "fake-serial-number-81cba3a2-6db2-4feb-85f3-c85417936919" + } + ], + "liquids": [ + { + "id": "0901b8fb-ab54-437d-bce8-669ab9f78186", + "displayName": "EtOH", + "description": "AMPure Beads", + "displayColor": "#704848" + }, + { + "id": "39cb0aae-11c7-40f4-a4d0-f68bed1bc254", + "displayName": "EtOH", + "description": "80% Ethanol", + "displayColor": "#9ACECB" + }, + { + "id": "6d5925a9-c9e8-40d9-bb9a-316c849b1841", + "displayName": "RSB", + "description": "Resuspension Buffer", + "displayColor": "#00FFF2" + }, + { + "id": "fdc777d0-5c0b-4a15-bb17-c9ed1b5bf6e1", + "displayName": "Liquid_trash_well", + "description": "Liquid Trash", + "displayColor": "#9B9B9B" + }, + { + "id": "dcb216ec-2ebd-4c72-a1c9-cadcc26427c3", + "displayName": "Sample", + "description": "Sample", + "displayColor": "#52AAFF" + }, + { + "id": "265760c3-6cba-4360-9797-8cf293cb3172", + "displayName": "FXENZ", + "description": "FX Enzyme", + "displayColor": "#FF0000" + }, + { + "id": "2cb7adb4-3b25-417d-af95-ee52a75ea27d", + "displayName": "LIG", + "description": "Ligation Mix", + "displayColor": "#FFA000" + }, + { + "id": "1272fe89-7b30-4dcd-af7f-be50204227f7", + "displayName": "Primer", + "description": "Primer", + "displayColor": "#FFFB00" + }, + { + "id": "d4394fca-54e0-4482-8df8-f363da968fd3", + "displayName": "PCR", + "description": "PCR Mix", + "displayColor": "#0EFF00" + }, + { + "id": "3b372f14-b824-4892-a685-747a7ced9d87", + "displayName": "Barcodes", + "description": "Barcodes", + "displayColor": "#7DFFC4" + }, + { + "id": "c087cfea-968b-4cff-a414-0ea384d8e5f0", + "displayName": "Final_Sample", + "description": "Final Sample", + "displayColor": "#82A9CF" + }, + { + "id": "2e0d394c-ca59-453b-8aa8-b366c6ade496", + "displayName": "Placeholder_Sample", + "description": "Placeholder Sample", + "displayColor": "#82A9CF" + } + ], + "errors": [] +} diff --git a/components/src/hardware-sim/ProtocolDeck/index.tsx b/components/src/hardware-sim/ProtocolDeck/index.tsx new file mode 100644 index 00000000000..8132153fc66 --- /dev/null +++ b/components/src/hardware-sim/ProtocolDeck/index.tsx @@ -0,0 +1,103 @@ +import * as React from 'react' +import { + FLEX_ROBOT_TYPE, + getLabwareDisplayName, + getSimplestDeckConfigForProtocol, +} from '@opentrons/shared-data' + +import { BaseDeck } from '../BaseDeck' +import { getStandardDeckViewLayerBlockList } from './utils' +import { getTopMostLabwareInSlots } from './utils/getLabwareInSlots' +import { getModulesInSlots } from './utils/getModulesInSlots' + +import type { + CompletedProtocolAnalysis, + ProtocolAnalysisOutput, +} from '@opentrons/shared-data' +import { LabwareInfo } from './LabwareInfo' +import { getLabwareInfoByLiquidId } from './utils/getLabwareInfoByLiquidId' +import { getWellFillFromLabwareId } from './utils/getWellFillFromLabwareId' + +export * from './utils/getStandardDeckViewLayerBlockList' + +interface ProtocolDeckProps { + protocolAnalysis: CompletedProtocolAnalysis | ProtocolAnalysisOutput | null + /** defaults to false, when set labware nicknames will appear on top level labware. If no nickname specified in protocol, falls back to labware definition display name */ + showLabwareInfo?: boolean + /** extra props to pass through to BaseDeck component */ + baseDeckProps?: Partial> +} + +export function ProtocolDeck(props: ProtocolDeckProps): JSX.Element | null { + const { protocolAnalysis, baseDeckProps, showLabwareInfo = false } = props + + if (protocolAnalysis == null || (protocolAnalysis?.errors ?? []).length > 0) + return null + + const robotType = protocolAnalysis.robotType ?? FLEX_ROBOT_TYPE + const deckConfig = getSimplestDeckConfigForProtocol(protocolAnalysis) + const labwareByLiquidId = getLabwareInfoByLiquidId(protocolAnalysis.commands) + + const modulesInSlots = getModulesInSlots(protocolAnalysis) + const modulesOnDeck = modulesInSlots.map( + ({ + moduleModel, + moduleLocation, + nestedLabwareId, + nestedLabwareDef, + nestedLabwareNickName, + }) => ({ + moduleModel, + moduleLocation, + nestedLabwareDef, + nestedLabwareWellFill: getWellFillFromLabwareId( + nestedLabwareId ?? '', + protocolAnalysis.liquids, + labwareByLiquidId + ), + moduleChildren: + showLabwareInfo && + nestedLabwareDef != null && + !(nestedLabwareDef.allowedRoles ?? []).includes('adapter') ? ( + + {nestedLabwareNickName ?? getLabwareDisplayName(nestedLabwareDef)} + + ) : null, + }) + ) + + const topMostLabwareInSlots = getTopMostLabwareInSlots(protocolAnalysis) + const labwareOnDeck = topMostLabwareInSlots.map( + ({ labwareId, labwareDef, labwareNickName, location }) => ({ + definition: labwareDef, + labwareLocation: location, + wellFill: getWellFillFromLabwareId( + labwareId, + protocolAnalysis.liquids, + labwareByLiquidId + ), + labwareChildren: showLabwareInfo ? ( + + {labwareNickName ?? getLabwareDisplayName(labwareDef)} + + ) : null, + }) + ) + + return ( + + ) +} diff --git a/components/src/hardware-sim/ProtocolDeck/types.ts b/components/src/hardware-sim/ProtocolDeck/types.ts new file mode 100644 index 00000000000..1926fa9a1c1 --- /dev/null +++ b/components/src/hardware-sim/ProtocolDeck/types.ts @@ -0,0 +1,6 @@ +export interface LabwareByLiquidId { + [liquidId: string]: Array<{ + labwareId: string + volumeByWell: { [well: string]: number } + }> +} diff --git a/components/src/hardware-sim/ProtocolDeck/utils/__tests__/getLabwareInforByLiquidId.test.ts b/components/src/hardware-sim/ProtocolDeck/utils/__tests__/getLabwareInforByLiquidId.test.ts new file mode 100644 index 00000000000..68eeb31a1d6 --- /dev/null +++ b/components/src/hardware-sim/ProtocolDeck/utils/__tests__/getLabwareInforByLiquidId.test.ts @@ -0,0 +1,157 @@ +import { RunTimeCommand } from '@opentrons/shared-data' +import { getLabwareInfoByLiquidId } from '../getLabwareInfoByLiquidId' + +const mockLoadLiquidRunTimeCommands = [ + { + id: '97ba49a5-04f6-4f91-986a-04a0eb632882', + createdAt: '2022-09-07T19:47:42.781065+00:00', + commandType: 'loadPipette', + key: '0feeecaf-3895-46d7-ab71-564601265e35', + status: 'succeeded', + params: { + pipetteName: 'p20_single_gen2', + mount: 'left', + pipetteId: '90183a18-a1df-4fd6-9636-be3bcec63fe4', + }, + result: { + pipetteId: '90183a18-a1df-4fd6-9636-be3bcec63fe4', + }, + startedAt: '2022-09-07T19:47:42.782665+00:00', + completedAt: '2022-09-07T19:47:42.785061+00:00', + }, + { + id: '846e0b7b-1e54-4f42-9ab1-964ebda45da5', + createdAt: '2022-09-07T19:47:42.781281+00:00', + commandType: 'loadLiquid', + key: '1870d1a2-8dcd-46f2-9e27-16578365913b', + status: 'succeeded', + params: { + liquidId: '1', + labwareId: 'mockLabwareId1', + volumeByWell: { + A2: 20, + B2: 20, + C2: 20, + D2: 20, + E2: 20, + F2: 20, + G2: 20, + H2: 20, + }, + }, + result: {}, + startedAt: '2022-09-07T19:47:42.785987+00:00', + completedAt: '2022-09-07T19:47:42.786087+00:00', + }, + { + id: '1e03ae10-7e9b-465c-bc72-21ab5706bfb0', + createdAt: '2022-09-07T19:47:42.781323+00:00', + commandType: 'loadLiquid', + key: '48df9766-04ff-4927-9f2d-4efdcf0b3df8', + status: 'succeeded', + params: { + liquidId: '1', + labwareId: 'mockLabwareId2', + volumeByWell: { + D3: 40, + }, + }, + result: {}, + startedAt: '2022-09-07T19:47:42.786212+00:00', + completedAt: '2022-09-07T19:47:42.786285+00:00', + }, + { + id: '1e03ae10-7e9b-465c-bc72-21ab5706bfb0', + createdAt: '2022-09-07T19:47:42.781323+00:00', + commandType: 'loadLiquid', + key: '48df9766-04ff-4927-9f2d-4efdcf0b3df8', + status: 'succeeded', + params: { + liquidId: '1', + labwareId: 'mockLabwareId2', + volumeByWell: { + A3: 33, + B3: 33, + C3: 33, + }, + }, + result: {}, + startedAt: '2022-09-07T19:47:42.786212+00:00', + completedAt: '2022-09-07T19:47:42.786285+00:00', + }, + { + id: 'e8596bb3-b650-4d62-9bb5-dfc6e9e63249', + createdAt: '2022-09-07T19:47:42.781363+00:00', + commandType: 'loadLiquid', + key: '69d19b03-fdcc-4964-a2f8-3cbb30f4ddf3', + status: 'succeeded', + params: { + liquidId: '0', + labwareId: 'mockLabwareId1', + volumeByWell: { + A1: 33, + B1: 33, + C1: 33, + D1: 33, + E1: 33, + F1: 33, + G1: 33, + H1: 33, + }, + }, + result: {}, + startedAt: '2022-09-07T19:47:42.786347+00:00', + completedAt: '2022-09-07T19:47:42.786412+00:00', + }, +] + +describe('getLabwareInfoByLiquidId', () => { + it('returns labware info by liquid id', () => { + const expected = { + '0': [ + { + labwareId: 'mockLabwareId1', + volumeByWell: { + A1: 33, + B1: 33, + C1: 33, + D1: 33, + E1: 33, + F1: 33, + G1: 33, + H1: 33, + }, + }, + ], + '1': [ + { + labwareId: 'mockLabwareId1', + volumeByWell: { + A2: 20, + B2: 20, + C2: 20, + D2: 20, + E2: 20, + F2: 20, + G2: 20, + H2: 20, + }, + }, + { + labwareId: 'mockLabwareId2', + volumeByWell: { + A3: 33, + B3: 33, + C3: 33, + D3: 40, + }, + }, + ], + } + expect( + getLabwareInfoByLiquidId( + mockLoadLiquidRunTimeCommands as RunTimeCommand[] + ) + ).toEqual(expected) + }) +}) diff --git a/components/src/hardware-sim/ProtocolDeck/utils/getInitiallyLoadedLabwareByAdapter.ts b/components/src/hardware-sim/ProtocolDeck/utils/getInitiallyLoadedLabwareByAdapter.ts new file mode 100644 index 00000000000..973c0991bf1 --- /dev/null +++ b/components/src/hardware-sim/ProtocolDeck/utils/getInitiallyLoadedLabwareByAdapter.ts @@ -0,0 +1,33 @@ +import reduce from 'lodash/reduce' +import type { + LoadLabwareRunTimeCommand, + RunTimeCommand, +} from '@opentrons/shared-data' + +export interface LoadedLabwareByAdapter { + [labwareId: string]: LoadLabwareRunTimeCommand +} +export function getInitialLoadedLabwareByAdapter( + commands: RunTimeCommand[] +): LoadedLabwareByAdapter { + const loadLabwareCommandsReversed = commands + .filter( + (command): command is LoadLabwareRunTimeCommand => + command.commandType === 'loadLabware' + ) + .reverse() + return reduce( + loadLabwareCommandsReversed, + (acc, command) => { + if ( + typeof command.params.location === 'object' && + 'labwareId' in command.params.location + ) { + return { ...acc, [command.params.location.labwareId]: command } + } else { + return acc + } + }, + {} + ) +} diff --git a/components/src/hardware-sim/ProtocolDeck/utils/getLabwareInSlots.ts b/components/src/hardware-sim/ProtocolDeck/utils/getLabwareInSlots.ts new file mode 100644 index 00000000000..b54d13561fa --- /dev/null +++ b/components/src/hardware-sim/ProtocolDeck/utils/getLabwareInSlots.ts @@ -0,0 +1,78 @@ +import { getInitialLoadedLabwareByAdapter } from './getInitiallyLoadedLabwareByAdapter' +import type { + CompletedProtocolAnalysis, + LoadLabwareRunTimeCommand, + ProtocolAnalysisOutput, + LabwareDefinition2, +} from '@opentrons/shared-data' + +interface LabwareInSlot { + labwareId: string + labwareDef: LabwareDefinition2 + labwareNickName: string | null + location: { slotName: string } +} + +export const getTopMostLabwareInSlots = ( + protocolAnalysis: CompletedProtocolAnalysis | ProtocolAnalysisOutput +): LabwareInSlot[] => { + const { commands } = protocolAnalysis + const initialLoadedLabwareByAdapter = getInitialLoadedLabwareByAdapter( + commands + ) + return commands + .filter( + (command): command is LoadLabwareRunTimeCommand => + command.commandType === 'loadLabware' + ) + .reduce((acc, command) => { + const labwareId = command.result?.labwareId + const location = command.params.location + const labwareDef = command.result?.definition + if ( + location === 'offDeck' || + 'moduleId' in location || + 'labwareId' in location + ) + return acc + if (labwareId == null) { + console.warn('expected to find labware id but could not') + return acc + } + if (labwareDef == null) { + console.warn( + `expected to find labware def for labware id ${String( + labwareId + )} but could not` + ) + return acc + } + + const slotName = + 'addressableAreaName' in location + ? location.addressableAreaName + : location.slotName + + const labwareInAdapter = initialLoadedLabwareByAdapter[labwareId] + + // NOTE: only grabbing the labware on top most layer so + // either the adapter or the labware but not both + const topLabwareDefinition = + labwareInAdapter?.result?.definition ?? labwareDef + const topLabwareId = labwareInAdapter?.result?.labwareId ?? labwareId + const topLabwareNickName = + labwareInAdapter?.params?.displayName ?? + command.params.displayName ?? + null + + return [ + ...acc, + { + labwareId: topLabwareId, + labwareDef: topLabwareDefinition, + labwareNickName: topLabwareNickName, + location: { slotName }, + }, + ] + }, []) +} diff --git a/components/src/hardware-sim/ProtocolDeck/utils/getLabwareInfoByLiquidId.ts b/components/src/hardware-sim/ProtocolDeck/utils/getLabwareInfoByLiquidId.ts new file mode 100644 index 00000000000..48a59a850dd --- /dev/null +++ b/components/src/hardware-sim/ProtocolDeck/utils/getLabwareInfoByLiquidId.ts @@ -0,0 +1,42 @@ +import reduce from 'lodash/reduce' +import type { + LoadLiquidRunTimeCommand, + RunTimeCommand, +} from '@opentrons/shared-data' +import type { LabwareByLiquidId } from '../types' + +export function getLabwareInfoByLiquidId( + commands: RunTimeCommand[] +): LabwareByLiquidId { + const loadLiquidCommands = + commands.length !== 0 + ? commands.filter( + (command): command is LoadLiquidRunTimeCommand => + command.commandType === 'loadLiquid' + ) + : [] + + return reduce( + loadLiquidCommands, + (acc, command) => { + if (!(command.params.liquidId in acc)) { + acc[command.params.liquidId] = [] + } + const labwareId = command.params.labwareId + const volumeByWell = command.params.volumeByWell + const labwareIndex = acc[command.params.liquidId].findIndex( + i => i.labwareId === labwareId + ) + if (labwareIndex >= 0) { + acc[command.params.liquidId][labwareIndex].volumeByWell = { + ...acc[command.params.liquidId][labwareIndex].volumeByWell, + ...volumeByWell, + } + } else { + acc[command.params.liquidId].push({ labwareId, volumeByWell }) + } + return acc + }, + {} + ) +} diff --git a/components/src/hardware-sim/ProtocolDeck/utils/getModulesInSlots.ts b/components/src/hardware-sim/ProtocolDeck/utils/getModulesInSlots.ts new file mode 100644 index 00000000000..0d9da4b48bd --- /dev/null +++ b/components/src/hardware-sim/ProtocolDeck/utils/getModulesInSlots.ts @@ -0,0 +1,129 @@ +import { + SPAN7_8_10_11_SLOT, + getModuleDef2, + getLoadedLabwareDefinitionsByUri, +} from '@opentrons/shared-data' +import type { + CompletedProtocolAnalysis, + LoadLabwareRunTimeCommand, + ProtocolAnalysisOutput, + LoadModuleRunTimeCommand, + RunTimeCommand, + ModuleLocation, + ModuleModel, + LabwareDefinition2, +} from '@opentrons/shared-data' +import { getInitialLoadedLabwareByAdapter } from './getInitiallyLoadedLabwareByAdapter' + +interface ModuleInSlot { + moduleModel: ModuleModel + moduleLocation: ModuleLocation + nestedLabwareId: string | null + nestedLabwareDef: LabwareDefinition2 | null + nestedLabwareNickName: string | null +} +export const getModulesInSlots = ( + protocolAnalysis: ProtocolAnalysisOutput | CompletedProtocolAnalysis +): ModuleInSlot[] => { + if (protocolAnalysis != null && 'modules' in protocolAnalysis) { + const { commands, modules, labware } = protocolAnalysis + const initialLoadedLabwareByAdapter = getInitialLoadedLabwareByAdapter( + commands + ) + return modules.reduce((acc, module) => { + const moduleDef = getModuleDef2(module.model) + const nestedLabwareId = + commands + .filter( + (command): command is LoadLabwareRunTimeCommand => + command.commandType === 'loadLabware' + ) + .find( + (command: LoadLabwareRunTimeCommand) => + typeof command.params.location === 'object' && + 'moduleId' in command.params.location && + command.params.location.moduleId === module.id + )?.result?.labwareId ?? null + const nestedLabware = labware.find( + item => nestedLabwareId != null && item.id === nestedLabwareId + ) + const labwareDefinitionsByUri = getLoadedLabwareDefinitionsByUri(commands) + const nestedLabwareDef = + nestedLabware != null + ? labwareDefinitionsByUri[nestedLabware.definitionUri] + : null + const moduleInitialLoadInfo = getModuleInitialLoadInfo( + module.id, + commands + ) + let slotName = moduleInitialLoadInfo.location.slotName + // Note: this is because PD for OT2 represents the slot the TC sits in as a made up slot. We want it to be rendered in slot 7 + if (slotName === SPAN7_8_10_11_SLOT) { + slotName = '7' + } + + const labwareInAdapterInMod = + nestedLabwareId != null + ? initialLoadedLabwareByAdapter[nestedLabwareId] + : null + // NOTE: only rendering the labware on top most layer so + // either the adapter or the labware are rendered but not both + const topLabwareDefinition = + labwareInAdapterInMod?.result?.definition ?? nestedLabwareDef + const topLabwareId = + labwareInAdapterInMod?.result?.labwareId ?? nestedLabwareId + const topLabwareDisplayName = + labwareInAdapterInMod != null + ? labwareInAdapterInMod.params.displayName?.toString() ?? null + : nestedLabware?.displayName?.toString() ?? null + return [ + ...acc, + { + moduleModel: moduleDef.model, + moduleLocation: { slotName }, + nestedLabwareId: topLabwareId, + nestedLabwareDef: topLabwareDefinition, + nestedLabwareNickName: topLabwareDisplayName, + }, + ] + }, []) + } + + return [] +} + +function getModuleInitialLoadInfo( + moduleId: string, + commands: RunTimeCommand[] +): { + location: ModuleLocation + protocolLoadOrder: number +} { + const moduleLoadIndex = commands.findIndex( + (command: RunTimeCommand): command is LoadModuleRunTimeCommand => + command.commandType === 'loadModule' && + command.result?.moduleId === moduleId + ) + + if (moduleLoadIndex === -1) { + throw new Error( + 'expected to be able to find module location, but could not' + ) + } + + const protocolLoadOrder = commands + .slice(0, moduleLoadIndex) + .reduce( + (moduleLoadCount, command) => + command.commandType === 'loadModule' + ? moduleLoadCount + 1 + : moduleLoadCount, + 0 + ) + + return { + location: (commands[moduleLoadIndex] as LoadModuleRunTimeCommand).params + .location, + protocolLoadOrder, + } +} diff --git a/app/src/molecules/DeckThumbnail/utils/getStandardDeckViewLayerBlockList.ts b/components/src/hardware-sim/ProtocolDeck/utils/getStandardDeckViewLayerBlockList.ts similarity index 100% rename from app/src/molecules/DeckThumbnail/utils/getStandardDeckViewLayerBlockList.ts rename to components/src/hardware-sim/ProtocolDeck/utils/getStandardDeckViewLayerBlockList.ts diff --git a/components/src/hardware-sim/ProtocolDeck/utils/getWellFillFromLabwareId.ts b/components/src/hardware-sim/ProtocolDeck/utils/getWellFillFromLabwareId.ts new file mode 100644 index 00000000000..fae03381681 --- /dev/null +++ b/components/src/hardware-sim/ProtocolDeck/utils/getWellFillFromLabwareId.ts @@ -0,0 +1,30 @@ +import type { Liquid } from '@opentrons/shared-data' +import type { WellFill } from '../../Labware' +import type { LabwareByLiquidId } from '../types' + +export function getWellFillFromLabwareId( + labwareId: string, + liquidsInLoadOrder: Liquid[], + labwareByLiquidId: LabwareByLiquidId +): WellFill { + let labwareWellFill: WellFill = {} + const liquidIds = Object.keys(labwareByLiquidId) + const labwareInfo = Object.values(labwareByLiquidId) + + labwareInfo.forEach((labwareArray, index) => { + labwareArray.forEach(labware => { + if (labware.labwareId === labwareId) { + const liquidId = liquidIds[index] + const liquid = liquidsInLoadOrder.find(liquid => liquid.id === liquidId) + const wellFill: { + [well: string]: string + } = {} + Object.keys(labware.volumeByWell).forEach(key => { + wellFill[key] = liquid?.displayColor ?? '' + }) + labwareWellFill = { ...labwareWellFill, ...wellFill } + } + }) + }) + return labwareWellFill +} diff --git a/components/src/hardware-sim/ProtocolDeck/utils/index.ts b/components/src/hardware-sim/ProtocolDeck/utils/index.ts new file mode 100644 index 00000000000..3f6727123ec --- /dev/null +++ b/components/src/hardware-sim/ProtocolDeck/utils/index.ts @@ -0,0 +1,2 @@ +export * from './getLabwareInSlots' +export * from './getStandardDeckViewLayerBlockList' diff --git a/components/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpace.tsx b/components/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpace.tsx new file mode 100644 index 00000000000..6a145c8bd67 --- /dev/null +++ b/components/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpace.tsx @@ -0,0 +1,27 @@ +import styled from 'styled-components' +import { animated } from '@react-spring/web' +import * as React from 'react' +import { Svg } from '../../primitives' + +interface RobotCoordinateSpaceProps extends React.ComponentProps { + animated?: boolean +} +export function RobotCoordinateSpace( + props: RobotCoordinateSpaceProps +): JSX.Element { + const { animated = false, children, ...restProps } = props + const allPassThroughProps = { + transform: 'scale(1, -1)', + ...restProps, + } + return animated ? ( + {children} + ) : ( + {children} + ) +} + +/** + * These animated components needs to be split out because react-spring and styled-components don't play nice + * @see https://github.com/pmndrs/react-spring/issues/1515 */ +const AnimatedSvg = styled(animated.svg)`` diff --git a/components/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpaceWithDOMCoords.tsx b/components/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpaceWithDOMCoords.tsx new file mode 100644 index 00000000000..5ca8396c5be --- /dev/null +++ b/components/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpaceWithDOMCoords.tsx @@ -0,0 +1,65 @@ +import * as React from 'react' +import { Svg } from '../../primitives' +import type { DeckDefinition, DeckSlot } from '@opentrons/shared-data' + +export interface RobotCoordinateSpaceWithDOMCoordsRenderProps { + deckSlotsById: { [slotId: string]: DeckSlot } + getRobotCoordsFromDOMCoords: ( + domX: number, + domY: number + ) => { x: number; y: number } +} + +interface RobotCoordinateSpaceWithDOMCoordsProps + extends React.ComponentProps { + viewBox?: string | null + deckDef?: DeckDefinition + children?: ( + props: RobotCoordinateSpaceWithDOMCoordsRenderProps + ) => React.ReactNode +} + +type GetRobotCoordsFromDOMCoords = RobotCoordinateSpaceWithDOMCoordsRenderProps['getRobotCoordsFromDOMCoords'] + +export function RobotCoordinateSpaceWithDOMCoords( + props: RobotCoordinateSpaceWithDOMCoordsProps +): JSX.Element | null { + const { children, deckDef, viewBox, ...restProps } = props + const wrapperRef = React.useRef(null) + const getRobotCoordsFromDOMCoords: GetRobotCoordsFromDOMCoords = (x, y) => { + if (wrapperRef.current == null) return { x: 0, y: 0 } + + const cursorPoint = wrapperRef.current.createSVGPoint() + + cursorPoint.x = x + cursorPoint.y = y + + return cursorPoint.matrixTransform( + wrapperRef.current.getScreenCTM()?.inverse() + ) + } + if (deckDef == null && viewBox == null) return null + + let wholeDeckViewBox + let deckSlotsById = {} + if (deckDef != null) { + const [viewBoxOriginX, viewBoxOriginY] = deckDef.cornerOffsetFromOrigin + const [deckXDimension, deckYDimension] = deckDef.dimensions + + deckSlotsById = deckDef.locations.addressableAreas.reduce( + (acc, deckSlot) => ({ ...acc, [deckSlot.id]: deckSlot }), + {} + ) + wholeDeckViewBox = `${viewBoxOriginX} ${viewBoxOriginY} ${deckXDimension} ${deckYDimension}` + } + return ( + + {children?.({ deckSlotsById, getRobotCoordsFromDOMCoords })} + + ) +} diff --git a/components/src/hardware-sim/RobotCoordinateSpace/index.ts b/components/src/hardware-sim/RobotCoordinateSpace/index.ts new file mode 100644 index 00000000000..71c518dc39a --- /dev/null +++ b/components/src/hardware-sim/RobotCoordinateSpace/index.ts @@ -0,0 +1,2 @@ +export * from './RobotCoordinateSpaceWithDOMCoords' +export * from './RobotCoordinateSpace' diff --git a/components/src/hardware-sim/RobotCoordinateSpace/index.tsx b/components/src/hardware-sim/RobotCoordinateSpace/index.tsx deleted file mode 100644 index 4ac35b2aed5..00000000000 --- a/components/src/hardware-sim/RobotCoordinateSpace/index.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import * as React from 'react' -import { Svg } from '../../primitives' - -export function RobotCoordinateSpace( - props: React.ComponentProps -): JSX.Element { - const { children, ...restProps } = props - return ( - - {children} - - ) -} diff --git a/components/src/hardware-sim/index.ts b/components/src/hardware-sim/index.ts index 51c7a438978..5ff502ef4e2 100644 --- a/components/src/hardware-sim/index.ts +++ b/components/src/hardware-sim/index.ts @@ -1,4 +1,11 @@ +export * from './BaseDeck' +export * from './BaseDeck/__fixtures__' +export * from './ProtocolDeck' +export * from './ProtocolDeck/utils' export * from './Deck' +export * from './DeckConfigurator' +export * from './DeckSlotLocation' export * from './Labware' export * from './Module' export * from './Pipette' +export * from './RobotCoordinateSpace' diff --git a/components/src/helix-design-system/colors.ts b/components/src/helix-design-system/colors.ts new file mode 100644 index 00000000000..ee67be9d588 --- /dev/null +++ b/components/src/helix-design-system/colors.ts @@ -0,0 +1,83 @@ +/** + * green + */ +export const green60 = '#03683E' +export const green50 = '#04AA65' +export const green40 = '#91E2C0' +export const green35 = '#AFEDD3' +export const green30 = '#C4F6E0' +export const green20 = '#E8F7ED' + +/** + * red + */ +export const red60 = '#941313' +export const red55 = '#C71A1B' +export const red50 = '#DE1B1B' +export const red40 = '#F5B2B3' +export const red35 = '#F8C8C9' +export const red30 = '#FAD6D6' +export const red20 = '#FCE9E9' + +/** + * yellow + */ +export const yellow60 = '#825512' +export const yellow50 = '#F09D20' +export const yellow40 = '#FCD48B' +export const yellow35 = '#FFE1A4' +export const yellow30 = '#FFE9BE' +export const yellow20 = '#FDF3E2' + +/** + * purple + */ +export const purple60 = '#562566' +export const purple55 = '#713187' +export const purple50 = '#893BA4' +export const purple40 = '#CEA4DF' +export const purple35 = '#DBBCE7' +export const purple30 = '#E6D5EC' +export const purple20 = '#F1E8F5' + +/** + * blue + */ +export const blue60 = '#004196' +export const blue55 = '#0056C8' +export const blue40 = '#A9CEFD' +export const blue35 = '#BFDCFD' +export const blue30 = '#D0E6FE' +export const blue20 = '#E1EFFF' +export const blue10 = '#F1F8FF' + +/** + * grey + */ +export const grey60 = '#4A4C4E' +export const grey55 = '#737578' +export const grey50 = '#9C9C9C' +export const grey40 = '#D0D0D0' +export const grey35 = '#CBCCCC' +export const grey30 = '#DEDEDE' +export const grey20 = '#E9E9E9' +export const grey10 = '#F8F8F8' + +/** + * core + */ +export const black90 = '#16212D' +export const black80 = '#24313F' +export const black70 = '#39495B' +export const white = '#FFFFFF' +export const blue50 = '#006CFA' + +/** + * extras + */ +export const transparent = 'transparent' +// opacity hex codes to append to 6-digit color hex codes +export const opacity20HexCode = '33' // 20% opacity +export const opacity40HexCode = '66' // 40% opacity +export const opacity60HexCode = '99' // 60% opacity +export const opacity90HexCode = 'E6' // 90% opacity diff --git a/components/src/helix-design-system/index.ts b/components/src/helix-design-system/index.ts new file mode 100644 index 00000000000..2240f640245 --- /dev/null +++ b/components/src/helix-design-system/index.ts @@ -0,0 +1 @@ +export * as COLORS from './colors' diff --git a/components/src/hooks/__tests__/useConditionalConfirm.test.tsx b/components/src/hooks/__tests__/useConditionalConfirm.test.tsx index a13581e8d3f..e507afa777c 100644 --- a/components/src/hooks/__tests__/useConditionalConfirm.test.tsx +++ b/components/src/hooks/__tests__/useConditionalConfirm.test.tsx @@ -1,172 +1,3 @@ -import * as React from 'react' -import { act } from 'react-dom/test-utils' -import { mount } from 'enzyme' -import { useConditionalConfirm } from '../useConditionalConfirm' - describe('useConditionalConfirm', () => { - let confirm: () => unknown - let showConfirmation: boolean - let cancel: () => unknown - - const TestUseConditionalConfirm = (options: any): JSX.Element => { - ;({ confirm, showConfirmation, cancel } = useConditionalConfirm( - options.handleContinue, - options.shouldBlock - )) - - return test wrapper using useConditionalConfirm - } - - afterEach(() => { - jest.resetAllMocks() - }) - - it('should initially set showConfirmation to false', () => { - const props = { - handleContinue: jest.fn(), - shouldBlock: true, - } - mount() - - expect(showConfirmation).toBe(false) - }) - - it('should NOT call handleContinue when calling cancel', () => { - const props = { - handleContinue: jest.fn(), - shouldBlock: true, - } - - mount() - - act(() => { - cancel() - }) - - expect(props.handleContinue).not.toHaveBeenCalled() - }) - - it('should set showConfirmation to false when calling cancel', () => { - const props = { - handleContinue: jest.fn(), - shouldBlock: true, - } - - mount() - - act(() => { - cancel() - }) - - expect(showConfirmation).toBe(false) - }) - - describe('when it should block the user', () => { - describe('and the user has NOT yet confirmed', () => { - it('should set showConfirmation to true after calling confirm', () => { - const props = { - handleContinue: jest.fn(), - shouldBlock: true, - } - - mount() - - expect(showConfirmation).toBe(false) - - act(() => { - confirm() - }) - - expect(showConfirmation).toBe(true) - }) - - it('should NOT call handleContinue after calling confirm', () => { - const props = { - handleContinue: jest.fn(), - shouldBlock: true, - } - - mount() - - act(() => { - confirm() - }) - - expect(props.handleContinue).not.toHaveBeenCalled() - }) - }) - - describe('and the user has confirmed', () => { - it('should call handleContinue after calling confirm', () => { - const props = { - handleContinue: jest.fn(), - shouldBlock: true, - } - - mount() - - expect(showConfirmation).toBe(false) - - act(() => { - confirm() // initial confirmation - }) - - act(() => { - confirm() // we've already confirmed, go ahead! - }) - - expect(props.handleContinue).toHaveBeenCalled() - }) - - it('should set showConfirmation to false after calling confirm', () => { - const props = { - handleContinue: jest.fn(), - shouldBlock: true, - } - - mount() - - act(() => { - confirm() // initial confirmation - }) - - act(() => { - confirm() // we've already confirmed, go ahead! - }) - - expect(showConfirmation).toBe(false) - }) - }) - }) - describe('when it should NOT block the user', () => { - it('should call handleContinue after calling confirm', () => { - const props = { - handleContinue: jest.fn(), - shouldBlock: false, - } - - mount() - - act(() => { - confirm() - }) - - expect(props.handleContinue).toHaveBeenCalled() - }) - - it('should NOT set showConfirmation to true after calling confirm', () => { - const props = { - handleContinue: jest.fn(), - shouldBlock: false, - } - - mount() - - act(() => { - confirm() - }) - - expect(showConfirmation).toBe(false) - }) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/hooks/__tests__/useDrag.test.ts b/components/src/hooks/__tests__/useDrag.test.ts index 6aaccd7bd33..d8f56926bf4 100644 --- a/components/src/hooks/__tests__/useDrag.test.ts +++ b/components/src/hooks/__tests__/useDrag.test.ts @@ -1,4 +1,4 @@ -import { renderHook } from '@testing-library/react-hooks' +import { act, renderHook } from '@testing-library/react' import { useDrag } from '../useDrag' import type { ElementPosition } from '../useDrag' @@ -29,13 +29,17 @@ describe('useDrag', () => { it('When calling enable, isEnabled true', () => { const { result } = renderHook(() => useDrag(mockPosition)) - result.current.enable() + act(() => { + result.current.enable() + }) expect(result.current.isEnabled).toBe(true) }) it('When calling disable, isEnabled false', () => { const { result } = renderHook(() => useDrag(mockPosition)) - result.current.disable() + act(() => { + result.current.disable() + }) expect(result.current.isEnabled).toBe(false) }) }) diff --git a/components/src/hooks/__tests__/useIdle.test.ts b/components/src/hooks/__tests__/useIdle.test.ts index 64cd3f3283b..09ef34dc0a1 100644 --- a/components/src/hooks/__tests__/useIdle.test.ts +++ b/components/src/hooks/__tests__/useIdle.test.ts @@ -1,4 +1,4 @@ -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { useIdle } from '../useIdle' const MOCK_EVENTS: Array = [ diff --git a/components/src/hooks/__tests__/useInterval.test.tsx b/components/src/hooks/__tests__/useInterval.test.tsx index 036683100f2..bc8626bac10 100644 --- a/components/src/hooks/__tests__/useInterval.test.tsx +++ b/components/src/hooks/__tests__/useInterval.test.tsx @@ -1,46 +1,3 @@ -import * as React from 'react' -import { mount } from 'enzyme' -import { useInterval } from '..' - describe('useInterval hook', () => { - const callback = jest.fn() - - beforeEach(() => { - jest.useFakeTimers() - }) - - afterEach(() => { - jest.resetAllMocks() - jest.clearAllTimers() - jest.useRealTimers() - }) - - const TestUseInterval = (props: { delay: number | null }): JSX.Element => { - useInterval(callback, props.delay) - return - } - - it('delay `null` results in no calls', () => { - mount() - jest.runTimersToTime(10000) - - expect(callback).toHaveBeenCalledTimes(0) - }) - - it('delay sets an interval', () => { - mount() - jest.runTimersToTime(10) - - expect(callback).toHaveBeenCalledTimes(5) - }) - - it('re-rendering with delay={null} clears the interval', () => { - const wrapper = mount() - - jest.runTimersToTime(6) - wrapper.setProps({ delay: null }) - jest.runTimersToTime(4) - - expect(callback).toHaveBeenCalledTimes(3) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/hooks/__tests__/useLongPress.test.ts b/components/src/hooks/__tests__/useLongPress.test.ts index ff58a3ba8e7..e671309d91d 100644 --- a/components/src/hooks/__tests__/useLongPress.test.ts +++ b/components/src/hooks/__tests__/useLongPress.test.ts @@ -1,4 +1,4 @@ -import { renderHook } from '@testing-library/react-hooks' +import { act, renderHook, waitFor } from '@testing-library/react' import { useLongPress } from '../useLongPress' describe('useLongPress', () => { @@ -12,13 +12,13 @@ describe('useLongPress', () => { it('when callling disable, isEnabled true', () => { const { result } = renderHook(() => useLongPress()) - result.current.enable() - expect(result.current.isEnabled).toBe(true) + act(() => result.current.enable()) + waitFor(() => expect(result.current.isEnabled).toBe(true)) }) it('when callling disable, isEnabled false', () => { const { result } = renderHook(() => useLongPress()) - result.current.disable() - expect(result.current.isEnabled).toBe(false) + act(() => result.current.disable()) + waitFor(() => expect(result.current.isEnabled).toBe(false)) }) }) diff --git a/components/src/hooks/__tests__/useMountEffect.test.tsx b/components/src/hooks/__tests__/useMountEffect.test.tsx index 0c14c2f8fca..71179291375 100644 --- a/components/src/hooks/__tests__/useMountEffect.test.tsx +++ b/components/src/hooks/__tests__/useMountEffect.test.tsx @@ -1,51 +1,3 @@ -import * as React from 'react' -import { mount } from 'enzyme' - -import { useMountEffect } from '../useMountEffect' - describe('useMountEffect hook', () => { - const TestUseMountEffect = (props: { - onMount: React.EffectCallback - }): JSX.Element => { - useMountEffect(props.onMount) - return <> - } - const render = (handleMount: () => void): ReturnType => { - return mount() - } - - it('should call mount handler on render', () => { - const handleMount = jest.fn() - - render(handleMount) - expect(handleMount).toHaveBeenCalledTimes(1) - }) - - it('should not call mount handler again on subsequent renders', () => { - const handleMount = jest.fn() - const wrapper = render(handleMount) - - wrapper.setProps({}) - expect(handleMount).toHaveBeenCalledTimes(1) - }) - - it('should not call mount handler again if handler changes', () => { - const handleMount = jest.fn() - const handleMountDifferently = jest.fn() - const wrapper = render(handleMount) - - wrapper.setProps({ onMount: handleMountDifferently }) - expect(handleMount).toHaveBeenCalledTimes(1) - expect(handleMountDifferently).toHaveBeenCalledTimes(0) - }) - - it('should run a cleanup function', () => { - const handleUnmount = jest.fn() - const handleMount = (): unknown => handleUnmount - const wrapper = render(handleMount) - - expect(handleUnmount).toHaveBeenCalledTimes(0) - wrapper.unmount() - expect(handleUnmount).toHaveBeenCalledTimes(1) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/hooks/__tests__/usePrevious.test.tsx b/components/src/hooks/__tests__/usePrevious.test.tsx index 4503306b034..92f12e38d85 100644 --- a/components/src/hooks/__tests__/usePrevious.test.tsx +++ b/components/src/hooks/__tests__/usePrevious.test.tsx @@ -1,27 +1,3 @@ -import * as React from 'react' -import { mount } from 'enzyme' -import { usePrevious } from '..' - describe('usePrevious hook', () => { - const TestUsePrevious = (props: { value: string }): JSX.Element => { - const prevValue = usePrevious(props.value) - return ( - {typeof prevValue === 'undefined' ? 'undefined' : prevValue} - ) - } - - it('initial previous value is `undefined', () => { - const wrapper = mount() - expect(wrapper.html()).toEqual('undefined') - }) - - it('saves previous values', () => { - const wrapper = mount() - wrapper.setProps({ value: 'bar' }) - expect(wrapper.html()).toEqual('foo') - wrapper.setProps({ value: 'baz' }) - expect(wrapper.html()).toEqual('bar') - wrapper.setProps({ value: 'qux' }) - expect(wrapper.html()).toEqual('baz') - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/hooks/__tests__/useScrolling.test.tsx b/components/src/hooks/__tests__/useScrolling.test.tsx index d88d7e329c0..67397621a8e 100644 --- a/components/src/hooks/__tests__/useScrolling.test.tsx +++ b/components/src/hooks/__tests__/useScrolling.test.tsx @@ -1,4 +1,4 @@ -import { renderHook, act } from '@testing-library/react-hooks' +import { renderHook, act } from '@testing-library/react' import { useScrolling } from '../' describe('useScrolling', () => { @@ -13,27 +13,27 @@ describe('useScrolling', () => { }) it('returns false when there is no scrolling', () => { - const ref = { current: document.createElement('div') } + const ref = document.createElement('div') const { result } = renderHook(() => useScrolling(ref)) expect(result.current).toBe(false) }) it('returns true when scrolling', () => { - const ref = { current: document.createElement('div') } + const ref = document.createElement('div') const { result } = renderHook(() => useScrolling(ref)) - ref.current.scrollTop = 10 + ref.scrollTop = 10 act(() => { - ref.current.dispatchEvent(new Event('scroll')) + ref.dispatchEvent(new Event('scroll')) }) expect(result.current).toBe(true) }) it('returns false after scrolling stops', () => { - const ref = { current: document.createElement('div') } + const ref = document.createElement('div') const { result } = renderHook(() => useScrolling(ref)) - ref.current.scrollTop = 10 + ref.scrollTop = 10 act(() => { - ref.current.dispatchEvent(new Event('scroll')) + ref.dispatchEvent(new Event('scroll')) }) expect(result.current).toBe(true) act(() => { diff --git a/components/src/hooks/__tests__/useSwipe.test.tsx b/components/src/hooks/__tests__/useSwipe.test.tsx index 9987b7c79b9..21f409ac714 100644 --- a/components/src/hooks/__tests__/useSwipe.test.tsx +++ b/components/src/hooks/__tests__/useSwipe.test.tsx @@ -1,4 +1,4 @@ -import { renderHook } from '@testing-library/react-hooks' +import { act, renderHook } from '@testing-library/react' import { useSwipe } from '..' describe('useSwipe hook', () => { @@ -17,7 +17,9 @@ describe('useSwipe hook', () => { it('When calling disable, isEnabled false', () => { const { result } = renderHook(() => useSwipe()) - result.current.disable() + act(() => { + result.current.disable() + }) expect(result.current.isEnabled).toBe(false) }) }) diff --git a/components/src/hooks/__tests__/useTimeout.test.tsx b/components/src/hooks/__tests__/useTimeout.test.tsx index e3258ef8b14..33c48337018 100644 --- a/components/src/hooks/__tests__/useTimeout.test.tsx +++ b/components/src/hooks/__tests__/useTimeout.test.tsx @@ -1,50 +1,3 @@ -import * as React from 'react' -import { mount } from 'enzyme' -import { useTimeout } from '..' - describe('useTimeouthook', () => { - const callback = jest.fn() - - beforeEach(() => { - jest.useFakeTimers() - }) - - afterEach(() => { - jest.resetAllMocks() - jest.clearAllTimers() - jest.useRealTimers() - }) - - const TestUseTimeout = (props: { delay: number | null }): JSX.Element => { - useTimeout(callback, props.delay) - return - } - - it('delay `null` results in no calls', () => { - mount() - jest.runTimersToTime(10000) - - expect(callback).toHaveBeenCalledTimes(0) - }) - - it('delay sets a timeout', () => { - mount() - jest.runTimersToTime(3) - - expect(callback).toHaveBeenCalledTimes(1) - }) - - it('re-rendering with delay={null} clears the interval', () => { - const wrapper = mount() - - jest.runTimersToTime(2) - wrapper.setProps({ delay: null }) - - expect(callback).toHaveBeenCalledTimes(0) - - wrapper.setProps({ delay: 4 }) - jest.runTimersToTime(6) - - expect(callback).toHaveBeenCalledTimes(1) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/hooks/__tests__/useToggle.test.tsx b/components/src/hooks/__tests__/useToggle.test.tsx index 6d0234df17c..b6ad18aa94d 100644 --- a/components/src/hooks/__tests__/useToggle.test.tsx +++ b/components/src/hooks/__tests__/useToggle.test.tsx @@ -1,42 +1,3 @@ -import * as React from 'react' -import { act } from 'react-dom/test-utils' -import { mount } from 'enzyme' - -import { useToggle } from '../useToggle' - describe('useToggle hook', () => { - let result: ReturnType - - const TestUseToggle = (props: { - initialValue: boolean | undefined - }): JSX.Element => { - result = useToggle(props.initialValue) - return <> - } - const render = (initialValue?: boolean): ReturnType => { - return mount() - } - - it('should use initialValue=false', () => { - render(false) - expect(result[0]).toBe(false) - }) - - it('should use initialValue=true', () => { - render(true) - expect(result[0]).toBe(true) - }) - - it('should default initialValue to false', () => { - render() - expect(result[0]).toBe(false) - }) - - it('should toggle', () => { - render(false) - act(() => result[1]()) - expect(result[0]).toBe(true) - act(() => result[1]()) - expect(result[0]).toBe(false) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/hooks/useScrolling.ts b/components/src/hooks/useScrolling.ts index 10924e419fe..b32e02dc523 100644 --- a/components/src/hooks/useScrolling.ts +++ b/components/src/hooks/useScrolling.ts @@ -1,36 +1,33 @@ /** * A custom hook that detects whether an HTMLElement is being scrolled. * - * @param {RefObject} ref - A ref object containing the HTMLElement to monitor for scrolling. + * @param {HTMLElement | null} node - HTMLElement to monitor for scrolling. * @returns {boolean} - A boolean indicating whether the HTMLElement is being scrolled. */ -import { useState, useEffect, RefObject } from 'react' +import { useState, useEffect, useRef } from 'react' -export function useScrolling(ref: RefObject): boolean { +export const useScrolling = (node: HTMLElement | null): boolean => { const [isScrolling, setIsScrolling] = useState(false) + const scrollTimeout = useRef(null) useEffect(() => { - let scrollTimeout: ReturnType | null = null - const currentRef = ref.current // Copy ref.current to a variable - - if (currentRef != null) { - currentRef.addEventListener('scroll', () => { - if (scrollTimeout !== null) clearTimeout(scrollTimeout) + if (node != null) { + const handleScroll = (): void => { setIsScrolling(true) - scrollTimeout = setTimeout(function () { + if (scrollTimeout.current != null) clearTimeout(scrollTimeout.current) + scrollTimeout.current = setTimeout(() => { setIsScrolling(false) - }, 100) - }) - } + }, 200) + } - return () => { - if (currentRef != null) { - currentRef.removeEventListener('scroll', e => { - setIsScrolling(false) - }) + node?.addEventListener('scroll', handleScroll) + + return () => { + if (scrollTimeout.current != null) clearTimeout(scrollTimeout.current) + node?.removeEventListener('scroll', handleScroll) } } - }, [ref]) + }, [node]) return isScrolling } diff --git a/components/src/hooks/useSelectDeckLocation/SelectDeckLocation.stories.tsx b/components/src/hooks/useSelectDeckLocation/SelectDeckLocation.stories.tsx index e93640e3f5b..df387095f0b 100644 --- a/components/src/hooks/useSelectDeckLocation/SelectDeckLocation.stories.tsx +++ b/components/src/hooks/useSelectDeckLocation/SelectDeckLocation.stories.tsx @@ -3,9 +3,11 @@ import { DeckLocationSelect as DeckLocationSelectComponent } from './' import { FLEX_ROBOT_TYPE, getDeckDefFromRobotType, + OT2_ROBOT_TYPE, } from '@opentrons/shared-data' import type { Meta, StoryObj } from '@storybook/react' +import type { RobotType } from '@opentrons/shared-data' const meta: Meta> = { component: DeckLocationSelectComponent, @@ -13,23 +15,37 @@ const meta: Meta> = { } as Meta export default meta -type Story = StoryObj<{ disabledSlotNames: string[] }> +type Story = StoryObj<{ disabledSlotNames: string[]; robotType: RobotType }> -export const DeckLocationSelect: Story = { +export const FlexDeckLocationSelect: Story = { render: args => { return }, args: { disabledSlotNames: ['A2'], + robotType: FLEX_ROBOT_TYPE, }, } -function Wrapper(props: { disabledSlotNames: string[] }): JSX.Element { +export const OT2DeckLocationSelect: Story = { + render: args => { + return + }, + args: { + disabledSlotNames: ['2'], + robotType: OT2_ROBOT_TYPE, + }, +} + +function Wrapper(props: { + disabledSlotNames: string[] + robotType: RobotType +}): JSX.Element { const [selectedLocation, setSelectedLocation] = React.useState({ - slotName: 'A1', + slotName: props.robotType === FLEX_ROBOT_TYPE ? 'A1' : '1', }) - const deckDef = getDeckDefFromRobotType(FLEX_ROBOT_TYPE) + const deckDef = getDeckDefFromRobotType(props.robotType) return ( ({ - slotName: deckDef.locations.orderedSlots[0].id, + slotName: deckDef.locations.addressableAreas[0].id, }) return { DeckLocationSelect: ( ), selectedLocation, @@ -35,68 +78,259 @@ export function useDeckLocationSelect( interface DeckLocationSelectProps { deckDef: DeckDefinition selectedLocation: ModuleLocation - setSelectedLocation: (loc: ModuleLocation) => void - disabledLocations?: ModuleLocation[] + theme?: DeckLocationSelectThemes + setSelectedLocation?: (loc: ModuleLocation) => void + availableSlotNames?: string[] + occupiedCutouts?: CutoutConfig[] + isThermocycler?: boolean + showTooltipOnDisabled?: boolean } + export function DeckLocationSelect({ deckDef, selectedLocation, setSelectedLocation, - disabledLocations = [], + availableSlotNames, + occupiedCutouts = [], + theme = 'default', + isThermocycler = false, + showTooltipOnDisabled = false, }: DeckLocationSelectProps): JSX.Element { + const robotType = deckDef.robot.model + + const { t } = useTranslation('module_wizard_flows') + + const [hoveredData, setHoveredData] = React.useState<{ + slot: AddressableArea + slotPosition: CoordinateTuple | null + isDisabled: boolean + disabledReason?: CutoutFixtureId | null + } | null>(null) + + const handleMouseEnter = ( + slot: AddressableArea, + slotPosition: CoordinateTuple | null, + isDisabled: boolean, + disabledReason?: CutoutFixtureId | null + ): void => { + if (isDisabled) { + setHoveredData({ + slot: slot, + slotPosition: slotPosition, + isDisabled: isDisabled, + disabledReason: disabledReason, + }) + } else { + setHoveredData(null) + } + } + + const handleMouseLeave = (): void => { + setHoveredData(null) + } + return ( - {deckDef.locations.orderedSlots.map(slot => { - const slotLocation = { slotName: slot.id } - const isDisabled = disabledLocations.some( - l => - typeof l === 'object' && 'slotName' in l && l.slotName === slot.id + {deckDef.locations.addressableAreas + // only render standard slot fixture components + .filter( + addressableArea => + isAddressableAreaStandardSlot(addressableArea.id, deckDef) || + // special case the OT-2 trash addressable area + addressableArea.id === 'fixedTrash' ) - const isSelected = isEqual(selectedLocation, slotLocation) - let fill = COLORS.highlightPurple2 - if (isSelected) fill = COLORS.highlightPurple1 - if (isDisabled) fill = COLORS.darkGreyDisabled - return ( - - !isDisabled && setSelectedLocation(slotLocation)} - cursor={isDisabled || isSelected ? 'default' : 'pointer'} - deckDefinition={deckDef} - /> - {isSelected ? ( - - - - Selected - - - ) : null} - - ) - })} - + .map(slot => { + const slotLocation = { slotName: slot.id } + const isDisabled = + availableSlotNames !== undefined + ? !availableSlotNames.some(slotName => slotName === slot.id) + : false + + const disabledReason = + occupiedCutouts.find( + cutout => + FLEX_SINGLE_SLOT_BY_CUTOUT_ID[cutout.cutoutId] === slot.id + )?.cutoutFixtureId ?? null + const isSelected = isEqual(selectedLocation, slotLocation) + let fill = theme === 'default' ? COLORS.purple35 : COLORS.grey35 + if (isSelected) + fill = theme === 'default' ? COLORS.purple50 : COLORS.grey50 + if (isDisabled) fill = COLORS.grey30 + if (isSelected && slot.id === 'B1' && isThermocycler) { + return ( + + + + + + Selected + + + + ) + } else if (slot.id === 'A1' && isThermocycler) { + return null + } + + const slotPosition = getPositionFromSlotId(slot.id, deckDef) + const cutoutId = FLEX_CUTOUT_BY_SLOT_ID[slot.id] + + return ( + + {robotType === FLEX_ROBOT_TYPE ? ( + <> + + !isDisabled && + setSelectedLocation != null && + setSelectedLocation(slotLocation) + } + cursor={ + setSelectedLocation == null || isDisabled || isSelected + ? 'default' + : 'pointer' + } + deckDefinition={deckDef} + onMouseEnter={() => + handleMouseEnter( + slot, + slotPosition, + isDisabled, + disabledReason + ) + } + onMouseLeave={handleMouseLeave} + /> + + ) : ( + + !isDisabled && + setSelectedLocation != null && + setSelectedLocation(slotLocation) + } + cursor={ + setSelectedLocation == null || isDisabled || isSelected + ? 'default' + : 'pointer' + } + /> + )} + {isSelected && slotPosition != null ? ( + + + Selected + + + ) : null} + + ) + })} + {robotType === OT2_ROBOT_TYPE ? ( + + ) : null} + + {hoveredData != null && + hoveredData.isDisabled && + hoveredData.slotPosition != null && + showTooltipOnDisabled && ( + + + {hoveredData.disabledReason != null + ? t('location_occupied', { + fixture: getFixtureDisplayName( + hoveredData.disabledReason + ).toLowerCase(), + }) + : 'Slot unavailable'} + + + )} ) } + +const INNER_DIV_PROPS = { + display: 'flex', + alignItems: ALIGN_CENTER, + justifyContent: JUSTIFY_CENTER, + height: '100%', + gridGap: SPACING.spacing4, +} diff --git a/components/src/icons/IconList.stories.tsx b/components/src/icons/IconList.stories.tsx index 7e4b3bda085..d92aca2c8e2 100644 --- a/components/src/icons/IconList.stories.tsx +++ b/components/src/icons/IconList.stories.tsx @@ -81,8 +81,8 @@ const Template: Story> = args => { onClick={() => handleCopy(name, index)} border={ selectedIcon === name - ? `2px solid ${COLORS.blueEnabled}` - : `2px solid ${COLORS.darkBlackEnabled}` + ? `2px solid ${COLORS.blue50}` + : `2px solid ${COLORS.black90}` } > @@ -94,9 +94,7 @@ const Template: Story> = args => { {name} - {showText ? ( - {'copied'} - ) : null} + {showText ? {'copied'} : null} ))} @@ -105,5 +103,5 @@ const Template: Story> = args => { } export const IconList = Template.bind({}) IconList.args = { - backgroundColor: COLORS.blueEnabled, + backgroundColor: COLORS.blue50, } diff --git a/components/src/icons/icon-data.ts b/components/src/icons/icon-data.ts index 17786af0323..c805a8bbfba 100644 --- a/components/src/icons/icon-data.ts +++ b/components/src/icons/icon-data.ts @@ -1,5 +1,10 @@ // icon data export const ICON_DATA_BY_NAME = { + add: { + path: + 'M24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48ZM21 21V12H27V21H36V27H27V36H21V27H12V21H21Z', + viewBox: '0 0 48 48', + }, alert: { path: 'M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z', viewBox: '0 0 24 24', @@ -232,7 +237,7 @@ export const ICON_DATA_BY_NAME = { 'M15.07,11.25L14.17,12.17C13.45,12.89 13,13.5 13,15H11V14.5C11,13.39 11.45,12.39 12.17,11.67L13.41,10.41C13.78,10.05 14,9.55 14,9C14,7.89 13.1,7 12,7A2,2 0 0,0 10,9H8A4,4 0 0,1 12,5A4,4 0 0,1 16,9C16,9.88 15.64,10.67 15.07,11.25M13,19H11V17H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z', viewBox: '0 0 24 24', }, - 'home-gantry': { + 'reset-position': { path: 'M14.4004 3.59998H33.6004V27.6H30V36H18V27.6H14.4004V3.59998ZM26.3996 43.2V36H21.5996V43.2H26.3996Z', viewBox: '0 0 48 48', @@ -607,6 +612,11 @@ export const ICON_DATA_BY_NAME = { 'M121.9,31.3L129,4.6l56.7,56.7l-77.5,20.8c0,0,7.7-28.6,7.7-28.6c-5.7-1.8-11.7-2.7-17.9-2.7 c-33.5,0-60.8,27.3-60.8,60.8c0,33.5,27.3,60.8,60.8,60.8c26.5,0,50.5-17.7,58.1-43.1l22,6.7c-5.1,16.8-15.7,32-29.8,42.6 c-14.6,11-32,16.8-50.3,16.8c-46.2,0-83.8-37.6-83.8-83.8S51.8,27.9,98,27.9C106.1,27.9,114.1,29.1,121.9,31.3', viewBox: '0 0 200 200', }, + remove: { + path: + 'M24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48ZM13.3936 17.636L17.6362 13.3934L24.0005 19.7574L30.3643 13.3934L34.6069 17.636L28.2432 24L34.6069 30.364L30.3643 34.6066L24 28.2427L17.6362 34.6066L13.3936 30.364L19.7578 24L13.3936 17.636Z', + viewBox: '0 0 48 48', + }, reset: { path: 'M36.6693 15.9009V9.05406C36.6693 7.97886 36.2421 6.9477 35.4819 6.18741C34.7216 5.42713 33.6904 5.00001 32.6152 5.00001H7.39C6.85728 4.99882 6.32957 5.10287 5.83718 5.30619C5.34478 5.5095 4.89739 5.80808 4.5207 6.18477C4.14401 6.56146 3.84544 7.00884 3.64212 7.50124C3.43881 7.99364 3.33476 8.52134 3.33595 9.05406V31.5766C3.33476 32.1093 3.43881 32.637 3.64212 33.1294C3.84544 33.6218 4.14401 34.0692 4.5207 34.4459C4.89739 34.8226 5.34478 35.1211 5.83718 35.3244C6.32957 35.5278 6.85728 35.6318 7.39 35.6306H32.6152C33.6904 35.6306 34.7216 35.2035 35.4819 34.4432C36.2421 33.6829 36.6693 32.6518 36.6693 31.5766V21.2162C36.6693 20.7383 36.4794 20.2801 36.1415 19.9422C35.8036 19.6042 35.3453 19.4144 34.8675 19.4144H23.9125L27.2098 15.3604L25.6693 13.4685L19.7413 20.7658L25.6693 27.973L27.2098 26.0811L23.9125 22.1171H33.9666V30.2252H6.03865V10.4054H33.9666V15.9009H36.6693Z', diff --git a/components/src/index.ts b/components/src/index.ts index 48d718aad19..7fe4930699e 100644 --- a/components/src/index.ts +++ b/components/src/index.ts @@ -1,6 +1,5 @@ // opentrons components library -export * from './constants' export * from './hooks' export * from './utils' @@ -28,6 +27,11 @@ export * from './tooltips' export * from './styles' // new ui-overhaul style vars export * from './ui-style-constants' +// helix design system +export * from './helix-design-system' + +// helix design system +export * from './helix-design-system' // Pure Types export * from './robot-types' diff --git a/components/src/instrument/InstrumentDiagram.tsx b/components/src/instrument/InstrumentDiagram.tsx index b0b682c57fd..3a610d46f57 100644 --- a/components/src/instrument/InstrumentDiagram.tsx +++ b/components/src/instrument/InstrumentDiagram.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import { FlattenSimpleInterpolation } from 'styled-components' -import { Box } from '..' +import { Flex } from '../primitives' +import { ALIGN_CENTER, JUSTIFY_CENTER } from '../styles' import singleSrc from '@opentrons/components/src/instrument/single_channel_GEN1_800px.png' import multiSrc from '@opentrons/components/src/instrument/multi-channel_GEN1_800px.png' import singleGEN2Src from '@opentrons/components/src/instrument/single-channel_GEN2_800px.png' @@ -40,13 +41,19 @@ export function InstrumentDiagram(props: InstrumentDiagramProps): JSX.Element { } } return ( - - - + + ) } diff --git a/components/src/instrument/InstrumentGroup.tsx b/components/src/instrument/InstrumentGroup.tsx index b9cb8f3479b..424065ca2d5 100644 --- a/components/src/instrument/InstrumentGroup.tsx +++ b/components/src/instrument/InstrumentGroup.tsx @@ -29,7 +29,9 @@ export function InstrumentGroup(props: InstrumentGroupProps): JSX.Element { return (
    - + {leftProps.pipetteSpecs?.channels === 96 ? null : ( + + )}
    ) } diff --git a/components/src/instrument/InstrumentInfo.tsx b/components/src/instrument/InstrumentInfo.tsx index 82726a9fa6d..306a21c0571 100644 --- a/components/src/instrument/InstrumentInfo.tsx +++ b/components/src/instrument/InstrumentInfo.tsx @@ -33,6 +33,7 @@ export interface InstrumentInfoProps { } export function InstrumentInfo(props: InstrumentInfoProps): JSX.Element { + const has96Channel = props.pipetteSpecs?.channels === 96 return ( {props.mount === RIGHT && props.pipetteSpecs && ( @@ -42,15 +43,21 @@ export function InstrumentInfo(props: InstrumentInfoProps): JSX.Element { mount={props.mount} /> )} + {props.tiprackModel && ( )} + {props.children} {props.mount === LEFT && props.pipetteSpecs && ( { enableNoneOption, id, nameBlocklist = [], + disabled = false, } = props const allowlist = ({ value }: SelectOption): boolean => { return !nameBlocklist.some(n => n === value) @@ -89,6 +91,7 @@ export const PipetteSelect = (props: PipetteSelectProps): JSX.Element => { className={className} options={groupedOptions} value={value} + isDisabled={disabled} defaultValue={defaultValue} tabIndex={tabIndex as number} id={id} @@ -139,7 +142,9 @@ const PipetteNameItem = (props: PipetteNameSpecs): JSX.Element => { >
    {volumeClass}
    {displayChannels}
    -
    {displayCategory}
    +
    + {channels === 96 ? 'FLEX' : displayCategory} +
    ) } diff --git a/components/src/instrument/__tests__/PipetteSelect.test.tsx b/components/src/instrument/__tests__/PipetteSelect.test.tsx index 90a94192261..d6bf72e00a6 100644 --- a/components/src/instrument/__tests__/PipetteSelect.test.tsx +++ b/components/src/instrument/__tests__/PipetteSelect.test.tsx @@ -1,155 +1,3 @@ -import * as React from 'react' -import { shallow } from 'enzyme' - -import { - getAllPipetteNames, - getPipetteNameSpecs, - GEN1, - GEN2, - OT3_PIPETTES, - FLEX, -} from '@opentrons/shared-data' -import { PipetteSelect } from '../PipetteSelect' -import { Select } from '../../forms' - -import type { PipetteNameSpecs } from '@opentrons/shared-data' - describe('PipetteSelect', () => { - it('renders a Select', () => { - const wrapper = shallow() - - expect(wrapper.find(Select)).toHaveLength(1) - }) - - it('passes props to Select', () => { - const tabIndex = '3' - const className = 'class' - - const selectWrapper = shallow( - - ).find(Select) - - expect(selectWrapper.props()).toMatchObject({ - tabIndex, - isSearchable: false, - menuPosition: 'fixed', - className: expect.stringContaining('class'), - }) - }) - - it('passes pipettes as grouped options to Select', () => { - const wrapper = shallow() - const pipetteSpecs: PipetteNameSpecs[] = getAllPipetteNames( - 'maxVolume', - 'channels' - ) - .map(getPipetteNameSpecs) - .filter((specs): specs is PipetteNameSpecs => specs !== null) - - const flexSpecs = pipetteSpecs.filter(s => s.displayCategory === FLEX) - const gen2Specs = pipetteSpecs.filter(s => s.displayCategory === GEN2) - const gen1Specs = pipetteSpecs.filter(s => s.displayCategory === GEN1) - - expect(wrapper.find(Select).prop('options')).toEqual([ - { - options: flexSpecs.map(s => ({ value: s.name, label: s.displayName })), - }, - { - options: gen2Specs.map(s => ({ value: s.name, label: s.displayName })), - }, - { - options: gen1Specs.map(s => ({ value: s.name, label: s.displayName })), - }, - ]) - }) - - it('can omit pipettes by name', () => { - const pipetteSpecs: PipetteNameSpecs[] = getAllPipetteNames( - 'maxVolume', - 'channels' - ) - .map(getPipetteNameSpecs) - .filter((specs): specs is PipetteNameSpecs => specs !== null) - - const gen2Specs = pipetteSpecs.filter(s => s.displayCategory === GEN2) - const nameBlocklist = pipetteSpecs - .filter(s => s.displayCategory !== GEN2) - .map(s => s.name) - - const wrapper = shallow( - - ) - - expect(wrapper.find(Select).prop('options')).toEqual([ - { - options: gen2Specs.map(s => ({ value: s.name, label: s.displayName })), - }, - ]) - }) - - it('excludes the flex pipette options', () => { - const pipetteSpecs: PipetteNameSpecs[] = getAllPipetteNames( - 'maxVolume', - 'channels' - ) - .map(getPipetteNameSpecs) - .filter((specs): specs is PipetteNameSpecs => specs !== null) - - const gen1Specs = pipetteSpecs.filter( - s => s.displayCategory === GEN1 && s.name !== 'p1000_96' - ) - const gen2Specs = pipetteSpecs.filter(s => s.displayCategory === GEN2) - - const nameBlocklist = OT3_PIPETTES - const wrapper = shallow( - - ) - - expect(wrapper.find(Select).prop('options')).toEqual([ - { - options: gen2Specs.map(s => ({ value: s.name, label: s.displayName })), - }, - { - options: gen1Specs.map(s => ({ value: s.name, label: s.displayName })), - }, - ]) - }) - - it('maps pipetteName prop to Select value', () => { - const pipetteName = 'p300_single_gen2' - const pipetteSpecs = getPipetteNameSpecs(pipetteName) - const expectedOption = { - value: pipetteName, - label: pipetteSpecs?.displayName, - } - - const wrapper = shallow( - - ) - - expect(wrapper.find(Select).prop('value')).toEqual(expectedOption) - }) - - it('allows "None" as an option', () => { - const expectedNone = { value: '', label: 'None' } - const selectWrapper = shallow( - - ).find(Select) - - expect(selectWrapper.prop('defaultValue')).toEqual(expectedNone) - expect(selectWrapper.prop('options')).toContainEqual(expectedNone) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/interaction-enhancers/__tests__/useHover.test.tsx b/components/src/interaction-enhancers/__tests__/useHover.test.tsx index c6d25012a48..7d485af6b3c 100644 --- a/components/src/interaction-enhancers/__tests__/useHover.test.tsx +++ b/components/src/interaction-enhancers/__tests__/useHover.test.tsx @@ -1,147 +1,3 @@ -import * as React from 'react' -import { act } from 'react-dom/test-utils' -import { mount } from 'enzyme' - -import { useHover } from '../useHover' -import type { UseHoverOptions, UseHoverResult } from '../useHover' - -const TARGET_SELECTOR = '[title="target"]' - describe('useHover hook', () => { - let result: UseHoverResult - - const TestUseHover = (options: UseHoverOptions): JSX.Element => { - result = useHover(options) - return
    - } - - const render = (options?: UseHoverOptions): ReturnType => { - return mount() - } - - afterEach(() => { - jest.clearAllTimers() - jest.useRealTimers() - }) - - it('returns not hovered by default', () => { - render() - const [hovered] = result - expect(hovered).toBe(false) - }) - - it('sets hovered on component mouse enter', () => { - const wrapper = render() - const target = wrapper.find(TARGET_SELECTOR) - - act(() => { - target.simulate('pointerEnter') - }) - - expect(result[0]).toBe(true) - }) - - it('unsets hovered on component mouse leave', () => { - const wrapper = render() - const target = wrapper.find(TARGET_SELECTOR) - - act(() => { - target.simulate('pointerEnter') - }) - - act(() => { - target.simulate('pointerLeave') - }) - - expect(result[0]).toBe(false) - }) - - it('can take an enter delay option', () => { - jest.useFakeTimers() - - const wrapper = render({ enterDelay: 42 }) - const target = wrapper.find(TARGET_SELECTOR) - - act(() => { - target.simulate('pointerEnter') - }) - - expect(result[0]).toBe(false) - - act(() => { - jest.advanceTimersByTime(42) - }) - - expect(result[0]).toBe(true) - }) - - it('cancels enter delay on leave', () => { - jest.useFakeTimers() - - const wrapper = render({ enterDelay: 42 }) - const target = wrapper.find(TARGET_SELECTOR) - - act(() => { - target.simulate('pointerEnter') - target.simulate('pointerLeave') - jest.advanceTimersByTime(42) - }) - - expect(result[0]).toBe(false) - }) - - it('can take a leave delay option', () => { - jest.useFakeTimers() - - const wrapper = render({ leaveDelay: 42 }) - const target = wrapper.find(TARGET_SELECTOR) - - act(() => { - target.simulate('pointerEnter') - target.simulate('pointerLeave') - }) - - expect(result[0]).toBe(true) - - act(() => { - jest.advanceTimersByTime(42) - }) - - expect(result[0]).toBe(false) - }) - - it('cancels a leave delay on enter', () => { - jest.useFakeTimers() - - const wrapper = render({ leaveDelay: 42 }) - const target = wrapper.find(TARGET_SELECTOR) - - act(() => { - target.simulate('pointerEnter') - target.simulate('pointerLeave') - target.simulate('pointerEnter') - jest.advanceTimersByTime(42) - }) - - act(() => { - jest.advanceTimersByTime(42) - }) - - expect(result[0]).toBe(true) - }) - - it('cleans up its timeouts', () => { - jest.useFakeTimers() - - const wrapper = render({ enterDelay: 42 }) - const target = wrapper.find(TARGET_SELECTOR) - - act(() => { - target.simulate('pointerEnter') - wrapper.unmount() - jest.advanceTimersByTime(0) - }) - - expect(jest.getTimerCount()).toBe(0) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/interaction-enhancers/useHover.ts b/components/src/interaction-enhancers/useHover.ts index ffdf9228d0a..6c303dd4ccb 100644 --- a/components/src/interaction-enhancers/useHover.ts +++ b/components/src/interaction-enhancers/useHover.ts @@ -40,20 +40,23 @@ export function useHover(options: UseHoverOptions = {}): UseHoverResult { const [hovered, setHovered] = useState(false) const timeoutRef = useRef() - const handleHoverChange = useCallback((value, delay) => { - clearTimeout(timeoutRef.current) - if (delay) { - timeoutRef.current = setTimeout( - // TODO(mc, 2021-03-08): use window.setTimeout or a separate const - // for the handler to tell TS that we're using DOM setTimeout, not Node.js - // eslint-disable-next-line @typescript-eslint/no-implied-eval - (() => setHovered(value)) as TimerHandler, - delay - ) - } else { - setHovered(value) - } - }, []) + const handleHoverChange = useCallback( + (value: boolean, delay: number | undefined) => { + clearTimeout(timeoutRef.current) + if (delay) { + timeoutRef.current = setTimeout( + // TODO(mc, 2021-03-08): use window.setTimeout or a separate const + // for the handler to tell TS that we're using DOM setTimeout, not Node.js + // eslint-disable-next-line @typescript-eslint/no-implied-eval + (() => setHovered(value)) as TimerHandler, + delay + ) + } else { + setHovered(value) + } + }, + [] + ) const handlers = useMemo( () => ({ diff --git a/components/src/legacy-hardware-sim/Labware.css b/components/src/legacy-hardware-sim/Labware.css deleted file mode 100644 index a5a3c3db224..00000000000 --- a/components/src/legacy-hardware-sim/Labware.css +++ /dev/null @@ -1,23 +0,0 @@ -@import '..'; - -.fallback_plate_text { - height: 100%; - width: 100%; - font-size: var(--fs-body-1); - font-style: italic; - color: gray; - display: flex; - flex-direction: column; - justify-content: space-around; - align-items: center; -} - -.labware_outline { - fill: var(--c-white); - stroke: var(--c-black); -} - -.tiprack_outline { - fill: var(--c-plate-bg); - stroke: var(--c-charcoal); -} \ No newline at end of file diff --git a/components/src/legacy-hardware-sim/LabwareNameOverlay.tsx b/components/src/legacy-hardware-sim/LabwareNameOverlay.tsx index d199e118dcb..72ffa5ab43f 100644 --- a/components/src/legacy-hardware-sim/LabwareNameOverlay.tsx +++ b/components/src/legacy-hardware-sim/LabwareNameOverlay.tsx @@ -8,6 +8,7 @@ export interface LabwareNameOverlayProps { className?: string } +/** @deprecated use LabwareDisplayName or custom RobotCoordsForeignDiv */ export function LabwareNameOverlay( props: LabwareNameOverlayProps ): JSX.Element { diff --git a/components/src/legacy-hardware-sim/LegacyLabware.tsx b/components/src/legacy-hardware-sim/LegacyLabware.tsx deleted file mode 100644 index b7c253a6b80..00000000000 --- a/components/src/legacy-hardware-sim/LegacyLabware.tsx +++ /dev/null @@ -1,286 +0,0 @@ -// TODO(mc, 2020-02-19): still used but deprecated; remove when able -import * as React from 'react' -import map from 'lodash/map' -import assert from 'assert' -import cx from 'classnames' -import { - SLOT_RENDER_WIDTH, - SLOT_RENDER_HEIGHT, - getLabwareV1Def as getLabware, - wellIsRect, -} from '@opentrons/shared-data' -import type { LabwareDefinition1, WellDefinition } from '@opentrons/shared-data' -import { SELECTABLE_WELL_CLASS } from '../constants' - -import labwareStyles from './Labware.css' -import wellStyles from './Well.css' - -import { LabwareOutline, RobotCoordsForeignDiv } from '../hardware-sim' - -export interface LabwareProps { - /** labware type, to get legacy definition from shared-data */ - labwareType?: string - definition?: LabwareDefinition1 | null | undefined -} - -/** - * This is a legacy component that is only responsible - * for visualizing a labware schema v1 definition by def or loadName - * - * @deprecated Use {@link LabwareRender instead} - */ -export class LegacyLabware extends React.Component { - render(): JSX.Element { - const { labwareType, definition } = this.props - - const labwareDefinition = - definition || (labwareType ? getLabware(labwareType) : null) - - if (!labwareDefinition) { - return - } - - const tipVolume = - labwareDefinition.metadata && labwareDefinition.metadata.tipVolume - - const isTiprack = - labwareDefinition.metadata && labwareDefinition.metadata.isTiprack - - return ( - - - {map(labwareDefinition.wells, (wellDef, wellName) => { - assert( - wellDef, - `No well definition for labware ${ - labwareType || 'unknown labware' - }, well ${wellName}` - ) - // NOTE x + 1, y + 3 HACK offset from old getWellDefsForSVG has been purposefully - // left out here; it's intention was to make the well viz offset less "off" - return isTiprack ? ( - - ) : ( - - ) - })} - - ) - } -} - -// TODO: BC 2019-06-18 remove when old Labware component is no longer used anywhere -/** - * @deprecated No longer necessary, do not use - */ -export function FallbackLabware(): JSX.Element { - return ( - - - -

    Custom Labware

    -
    -
    - ) -} - -export interface TipProps { - wellDef: WellDefinition - tipVolume: number | null | undefined - empty?: boolean | null | undefined - highlighted?: boolean | null | undefined -} - -/** - * @deprecated No longer necessary, do not use - */ -export function Tip(props: TipProps): JSX.Element { - const { wellDef, empty, highlighted, tipVolume } = props - const circleProps = { - cx: wellDef.x, - cy: wellDef.y, - } - - // TODO: Ian 2018-08-13 refine tip sizes for different tip racks - let outerRadius = 3 - let innerRadius = 2 - - if (typeof tipVolume === 'number' && tipVolume > 20) { - outerRadius = 3.5 - innerRadius = 2.5 - } - - if (empty) { - return ( - - ) - } - - const outerCircleClassName = highlighted - ? wellStyles.highlighted - : wellStyles.tip_border - - return ( - - {/* Fill contents */} - - {/* Outer circle */} - - {/* Inner circle */} - - - ) -} - -export interface SingleWell { - wellName: string - highlighted?: boolean | null | undefined // highlighted is the same as hovered - selected?: boolean | null - error?: boolean | null - maxVolume?: number - fillColor?: string | null -} - -export interface WellProps extends SingleWell { - selectable?: boolean - wellDef: WellDefinition - onMouseOver?: React.MouseEventHandler - onMouseLeave?: React.MouseEventHandler - onMouseMove?: React.MouseEventHandler -} - -/** - * @deprecated No longer necessary, do not use - */ -export class Well extends React.Component { - shouldComponentUpdate(nextProps: WellProps): boolean { - return ( - this.props.highlighted !== nextProps.highlighted || - this.props.selected !== nextProps.selected || - this.props.fillColor !== nextProps.fillColor - ) - } - - render(): JSX.Element | null { - const { - wellName, - selectable, - highlighted, - selected, - error, - wellDef, - onMouseOver, - onMouseLeave, - onMouseMove, - } = this.props - - const fillColor = this.props.fillColor || 'transparent' - - const wellOverlayClassname = cx(wellStyles.well_border, { - [SELECTABLE_WELL_CLASS]: selectable, - [wellStyles.selected]: selected, - [wellStyles.selected_overlay]: selected, - [wellStyles.highlighted]: highlighted, - [wellStyles.error]: error, - }) - - const selectionProps = { - 'data-wellname': wellName, - onMouseOver, - onMouseLeave, - onMouseMove, - } - - const isRect = wellIsRect(wellDef) - const isCircle = !isRect - - if (isRect) { - const rectProps = { - x: wellDef.x, - y: wellDef.y, - width: wellDef.width, - height: wellDef.length, - } - - return ( - - {/* Fill contents */} - - {/* Border + overlay */} - - - ) - } - - if (isCircle) { - const circleProps = { - cx: wellDef.x, - cy: wellDef.y, - r: (wellDef.diameter || 0) / 2, - } - - return ( - - {/* Fill contents */} - - {/* Border + overlay */} - - - ) - } - - console.warn( - 'Invalid well: neither rectangle or circle: ' + JSON.stringify(wellDef) - ) - return null - } -} diff --git a/components/src/legacy-hardware-sim/ModuleViz.css b/components/src/legacy-hardware-sim/ModuleViz.css deleted file mode 100644 index 27d8941b018..00000000000 --- a/components/src/legacy-hardware-sim/ModuleViz.css +++ /dev/null @@ -1,19 +0,0 @@ -@import '..'; - -.module_viz { - rx: 6; - stroke: var(--c-plate-bg); - stroke-width: 1; - fill: var(--c-lightest-gray); -} - -.module_slot_area { - fill: transparent; - stroke: var(--c-plate-bg); - stroke-width: 2; - stroke-dasharray: 8 4; -} - -.module_slot_text { - fill: var(--c-plate-bg); -} diff --git a/components/src/legacy-hardware-sim/ModuleViz.tsx b/components/src/legacy-hardware-sim/ModuleViz.tsx deleted file mode 100644 index 5bf4f71d383..00000000000 --- a/components/src/legacy-hardware-sim/ModuleViz.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import * as React from 'react' -import styles from './ModuleViz.css' -import { getModuleVizDims, ModuleType } from '@opentrons/shared-data' - -interface Props { - x: number - y: number - orientation: 'left' | 'right' - moduleType: ModuleType -} - -export const ModuleViz = (props: Props): JSX.Element => { - const moduleType = props.moduleType - const { - xOffset, - yOffset, - xDimension, - yDimension, - childXOffset, - childYOffset, - childXDimension, - childYDimension, - } = getModuleVizDims(props.orientation, moduleType) - - return ( - - - - - ) -} diff --git a/components/src/legacy-hardware-sim/Well.css b/components/src/legacy-hardware-sim/Well.css deleted file mode 100644 index 9ab048b0a6a..00000000000 --- a/components/src/legacy-hardware-sim/Well.css +++ /dev/null @@ -1,48 +0,0 @@ -@import '@opentrons/components'; - -/* Well fill contents, the "bottom layer" */ - -.well_fill { - fill: currentColor; -} - -/* Styles for border + overlay, the "top layer" */ - -.well_border { - stroke-width: 0.4; - stroke: var(--c-black); - fill: transparent; -} - -.selected { - stroke-width: 1; - stroke: var(--c-highlight); - fill: color-mod(var(--c-highlight) alpha(20%)); -} - -.highlighted { - stroke-width: 1; - stroke: var(--c-highlight); - fill: transparent; -} - -.error { - stroke-width: 1; - stroke: var(--c-red); -} - -/* Tip-specific */ - -.tip_border { - stroke-width: 0.6; - stroke: var(--c-near-black); - fill: transparent; -} - -.empty_tip { - fill: color-mod(var(--c-charcoal) alpha(40%)); -} - -.tip_fill { - fill: var(--c-white); -} \ No newline at end of file diff --git a/components/src/legacy-hardware-sim/constants.ts b/components/src/legacy-hardware-sim/constants.ts deleted file mode 100644 index 0510e32e210..00000000000 --- a/components/src/legacy-hardware-sim/constants.ts +++ /dev/null @@ -1,15 +0,0 @@ -// @deprecated TODO: remove final usage of this in PD and replace with deck definition accessor -export const sortedSlotnames = [ - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - '10', - '11', - '12', -] diff --git a/components/src/legacy-hardware-sim/index.ts b/components/src/legacy-hardware-sim/index.ts index 61ff1079b09..0f915451971 100644 --- a/components/src/legacy-hardware-sim/index.ts +++ b/components/src/legacy-hardware-sim/index.ts @@ -1,5 +1,2 @@ -export * from './constants' export * from './LabwareNameOverlay' -export * from './ModuleViz' // legacy PD module rendering export * from './ModuleItem' // legacy App module rendering -export * from './LegacyLabware' diff --git a/components/src/modals/BaseModal.tsx b/components/src/modals/BaseModal.tsx index 6e309b45484..65fb9eacf58 100644 --- a/components/src/modals/BaseModal.tsx +++ b/components/src/modals/BaseModal.tsx @@ -2,9 +2,10 @@ import * as React from 'react' import * as Styles from '../styles' import { Box, Flex } from '../primitives' -import { COLORS, SPACING } from '../ui-style-constants' -import type { StyleProps } from '../primitives' +import { SPACING } from '../ui-style-constants' +import { COLORS } from '../helix-design-system' import { POSITION_FIXED } from '../styles' +import type { StyleProps } from '../primitives' const BASE_STYLE = { position: Styles.POSITION_ABSOLUTE, @@ -73,7 +74,7 @@ export interface BaseModalProps extends StyleProps { */ export function BaseModal(props: BaseModalProps): JSX.Element { const { - overlayColor = COLORS.backgroundOverlay, + overlayColor = `${COLORS.black90}${COLORS.opacity40HexCode}`, onOutsideClick, zIndex = 10, header, diff --git a/components/src/modals/ModalShell.tsx b/components/src/modals/ModalShell.tsx index 0eb80cfa074..6488db16b24 100644 --- a/components/src/modals/ModalShell.tsx +++ b/components/src/modals/ModalShell.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import styled from 'styled-components' -import { BORDERS, COLORS, RESPONSIVENESS, SPACING } from '../ui-style-constants' +import { BORDERS, RESPONSIVENESS, SPACING } from '../ui-style-constants' +import { COLORS } from '../helix-design-system' import { StyleProps, styleProps } from '../primitives' import { POSITION_FIXED, @@ -77,11 +78,11 @@ const Overlay = styled.div` top: 0; bottom: 0; z-index: 1; - background-color: ${COLORS.backgroundOverlay}; + background-color: ${COLORS.black90}${COLORS.opacity40HexCode}; cursor: default; @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { - background-color: ${COLORS.darkBlack60}; + background-color: ${COLORS.grey50}; } ` const ContentArea = styled.div<{ zIndex: string | number }>` diff --git a/components/src/modals/__tests__/BaseModal.test.tsx b/components/src/modals/__tests__/BaseModal.test.tsx index 7cb9bd05a77..a18dd46683f 100644 --- a/components/src/modals/__tests__/BaseModal.test.tsx +++ b/components/src/modals/__tests__/BaseModal.test.tsx @@ -1,116 +1,3 @@ -import * as React from 'react' -import { shallow } from 'enzyme' - -import { OVERLAY_BLACK_90, C_WHITE, C_LIGHT_GRAY } from '../../styles' - -import { Box, Flex, Text, Btn } from '../../primitives' -import { SPACING } from '../../ui-style-constants' -import { BaseModal } from '../BaseModal' - describe('BaseModal', () => { - it('should take up the whole parent', () => { - const wrapper = shallow() - const box = wrapper.find(Flex).at(1) - - expect({ ...box.props() }).toMatchObject({ - position: 'absolute', - top: 0, - right: 0, - bottom: 0, - left: 0, - width: '100%', - height: '100%', - alignItems: 'center', - justifyContent: 'center', - padding: `${SPACING.spacing16}, ${SPACING.spacing24}`, - }) - }) - - it('should have an overlay background that can be overridden', () => { - const wrapper = shallow() - const box = wrapper.find(Flex).first() - - expect(box.prop('backgroundColor')).toBe('#16212d59') - - wrapper.setProps({ overlayColor: OVERLAY_BLACK_90 }) - expect(wrapper.find(Flex).first().prop('backgroundColor')).toBe( - OVERLAY_BLACK_90 - ) - }) - - it('should have a zIndex that can be overridden', () => { - const wrapper = shallow() - const box = wrapper.find(Flex).at(1) - - expect(box.prop('zIndex')).toBe(10) - - wrapper.setProps({ zIndex: 5 }) - expect(wrapper.find(Flex).at(1).prop('zIndex')).toBe(5) - }) - - it('should have a white content box', () => { - const wrapper = shallow() - const modal = wrapper.find(Flex).at(1) - const content = modal.children(Box).first() - - expect({ ...content.props() }).toMatchObject({ - position: 'relative', - backgroundColor: C_WHITE, - maxHeight: '100%', - width: '100%', - overflowY: 'auto', - }) - }) - - it('should apply style props to content box', () => { - const wrapper = shallow() - const modal = wrapper.find(Flex).at(1) - const content = modal.children(Box).first() - - expect(content.prop('maxWidth')).toBe('32rem') - }) - - it('should render a header bar if props.header is passed', () => { - const header = Modal title - const wrapper = shallow() - const icon = wrapper.find(Text) - const headerBar = icon.closest(Box) - - expect({ ...headerBar.props() }).toMatchObject({ - backgroundColor: C_LIGHT_GRAY, - padding: '1rem', - position: 'sticky', - top: 0, - }) - }) - - it('should render a footer bar if props.footer is passed', () => { - const footer = button in the footer - const wrapper = shallow() - const text = wrapper.find(Btn) - const footerBar = text.closest(Box) - - expect({ ...footerBar.props() }).toMatchObject({ - backgroundColor: C_WHITE, - padding: '1rem', - position: 'sticky', - bottom: 0, - }) - }) - - it('should render children in a padded box', () => { - const wrapper = shallow( - - Hey there - - ) - const text = wrapper.find('[data-test="content"]') - const contentWrapper = text.closest(Box) - - expect({ ...contentWrapper.props() }).toMatchObject({ - paddingTop: '1rem', - paddingX: '1.5rem', - paddingBottom: '1.5rem', - }) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/molecules/LocationIcon/__tests__/LocationIcon.test.tsx b/components/src/molecules/LocationIcon/__tests__/LocationIcon.test.tsx index 47f659d841d..62ad919e747 100644 --- a/components/src/molecules/LocationIcon/__tests__/LocationIcon.test.tsx +++ b/components/src/molecules/LocationIcon/__tests__/LocationIcon.test.tsx @@ -1,7 +1,8 @@ import * as React from 'react' import { renderWithProviders } from '../../../testing/utils' -import { BORDERS, COLORS, SPACING } from '../../../ui-style-constants' +import { BORDERS, SPACING } from '../../../ui-style-constants' +import { COLORS } from '../../../helix-design-system' import { LocationIcon } from '..' @@ -21,10 +22,10 @@ describe('LocationIcon', () => { it('should render the proper styles', () => { const [{ getByTestId }] = render(props) const locationIcon = getByTestId('LocationIcon_A1') - expect(locationIcon).toHaveStyle(`padding: ${SPACING.spacing2} 0.375rem`) + expect(locationIcon).toHaveStyle(`padding: ${SPACING.spacing4} 0.375rem`) expect(locationIcon).toHaveStyle('height: 2rem') expect(locationIcon).toHaveStyle('width: max-content') - expect(locationIcon).toHaveStyle(`border: 2px solid ${COLORS.darkBlack100}`) + expect(locationIcon).toHaveStyle(`border: 2px solid ${COLORS.black90}`) expect(locationIcon).toHaveStyle( `border-radius: ${BORDERS.borderRadiusSize3}` ) diff --git a/components/src/molecules/LocationIcon/index.tsx b/components/src/molecules/LocationIcon/index.tsx index 42dc1e71632..f2279600fe2 100644 --- a/components/src/molecules/LocationIcon/index.tsx +++ b/components/src/molecules/LocationIcon/index.tsx @@ -4,13 +4,8 @@ import { css } from 'styled-components' import { Icon } from '../../icons' import { Flex, Text } from '../../primitives' import { ALIGN_CENTER } from '../../styles' -import { - BORDERS, - COLORS, - RESPONSIVENESS, - SPACING, - TYPOGRAPHY, -} from '../../ui-style-constants' +import { BORDERS, SPACING, TYPOGRAPHY } from '../../ui-style-constants' +import { COLORS } from '../../helix-design-system' import type { IconName } from '../../icons' import type { StyleProps } from '../../primitives' @@ -37,22 +32,16 @@ const LOCATION_ICON_STYLE = css<{ width?: string }>` align-items: ${ALIGN_CENTER}; - border: 2px solid ${props => props.color ?? COLORS.darkBlack100}; + border: 2px solid ${props => props.color ?? COLORS.black90}; border-radius: ${BORDERS.borderRadiusSize3}; height: ${props => props.height ?? SPACING.spacing32}; - padding: ${SPACING.spacing2} 0.375rem; width: ${props => props.width ?? 'max-content'}; - @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { - padding: ${SPACING.spacing4} - ${props => (props.slotName != null ? SPACING.spacing8 : SPACING.spacing6)}; - } + padding: ${SPACING.spacing4} + ${props => (props.slotName != null ? SPACING.spacing8 : SPACING.spacing6)}; ` const SLOT_NAME_TEXT_STYLE = css` - ${TYPOGRAPHY.pSemiBold} - @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { - ${TYPOGRAPHY.smallBodyTextBold} - } + ${TYPOGRAPHY.smallBodyTextBold} ` export function LocationIcon({ @@ -75,7 +64,7 @@ export function LocationIcon({ ) : ( diff --git a/components/src/molecules/RoundTab.tsx b/components/src/molecules/RoundTab.tsx index 613253cdb39..71c83e5a390 100644 --- a/components/src/molecules/RoundTab.tsx +++ b/components/src/molecules/RoundTab.tsx @@ -1,77 +1,60 @@ import * as React from 'react' import { css } from 'styled-components' -import { TYPOGRAPHY, BORDERS, SPACING, COLORS } from '../ui-style-constants' -import { - POSITION_RELATIVE, - POSITION_ABSOLUTE, - DISPLAY_BLOCK, - SIZE_1, -} from '../styles' +import { TYPOGRAPHY, BORDERS, SPACING } from '../ui-style-constants' +import { COLORS } from '../helix-design-system' +import { POSITION_RELATIVE } from '../styles' import { Btn } from '../primitives' const defaultTabStyle = css` ${TYPOGRAPHY.pSemiBold} - border-radius: ${BORDERS.radiusSoftCorners} ${BORDERS.radiusSoftCorners} 0 0; - border-top: ${BORDERS.transparentLineBorder}; - border-left: ${BORDERS.transparentLineBorder}; - border-right: ${BORDERS.transparentLineBorder}; + color: ${COLORS.black90}; + background-color: ${COLORS.purple30}; + border: 0px ${BORDERS.styleSolid} ${COLORS.purple30}; + border-radius: ${BORDERS.borderRadiusSize2}; padding: ${SPACING.spacing8} ${SPACING.spacing16}; position: ${POSITION_RELATIVE}; -` - -const inactiveTabStyle = css` - color: ${COLORS.darkGreyEnabled}; &:hover { - color: ${COLORS.darkGreyEnabled}; - background-color: ${COLORS.fundamentalsBackgroundShade}; + background-color: ${COLORS.purple35}; + } + + &:focus-visible { + outline: 2px ${BORDERS.styleSolid} ${COLORS.yellow50}; } ` const currentTabStyle = css` - ${TYPOGRAPHY.pSemiBold} - background-color: ${COLORS.white}; - border-top: ${BORDERS.lineBorder}; - border-left: ${BORDERS.lineBorder}; - border-right: ${BORDERS.lineBorder}; - color: ${COLORS.blueEnabled}; + ${defaultTabStyle} + color: ${COLORS.white}; + background-color: ${COLORS.purple50}; - /* extend below the tab when active to flow into the content */ - &:after { - position: ${POSITION_ABSOLUTE}; - display: ${DISPLAY_BLOCK}; - content: ''; - background-color: ${COLORS.white}; - top: 100; - left: 0; - height: ${SIZE_1}; - width: 100%; + &:hover { + background-color: ${COLORS.purple55}; } ` +const disabledTabStyle = css` + ${defaultTabStyle} + background-color: ${COLORS.grey30}; + color: ${COLORS.grey40}; +` + interface RoundTabProps extends React.ComponentProps { isCurrent: boolean + disabled?: boolean } export function RoundTab({ isCurrent, children, + disabled = false, ...restProps }: RoundTabProps): JSX.Element { + let tabStyle = defaultTabStyle + if (disabled) tabStyle = disabledTabStyle + else if (isCurrent) tabStyle = currentTabStyle + return ( - + {children} ) diff --git a/components/src/primitives/Btn.tsx b/components/src/primitives/Btn.tsx index f3b827f9a71..de67621eead 100644 --- a/components/src/primitives/Btn.tsx +++ b/components/src/primitives/Btn.tsx @@ -66,7 +66,7 @@ export const Btn: BtnComponent = styled.button * * @component */ -export const PrimaryBtn: BtnComponent = styled(Btn)` +export const PrimaryBtn = styled(Btn)` ${BUTTON_VARIANT_STYLE} background-color: ${Styles.C_DARK_GRAY}; color: ${Styles.C_WHITE}; @@ -96,7 +96,7 @@ export const PrimaryBtn: BtnComponent = styled(Btn)` * * @component */ -export const SecondaryBtn: BtnComponent = styled(Btn)` +export const SecondaryBtn = styled(Btn)` ${BUTTON_VARIANT_STYLE} background-color: ${Styles.C_WHITE}; border-width: ${Styles.BORDER_WIDTH_DEFAULT}; @@ -125,7 +125,7 @@ export const SecondaryBtn: BtnComponent = styled(Btn)` * * @component */ -export const NewPrimaryBtn: BtnComponent = styled(PrimaryBtn)` +export const NewPrimaryBtn = styled(PrimaryBtn)` background-color: ${Styles.C_BLUE}; color: ${Styles.C_WHITE}; @@ -155,7 +155,7 @@ export const NewPrimaryBtn: BtnComponent = styled(PrimaryBtn)` * * @component */ -export const NewSecondaryBtn: BtnComponent = styled(SecondaryBtn)` +export const NewSecondaryBtn = styled(SecondaryBtn)` background-color: ${Styles.C_WHITE}; color: ${Styles.C_BLUE}; @@ -190,7 +190,7 @@ export const NewSecondaryBtn: BtnComponent = styled(SecondaryBtn)` * * @component */ -export const NewAlertPrimaryBtn: BtnComponent = styled(NewPrimaryBtn)` +export const NewAlertPrimaryBtn = styled(NewPrimaryBtn)` background-color: ${Styles.C_ERROR_DARK}; &:hover, @@ -210,7 +210,7 @@ export const NewAlertPrimaryBtn: BtnComponent = styled(NewPrimaryBtn)` * * @component */ -export const NewAlertSecondaryBtn: BtnComponent = styled(NewSecondaryBtn)` +export const NewAlertSecondaryBtn = styled(NewSecondaryBtn)` color: ${Styles.C_ERROR_DARK}; &:hover, @@ -230,7 +230,7 @@ export const NewAlertSecondaryBtn: BtnComponent = styled(NewSecondaryBtn)` * * @component */ -export const LightSecondaryBtn: BtnComponent = styled(SecondaryBtn)` +export const LightSecondaryBtn = styled(SecondaryBtn)` background-color: ${Styles.C_TRANSPARENT}; color: ${Styles.C_WHITE}; @@ -257,6 +257,6 @@ export const LightSecondaryBtn: BtnComponent = styled(SecondaryBtn)` * * @component */ -export const TertiaryBtn: BtnComponent = styled(LightSecondaryBtn)` +export const TertiaryBtn = styled(LightSecondaryBtn)` border-width: 0; ` diff --git a/components/src/primitives/__tests__/Box.test.tsx b/components/src/primitives/__tests__/Box.test.tsx index 8dfb9c96f50..52274f1d25d 100644 --- a/components/src/primitives/__tests__/Box.test.tsx +++ b/components/src/primitives/__tests__/Box.test.tsx @@ -1,21 +1,3 @@ -import * as React from 'react' -import { shallow } from 'enzyme' - -import { Box } from '..' - describe('Box primitive component', () => { - it('should be a div with min-width: 0', () => { - const wrapper = shallow() - expect(wrapper.exists('div')).toBe(true) - expect(wrapper).toHaveStyleRule('min-width', '0') - }) - - it('should render children', () => { - const wrapper = shallow( - - - - ) - expect(wrapper.exists('[data-test="child"]')).toBe(true) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/components/src/primitives/__tests__/Btn.test.tsx b/components/src/primitives/__tests__/Btn.test.tsx index 0a83933b044..8d2c71afe3f 100644 --- a/components/src/primitives/__tests__/Btn.test.tsx +++ b/components/src/primitives/__tests__/Btn.test.tsx @@ -1,382 +1,3 @@ -import * as React from 'react' -import { shallow } from 'enzyme' - -import { - Btn, - PrimaryBtn, - SecondaryBtn, - NewPrimaryBtn, - NewSecondaryBtn, - NewAlertSecondaryBtn, - NewAlertPrimaryBtn, - LightSecondaryBtn, - TertiaryBtn, - BUTTON_TYPE_SUBMIT, - BUTTON_TYPE_RESET, -} from '..' - describe('Btn primitive component', () => { - it('should be an
    )) - const { getByText } = render({ + render({ dimensions: mockDimensions, displayName: 'mock Magnetic Block', }) - getByText('mock Magnetic Block') - getByText('rectangle with width 5 and height 16') + screen.getByText('mock Magnetic Block') + screen.getByText('rectangle with width 5 and height 16') }) it('renders the flex module tag for heater-shaker', () => { when(mockRobotCoordsForeignDiv) .calledWith( partialComponentPropsMatcher({ width: 5, - height: 16, + height: 20, }) ) .mockImplementation(({ children }) => ( @@ -56,11 +57,11 @@ describe('FlexModuleTag', () => { {`rectangle with width 5 and height 16`} {children}
    )) - const { getByText } = render({ + render({ dimensions: mockDimensions, displayName: 'mock Heater-shaker', }) - getByText('mock Heater-shaker') - getByText('rectangle with width 5 and height 16') + screen.getByText('mock Heater-shaker') + screen.getByText('rectangle with width 5 and height 16') }) }) diff --git a/protocol-designer/src/components/DeckSetup/__tests__/Ot2ModuleTag.test.tsx b/protocol-designer/src/components/DeckSetup/__tests__/Ot2ModuleTag.test.tsx index da5ebee3eda..a87d824672b 100644 --- a/protocol-designer/src/components/DeckSetup/__tests__/Ot2ModuleTag.test.tsx +++ b/protocol-designer/src/components/DeckSetup/__tests__/Ot2ModuleTag.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { screen } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { Ot2ModuleTag } from '../Ot2ModuleTag' import type { ModuleDimensions } from '@opentrons/shared-data' @@ -13,27 +14,27 @@ const mockDimensions: ModuleDimensions = { describe('Ot2ModuleTag', () => { it('renders module tag for left magnetic module', () => { - const { getByText } = render({ + render({ dimensions: mockDimensions, orientation: 'left', model: 'magneticModuleV1', }) - getByText('Magnetic Module GEN1') + screen.getByText('Magnetic Module GEN1') }) it('renders module tag for right heater-shaker', () => { - const { getByText } = render({ + render({ dimensions: mockDimensions, orientation: 'right', model: 'heaterShakerModuleV1', }) - getByText('Heater-Shaker Module GEN1') + screen.getByText('Heater-Shaker Module GEN1') }) it('renders module tag for thermocycler', () => { - const { getByText } = render({ + render({ dimensions: mockDimensions, orientation: 'left', model: 'thermocyclerModuleV1', }) - getByText('Thermocycler Module GEN1') + screen.getByText('Thermocycler Module GEN1') }) }) diff --git a/protocol-designer/src/components/DeckSetup/constants.ts b/protocol-designer/src/components/DeckSetup/constants.ts new file mode 100644 index 00000000000..2037126b253 --- /dev/null +++ b/protocol-designer/src/components/DeckSetup/constants.ts @@ -0,0 +1,4 @@ +export const VIEWBOX_MIN_X = -64 +export const VIEWBOX_MIN_Y = -10 +export const VIEWBOX_WIDTH = 520 +export const VIEWBOX_HEIGHT = 414 diff --git a/protocol-designer/src/components/DeckSetup/index.tsx b/protocol-designer/src/components/DeckSetup/index.tsx index 0fedc9daec9..8044c838050 100644 --- a/protocol-designer/src/components/DeckSetup/index.tsx +++ b/protocol-designer/src/components/DeckSetup/index.tsx @@ -3,49 +3,47 @@ import { useDispatch, useSelector } from 'react-redux' import compact from 'lodash/compact' import values from 'lodash/values' import { - RobotCoordsText, - RobotWorkSpace, - useOnClickOutside, - FONT_SIZE_BODY_1, - FONT_WEIGHT_BOLD, - TEXT_TRANSFORM_UPPERCASE, - RobotWorkSpaceRenderProps, - Module, COLORS, + DeckFromLayers, + FlexTrash, + Module, + RobotCoordinateSpaceWithDOMCoords, + RobotWorkSpaceRenderProps, + SingleSlotFixture, + StagingAreaFixture, + StagingAreaLocation, + TrashCutoutId, + useOnClickOutside, + WasteChuteFixture, + WasteChuteStagingAreaFixture, } from '@opentrons/components' import { + AdditionalEquipmentEntity, MODULES_WITH_COLLISION_ISSUES, ModuleTemporalProperties, } from '@opentrons/step-generation' import { - getLabwareHasQuirk, - inferModuleOrientationFromSlot, - GEN_ONE_MULTI_PIPETTES, - DeckSlot as DeckDefSlot, - ModuleType, + FLEX_ROBOT_TYPE, + getAddressableAreaFromSlotId, getDeckDefFromRobotType, - OT2_ROBOT_TYPE, + getLabwareHasQuirk, getModuleDef2, + getModuleDisplayName, + getPositionFromSlotId, + inferModuleOrientationFromSlot, inferModuleOrientationFromXCoordinate, + isAddressableAreaStandardSlot, + OT2_ROBOT_TYPE, + STAGING_AREA_CUTOUTS, THERMOCYCLER_MODULE_TYPE, - getModuleDisplayName, - DeckDefinition, - RobotType, - FLEX_ROBOT_TYPE, + TRASH_BIN_ADAPTER_FIXTURE, + WASTE_CHUTE_CUTOUT, } from '@opentrons/shared-data' -import { getDeckDefinitions } from '@opentrons/components/src/hardware-sim/Deck/getDeckDefinitions' -import { PSEUDO_DECK_SLOTS } from '../../constants' -import { i18n } from '../../localization' -import { - getLabwareIsCompatible, - getLabwareIsCustom, -} from '../../utils/labwareModuleCompatibility' -import { - selectors as labwareDefSelectors, - LabwareDefByDefURI, -} from '../../labware-defs' +import { SPAN7_8_10_11_SLOT } from '../../constants' +import { selectors as labwareDefSelectors } from '../../labware-defs' import { selectors as featureFlagSelectors } from '../../feature-flags' +import { getStagingAreaAddressableAreas } from '../../utils' import { getSlotIdsBlockedBySpanning, getSlotIsEmpty, @@ -71,6 +69,16 @@ import { import { FlexModuleTag } from './FlexModuleTag' import { Ot2ModuleTag } from './Ot2ModuleTag' import { SlotLabels } from './SlotLabels' +import { getHasGen1MultiChannelPipette, getSwapBlocked } from './utils' + +import type { + AddressableAreaName, + CutoutFixture, + CutoutId, + DeckDefinition, + RobotType, +} from '@opentrons/shared-data' + import styles from './DeckSetup.css' export const DECK_LAYER_BLOCKLIST = [ @@ -83,78 +91,40 @@ export const DECK_LAYER_BLOCKLIST = [ 'screwHoles', ] -type ContentsProps = RobotWorkSpaceRenderProps & { +const OT2_STANDARD_DECK_VIEW_LAYER_BLOCK_LIST: string[] = [ + 'calibrationMarkings', + 'fixedBase', + 'doorStops', + 'metalFrame', + 'removalHandle', + 'removableDeckOutline', + 'screwHoles', +] + +interface ContentsProps { + getRobotCoordsFromDOMCoords: RobotWorkSpaceRenderProps['getRobotCoordsFromDOMCoords'] activeDeckSetup: InitialDeckSetup selectedTerminalItemId?: TerminalItemId | null showGen1MultichannelCollisionWarnings: boolean deckDef: DeckDefinition robotType: RobotType + stagingAreaCutoutIds: CutoutId[] + trashSlot: string | null } -export const VIEWBOX_MIN_X = -64 -export const VIEWBOX_MIN_Y = -10 -export const VIEWBOX_WIDTH = 520 -export const VIEWBOX_HEIGHT = 414 -const FLEX_TRASH_SLOT = 'A3' -const OT2_VIEWBOX = `${VIEWBOX_MIN_X} ${VIEWBOX_MIN_Y} ${VIEWBOX_WIDTH} ${VIEWBOX_HEIGHT}` -const FLEX_VIEWBOX = '-144.31 -76.59 750 580' - -export interface SwapBlockedArgs { - hoveredLabware?: LabwareOnDeckType | null - draggedLabware?: LabwareOnDeckType | null - modulesById: InitialDeckSetup['modules'] - customLabwareDefs: LabwareDefByDefURI -} - -export const getSwapBlocked = (args: SwapBlockedArgs): boolean => { - const { - hoveredLabware, - draggedLabware, - modulesById, - customLabwareDefs, - } = args - if (!hoveredLabware || !draggedLabware) { - return false - } - - const sourceModuleType: ModuleType | null = - modulesById[draggedLabware.slot]?.type || null - const destModuleType: ModuleType | null = - modulesById[hoveredLabware.slot]?.type || null - - const draggedLabwareIsCustom = getLabwareIsCustom( - customLabwareDefs, - draggedLabware - ) - const hoveredLabwareIsCustom = getLabwareIsCustom( - customLabwareDefs, - hoveredLabware - ) - - // dragging custom labware to module gives not compat error - const labwareSourceToDestBlocked = sourceModuleType - ? !getLabwareIsCompatible(hoveredLabware.def, sourceModuleType) && - !hoveredLabwareIsCustom - : false - const labwareDestToSourceBlocked = destModuleType - ? !getLabwareIsCompatible(draggedLabware.def, destModuleType) && - !draggedLabwareIsCustom - : false - - return labwareSourceToDestBlocked || labwareDestToSourceBlocked -} +const lightFill = COLORS.grey35 +const darkFill = COLORS.grey60 export const DeckSetupContents = (props: ContentsProps): JSX.Element => { const { activeDeckSetup, - deckSlotsById, getRobotCoordsFromDOMCoords, showGen1MultichannelCollisionWarnings, deckDef, robotType, + trashSlot, + stagingAreaCutoutIds, } = props - const trashSlot = robotType === FLEX_ROBOT_TYPE ? FLEX_TRASH_SLOT : '12' - // NOTE: handling module<>labware compat when moving labware to empty module // is handled by SlotControls. // But when swapping labware when at least one is on a module, we need to be aware @@ -185,9 +155,6 @@ export const DeckSetupContents = (props: ContentsProps): JSX.Element => { ) const slotIdsBlockedBySpanning = getSlotIdsBlockedBySpanning(activeDeckSetup) - const deckSlots: DeckDefSlot[] = values(deckSlotsById) - // modules can be on the deck, including pseudo-slots (eg special 'spanning' slot for thermocycler position) - const moduleParentSlots = [...deckSlots, ...values(PSEUDO_DECK_SLOTS)] const allLabware: LabwareOnDeckType[] = Object.keys( activeDeckSetup.labware @@ -201,24 +168,22 @@ export const DeckSetupContents = (props: ContentsProps): JSX.Element => { const allModules: ModuleOnDeck[] = values(activeDeckSetup.modules) // NOTE: naively hard-coded to show warning north of slots 1 or 3 when occupied by any module - const multichannelWarningSlots: DeckDefSlot[] = showGen1MultichannelCollisionWarnings + const multichannelWarningSlotIds: AddressableAreaName[] = showGen1MultichannelCollisionWarnings ? compact([ - (allModules.some( + allModules.some( moduleOnDeck => moduleOnDeck.slot === '1' && - // @ts-expect-error(sa, 2021-6-21): ModuleModel is a super type of the elements in MODULES_WITH_COLLISION_ISSUES MODULES_WITH_COLLISION_ISSUES.includes(moduleOnDeck.model) - ) && - deckSlotsById?.['4']) || - null, - (allModules.some( + ) + ? deckDef.locations.addressableAreas.find(s => s.id === '4')?.id + : null, + allModules.some( moduleOnDeck => moduleOnDeck.slot === '3' && - // @ts-expect-error(sa, 2021-6-21): ModuleModel is a super type of the elements in MODULES_WITH_COLLISION_ISSUES MODULES_WITH_COLLISION_ISSUES.includes(moduleOnDeck.model) - ) && - deckSlotsById?.['6']) || - null, + ) + ? deckDef.locations.addressableAreas.find(s => s.id === '6')?.id + : null, ]) : [] @@ -226,13 +191,12 @@ export const DeckSetupContents = (props: ContentsProps): JSX.Element => { <> {/* all modules */} {allModules.map(moduleOnDeck => { - const slot = moduleParentSlots.find( - slot => slot.id === moduleOnDeck.slot - ) - if (slot == null) { - console.warn( - `no slot ${moduleOnDeck.slot} for module ${moduleOnDeck.id}` - ) + const slotId = + moduleOnDeck.slot === SPAN7_8_10_11_SLOT ? '7' : moduleOnDeck.slot + + const slotPosition = getPositionFromSlotId(slotId, deckDef) + if (slotPosition == null) { + console.warn(`no slot ${slotId} for module ${moduleOnDeck.id}`) return null } const moduleDef = getModuleDef2(moduleOnDeck.model) @@ -270,17 +234,10 @@ export const DeckSetupContents = (props: ContentsProps): JSX.Element => { const shouldHideChildren = moduleOnDeck.moduleState.type === THERMOCYCLER_MODULE_TYPE && moduleOnDeck.moduleState.lidOpen === false - const labwareInterfaceSlotDef: DeckDefSlot = { - displayName: `Labware interface on ${moduleOnDeck.model}`, - id: moduleOnDeck.id, - position: [0, 0, 0], // Module Component already handles nested positioning - matingSurfaceUnitVector: [-1, 1, -1], - boundingBox: { - xDimension: moduleDef.dimensions.labwareInterfaceXDimension ?? 0, - yDimension: moduleDef.dimensions.labwareInterfaceYDimension ?? 0, - zDimension: 0, - }, - compatibleModules: [THERMOCYCLER_MODULE_TYPE], + const labwareInterfaceBoundingBox = { + xDimension: moduleDef.dimensions.labwareInterfaceXDimension ?? 0, + yDimension: moduleDef.dimensions.labwareInterfaceYDimension ?? 0, + zDimension: 0, } const moduleOrientation = inferModuleOrientationFromSlot( @@ -291,15 +248,13 @@ export const DeckSetupContents = (props: ContentsProps): JSX.Element => { labwareLoadedOnModule?.def.metadata.displayCategory === 'adapter' return ( {labwareLoadedOnModule != null && !shouldHideChildren ? ( @@ -310,19 +265,20 @@ export const DeckSetupContents = (props: ContentsProps): JSX.Element => { labwareOnDeck={labwareLoadedOnModule} /> {isAdapter ? ( - // @ts-expect-error + // @ts-expect-error ) : ( { {labwareLoadedOnModule == null && !shouldHideChildren && !isAdapter ? ( - // @ts-expect-error (ce, 2021-06-21) once we upgrade to the react-dnd hooks api, and use react-redux hooks, typing this will be easier + // @ts-expect-error ) : null} {robotType === FLEX_ROBOT_TYPE ? ( @@ -366,37 +324,52 @@ export const DeckSetupContents = (props: ContentsProps): JSX.Element => { })} {/* on-deck warnings */} - {multichannelWarningSlots.map(slot => ( - - ))} - - {/* SlotControls for all empty deck + module slots */} - {deckSlots - .filter( - slot => - !slotIdsBlockedBySpanning.includes(slot.id) && - getSlotIsEmpty(activeDeckSetup, slot.id) && - // todo(jr, 7/13/23): filtering out trash slot for now, remove this - // when we start to support moving the trash location - slot.id !== trashSlot - ) - .map(slot => { + {multichannelWarningSlotIds.map(slotId => { + const slotPosition = getPositionFromSlotId(slotId, deckDef) + const slotBoundingBox = getAddressableAreaFromSlotId(slotId, deckDef) + ?.boundingBox + return slotPosition != null && slotBoundingBox != null ? ( + + ) : null + })} + + {/* SlotControls for all empty deck */} + {deckDef.locations.addressableAreas + .filter(addressableArea => { + const stagingAreaAddressableAreas = getStagingAreaAddressableAreas( + stagingAreaCutoutIds + ) + const addressableAreas = + isAddressableAreaStandardSlot(addressableArea.id, deckDef) || + stagingAreaAddressableAreas.includes(addressableArea.id) return ( - // @ts-expect-error (ce, 2021-06-21) once we upgrade to the react-dnd hooks api, and use react-redux hooks, typing this will be easier + addressableAreas && + !slotIdsBlockedBySpanning.includes(addressableArea.id) && + getSlotIsEmpty(activeDeckSetup, addressableArea.id) && + addressableArea.id !== trashSlot + ) + }) + .map(addressableArea => { + return ( + // @ts-expect-error ) @@ -410,8 +383,13 @@ export const DeckSetupContents = (props: ContentsProps): JSX.Element => { allLabware.some(lab => lab.id === labware.slot) ) return null - const slot = deckSlots.find(slot => slot.id === labware.slot) - if (slot == null) { + + const slotPosition = getPositionFromSlotId(labware.slot, deckDef) + const slotBoundingBox = getAddressableAreaFromSlotId( + labware.slot, + deckDef + )?.boundingBox + if (slotPosition == null || slotBoundingBox == null) { console.warn(`no slot ${labware.slot} for labware ${labware.id}!`) return null } @@ -420,27 +398,26 @@ export const DeckSetupContents = (props: ContentsProps): JSX.Element => { return ( {labwareIsAdapter ? ( - <> - {/* @ts-expect-error */} - - + // @ts-expect-error + ) : ( { labware.slot === 'offDeck' ) return null - const slotOnDeck = deckSlots.find(slot => slot.id === labware.slot) - if (slotOnDeck != null) { + if ( + deckDef.locations.addressableAreas.some( + addressableArea => addressableArea.id === labware.slot + ) + ) { return null } const slotForOnTheDeck = allLabware.find(lab => lab.id === labware.slot) ?.slot const slotForOnMod = allModules.find(mod => mod.id === slotForOnTheDeck) ?.slot - const deckDefSlot = deckSlots.find( - s => s.id === (slotForOnMod ?? slotForOnTheDeck) - ) - if (deckDefSlot == null) { + let slotPosition = null + if (slotForOnMod != null) { + slotPosition = getPositionFromSlotId(slotForOnMod, deckDef) + } else if (slotForOnTheDeck != null) { + slotPosition = getPositionFromSlotId(slotForOnTheDeck, deckDef) + } + if (slotPosition == null) { console.warn(`no slot ${labware.slot} for labware ${labware.id}!`) return null } return ( { ) })} - ) } -const getHasGen1MultiChannelPipette = ( - pipettes: InitialDeckSetup['pipettes'] -): boolean => { - const pipetteIds = Object.keys(pipettes) - return pipetteIds.some(pipetteId => - GEN_ONE_MULTI_PIPETTES.includes(pipettes[pipetteId]?.name) - ) -} - export const DeckSetup = (): JSX.Element => { const drilledDown = useSelector(labwareIngredSelectors.getDrillDownLabwareId) != null @@ -526,6 +499,11 @@ export const DeckSetup = (): JSX.Element => { const _disableCollisionWarnings = useSelector( featureFlagSelectors.getDisableModuleRestrictions ) + const trash = Object.values(activeDeckSetup.additionalEquipmentOnDeck).find( + ae => ae.name === 'trashBin' + ) + + const trashSlot = trash?.location const robotType = useSelector(getRobotType) const dispatch = useDispatch() @@ -542,72 +520,169 @@ export const DeckSetup = (): JSX.Element => { if (drilledDown) dispatch(labwareIngredActions.drillUpFromLabware()) }, }) + const trashBinFixtures = [ + { + cutoutId: trash?.location as CutoutId, + cutoutFixtureId: TRASH_BIN_ADAPTER_FIXTURE, + }, + ] + const wasteChuteFixtures = Object.values( + activeDeckSetup.additionalEquipmentOnDeck + ).filter( + aE => + WASTE_CHUTE_CUTOUT.includes(aE.location as CutoutId) && + aE.name === 'wasteChute' + ) + const stagingAreaFixtures: AdditionalEquipmentEntity[] = Object.values( + activeDeckSetup.additionalEquipmentOnDeck + ).filter( + aE => + STAGING_AREA_CUTOUTS.includes(aE.location as CutoutId) && + aE.name === 'stagingArea' + ) + + const wasteChuteStagingAreaFixtures = Object.values( + activeDeckSetup.additionalEquipmentOnDeck + ).filter( + aE => + STAGING_AREA_CUTOUTS.includes(aE.location as CutoutId) && + aE.name === 'stagingArea' && + aE.location === WASTE_CHUTE_CUTOUT && + wasteChuteFixtures.length > 0 + ) + + const hasWasteChute = + wasteChuteFixtures.length > 0 || wasteChuteStagingAreaFixtures.length > 0 + const filteredAddressableAreas = deckDef.locations.addressableAreas.filter( + aa => isAddressableAreaStandardSlot(aa.id, deckDef) + ) return (
    {drilledDown && }
    - - {({ deckSlotsById, getRobotCoordsFromDOMCoords }) => ( + {({ getRobotCoordsFromDOMCoords }) => ( <> + {robotType === OT2_ROBOT_TYPE ? ( + + ) : ( + <> + {filteredAddressableAreas.map(addressableArea => { + const cutoutId = getCutoutIdForAddressableArea( + addressableArea.id, + deckDef.cutoutFixtures + ) + return cutoutId != null ? ( + + ) : null + })} + {stagingAreaFixtures.map(fixture => ( + + ))} + {trash != null + ? trashBinFixtures.map(({ cutoutId }) => + cutoutId != null ? ( + + + + + ) : null + ) + : null} + {wasteChuteFixtures.map(fixture => ( + + ))} + {wasteChuteStagingAreaFixtures.map(fixture => ( + + ))} + + )} areas.location as CutoutId + )} {...{ deckDef, - deckSlotsById, getRobotCoordsFromDOMCoords, showGen1MultichannelCollisionWarnings, }} /> - + 0} + hasWasteChute={hasWasteChute} + /> )} - +
    ) } -export const NullDeckState = (): JSX.Element => { - const deckDef = React.useMemo(() => getDeckDefinitions().ot2_standard, []) - - return ( -
    -
    - - {() => ( - <> - {/* TODO(IL, 2021-03-15): use styled-components for RobotCoordsText instead of style prop */} - - {i18n.t('deck.inactive_deck')} - - - )} - -
    -
    - ) +function getCutoutIdForAddressableArea( + addressableArea: AddressableAreaName, + cutoutFixtures: CutoutFixture[] +): CutoutId | null { + return cutoutFixtures.reduce((acc, cutoutFixture) => { + const [cutoutId] = + Object.entries( + cutoutFixture.providesAddressableAreas + ).find(([_cutoutId, providedAAs]) => + providedAAs.includes(addressableArea) + ) ?? [] + return (cutoutId as CutoutId) ?? acc + }, null) } diff --git a/protocol-designer/src/components/DeckSetup/utils.ts b/protocol-designer/src/components/DeckSetup/utils.ts new file mode 100644 index 00000000000..a2d7e6d4af5 --- /dev/null +++ b/protocol-designer/src/components/DeckSetup/utils.ts @@ -0,0 +1,61 @@ +import { GEN_ONE_MULTI_PIPETTES, ModuleType } from '@opentrons/shared-data' +import { LabwareDefByDefURI } from '../../labware-defs' +import { InitialDeckSetup, LabwareOnDeck } from '../../step-forms' +import { + getLabwareIsCompatible, + getLabwareIsCustom, +} from '../../utils/labwareModuleCompatibility' + +export interface SwapBlockedArgs { + hoveredLabware?: LabwareOnDeck | null + draggedLabware?: LabwareOnDeck | null + modulesById: InitialDeckSetup['modules'] + customLabwareDefs: LabwareDefByDefURI +} + +export const getSwapBlocked = (args: SwapBlockedArgs): boolean => { + const { + hoveredLabware, + draggedLabware, + modulesById, + customLabwareDefs, + } = args + if (!hoveredLabware || !draggedLabware) { + return false + } + + const sourceModuleType: ModuleType | null = + modulesById[draggedLabware.slot]?.type || null + const destModuleType: ModuleType | null = + modulesById[hoveredLabware.slot]?.type || null + + const draggedLabwareIsCustom = getLabwareIsCustom( + customLabwareDefs, + draggedLabware + ) + const hoveredLabwareIsCustom = getLabwareIsCustom( + customLabwareDefs, + hoveredLabware + ) + + // dragging custom labware to module gives not compat error + const labwareSourceToDestBlocked = sourceModuleType + ? !getLabwareIsCompatible(hoveredLabware.def, sourceModuleType) && + !hoveredLabwareIsCustom + : false + const labwareDestToSourceBlocked = destModuleType + ? !getLabwareIsCompatible(draggedLabware.def, destModuleType) && + !draggedLabwareIsCustom + : false + + return labwareSourceToDestBlocked || labwareDestToSourceBlocked +} + +export const getHasGen1MultiChannelPipette = ( + pipettes: InitialDeckSetup['pipettes'] +): boolean => { + const pipetteIds = Object.keys(pipettes) + return pipetteIds.some(pipetteId => + GEN_ONE_MULTI_PIPETTES.includes(pipettes[pipetteId]?.name) + ) +} diff --git a/protocol-designer/src/components/DeckSetupManager.tsx b/protocol-designer/src/components/DeckSetupManager.tsx index 43481a66922..8aabeba5090 100644 --- a/protocol-designer/src/components/DeckSetupManager.tsx +++ b/protocol-designer/src/components/DeckSetupManager.tsx @@ -4,7 +4,9 @@ import { getBatchEditSelectedStepTypes, getHoveredItem, } from '../ui/steps/selectors' -import { DeckSetup, NullDeckState } from './DeckSetup' +import { DeckSetup } from './DeckSetup' +import { NullDeckState } from './DeckSetup/NullDeckState' +import { OffDeckLabwareButton } from './OffDeckLabwareButton' export const DeckSetupManager = (): JSX.Element => { const batchEditSelectedStepTypes = useSelector(getBatchEditSelectedStepTypes) @@ -12,7 +14,12 @@ export const DeckSetupManager = (): JSX.Element => { if (batchEditSelectedStepTypes.length === 0 || hoveredItem !== null) { // not batch edit mode, or batch edit while item is hovered: show the deck - return + return ( + <> + + + + ) } else { return } diff --git a/protocol-designer/src/components/EditModules.tsx b/protocol-designer/src/components/EditModules.tsx index 376054a048d..9df9defbdd9 100644 --- a/protocol-designer/src/components/EditModules.tsx +++ b/protocol-designer/src/components/EditModules.tsx @@ -15,7 +15,7 @@ export interface EditModulesProps { moduleId?: string | null moduleType: ModuleType } - onCloseClick: () => unknown + onCloseClick: () => void } export interface ModelModuleInfo { @@ -75,7 +75,7 @@ export const EditModules = (props: EditModulesProps): JSX.Element => { }) return ( - changeModuleWarning || ( + changeModuleWarning ?? ( unknown } -interface State { - editing: boolean - transientValue?: string | null -} +export function EditableTextField(props: Props): JSX.Element { + const { className, value, saveEdit } = props + const [editing, setEditing] = React.useState(false) + const [transientValue, setTransientValue] = React.useState< + string | null | undefined + >(value) -export class EditableTextField extends React.Component { - constructor(props: Props) { - super(props) - this.state = { - editing: false, - transientValue: this.props.value, - } + const enterEditMode = (): void => { + setEditing(true) + setTransientValue(value) } - - enterEditMode: () => void = () => - this.setState({ editing: true, transientValue: this.props.value }) - - handleCancel: () => void = () => { - this.setState({ - editing: false, - transientValue: this.props.value, - }) + const handleCancel = (): void => { + setEditing(false) + setTransientValue(value) } - handleKeyUp: (e: React.KeyboardEvent) => void = e => { + const handleKeyUp = (e: React.KeyboardEvent): void => { if (e.key === 'Escape') { - this.handleCancel() + handleCancel() } } - handleFormSubmit: (e: React.FormEvent) => void = e => { - e.preventDefault() // avoid 'form is not connected' warning - this.handleSubmit() + const handleSubmit = (): void => { + setEditing(false) + saveEdit(transientValue ?? '') } - - handleSubmit: () => void = () => { - this.setState({ editing: false }, () => - this.props.saveEdit(this.state.transientValue || '') - ) + const handleFormSubmit = (e: React.FormEvent): void => { + e.preventDefault() // avoid 'form is not connected' warning + handleSubmit() } - updateValue: (e: React.ChangeEvent) => void = e => { - this.setState({ transientValue: e.currentTarget.value }) + const updateValue = (e: React.ChangeEvent): void => { + setTransientValue(e.currentTarget.value) } - - render(): React.ReactNode { - const { className, value } = this.props - if (this.state.editing) { - return ( - - {({ ref }) => ( -
    - } - /> - - )} -
    - ) - } - + if (editing) { return ( -
    -
    {value}
    - -
    + + {({ ref }) => ( +
    + } + /> + + )} +
    ) } + + return ( +
    +
    {value}
    + +
    + ) } diff --git a/protocol-designer/src/components/FilePage.tsx b/protocol-designer/src/components/FilePage.tsx index 3c539467b3b..c24c3915c93 100644 --- a/protocol-designer/src/components/FilePage.tsx +++ b/protocol-designer/src/components/FilePage.tsx @@ -1,233 +1,252 @@ import * as React from 'react' -import { Formik, FormikProps } from 'formik' +import { Controller, useForm } from 'react-hook-form' +import { useTranslation } from 'react-i18next' +import { useSelector, useDispatch } from 'react-redux' +import mapValues from 'lodash/mapValues' import { format } from 'date-fns' import cx from 'classnames' import { Card, FormGroup, - InputField, InstrumentGroup, OutlineButton, DeprecatedPrimaryButton, + InputField, } from '@opentrons/components' -import { i18n } from '../localization' import { resetScrollElements } from '../ui/steps/utils' import { Portal } from './portals/MainPageModalPortal' -import { EditPipettesModal } from './modals/EditPipettesModal' import { EditModulesCard } from './modules' import { EditModules } from './EditModules' - +import { actions, selectors as fileSelectors } from '../file-data' +import { actions as navActions } from '../navigation' +import { actions as steplistActions } from '../steplist' +import { selectors as stepFormSelectors } from '../step-forms' +import { INITIAL_DECK_SETUP_STEP_ID } from '../constants' +import { FilePipettesModal } from './modals/FilePipettesModal' import styles from './FilePage.css' import modalStyles from '../components/modals/modal.css' import formStyles from '../components/forms/forms.css' import type { ModuleType } from '@opentrons/shared-data' import type { FileMetadataFields } from '../file-data' -import type { ModulesForEditModulesCard } from '../step-forms' - -export interface Props { - formValues: FileMetadataFields - instruments: React.ComponentProps - goToNextPage: () => unknown - saveFileMetadata: (fileMetaDataFields: FileMetadataFields) => void - swapPipettes: () => unknown - modules: ModulesForEditModulesCard -} - -interface State { - isEditPipetteModalOpen: boolean - moduleToEdit: { - moduleType: ModuleType - moduleId?: string | null - } | null -} // TODO(mc, 2020-02-28): explore l10n for these dates const DATE_ONLY_FORMAT = 'MMM dd, yyyy' const DATETIME_FORMAT = 'MMM dd, yyyy | h:mm a' +export const FilePage = (): JSX.Element => { + const { t } = useTranslation(['button', 'application']) + const dispatch = useDispatch() + + const formValues = useSelector(fileSelectors.getFileMetadata) + const instruments = useSelector( + stepFormSelectors.getPipettesForInstrumentGroup + ) + const modules = useSelector(stepFormSelectors.getModulesForEditModulesCard) + const initialDeckSetup = useSelector(stepFormSelectors.getInitialDeckSetup) + const [ + isEditPipetteModalOpen, + setEditPipetteModalOpen, + ] = React.useState(false) + const [moduleToEdit, setModuleToEdit] = React.useState<{ + moduleType: ModuleType + moduleId?: string | null + } | null>(null) -// TODO: Ian 2019-03-15 use i18n for labels -export class FilePage extends React.Component { - state: State = { - isEditPipetteModalOpen: false, - moduleToEdit: null, - } + const swapPipetteUpdate = mapValues(initialDeckSetup.pipettes, pipette => { + if (!pipette.mount) return pipette.mount + return pipette.mount === 'left' ? 'right' : 'left' + }) - openEditPipetteModal: () => void = () => { + const openEditPipetteModal = (): void => { resetScrollElements() - this.setState({ isEditPipetteModalOpen: true }) + setEditPipetteModalOpen(true) } - closeEditPipetteModal: () => void = () => - this.setState({ isEditPipetteModalOpen: false }) - - handleEditModule: (moduleType: ModuleType, moduleId?: string) => void = ( - moduleType, - moduleId - ) => { + const closeEditPipetteModal = (): void => { + setEditPipetteModalOpen(false) + } + const handleEditModule = ( + moduleType: ModuleType, + moduleId?: string | null + ): void => { resetScrollElements() - this.setState({ - moduleToEdit: { moduleType: moduleType, moduleId: moduleId }, - }) + setModuleToEdit({ moduleType: moduleType, moduleId: moduleId }) } - closeEditModulesModal: () => void = () => { - this.setState({ - moduleToEdit: null, - }) + const closeEditModulesModal = (): void => { + setModuleToEdit(null) } - render(): JSX.Element { - const { - formValues, - instruments, - goToNextPage, - saveFileMetadata, - swapPipettes, - modules, - } = this.props - - return ( -
    - - { + dispatch(actions.saveFileMetadata(nextFormValues)) + } + + const { + handleSubmit, + watch, + control, + formState: { isDirty }, + } = useForm({ defaultValues: formValues }) + + const [created, lastModified, protocolName, author, description] = watch([ + 'created', + 'lastModified', + 'protocolName', + 'author', + 'description', + ]) + + return ( +
    + +
    +
    - {({ - handleChange, - handleSubmit, - dirty, - touched, - values, - }: FormikProps) => ( - -
    - - {values.created && format(values.created, DATE_ONLY_FORMAT)} - - - - {values.lastModified && - format(values.lastModified, DATETIME_FORMAT)} - -
    - -
    - - - - - - - -
    - - + + {created && format(created, DATE_ONLY_FORMAT)} + + + + {lastModified && format(lastModified, DATETIME_FORMAT)} + +
    + +
    + + ( - -
    - - {dirty ? 'UPDATE' : 'UPDATED'} - -
    - - )} - - - - -
    - -
    - - {i18n.t('button.edit')} - - - {i18n.t('button.swap')} - -
    + )} + /> + + + + ( + + )} + /> +
    -
    - - - -
    - - {i18n.t('button.continue_to_liquids')} - -
    - - {this.state.isEditPipetteModalOpen && ( - - )} - {this.state.moduleToEdit && ( - + ( + + )} /> - )} - + +
    + + {isDirty ? t('application:update') : t('application:updated')} + +
    + + + + +
    + +
    + + {t('edit')} + + + dispatch( + steplistActions.changeSavedStepForm({ + stepId: INITIAL_DECK_SETUP_STEP_ID, + update: { + pipetteLocationUpdate: swapPipetteUpdate, + }, + }) + ) + } + className={styles.swap_button} + iconName="swap-horizontal" + name="swapPipettes" + disabled={instruments?.left?.pipetteSpecs?.channels === 96} + > + {t('swap')} + +
    +
    +
    + + + +
    + dispatch(navActions.navigateToPage('liquids'))} + className={styles.continue_button} + iconName="arrow-right" + name="continueToLiquids" + > + {t('continue_to_liquids')} +
    - ) - } + + + {isEditPipetteModalOpen && ( + + )} + {moduleToEdit != null && ( + + )} + +
    + ) } diff --git a/protocol-designer/src/components/FileSidebar/FileSidebar.tsx b/protocol-designer/src/components/FileSidebar/FileSidebar.tsx index 5a8ddaa331f..9f35f94aa41 100644 --- a/protocol-designer/src/components/FileSidebar/FileSidebar.tsx +++ b/protocol-designer/src/components/FileSidebar/FileSidebar.tsx @@ -1,32 +1,55 @@ import * as React from 'react' import cx from 'classnames' +import { useDispatch, useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' import { DeprecatedPrimaryButton, AlertModal, OutlineButton, SidePanel, } from '@opentrons/components' -import { i18n } from '../../localization' +import { + actions as loadFileActions, + selectors as loadFileSelectors, +} from '../../load-file' +import { actions, selectors } from '../../navigation' +import { selectors as fileDataSelectors } from '../../file-data' +import { selectors as stepFormSelectors } from '../../step-forms' +import { getRobotType } from '../../file-data/selectors' +import { getAdditionalEquipment } from '../../step-forms/selectors' import { resetScrollElements } from '../../ui/steps/utils' import { Portal } from '../portals/MainPageModalPortal' import { useBlockingHint } from '../Hints/useBlockingHint' import { KnowledgeBaseLink } from '../KnowledgeBaseLink' -import { getUnusedEntities } from './utils' +import { + getUnusedEntities, + getUnusedTrash, + getUnusedStagingAreas, +} from './utils' import modalStyles from '../modals/modal.css' import styles from './FileSidebar.css' -import { HintKey } from '../../tutorial' +import type { + CreateCommand, + ProtocolFile, + RobotType, +} from '@opentrons/shared-data' +import type { HintKey } from '../../tutorial' import type { InitialDeckSetup, SavedStepFormState, ModuleOnDeck, PipetteOnDeck, } from '../../step-forms' -import type { - CreateCommand, - ProtocolFile, - RobotType, -} from '@opentrons/shared-data' +import type { ThunkDispatch } from '../../types' + +export interface AdditionalEquipment { + [additionalEquipmentId: string]: { + name: 'gripper' | 'wasteChute' | 'stagingArea' | 'trashBin' + id: string + location?: string + } +} export interface Props { loadFile: (event: React.ChangeEvent) => unknown @@ -41,24 +64,23 @@ export interface Props { additionalEquipment: AdditionalEquipment } -export interface AdditionalEquipment { - [additionalEquipmentId: string]: { - name: 'gripper' | 'wasteChute' - id: string - location?: string - } -} - interface WarningContent { content: React.ReactNode heading: string } +interface Fixture { + trashBin: boolean + wasteChute: boolean + stagingAreaSlots: string[] +} interface MissingContent { noCommands: boolean pipettesWithoutStep: PipetteOnDeck[] modulesWithoutStep: ModuleOnDeck[] gripperWithoutStep: boolean + fixtureWithoutStep: Fixture + t: any } const LOAD_COMMANDS: Array = [ @@ -73,19 +95,21 @@ function getWarningContent({ pipettesWithoutStep, modulesWithoutStep, gripperWithoutStep, + fixtureWithoutStep, + t, }: MissingContent): WarningContent | null { if (noCommands) { return { content: ( <> -

    {i18n.t('alert.export_warnings.no_commands.body1')}

    +

    {t('export_warnings.no_commands.body1')}

    - {i18n.t('alert.export_warnings.no_commands.body2')} + {t('export_warnings.no_commands.body2')} here.

    ), - heading: i18n.t('alert.export_warnings.no_commands.heading'), + heading: t('export_warnings.no_commands.heading'), } } @@ -93,11 +117,11 @@ function getWarningContent({ return { content: ( <> -

    {i18n.t('alert.export_warnings.unused_gripper.body1')}

    -

    {i18n.t('alert.export_warnings.unused_gripper.body2')}

    +

    {t('export_warnings.unused_gripper.body1')}

    +

    {t('export_warnings.unused_gripper.body2')}

    ), - heading: i18n.t('alert.export_warnings.unused_gripper.heading'), + heading: t('export_warnings.unused_gripper.heading'), } } @@ -105,9 +129,7 @@ function getWarningContent({ .map(pipette => `${pipette.mount} ${pipette.spec.displayName}`) .join(' and ') const modulesDetails = modulesWithoutStep - .map(moduleOnDeck => - i18n.t(`modules.module_long_names.${moduleOnDeck.type}`) - ) + .map(moduleOnDeck => t(`modules:module_long_names.${moduleOnDeck.type}`)) .join(' and ') if (pipettesWithoutStep.length && modulesWithoutStep.length) { @@ -115,19 +137,15 @@ function getWarningContent({ content: ( <>

    - {i18n.t('alert.export_warnings.unused_pipette_and_module.body1', { + {t('export_warnings.unused_pipette_and_module.body1', { modulesDetails, pipettesDetails, })}

    -

    - {i18n.t('alert.export_warnings.unused_pipette_and_module.body2')} -

    +

    {t('export_warnings.unused_pipette_and_module.body2')}

    ), - heading: i18n.t( - 'alert.export_warnings.unused_pipette_and_module.heading' - ), + heading: t('export_warnings.unused_pipette_and_module.heading'), } } @@ -136,14 +154,14 @@ function getWarningContent({ content: ( <>

    - {i18n.t('alert.export_warnings.unused_pipette.body1', { + {t('export_warnings.unused_pipette.body1', { pipettesDetails, })}

    -

    {i18n.t('alert.export_warnings.unused_pipette.body2')}

    +

    {t('export_warnings.unused_pipette.body2')}

    ), - heading: i18n.t('alert.export_warnings.unused_pipette.heading'), + heading: t('export_warnings.unused_pipette.heading'), } } @@ -154,54 +172,127 @@ function getWarningContent({ content: ( <>

    - {i18n.t(`alert.export_warnings.${moduleCase}.body1`, { + {t(`export_warnings.${moduleCase}.body1`, { modulesDetails, })}

    -

    {i18n.t(`alert.export_warnings.${moduleCase}.body2`)}

    +

    {t(`export_warnings.${moduleCase}.body2`)}

    ), - heading: i18n.t(`alert.export_warnings.${moduleCase}.heading`), + heading: t(`export_warnings.${moduleCase}.heading`), } } + + if (fixtureWithoutStep.trashBin || fixtureWithoutStep.wasteChute) { + return { + content: + (fixtureWithoutStep.trashBin && !fixtureWithoutStep.wasteChute) || + (!fixtureWithoutStep.trashBin && fixtureWithoutStep.wasteChute) ? ( +

    + {t('export_warnings.unused_trash.body', { + name: fixtureWithoutStep.trashBin ? 'trash bin' : 'waste chute', + })} +

    + ) : ( +

    + {t('export_warnings.unused_trash.body_both', { + trashName: 'trash bin', + wasteName: 'waste chute', + })} +

    + ), + heading: t('export_warnings.unused_trash.heading'), + } + } + + if (fixtureWithoutStep.stagingAreaSlots.length) { + return { + content: ( + <> +

    + {t('export_warnings.unused_staging_area.body1', { + count: fixtureWithoutStep.stagingAreaSlots.length, + slot: fixtureWithoutStep.stagingAreaSlots, + })} +

    +

    + {t('export_warnings.unused_staging_area.body2', { + count: fixtureWithoutStep.stagingAreaSlots.length, + })} +

    + + ), + heading: t('export_warnings.unused_staging_area.heading'), + } + } + return null } -export const v7WarningContent: JSX.Element = ( -
    -

    - {i18n.t(`alert.hint.export_v7_protocol_7_0.body1`)}{' '} - {i18n.t(`alert.hint.export_v7_protocol_7_0.body2`)} - {i18n.t(`alert.hint.export_v7_protocol_7_0.body3`)} -

    -
    -) +export function v8WarningContent(t: any): JSX.Element { + return ( +
    +

    + {t(`hint.export_v8_protocol_7_1.body1`)}{' '} + {t(`hint.export_v8_protocol_7_1.body2`)} + {t(`hint.export_v8_protocol_7_1.body3`)} +

    +
    + ) +} +export function FileSidebar(): JSX.Element { + const fileData = useSelector(fileDataSelectors.createFile) + const canDownload = useSelector(selectors.getCurrentPage) + const initialDeckSetup = useSelector(stepFormSelectors.getInitialDeckSetup) + const modulesOnDeck = initialDeckSetup.modules + const pipettesOnDeck = initialDeckSetup.pipettes + const robotType = useSelector(getRobotType) + const additionalEquipment = useSelector(getAdditionalEquipment) + const savedStepForms = useSelector(stepFormSelectors.getSavedStepForms) + const newProtocolModal = useSelector(selectors.getNewProtocolModal) + const hasUnsavedChanges = useSelector(loadFileSelectors.getHasUnsavedChanges) + const canCreateNew = !newProtocolModal + const dispatch: ThunkDispatch = useDispatch() -export function FileSidebar(props: Props): JSX.Element { - const { - canDownload, - fileData, - loadFile, - createNewFile, - onDownload, - modulesOnDeck, - pipettesOnDeck, - savedStepForms, - robotType, - additionalEquipment, - } = props const [ showExportWarningModal, setShowExportWarningModal, ] = React.useState(false) + const { t } = useTranslation(['alert', 'modules']) const isGripperAttached = Object.values(additionalEquipment).some( equipment => equipment?.name === 'gripper' ) + const { trashBinUnused, wasteChuteUnused } = getUnusedTrash( + additionalEquipment, + fileData?.commands + ) + const fixtureWithoutStep: Fixture = { + trashBin: trashBinUnused, + wasteChute: wasteChuteUnused, + stagingAreaSlots: getUnusedStagingAreas( + additionalEquipment, + fileData?.commands + ), + } const [showBlockingHint, setShowBlockingHint] = React.useState(false) const cancelModal = (): void => setShowExportWarningModal(false) + const loadFile = ( + fileChangeEvent: React.ChangeEvent + ): void => { + if (!hasUnsavedChanges || window.confirm(t('confirm_import'))) { + dispatch(loadFileActions.loadProtocolFile(fileChangeEvent)) + } + } + + const createNewFile = (): void => { + if (canCreateNew) { + dispatch(actions.toggleNewProtocolModal(true)) + } + } + const nonLoadCommands = fileData?.commands.filter( command => !LOAD_COMMANDS.includes(command.commandType) @@ -227,14 +318,16 @@ export function FileSidebar(props: Props): JSX.Element { 'moduleId', robotType ) - const gripperWithoutStep = isGripperAttached && !gripperInUse const hasWarning = noCommands || - modulesWithoutStep.length || - pipettesWithoutStep.length || - gripperWithoutStep + modulesWithoutStep.length > 0 || + pipettesWithoutStep.length > 0 || + gripperWithoutStep || + fixtureWithoutStep.trashBin || + fixtureWithoutStep.wasteChute || + fixtureWithoutStep.stagingAreaSlots.length > 0 const warning = hasWarning && @@ -243,6 +336,8 @@ export function FileSidebar(props: Props): JSX.Element { pipettesWithoutStep, modulesWithoutStep, gripperWithoutStep, + fixtureWithoutStep, + t, }) const getExportHintContent = (): { @@ -250,8 +345,8 @@ export function FileSidebar(props: Props): JSX.Element { content: React.ReactNode } => { return { - hintKey: 'export_v7_protocol_7_0', - content: v7WarningContent, + hintKey: 'export_v8_protocol_7_1', + content: v8WarningContent(t), } } @@ -264,10 +359,9 @@ export function FileSidebar(props: Props): JSX.Element { handleCancel: () => setShowBlockingHint(false), handleContinue: () => { setShowBlockingHint(false) - onDownload() + dispatch(loadFileActions.saveProtocolFile()) }, }) - return ( <> {blockingExportHint} @@ -280,11 +374,11 @@ export function FileSidebar(props: Props): JSX.Element { onCloseClick={cancelModal} buttons={[ { - children: 'CANCEL', + children: t('cancel'), onClick: cancelModal, }, { - children: 'CONTINUE WITH EXPORT', + children: t('continue_with_export'), className: modalStyles.long_button, onClick: () => { setShowExportWarningModal(false) @@ -300,11 +394,11 @@ export function FileSidebar(props: Props): JSX.Element {
    - Create New + {t('create_new')} - Import + {t('import')} @@ -321,7 +415,7 @@ export function FileSidebar(props: Props): JSX.Element { }} disabled={!canDownload} > - Export + {t('export')}
    diff --git a/protocol-designer/src/components/FileSidebar/__tests__/FileSidebar.test.tsx b/protocol-designer/src/components/FileSidebar/__tests__/FileSidebar.test.tsx index 5728738f02c..fbcbe0d2e12 100644 --- a/protocol-designer/src/components/FileSidebar/__tests__/FileSidebar.test.tsx +++ b/protocol-designer/src/components/FileSidebar/__tests__/FileSidebar.test.tsx @@ -1,254 +1,179 @@ import * as React from 'react' -import { shallow, mount } from 'enzyme' +import { fireEvent, screen } from '@testing-library/react' +import { renderWithProviders } from '@opentrons/components' +import { FLEX_ROBOT_TYPE } from '@opentrons/shared-data' +import { createFile, getRobotType } from '../../../file-data/selectors' import { - DeprecatedPrimaryButton, - AlertModal, - OutlineButton, -} from '@opentrons/components' -import { Command } from '@opentrons/shared-data/protocol/types/schemaV5' + getCurrentPage, + getNewProtocolModal, +} from '../../../navigation/selectors' +import { i18n } from '../../../localization' import { - LabwareDefinition2, - MAGNETIC_MODULE_TYPE, -} from '@opentrons/shared-data' -import { - fixtureP10Single, - fixtureP300Single, -} from '@opentrons/shared-data/pipette/fixtures/name' -import fixture_tiprack_10_ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_10_ul.json' + getAdditionalEquipment, + getInitialDeckSetup, + getSavedStepForms, +} from '../../../step-forms/selectors' +import { toggleNewProtocolModal } from '../../../navigation/actions' +import { getHasUnsavedChanges } from '../../../load-file/selectors' import { useBlockingHint } from '../../Hints/useBlockingHint' -import { FileSidebar, v7WarningContent } from '../FileSidebar' +import { + getUnusedEntities, + getUnusedStagingAreas, + getUnusedTrash, +} from '../utils' +import { FileSidebar } from '../FileSidebar' -jest.mock('../../Hints/useBlockingHint') -jest.mock('../../../file-data/selectors') jest.mock('../../../step-forms/selectors') +jest.mock('../../../load-file/selectors') +jest.mock('../../../navigation/actions') +jest.mock('../../../navigation/selectors') +jest.mock('../../../file-data/selectors') +jest.mock('../../Hints/useBlockingHint') +jest.mock('../utils') +const mockCreateFile = createFile as jest.MockedFunction +const mockGetCurrentPage = getCurrentPage as jest.MockedFunction< + typeof getCurrentPage +> +const mockGetInitialDeckSetup = getInitialDeckSetup as jest.MockedFunction< + typeof getInitialDeckSetup +> +const mockGetRobotType = getRobotType as jest.MockedFunction< + typeof getRobotType +> +const mockGetAdditionalEquipment = getAdditionalEquipment as jest.MockedFunction< + typeof getAdditionalEquipment +> +const mockGetSavedStepForms = getSavedStepForms as jest.MockedFunction< + typeof getSavedStepForms +> +const mockGetNewProtocolModal = getNewProtocolModal as jest.MockedFunction< + typeof getNewProtocolModal +> +const mockGetHasUnsavedChanges = getHasUnsavedChanges as jest.MockedFunction< + typeof getHasUnsavedChanges +> +const mockGetUnusedTrash = getUnusedTrash as jest.MockedFunction< + typeof getUnusedTrash +> +const mockGetUnusedStagingAreas = getUnusedStagingAreas as jest.MockedFunction< + typeof getUnusedStagingAreas +> +const mockGetUnusedEntities = getUnusedEntities as jest.MockedFunction< + typeof getUnusedEntities +> const mockUseBlockingHint = useBlockingHint as jest.MockedFunction< typeof useBlockingHint > +const mockToggleNewProtocolModal = toggleNewProtocolModal as jest.MockedFunction< + typeof toggleNewProtocolModal +> + +const render = () => { + return renderWithProviders(, { i18nInstance: i18n })[0] +} describe('FileSidebar', () => { - const pipetteLeftId = 'pipetteLeftId' - const pipetteRightId = 'pipetteRightId' - let props: React.ComponentProps - let commands: Command[] - let modulesOnDeck: React.ComponentProps['modulesOnDeck'] - let pipettesOnDeck: React.ComponentProps['pipettesOnDeck'] - let savedStepForms: React.ComponentProps['savedStepForms'] beforeEach(() => { - props = { - loadFile: jest.fn(), - createNewFile: jest.fn(), - canDownload: true, - onDownload: jest.fn(), - fileData: { - labware: {}, - labwareDefinitions: {}, - metadata: {}, - pipettes: {}, - robot: { model: 'OT-2 Standard', deckId: 'ot2_standard' }, - schemaVersion: 6, - commands: [], - } as any, - pipettesOnDeck: {}, - modulesOnDeck: {}, - savedStepForms: {}, - robotType: 'OT-2 Standard', - additionalEquipment: {}, - } - - commands = [ - { - command: 'pickUpTip', - params: { pipette: pipetteLeftId, labware: 'well', well: 'A1' }, - }, - ] - - pipettesOnDeck = { - pipetteLeftId: { - name: 'string' as any, - id: pipetteLeftId, - tiprackDefURI: 'test', - tiprackLabwareDef: fixture_tiprack_10_ul as LabwareDefinition2, - spec: fixtureP10Single, - mount: 'left', - }, - pipetteRightId: { - name: 'string' as any, - id: pipetteRightId, - tiprackDefURI: 'test', - tiprackLabwareDef: fixture_tiprack_10_ul as LabwareDefinition2, - spec: fixtureP300Single, - mount: 'right', - }, - } - - modulesOnDeck = { - magnet123: { - type: MAGNETIC_MODULE_TYPE, - } as any, - } - - savedStepForms = { - step123: { - id: 'step123', - pipette: pipetteLeftId, - } as any, - } + mockGetUnusedEntities.mockReturnValue([]) + mockGetUnusedStagingAreas.mockReturnValue([]) + mockGetUnusedTrash.mockReturnValue({ + trashBinUnused: false, + wasteChuteUnused: false, + }) + mockGetInitialDeckSetup.mockReturnValue({ + modules: {}, + pipettes: {}, + additionalEquipmentOnDeck: {}, + labware: {}, + }) + mockGetHasUnsavedChanges.mockReturnValue(false) + mockGetNewProtocolModal.mockReturnValue(false) + mockGetSavedStepForms.mockReturnValue({}) + mockGetAdditionalEquipment.mockReturnValue({}) + mockGetRobotType.mockReturnValue(FLEX_ROBOT_TYPE) + mockGetCurrentPage.mockReturnValue('settings-app') + mockUseBlockingHint.mockReturnValue(null) + mockCreateFile.mockReturnValue({ + commands: [ + { + commandType: 'moveToAddressableArea', + params: { + addressableAreaName: 'movableTrashA3', + pipetteId: 'mockId', + offset: { x: 0, y: 0, z: 0 }, + }, + }, + ], + } as any) }) afterEach(() => { jest.resetAllMocks() }) - it('create new button creates new protocol', () => { - const wrapper = shallow() - const createButton = wrapper.find(OutlineButton).at(0) - createButton.simulate('click') - - expect(props.createNewFile).toHaveBeenCalled() + it('renders the file sidebar and buttons work as expected with no warning upon export', () => { + render() + screen.getByText('Protocol File') + fireEvent.click(screen.getByRole('button', { name: 'Create New' })) + expect(mockToggleNewProtocolModal).toHaveBeenCalled() + screen.getByText('Import') + fireEvent.click(screen.getByRole('button', { name: 'Export' })) + expect(mockUseBlockingHint).toHaveBeenCalled() }) - - it('import button imports saved protocol', () => { - const event = { files: ['test.json'] } - - const wrapper = shallow() - const importButton = wrapper.find('[type="file"]') - importButton.simulate('change', event) - - expect(props.loadFile).toHaveBeenCalledWith(event) + it('renders the no commands warning', () => { + mockCreateFile.mockReturnValue({ + commands: [], + } as any) + render() + fireEvent.click(screen.getByRole('button', { name: 'Export' })) + screen.getByText('Your protocol has no steps') }) - - it('export button is disabled when canDownload is false', () => { - props.canDownload = false - - const wrapper = shallow() - const downloadButton = wrapper.find(DeprecatedPrimaryButton).at(0) - - expect(downloadButton.prop('disabled')).toEqual(true) - }) - - it('warning modal is shown when export is clicked with no command', () => { - const wrapper = shallow() - const downloadButton = wrapper.find(DeprecatedPrimaryButton).at(0) - downloadButton.simulate('click') - const alertModal = wrapper.find(AlertModal) - - expect(alertModal).toHaveLength(1) - expect(alertModal.prop('heading')).toEqual('Your protocol has no steps') - }) - - it('warning modal is shown when export is clicked with unused pipette', () => { - // @ts-expect-error(sa, 2021-6-22): props.fileData might be null - props.fileData.commands = commands - props.pipettesOnDeck = pipettesOnDeck - props.savedStepForms = savedStepForms - - const wrapper = shallow() - const downloadButton = wrapper.find(DeprecatedPrimaryButton).at(0) - downloadButton.simulate('click') - const alertModal = wrapper.find(AlertModal) - - expect(alertModal).toHaveLength(1) - expect(alertModal.prop('heading')).toEqual('Unused pipette') - expect(alertModal.html()).toContain( - pipettesOnDeck.pipetteRightId.spec.displayName - ) - expect(alertModal.html()).toContain(pipettesOnDeck.pipetteRightId.mount) - expect(alertModal.html()).not.toContain( - pipettesOnDeck.pipetteLeftId.spec.displayName - ) + it('renders the unused pipette and module warning', () => { + mockGetUnusedEntities.mockReturnValue([ + { + mount: 'left', + name: 'p1000_96', + id: 'pipetteId', + tiprackDefURI: 'mockURI', + spec: { + name: 'mock pip name', + displayName: 'mock display name', + }, + }, + ]) + render() + fireEvent.click(screen.getByRole('button', { name: 'Export' })) + screen.getByText('Unused pipette and module') }) - - it('warning modal is shown when export is clicked with unused gripper', () => { - const gripperId = 'gripperId' - props.modulesOnDeck = modulesOnDeck - props.savedStepForms = savedStepForms - // @ts-expect-error(sa, 2021-6-22): props.fileData might be null - props.fileData.commands = commands - props.additionalEquipment = { - [gripperId]: { name: 'gripper', id: gripperId }, - } - - const wrapper = shallow() - const downloadButton = wrapper.find(DeprecatedPrimaryButton).at(0) - downloadButton.simulate('click') - const alertModal = wrapper.find(AlertModal) - - expect(alertModal).toHaveLength(1) - expect(alertModal.prop('heading')).toEqual('Unused gripper') + it('renders the unused trash warning', () => { + mockGetUnusedTrash.mockReturnValue({ + trashBinUnused: true, + wasteChuteUnused: false, + }) + render() + fireEvent.click(screen.getByRole('button', { name: 'Export' })) + screen.getByText('Unused trash') }) - - it('warning modal is shown when export is clicked with unused module', () => { - props.modulesOnDeck = modulesOnDeck - props.savedStepForms = savedStepForms - // @ts-expect-error(sa, 2021-6-22): props.fileData might be null - props.fileData.commands = commands - - const wrapper = shallow() - const downloadButton = wrapper.find(DeprecatedPrimaryButton).at(0) - downloadButton.simulate('click') - const alertModal = wrapper.find(AlertModal) - - expect(alertModal).toHaveLength(1) - expect(alertModal.prop('heading')).toEqual('Unused module') - expect(alertModal.html()).toContain('Magnetic module') + it('renders the unused waste chute warning', () => { + mockGetUnusedTrash.mockReturnValue({ + trashBinUnused: false, + wasteChuteUnused: true, + }) + render() + fireEvent.click(screen.getByRole('button', { name: 'Export' })) + screen.getByText('Unused trash') }) - - it('warning modal is shown when export is clicked with unused module and pipette', () => { - props.modulesOnDeck = modulesOnDeck - props.pipettesOnDeck = pipettesOnDeck - props.savedStepForms = savedStepForms - // @ts-expect-error(sa, 2021-6-22): props.fileData might be null - props.fileData.commands = commands - - const wrapper = shallow() - const downloadButton = wrapper.find(DeprecatedPrimaryButton).at(0) - downloadButton.simulate('click') - const alertModal = wrapper.find(AlertModal) - - expect(alertModal).toHaveLength(1) - expect(alertModal.prop('heading')).toEqual('Unused pipette and module') - expect(alertModal.html()).toContain( - pipettesOnDeck.pipetteRightId.spec.displayName - ) - expect(alertModal.html()).toContain(pipettesOnDeck.pipetteRightId.mount) - expect(alertModal.html()).toContain('Magnetic module') - expect(alertModal.html()).not.toContain( - pipettesOnDeck.pipetteLeftId.spec.displayName - ) + it('renders the unused staging area slot warning', () => { + mockGetUnusedStagingAreas.mockReturnValue(['D4']) + render() + fireEvent.click(screen.getByRole('button', { name: 'Export' })) + screen.getByText('One or more staging area slots are unused') }) - - it('blocking hint is shown', () => { - // @ts-expect-error(sa, 2021-6-22): props.fileData might be null - props.fileData.commands = commands - props.savedStepForms = savedStepForms - - const MockHintComponent = () => { - return
    - } - - mockUseBlockingHint.mockReturnValue() - - const wrapper = mount() - - expect(wrapper.exists(MockHintComponent)).toEqual(true) - // Before save button is clicked, enabled should be false - expect(mockUseBlockingHint).toHaveBeenNthCalledWith(1, { - enabled: false, - hintKey: 'export_v7_protocol_7_0', - content: v7WarningContent, - handleCancel: expect.any(Function), - handleContinue: expect.any(Function), - }) - - const downloadButton = wrapper.find(DeprecatedPrimaryButton).at(0) - downloadButton.simulate('click') - - // After save button is clicked, enabled should be true - expect(mockUseBlockingHint).toHaveBeenLastCalledWith({ - enabled: true, - hintKey: 'export_v7_protocol_7_0', - content: v7WarningContent, - handleCancel: expect.any(Function), - handleContinue: expect.any(Function), + it('renders the unused gripper warning', () => { + mockGetAdditionalEquipment.mockReturnValue({ + gripperId: { name: 'gripper', id: 'gripperId' }, }) + render() + fireEvent.click(screen.getByRole('button', { name: 'Export' })) + screen.getByText('Unused gripper') }) }) diff --git a/protocol-designer/src/components/FileSidebar/index.ts b/protocol-designer/src/components/FileSidebar/index.ts deleted file mode 100644 index 85390d1cf49..00000000000 --- a/protocol-designer/src/components/FileSidebar/index.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { connect } from 'react-redux' -import { i18n } from '../../localization' -import { actions, selectors } from '../../navigation' -import { selectors as fileDataSelectors } from '../../file-data' -import { selectors as stepFormSelectors } from '../../step-forms' -import { getRobotType } from '../../file-data/selectors' -import { getAdditionalEquipment } from '../../step-forms/selectors' -import { - actions as loadFileActions, - selectors as loadFileSelectors, -} from '../../load-file' -import { - AdditionalEquipment, - FileSidebar as FileSidebarComponent, - Props, -} from './FileSidebar' -import type { RobotType } from '@opentrons/shared-data' -import type { BaseState, ThunkDispatch } from '../../types' -import type { SavedStepFormState, InitialDeckSetup } from '../../step-forms' - -interface SP { - canDownload: boolean - fileData: Props['fileData'] - _canCreateNew?: boolean | null - _hasUnsavedChanges?: boolean | null - pipettesOnDeck: InitialDeckSetup['pipettes'] - modulesOnDeck: InitialDeckSetup['modules'] - savedStepForms: SavedStepFormState - robotType: RobotType - additionalEquipment: AdditionalEquipment -} -export const FileSidebar = connect( - mapStateToProps, - // @ts-expect-error(sa, 2021-6-21): TODO: refactor to use hooks api - null, - mergeProps -)(FileSidebarComponent) - -function mapStateToProps(state: BaseState): SP { - const fileData = fileDataSelectors.createFile(state) - const canDownload = selectors.getCurrentPage(state) !== 'file-splash' - const initialDeckSetup = stepFormSelectors.getInitialDeckSetup(state) - const robotType = getRobotType(state) - const additionalEquipment = getAdditionalEquipment(state) - - return { - canDownload, - fileData, - pipettesOnDeck: initialDeckSetup.pipettes, - modulesOnDeck: initialDeckSetup.modules, - savedStepForms: stepFormSelectors.getSavedStepForms(state), - robotType: robotType, - additionalEquipment: additionalEquipment, - // Ignore clicking 'CREATE NEW' button in these cases - _canCreateNew: !selectors.getNewProtocolModal(state), - _hasUnsavedChanges: loadFileSelectors.getHasUnsavedChanges(state), - } -} - -function mergeProps( - stateProps: SP, - dispatchProps: { - dispatch: ThunkDispatch - } -): Props { - const { - _canCreateNew, - _hasUnsavedChanges, - canDownload, - fileData, - pipettesOnDeck, - modulesOnDeck, - savedStepForms, - robotType, - additionalEquipment, - } = stateProps - const { dispatch } = dispatchProps - return { - loadFile: fileChangeEvent => { - if ( - !_hasUnsavedChanges || - window.confirm(i18n.t('alert.window.confirm_import')) - ) { - dispatch(loadFileActions.loadProtocolFile(fileChangeEvent)) - } - }, - canDownload, - createNewFile: _canCreateNew - ? () => dispatch(actions.toggleNewProtocolModal(true)) - : undefined, - onDownload: () => dispatch(loadFileActions.saveProtocolFile()), - fileData, - pipettesOnDeck, - modulesOnDeck, - savedStepForms, - robotType, - additionalEquipment, - } -} diff --git a/protocol-designer/src/components/FileSidebar/utils/__tests__/getUnusedStagingAreas.test.ts b/protocol-designer/src/components/FileSidebar/utils/__tests__/getUnusedStagingAreas.test.ts new file mode 100644 index 00000000000..feaec51a5be --- /dev/null +++ b/protocol-designer/src/components/FileSidebar/utils/__tests__/getUnusedStagingAreas.test.ts @@ -0,0 +1,59 @@ +import { getUnusedStagingAreas } from '../getUnusedStagingAreas' +import type { CreateCommand } from '@opentrons/shared-data' +import type { AdditionalEquipment } from '../../FileSidebar' + +describe('getUnusedStagingAreas', () => { + it('returns true for unused staging area', () => { + const stagingArea = 'stagingAreaId' + const mockAdditionalEquipment = { + [stagingArea]: { + name: 'stagingArea', + id: stagingArea, + location: 'cutoutA3', + }, + } as AdditionalEquipment + + expect(getUnusedStagingAreas(mockAdditionalEquipment, [])).toEqual(['A4']) + }) + it('returns true for multi unused staging areas', () => { + const stagingArea = 'stagingAreaId' + const stagingArea2 = 'stagingAreaId2' + const mockAdditionalEquipment = { + [stagingArea]: { + name: 'stagingArea', + id: stagingArea, + location: 'cutoutA3', + }, + [stagingArea2]: { + name: 'stagingArea', + id: stagingArea2, + location: 'cutoutB3', + }, + } as AdditionalEquipment + + expect(getUnusedStagingAreas(mockAdditionalEquipment, [])).toEqual([ + 'A4', + 'B4', + ]) + }) + it('returns false for unused staging area', () => { + const stagingArea = 'stagingAreaId' + const mockAdditionalEquipment = { + [stagingArea]: { + name: 'stagingArea', + id: stagingArea, + location: 'cutoutA3', + }, + } as AdditionalEquipment + const mockCommand = [ + { + commandType: 'loadLabware', + params: { location: { addressableAreaName: 'A4' } }, + }, + ] as CreateCommand[] + + expect(getUnusedStagingAreas(mockAdditionalEquipment, mockCommand)).toEqual( + [] + ) + }) +}) diff --git a/protocol-designer/src/components/FileSidebar/utils/__tests__/getUnusedTrash.test.ts b/protocol-designer/src/components/FileSidebar/utils/__tests__/getUnusedTrash.test.ts new file mode 100644 index 00000000000..77c659de876 --- /dev/null +++ b/protocol-designer/src/components/FileSidebar/utils/__tests__/getUnusedTrash.test.ts @@ -0,0 +1,127 @@ +import { getUnusedTrash } from '../getUnusedTrash' +import { + CreateCommand, + EIGHT_CHANNEL_WASTE_CHUTE_ADDRESSABLE_AREA, + ONE_CHANNEL_WASTE_CHUTE_ADDRESSABLE_AREA, +} from '@opentrons/shared-data' +import type { AdditionalEquipment } from '../../FileSidebar' + +describe('getUnusedTrash', () => { + it('returns true for unused trash bin', () => { + const mockTrashId = 'mockTrashId' + const mockTrash = { + [mockTrashId]: { + name: 'trashBin', + id: mockTrashId, + location: 'cutoutA3', + }, + } as AdditionalEquipment + + expect(getUnusedTrash(mockTrash, [])).toEqual({ + trashBinUnused: true, + wasteChuteUnused: false, + }) + }) + it('returns false for unused trash bin', () => { + const mockTrashId = 'mockTrashId' + const mockTrash = { + [mockTrashId]: { + name: 'trashBin', + id: mockTrashId, + location: 'cutoutA3', + }, + } as AdditionalEquipment + const mockCommand = [ + { + commandType: 'moveToAddressableArea', + params: { addressableAreaName: 'movableTrashA3' }, + }, + ] as CreateCommand[] + + expect(getUnusedTrash(mockTrash, mockCommand)).toEqual({ + trashBinUnused: false, + wasteChuteUnused: false, + }) + }) + it('returns true for unused waste chute', () => { + const wasteChute = 'wasteChuteId' + const mockAdditionalEquipment = { + [wasteChute]: { + name: 'wasteChute', + id: wasteChute, + location: 'cutoutD3', + }, + } as AdditionalEquipment + expect(getUnusedTrash(mockAdditionalEquipment, [])).toEqual({ + trashBinUnused: false, + wasteChuteUnused: true, + }) + }) + it('returns false for unused waste chute with single channel', () => { + const wasteChute = 'wasteChuteId' + const mockAdditionalEquipment = { + [wasteChute]: { + name: 'wasteChute', + id: wasteChute, + location: 'cutoutD3', + }, + } as AdditionalEquipment + const mockCommand = [ + { + commandType: 'moveToAddressableArea', + params: { + pipetteId: 'mockId', + addressableAreaName: ONE_CHANNEL_WASTE_CHUTE_ADDRESSABLE_AREA, + }, + }, + ] as CreateCommand[] + expect(getUnusedTrash(mockAdditionalEquipment, mockCommand)).toEqual({ + trashBinUnused: false, + wasteChuteUnused: false, + }) + }) + it('returns false for unused waste chute with 8-channel', () => { + const wasteChute = 'wasteChuteId' + const mockAdditionalEquipment = { + [wasteChute]: { + name: 'wasteChute', + id: wasteChute, + location: 'cutoutD3', + }, + } as AdditionalEquipment + const mockCommand = [ + { + commandType: 'moveToAddressableArea', + params: { + pipetteId: 'mockId', + addressableAreaName: EIGHT_CHANNEL_WASTE_CHUTE_ADDRESSABLE_AREA, + }, + }, + ] as CreateCommand[] + expect(getUnusedTrash(mockAdditionalEquipment, mockCommand)).toEqual({ + trashBinUnused: false, + wasteChuteUnused: false, + }) + }) + it('returns false for unused trash bin with moveToAddressableAreaForDropTip command', () => { + const mockTrashId = 'mockTrashId' + const mockTrash = { + [mockTrashId]: { + name: 'trashBin', + id: mockTrashId, + location: 'cutoutA3', + }, + } as AdditionalEquipment + const mockCommand = [ + { + commandType: 'moveToAddressableAreaForDropTip', + params: { addressableAreaName: 'movableTrashA3', pipetteId: 'mockPip' }, + }, + ] as CreateCommand[] + + expect(getUnusedTrash(mockTrash, mockCommand)).toEqual({ + trashBinUnused: false, + wasteChuteUnused: false, + }) + }) +}) diff --git a/protocol-designer/src/components/FileSidebar/utils/getUnusedStagingAreas.ts b/protocol-designer/src/components/FileSidebar/utils/getUnusedStagingAreas.ts new file mode 100644 index 00000000000..9c22d52b679 --- /dev/null +++ b/protocol-designer/src/components/FileSidebar/utils/getUnusedStagingAreas.ts @@ -0,0 +1,42 @@ +import { getStagingAreaAddressableAreas } from '../../../utils' +import type { CreateCommand, CutoutId } from '@opentrons/shared-data' +import type { AdditionalEquipment } from '../FileSidebar' + +export const getUnusedStagingAreas = ( + additionalEquipment: AdditionalEquipment, + commands?: CreateCommand[] +): string[] => { + const stagingAreaCutoutIds = Object.values(additionalEquipment) + .filter(equipment => equipment?.name === 'stagingArea') + .map(equipment => { + if (equipment.location == null) { + console.error( + `expected to find staging area slot location with id ${equipment.id} but could not.` + ) + } + return equipment.location ?? '' + }) + + const stagingAreaAddressableAreaNames = getStagingAreaAddressableAreas( + // TODO(jr, 11/13/23): fix AdditionalEquipment['location'] from type string to CutoutId + stagingAreaCutoutIds as CutoutId[] + ) + + const stagingAreaCommandSlots: string[] = stagingAreaAddressableAreaNames.filter( + location => + (commands ?? [])?.some( + command => + (command.commandType === 'loadLabware' && + command.params.location !== 'offDeck' && + 'addressableAreaName' in command.params.location && + command.params.location.addressableAreaName === location) || + (command.commandType === 'moveLabware' && + command.params.newLocation !== 'offDeck' && + 'addressableAreaName' in command.params.newLocation && + command.params.newLocation.addressableAreaName === location) + ) + ? null + : location + ) + return stagingAreaCommandSlots +} diff --git a/protocol-designer/src/components/FileSidebar/utils/getUnusedTrash.ts b/protocol-designer/src/components/FileSidebar/utils/getUnusedTrash.ts new file mode 100644 index 00000000000..634e0e07f42 --- /dev/null +++ b/protocol-designer/src/components/FileSidebar/utils/getUnusedTrash.ts @@ -0,0 +1,53 @@ +import { + AddressableAreaName, + CreateCommand, + FIXED_TRASH_ID, + MOVABLE_TRASH_ADDRESSABLE_AREAS, + WASTE_CHUTE_ADDRESSABLE_AREAS, +} from '@opentrons/shared-data' +import type { InitialDeckSetup } from '../../../step-forms' + +interface UnusedTrash { + trashBinUnused: boolean + wasteChuteUnused: boolean +} + +export const getUnusedTrash = ( + additionalEquipment: InitialDeckSetup['additionalEquipmentOnDeck'], + commands?: CreateCommand[] +): UnusedTrash => { + const trashBin = Object.values(additionalEquipment).find( + aE => aE.name === 'trashBin' + ) + + const hasTrashBinCommands = + trashBin != null + ? commands?.some( + command => + (command.commandType === 'moveToAddressableArea' && + (MOVABLE_TRASH_ADDRESSABLE_AREAS.includes( + command.params.addressableAreaName as AddressableAreaName + ) || + command.params.addressableAreaName === FIXED_TRASH_ID)) || + command.commandType === 'moveToAddressableAreaForDropTip' + ) + : null + const wasteChute = Object.values(additionalEquipment).find( + aE => aE.name === 'wasteChute' + ) + const hasWasteChuteCommands = + wasteChute != null + ? commands?.some( + command => + command.commandType === 'moveToAddressableArea' && + WASTE_CHUTE_ADDRESSABLE_AREAS.includes( + command.params.addressableAreaName as AddressableAreaName + ) + ) + : null + + return { + trashBinUnused: trashBin != null && !hasTrashBinCommands, + wasteChuteUnused: wasteChute != null && !hasWasteChuteCommands, + } +} diff --git a/protocol-designer/src/components/FileSidebar/utils/index.ts b/protocol-designer/src/components/FileSidebar/utils/index.ts index 1f9e4ed1b44..69cca896b00 100644 --- a/protocol-designer/src/components/FileSidebar/utils/index.ts +++ b/protocol-designer/src/components/FileSidebar/utils/index.ts @@ -1 +1,3 @@ export * from './getUnusedEntities' +export * from './getUnusedStagingAreas' +export * from './getUnusedTrash' diff --git a/protocol-designer/src/components/Hints/index.tsx b/protocol-designer/src/components/Hints/index.tsx index ff93427d71f..122939754a3 100644 --- a/protocol-designer/src/components/Hints/index.tsx +++ b/protocol-designer/src/components/Hints/index.tsx @@ -1,5 +1,6 @@ import * as React from 'react' -import { connect } from 'react-redux' +import { useTranslation } from 'react-i18next' +import { useSelector, useDispatch } from 'react-redux' import { AlertModal, DeprecatedCheckboxField, @@ -7,50 +8,31 @@ import { OutlineButton, Text, } from '@opentrons/components' -import { i18n } from '../../localization' -import { actions as stepsActions } from '../../ui/steps' -import { TerminalItemId } from '../../steplist' import { actions, selectors, HintKey } from '../../tutorial' import { Portal } from '../portals/MainPageModalPortal' import styles from './hints.css' import EXAMPLE_ADD_LIQUIDS_IMAGE from '../../images/example_add_liquids.png' import EXAMPLE_WATCH_LIQUIDS_MOVE_IMAGE from '../../images/example_watch_liquids_move.png' import EXAMPLE_BATCH_EDIT_IMAGE from '../../images/announcements/multi_select.gif' -import { BaseState, ThunkDispatch } from '../../types' -interface SP { - hintKey?: HintKey | null -} -interface DP { - removeHint: (key: HintKey, rememberDismissal: boolean) => unknown - selectTerminalItem: (item: TerminalItemId) => unknown -} -type Props = SP & DP - -interface State { - rememberDismissal: boolean -} - -// List of hints that should have /!\ gray AlertModal header -// (versus calmer non-alert header) const HINT_IS_ALERT: HintKey[] = ['add_liquids_and_labware'] -class HintsComponent extends React.Component { - constructor(props: Props) { - super(props) - this.state = { rememberDismissal: false } +export const Hints = (): JSX.Element | null => { + const { t } = useTranslation(['alert', 'nav', 'button']) + const [rememberDismissal, toggleRememberDismissal] = React.useState( + false + ) + const hintKey = useSelector(selectors.getHint) + const dispatch = useDispatch() + const removeHint = (hintKey: HintKey): void => { + dispatch(actions.removeHint(hintKey, rememberDismissal)) } - toggleRememberDismissal = (): void => { - this.setState({ rememberDismissal: !this.state.rememberDismissal }) + const makeHandleCloseClick = (hintKey: HintKey): (() => void) => { + return () => removeHint(hintKey) } - makeHandleCloseClick = (hintKey: HintKey): (() => void) => { - const { rememberDismissal } = this.state - return () => this.props.removeHint(hintKey, rememberDismissal) - } - - renderHintContents = (hintKey: HintKey): JSX.Element | null => { + const renderHintContents = (hintKey: HintKey): JSX.Element | null => { // Only hints that have no outside effects should go here. // For hints that have an effect, use BlockingHint. switch (hintKey) { @@ -58,17 +40,15 @@ class HintsComponent extends React.Component { return ( <>
    - {i18n.t('alert.hint.add_liquids_and_labware.summary', { - deck_setup_step: i18n.t('nav.terminal_item.__initial_setup__'), + {t('hint.add_liquids_and_labware.summary', { + deck_setup_step: t('nav:terminal_item.__initial_setup__'), })}
    Step 1: - - {i18n.t('alert.hint.add_liquids_and_labware.step1')} - + {t('hint.add_liquids_and_labware.step1')}
    @@ -76,9 +56,7 @@ class HintsComponent extends React.Component {
    Step 2: - - {i18n.t('alert.hint.add_liquids_and_labware.step2')} - + {t('hint.add_liquids_and_labware.step2')}
    @@ -87,31 +65,31 @@ class HintsComponent extends React.Component { case 'deck_setup_explanation': return ( <> -

    {i18n.t(`alert.hint.${hintKey}.body1`)}

    -

    {i18n.t(`alert.hint.${hintKey}.body2`)}

    -

    {i18n.t(`alert.hint.${hintKey}.body3`)}

    +

    {t(`hint.${hintKey}.body1`)}

    +

    {t(`hint.${hintKey}.body2`)}

    +

    {t(`hint.${hintKey}.body3`)}

    ) case 'module_without_labware': return ( <> -

    {i18n.t(`alert.hint.${hintKey}.body`)}

    +

    {t(`alert:hint.${hintKey}.body`)}

    ) case 'thermocycler_lid_passive_cooling': return ( <>

    - {i18n.t(`alert.hint.${hintKey}.body1a`)} - {i18n.t(`alert.hint.${hintKey}.strong_body1`)} - {i18n.t(`alert.hint.${hintKey}.body1b`)} + {t(`alert:hint.${hintKey}.body1a`)} + {t(`alert:hint.${hintKey}.strong_body1`)} + {t(`alert:hint.${hintKey}.body1b`)}

    1. - {i18n.t(`alert.hint.${hintKey}.li1`)} + {t(`alert:hint.${hintKey}.li1`)}
    2. - {i18n.t(`alert.hint.${hintKey}.li2`)} + {t(`alert:hint.${hintKey}.li2`)}
    @@ -123,33 +101,29 @@ class HintsComponent extends React.Component { -

    {i18n.t(`alert.hint.${hintKey}.body1`)}

    +

    {t(`alert:hint.${hintKey}.body1`)}

    - {i18n.t(`alert.hint.${hintKey}.body2`)} + {`alert:hint.${hintKey}.body2`}

    1. - {i18n.t(`alert.hint.${hintKey}.li1a`)} - - {i18n.t(`alert.hint.${hintKey}.strong_li1`)} - - {i18n.t(`alert.hint.${hintKey}.li1b`)} + {t(`alert:hint.${hintKey}.li1a`)} + {t(`alert:hint.${hintKey}.strong_li1`)} + {t(`alert:hint.${hintKey}.li1b`)}
    2. - {i18n.t(`alert.hint.${hintKey}.li2a`)} - - {i18n.t(`alert.hint.${hintKey}.strong_li2`)} - - {i18n.t(`alert.hint.${hintKey}.li2b`)} + {t(`alert:hint.${hintKey}.li2a`)} + {t(`alert:hint.${hintKey}.strong_li2`)} + {t(`alert:hint.${hintKey}.li2b`)}

    - {i18n.t(`alert.hint.${hintKey}.body3a`)}
    - {i18n.t(`alert.hint.${hintKey}.body3b`)} + {t(`alert:hint.${hintKey}.body3a`)}
    + {t(`alert:hint.${hintKey}.body3b`)}

    - {i18n.t(`alert.hint.${hintKey}.body4a`)}
    - {i18n.t(`alert.hint.${hintKey}.body4b`)} + {t(`alert:hint.${hintKey}.body4a`)}
    + {t(`alert:hint.${hintKey}.body4b`)}

    @@ -157,7 +131,7 @@ class HintsComponent extends React.Component { case 'waste_chute_warning': return ( - {i18n.t(`alert.hint.${hintKey}.body1`)} + {t(`hint.${hintKey}.body1`)} ) default: @@ -165,52 +139,34 @@ class HintsComponent extends React.Component { } } - render(): React.ReactNode { - const { hintKey } = this.props - if (!hintKey) return null + if (!hintKey) return null - const headingText = i18n.t(`alert.hint.${hintKey}.title`) - const hintIsAlert = HINT_IS_ALERT.includes(hintKey) - return ( - - - {!hintIsAlert ? ( -
    {headingText}
    - ) : null} -
    - {this.renderHintContents(hintKey)} -
    -
    - - - {i18n.t('button.ok')} - -
    -
    -
    - ) - } + const headingText = t(`hint.${hintKey}.title`) + const hintIsAlert = HINT_IS_ALERT.includes(hintKey) + return ( + + + {!hintIsAlert ? ( +
    {headingText}
    + ) : null} +
    + {renderHintContents(hintKey)} +
    +
    + toggleRememberDismissal(rememberDismissal)} + value={rememberDismissal} + /> + + {t('button:ok')} + +
    +
    +
    + ) } - -const mapStateToProps = (state: BaseState): SP => ({ - hintKey: selectors.getHint(state), -}) -const mapDispatchToProps = (dispatch: ThunkDispatch): DP => ({ - removeHint: (hintKey, rememberDismissal) => - dispatch(actions.removeHint(hintKey, rememberDismissal)), - selectTerminalItem: terminalId => - dispatch(stepsActions.selectTerminalItem(terminalId)), -}) - -export const Hints = connect( - mapStateToProps, - mapDispatchToProps -)(HintsComponent) diff --git a/protocol-designer/src/components/Hints/useBlockingHint.tsx b/protocol-designer/src/components/Hints/useBlockingHint.tsx index 036328914e2..c43e49e55f7 100644 --- a/protocol-designer/src/components/Hints/useBlockingHint.tsx +++ b/protocol-designer/src/components/Hints/useBlockingHint.tsx @@ -2,22 +2,23 @@ // Instances of BlockingHint need to be individually placed by whatever component // is controlling the flow that this modal will block, via useBlockingHint. import * as React from 'react' +import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' import { actions, selectors, HintKey } from '../../tutorial' import { ContinueModal, DeprecatedCheckboxField } from '@opentrons/components' import { Portal } from '../portals/MainPageModalPortal' -import { i18n } from '../../localization' import styles from './hints.css' export interface HintProps { hintKey: HintKey - handleCancel: () => unknown - handleContinue: () => unknown + handleCancel: () => void + handleContinue: () => void content: React.ReactNode } // This component handles the checkbox and dispatching `removeHint` action on continue/cancel export const BlockingHint = (props: HintProps): JSX.Element => { + const { t } = useTranslation('alert') const { hintKey, handleCancel, handleContinue } = props const dispatch = useDispatch() @@ -43,7 +44,7 @@ export const BlockingHint = (props: HintProps): JSX.Element => { @@ -51,7 +52,7 @@ export const BlockingHint = (props: HintProps): JSX.Element => {
    @@ -68,8 +69,8 @@ export interface HintArgs { enabled: boolean hintKey: HintKey content: React.ReactNode - handleCancel: () => unknown - handleContinue: () => unknown + handleCancel: () => void + handleContinue: () => void } export const useBlockingHint = (args: HintArgs): JSX.Element | null => { diff --git a/protocol-designer/src/components/IngredientsList/LabwareDetailsCard/LabwareDetailsCard.tsx b/protocol-designer/src/components/IngredientsList/LabwareDetailsCard/LabwareDetailsCard.tsx index e6a473db3c4..782a471e55f 100644 --- a/protocol-designer/src/components/IngredientsList/LabwareDetailsCard/LabwareDetailsCard.tsx +++ b/protocol-designer/src/components/IngredientsList/LabwareDetailsCard/LabwareDetailsCard.tsx @@ -1,37 +1,71 @@ import * as React from 'react' +import assert from 'assert' +import { useDispatch, useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' import cx from 'classnames' -import { i18n } from '../../../localization' +import { getLabwareDisplayName } from '@opentrons/shared-data' +import { selectors as stepFormSelectors } from '../../../step-forms' +import { selectors as uiLabwareSelectors } from '../../../ui/labware' +import { selectors as labwareIngredSelectors } from '../../../labware-ingred/selectors' +import * as labwareIngredActions from '../../../labware-ingred/actions' import { PDTitledList, PDListItem } from '../../lists' import { EditableTextField } from '../../EditableTextField' +import type { ThunkDispatch } from '../../../types' + import styles from './labwareDetailsCard.css' -export interface Props { - labwareDefDisplayName: string - nickname: string - renameLabware: (name: string) => unknown -} +export function LabwareDetailsCard(): JSX.Element { + const { t } = useTranslation('form') + const dispatch = useDispatch>() + const labwareNicknamesById = useSelector( + uiLabwareSelectors.getLabwareNicknamesById + ) + const labwareId = useSelector(labwareIngredSelectors.getSelectedLabwareId) + const labwareEntities = useSelector(stepFormSelectors.getLabwareEntities) + const labwareDefDisplayName = + labwareId != null + ? getLabwareDisplayName(labwareEntities[labwareId].def) + : null + + assert( + labwareId, + 'Expected labware id to exist in connected labware details card' + ) + + const renameLabware = (name: string): void => { + assert( + labwareId, + 'renameLabware in LabwareDetailsCard expected a labwareId' + ) + + if (labwareId) { + dispatch( + labwareIngredActions.renameLabware({ + labwareId: labwareId, + name, + }) + ) + } + } -export function LabwareDetailsCard(props: Props): JSX.Element { return (
    - {i18n.t('form.generic.labware_type')} - - - {props.labwareDefDisplayName} + {t('generic.labware_type')} + {labwareDefDisplayName}
    - {i18n.t('form.generic.nickname')} + {t('generic.nickname')}
    diff --git a/protocol-designer/src/components/IngredientsList/LabwareDetailsCard/index.ts b/protocol-designer/src/components/IngredientsList/LabwareDetailsCard/index.ts deleted file mode 100644 index 8ac97d61f02..00000000000 --- a/protocol-designer/src/components/IngredientsList/LabwareDetailsCard/index.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { connect } from 'react-redux' -import assert from 'assert' -import { getLabwareDisplayName } from '@opentrons/shared-data' -import { - LabwareDetailsCard as LabwareDetailsCardComponent, - Props as LabwareDetailsCardProps, -} from './LabwareDetailsCard' -import { selectors as stepFormSelectors } from '../../../step-forms' -import { selectors as uiLabwareSelectors } from '../../../ui/labware' -import { selectors as labwareIngredSelectors } from '../../../labware-ingred/selectors' -import * as labwareIngredActions from '../../../labware-ingred/actions' -import { BaseState, ThunkDispatch } from '../../../types' -type SP = Omit & { - _labwareId?: string -} - -function mapStateToProps(state: BaseState): SP { - const labwareNicknamesById = uiLabwareSelectors.getLabwareNicknamesById(state) - const labwareId = labwareIngredSelectors.getSelectedLabwareId(state) - const labwareDefDisplayName = - labwareId && - getLabwareDisplayName( - stepFormSelectors.getLabwareEntities(state)[labwareId].def - ) - assert( - labwareId, - 'Expected labware id to exist in connected labware details card' - ) - - if (!labwareId || !labwareDefDisplayName) { - return { - labwareDefDisplayName: '?', - nickname: '?', - } - } - - return { - labwareDefDisplayName, - nickname: labwareNicknamesById[labwareId] || 'Unnamed Labware', - _labwareId: labwareId, - } -} - -function mergeProps( - stateProps: SP, - dispatchProps: { - dispatch: ThunkDispatch - } -): LabwareDetailsCardProps { - const dispatch = dispatchProps.dispatch - const { _labwareId, ...passThruProps } = stateProps - - const renameLabware = (name: string): void => { - assert( - _labwareId, - 'renameLabware in LabwareDetailsCard expected a labwareId' - ) - - if (_labwareId) { - dispatch( - labwareIngredActions.renameLabware({ - labwareId: _labwareId, - name, - }) - ) - } - } - - return { ...passThruProps, renameLabware } -} - -export const LabwareDetailsCard = connect( - mapStateToProps, - // @ts-expect-error(sa, 2021-6-21): TODO: refactor to use hooks api - null, - mergeProps -)(LabwareDetailsCardComponent) diff --git a/protocol-designer/src/components/IngredientsList/index.tsx b/protocol-designer/src/components/IngredientsList/index.tsx index aa296c4a212..a176bed676e 100644 --- a/protocol-designer/src/components/IngredientsList/index.tsx +++ b/protocol-designer/src/components/IngredientsList/index.tsx @@ -1,18 +1,23 @@ // TODO: Ian 2018-10-09 figure out what belongs in LiquidsSidebar vs IngredientsList after #2427 import * as React from 'react' -import { useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' +import { useDispatch, useSelector } from 'react-redux' import { SingleLabwareLiquidState } from '@opentrons/step-generation' import { IconButton, SidePanel, truncateString } from '@opentrons/components' import { sortWells } from '@opentrons/shared-data' -import { i18n } from '../../localization' -import { selectors } from '../../labware-ingred/selectors' +import * as wellSelectionSelectors from '../../top-selectors/well-contents' +import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' import { PDTitledList, PDListItem } from '../lists' import { TitledListNotes } from '../TitledListNotes' import { swatchColors } from '../swatchColors' -import { LabwareDetailsCard } from './LabwareDetailsCard' -import { LiquidGroupsById, LiquidGroup } from '../../labware-ingred/types' +import { LabwareDetailsCard } from './LabwareDetailsCard/LabwareDetailsCard' + import styles from './IngredientsList.css' +import type { SelectedContainerId } from '../../labware-ingred/reducers' +import type { LiquidGroup } from '../../labware-ingred/types' +import type { ThunkDispatch } from '../../types' + type RemoveWellsContents = (args: { liquidGroupId: string wells: string[] @@ -38,7 +43,7 @@ const LiquidGroupCard = (props: LiquidGroupCardProps): JSX.Element | null => { groupId, labwareWellContents, } = props - + const { t } = useTranslation(['card', 'application']) const showName = ingredGroup.serialize const [expanded, setExpanded] = React.useState(true) @@ -48,7 +53,9 @@ const LiquidGroupCard = (props: LiquidGroupCardProps): JSX.Element | null => { const wellsWithIngred = Object.keys(labwareWellContents) .sort(sortWells) .filter(well => labwareWellContents[well][groupId]) - const liquidDisplayColors = useSelector(selectors.getLiquidDisplayColors) + const liquidDisplayColors = useSelector( + labwareIngredSelectors.getLiquidDisplayColors + ) if (wellsWithIngred.length < 1) { // do not show liquid card if it has no instances for this labware @@ -58,7 +65,7 @@ const LiquidGroupCard = (props: LiquidGroupCardProps): JSX.Element | null => { ingredGroup.name != null ? truncateString(ingredGroup.name, 25) : null return ( { description={} > - {i18n.t('card.well')} - {i18n.t('application.units.microliter')} - {showName && {i18n.t('card.name')}} + {t('well')} + {t('application:units.microliter')} + {showName && {t('name')}} @@ -125,22 +132,18 @@ function IngredIndividual(props: IndividProps): JSX.Element { groupId, removeWellsContents, } = props - + const { t } = useTranslation('application') return ( {wellName} - - {volume ? volume + ` ${i18n.t('application.units.microliter')}` : '-'} - + {volume ? volume + ` ${t('units.microliter')}` : '-'} {name && {name}} {canDelete && ( - window.confirm( - `Are you sure you want to delete well ${wellName} ?` - ) && + window.confirm(t('are_you_sure_delete_well', { well: wellName })) && removeWellsContents({ liquidGroupId: groupId, wells: [wellName] }) } /> @@ -149,28 +152,41 @@ function IngredIndividual(props: IndividProps): JSX.Element { ) } -type Props = CommonProps & { - liquidGroupsById: LiquidGroupsById - labwareWellContents: SingleLabwareLiquidState - selectedIngredientGroupId?: string | null -} - -export function IngredientsList(props: Props): JSX.Element { - const { - labwareWellContents, - liquidGroupsById, - removeWellsContents, - selectedIngredientGroupId, - } = props +export function IngredientsList(): JSX.Element { + const selectedLabwareId = useSelector( + labwareIngredSelectors.getSelectedLabwareId + ) + const allLabwareWellContents = useSelector( + labwareIngredSelectors.getLiquidsByLabwareId + ) + const liquidGroupsById = useSelector( + labwareIngredSelectors.getLiquidGroupsById + ) + const selectedIngredientGroupId = useSelector( + wellSelectionSelectors.getSelectedWellsCommonIngredId + ) + const { t } = useTranslation('nav') + const dispatch = useDispatch>() + + const labwareWellContents = + (selectedLabwareId && allLabwareWellContents[selectedLabwareId]) || {} + + const removeWellsContents = ( + labwareId?: SelectedContainerId | null + ): void => { + if (labwareId != null) { + dispatch(removeWellsContents(selectedLabwareId)) + } + } return ( - + {Object.keys(liquidGroupsById).map(groupIdForCard => ( removeWellsContents(selectedLabwareId)} labwareWellContents={labwareWellContents} ingredGroup={liquidGroupsById[groupIdForCard]} groupId={groupIdForCard} diff --git a/protocol-designer/src/components/KnowledgeBaseLink/index.tsx b/protocol-designer/src/components/KnowledgeBaseLink/index.tsx index d69b29d88ec..31fbefe73cd 100644 --- a/protocol-designer/src/components/KnowledgeBaseLink/index.tsx +++ b/protocol-designer/src/components/KnowledgeBaseLink/index.tsx @@ -6,7 +6,7 @@ export const KNOWLEDGEBASE_ROOT_URL = export const links = { airGap: `https://support.opentrons.com/en/articles/4398106-air-gap`, multiDispense: `https://support.opentrons.com/en/articles/4170341-paths`, - protocolSteps: `https://support.opentrons.com/en/collections/493886-protocol-designer#building-a-protocol-steps`, + protocolSteps: `https://support.opentrons.com/s/protocol-designer?tabset-92ba3=2`, customLabware: `https://support.opentrons.com/en/articles/3136504-creating-custom-labware-definitions`, recommendedLabware: 'https://support.opentrons.com/s/article/What-labware-can-I-use-with-my-modules', diff --git a/protocol-designer/src/components/LabwareSelectionModal/LabwareItem.tsx b/protocol-designer/src/components/LabwareSelectionModal/LabwareItem.tsx index 593502bc209..47a3a4b82ac 100644 --- a/protocol-designer/src/components/LabwareSelectionModal/LabwareItem.tsx +++ b/protocol-designer/src/components/LabwareSelectionModal/LabwareItem.tsx @@ -1,6 +1,6 @@ import * as React from 'react' +import { useTranslation } from 'react-i18next' import cx from 'classnames' -import { i18n } from '../../localization' import { Icon, IconName } from '@opentrons/components' import { PDListItem } from '../lists' import styles from './styles.css' @@ -31,7 +31,7 @@ export function LabwareItem(props: Props): JSX.Element { onMouseEnter, selectLabware, } = props - + const { t } = useTranslation('modal') const displayName = getLabwareDisplayName(labwareDef) const labwareURI = getLabwareDefURI(labwareDef) const labwareLoadName = labwareDef.parameters.loadName @@ -61,7 +61,7 @@ export function LabwareItem(props: Props): JSX.Element { href={`${LABWARE_LIBRARY_PAGE_PATH}/${labwareLoadName}`} onClick={e => e.stopPropagation()} > - {i18n.t('modal.labware_selection.view_measurements')} + {t('labware_selection.view_measurements')} ) : null} diff --git a/protocol-designer/src/components/LabwareSelectionModal/LabwarePreview.tsx b/protocol-designer/src/components/LabwareSelectionModal/LabwarePreview.tsx index d215fd807c8..2f89d6efde1 100644 --- a/protocol-designer/src/components/LabwareSelectionModal/LabwarePreview.tsx +++ b/protocol-designer/src/components/LabwareSelectionModal/LabwarePreview.tsx @@ -1,5 +1,6 @@ import * as React from 'react' import reduce from 'lodash/reduce' +import { useTranslation } from 'react-i18next' import { Icon, LabwareRender, @@ -11,7 +12,6 @@ import { getLabwareDefIsStandard, LabwareDefinition2, } from '@opentrons/shared-data' -import { i18n } from '../../localization' import styles from './styles.css' interface Props { @@ -25,6 +25,7 @@ interface Props { export const LabwarePreview = (props: Props): JSX.Element | null => { const { labwareDef, moduleCompatibility } = props + const { t } = useTranslation(['modal', 'application']) if (!labwareDef) return null const maxVolumes = reduce( labwareDef.wells, @@ -32,7 +33,7 @@ export const LabwarePreview = (props: Props): JSX.Element | null => { new Set() ) const formattedVolumes = Array.from(maxVolumes) - .map(vol => `${vol}${i18n.t('application.units.microliter')}`) + .map(vol => `${vol}${t('application:units.microliter')}`) .join(', ') // NOTE: this is a temporary magic value that positions the preview component @@ -51,9 +52,7 @@ export const LabwarePreview = (props: Props): JSX.Element | null => { {moduleCompatibility === 'recommended' ? ( ) : null} - {i18n.t( - `modal.labware_selection.module_compatibility.${moduleCompatibility}` - )} + {t(`labware_selection.module_compatibility.${moduleCompatibility}`)}
    ) : null}
    @@ -67,17 +66,17 @@ export const LabwarePreview = (props: Props): JSX.Element | null => {
    {getLabwareDefIsStandard(labwareDef) && ( )}
    diff --git a/protocol-designer/src/components/LabwareSelectionModal/LabwareSelectionModal.tsx b/protocol-designer/src/components/LabwareSelectionModal/LabwareSelectionModal.tsx index ae0ca3006eb..134a6fd33ea 100644 --- a/protocol-designer/src/components/LabwareSelectionModal/LabwareSelectionModal.tsx +++ b/protocol-designer/src/components/LabwareSelectionModal/LabwareSelectionModal.tsx @@ -1,4 +1,6 @@ import * as React from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' import startCase from 'lodash/startCase' import reduce from 'lodash/reduce' import { @@ -19,13 +21,29 @@ import { MAX_LABWARE_HEIGHT_EAST_WEST_HEATER_SHAKER_MM, LabwareDefinition2, ModuleType, + ModuleModel, + getModuleType, + THERMOCYCLER_MODULE_V2, + getAreSlotsHorizontallyAdjacent, } from '@opentrons/shared-data' -import { i18n } from '../../localization' +import { + closeLabwareSelector, + createContainer, +} from '../../labware-ingred/actions' +import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' +import { + actions as labwareDefActions, + selectors as labwareDefSelectors, +} from '../../labware-defs' +import { selectors as stepFormSelectors, ModuleOnDeck } from '../../step-forms' import { SPAN7_8_10_11_SLOT } from '../../constants' import { getLabwareIsCompatible as _getLabwareIsCompatible, getLabwareCompatibleWithAdapter, + ADAPTER_96_CHANNEL, } from '../../utils/labwareModuleCompatibility' +import { getPipetteEntities } from '../../step-forms/selectors' +import { getHas96Channel } from '../../utils' import { getOnlyLatestDefs } from '../../labware-defs/utils' import { Portal } from '../portals/TopPortal' import { PDTitledList } from '../lists' @@ -34,8 +52,9 @@ import { KnowledgeBaseLink } from '../KnowledgeBaseLink' import { LabwareItem } from './LabwareItem' import { LabwarePreview } from './LabwarePreview' import styles from './styles.css' -import { DeckSlot } from '../../types' -import { LabwareDefByDefURI } from '../../labware-defs' + +import type { DeckSlot, ThunkDispatch } from '../../types' +import type { LabwareDefByDefURI } from '../../labware-defs' export interface Props { onClose: (e?: any) => unknown @@ -46,11 +65,12 @@ export interface Props { slot?: DeckSlot | null /** if adding to a module, the slot of the parent (for display) */ parentSlot?: DeckSlot | null - /** if adding to a module, the module's type */ - moduleType?: ModuleType | null + /** if adding to a module, the module's model */ + moduleModel?: ModuleModel | null /** tipracks that may be added to deck (depends on pipette<>tiprack assignment) */ permittedTipracks: string[] isNextToHeaterShaker: boolean + has96Channel: boolean adapterLoadName?: string } @@ -85,7 +105,10 @@ const RECOMMENDED_LABWARE_BY_MODULE: { [K in ModuleType]: string[] } = { 'nest_96_wellplate_2ml_deep', 'opentrons_96_wellplate_200ul_pcr_full_skirt', ], - [THERMOCYCLER_MODULE_TYPE]: ['nest_96_wellplate_100ul_pcr_full_skirt'], + [THERMOCYCLER_MODULE_TYPE]: [ + 'nest_96_wellplate_100ul_pcr_full_skirt', + 'opentrons_96_wellplate_200ul_pcr_full_skirt', + ], [HEATERSHAKER_MODULE_TYPE]: [ 'opentrons_96_deep_well_adapter', 'opentrons_96_flat_bottom_adapter', @@ -101,28 +124,81 @@ const RECOMMENDED_LABWARE_BY_MODULE: { [K in ModuleType]: string[] } = { export const getLabwareIsRecommended = ( def: LabwareDefinition2, - moduleType?: ModuleType | null -): boolean => - moduleType - ? RECOMMENDED_LABWARE_BY_MODULE[moduleType].includes( - def.parameters.loadName + moduleModel?: ModuleModel | null +): boolean => { + // special-casing the thermocycler module V2 recommended labware + // since its different from V1 + const moduleType = moduleModel != null ? getModuleType(moduleModel) : null + if (moduleModel === THERMOCYCLER_MODULE_V2) { + return ( + def.parameters.loadName === 'opentrons_96_wellplate_200ul_pcr_full_skirt' + ) + } else { + return moduleType != null + ? RECOMMENDED_LABWARE_BY_MODULE[moduleType].includes( + def.parameters.loadName + ) + : false + } +} +export function LabwareSelectionModal(): JSX.Element | null { + const { t } = useTranslation(['modules', 'modal', 'button', 'alert']) + const dispatch = useDispatch>() + const selectedLabwareSlot = useSelector( + labwareIngredSelectors.selectedAddLabwareSlot + ) + const pipetteEntities = useSelector(getPipetteEntities) + const permittedTipracks = useSelector(stepFormSelectors.getPermittedTipracks) + const customLabwareDefs = useSelector( + labwareDefSelectors.getCustomLabwareDefsByURI + ) + const deckSetup = useSelector(stepFormSelectors.getInitialDeckSetup) + const has96Channel = getHas96Channel(pipetteEntities) + const modulesById = deckSetup.modules + const labwareById = deckSetup.labware + const slot = selectedLabwareSlot === false ? null : selectedLabwareSlot + + const onClose = (): void => { + dispatch(closeLabwareSelector()) + } + const selectLabware = (labwareDefURI: string): void => { + if (slot) { + dispatch( + createContainer({ + slot: slot, + labwareDefURI, + }) ) - : false - -export const LabwareSelectionModal = (props: Props): JSX.Element | null => { - const { - customLabwareDefs, - permittedTipracks, - onClose, - onUploadLabware, - slot, - parentSlot, - moduleType, - selectLabware, - isNextToHeaterShaker, - adapterLoadName, - } = props + } + } + + const onUploadLabware = ( + fileChangeEvent: React.ChangeEvent + ): void => { + dispatch(labwareDefActions.createCustomLabwareDef(fileChangeEvent)) + } + + const initialModules: ModuleOnDeck[] = Object.keys(modulesById).map( + moduleId => modulesById[moduleId] + ) + const parentModule = + (slot != null && + initialModules.find(moduleOnDeck => moduleOnDeck.id === slot)) || + null + const parentSlot = parentModule != null ? parentModule.slot : null + const moduleModel = parentModule != null ? parentModule.model : null + const isNextToHeaterShaker = initialModules.some( + hardwareModule => + hardwareModule.type === HEATERSHAKER_MODULE_TYPE && + getAreSlotsHorizontallyAdjacent(hardwareModule.slot, parentSlot ?? slot) + ) + const adapterLoadName = Object.values(labwareById) + .filter(labwareOnDeck => slot === labwareOnDeck.id) + .map(labwareOnDeck => labwareOnDeck.def.parameters.loadName)[0] + const defs = getOnlyLatestDefs() + const moduleType = moduleModel != null ? getModuleType(moduleModel) : null + const URIs = Object.keys(defs) const [selectedCategory, setSelectedCategory] = React.useState( null ) @@ -132,14 +208,16 @@ export const LabwareSelectionModal = (props: Props): JSX.Element | null => { const [filterRecommended, setFilterRecommended] = React.useState( false ) + const [filterHeight, setFilterHeight] = React.useState(false) const [enqueuedLabwareType, setEnqueuedLabwareType] = React.useState< string | null >(null) + const blockingCustomLabwareHint = useBlockingHint({ enabled: enqueuedLabwareType !== null, hintKey: 'custom_labware_with_modules', - content:

    {i18n.t(`alert.hint.custom_labware_with_modules.body`)}

    , + content:

    {t(`alert:hint.custom_labware_with_modules.body`)}

    , handleCancel: () => setEnqueuedLabwareType(null), handleContinue: () => { setEnqueuedLabwareType(null) @@ -186,29 +264,38 @@ export const LabwareSelectionModal = (props: Props): JSX.Element | null => { const getIsLabwareFiltered = React.useCallback( (labwareDef: LabwareDefinition2) => { - const smallXDimension = labwareDef.dimensions.xDimension < 127.75 - const smallYDimension = labwareDef.dimensions.yDimension < 85.48 - const irregularSize = smallXDimension && smallYDimension - const adapter = labwareDef.metadata.displayCategory === 'adapter' + const { dimensions, parameters } = labwareDef + const { xDimension, yDimension } = dimensions + + const isSmallXDimension = xDimension < 127.75 + const isSmallYDimension = yDimension < 85.48 + const isIrregularSize = isSmallXDimension && isSmallYDimension + + const isAdapter = labwareDef.allowedRoles?.includes('adapter') + const isAdapter96Channel = parameters.loadName === ADAPTER_96_CHANNEL return ( (filterRecommended && - !getLabwareIsRecommended(labwareDef, moduleType)) || + !getLabwareIsRecommended(labwareDef, moduleModel)) || (filterHeight && getIsLabwareAboveHeight( labwareDef, MAX_LABWARE_HEIGHT_EAST_WEST_HEATER_SHAKER_MM )) || !getLabwareCompatible(labwareDef) || - (adapter && irregularSize && !slot?.includes(HEATERSHAKER_MODULE_TYPE)) + (isAdapter && + isIrregularSize && + !slot?.includes(HEATERSHAKER_MODULE_TYPE)) || + (isAdapter96Channel && !has96Channel) || + (slot === 'offDeck' && isAdapter) ) }, [filterRecommended, filterHeight, getLabwareCompatible, moduleType, slot] ) const getTitleText = (): string => { if (isNextToHeaterShaker) { - return `Slot ${slot}, Labware to the side of ${i18n.t( - `modules.module_long_names.heaterShakerModuleType` + return `Slot ${slot}, Labware to the side of ${t( + `module_long_names.heaterShakerModuleType` )}` } if (adapterLoadName != null) { @@ -219,13 +306,31 @@ export const LabwareSelectionModal = (props: Props): JSX.Element | null => { return `Labware on top of the ${adapterDisplayName}` } if (parentSlot != null && moduleType != null) { - return `Slot ${ - parentSlot === SPAN7_8_10_11_SLOT ? '7' : parentSlot - }, ${i18n.t(`modules.module_long_names.${moduleType}`)} Labware` + return `Slot ${parentSlot === SPAN7_8_10_11_SLOT ? '7' : parentSlot}, ${t( + `module_long_names.${moduleType}` + )} Labware` } return `Slot ${slot} Labware` } + const getLabwareAdapterItem = ( + index: number, + labwareDefUri?: string + ): JSX.Element | null => { + const labwareDef = labwareDefUri != null ? defs[labwareDefUri] : null + return labwareDef != null ? ( + setPreviewedLabware(labwareDef)} + // @ts-expect-error(sa, 2021-6-22): setPreviewedLabware expects an argument (even if nullsy) + onMouseLeave={() => setPreviewedLabware()} + /> + ) : null + } + const customLabwareURIs: string[] = React.useMemo( () => Object.keys(customLabwareDefs), [customLabwareDefs] @@ -239,13 +344,10 @@ export const LabwareSelectionModal = (props: Props): JSX.Element | null => { defs, (acc, def: typeof defs[keyof typeof defs]) => { const category: string = def.metadata.displayCategory - // filter out non-permitted tipracks + - // temporarily filtering out 96-channel adapter until we support - // 96-channel + // filter out non-permitted tipracks if ( - (category === 'tipRack' && - !permittedTipracks.includes(getLabwareDefURI(def))) || - def.parameters.loadName === 'opentrons_flex_96_tiprack_adapter' + category === 'tipRack' && + !permittedTipracks.includes(getLabwareDefURI(def)) ) { return acc } @@ -311,10 +413,10 @@ export const LabwareSelectionModal = (props: Props): JSX.Element | null => { )} - {i18n.t( + {t( isNextToHeaterShaker - ? 'modal.labware_selection.heater_shaker_labware_filter' - : 'modal.labware_selection.recommended_labware_filter' + ? 'modal:labware_selection.heater_shaker_labware_filter' + : 'modal:labware_selection.recommended_labware_filter' )}{' '} { typeof LabwarePreview >['moduleCompatibility'] = null if (previewedLabware && moduleType) { - if (getLabwareIsRecommended(previewedLabware, moduleType)) { + if (getLabwareIsRecommended(previewedLabware, moduleModel)) { moduleCompatibility = 'recommended' } else if (getLabwareCompatible(previewedLabware)) { moduleCompatibility = 'potentiallyCompatible' @@ -343,6 +445,7 @@ export const LabwareSelectionModal = (props: Props): JSX.Element | null => { moduleCompatibility = 'notCompatible' } } + return ( <> @@ -352,7 +455,11 @@ export const LabwareSelectionModal = (props: Props): JSX.Element | null => { /> {blockingCustomLabwareHint} -
    +
    {getTitleText()}
    {getFilterCheckbox()}
      @@ -397,7 +504,7 @@ export const LabwareSelectionModal = (props: Props): JSX.Element | null => { { }) ) : ( { onClick={makeToggleCategory(adapterCompatibleLabware)} inert={false} > - {getLabwareCompatibleWithAdapter(adapterLoadName).map( - (adapterDefUri, index) => { - const latestDefs = getOnlyLatestDefs() - const Uris = Object.keys(latestDefs) - const labwareDefUri = Uris.find( - defUri => defUri === adapterDefUri - ) - const labwareDef = labwareDefUri - ? latestDefs[labwareDefUri] - : null - - return labwareDef != null ? ( - setPreviewedLabware(labwareDef)} - // @ts-expect-error(sa, 2021-6-22): setPreviewedLabware expects an argument (even if nullsy) - onMouseLeave={() => setPreviewedLabware()} - /> - ) : null - } - )} + {has96Channel && adapterLoadName === ADAPTER_96_CHANNEL + ? permittedTipracks.map((tiprackDefUri, index) => { + const labwareDefUri = URIs.find( + defUri => defUri === tiprackDefUri + ) + return getLabwareAdapterItem(index, labwareDefUri) + }) + : getLabwareCompatibleWithAdapter(adapterLoadName).map( + (adapterDefUri, index) => { + const labwareDefUri = URIs.find( + defUri => defUri === adapterDefUri + ) + return getLabwareAdapterItem(index, labwareDefUri) + } + )} )}
    - {i18n.t('button.upload_custom_labware')} + {t('button:upload_custom_labware')} { @@ -462,7 +561,7 @@ export const LabwareSelectionModal = (props: Props): JSX.Element | null => { />
    - {i18n.t('modal.labware_selection.creating_labware_defs')}{' '} + {t('modal:labware_selection.creating_labware_defs')}{' '} {/* TODO: Ian 2019-10-15 use LinkOut component once it's in components library, see Opentrons/opentrons#4229 */} { .
    - - {i18n.t('button.close')} - + {t('button:close')}
    ) diff --git a/protocol-designer/src/components/LabwareSelectionModal/__tests__/LabwareSelectionModal.test.tsx b/protocol-designer/src/components/LabwareSelectionModal/__tests__/LabwareSelectionModal.test.tsx index 6eed36b3d7f..c17c2ad42d7 100644 --- a/protocol-designer/src/components/LabwareSelectionModal/__tests__/LabwareSelectionModal.test.tsx +++ b/protocol-designer/src/components/LabwareSelectionModal/__tests__/LabwareSelectionModal.test.tsx @@ -1,13 +1,31 @@ import * as React from 'react' -import i18next from 'i18next' -import { renderWithProviders } from '@opentrons/components' +import { fireEvent, screen } from '@testing-library/react' +import { renderWithProviders, nestedTextMatcher } from '@opentrons/components' import { getIsLabwareAboveHeight, MAX_LABWARE_HEIGHT_EAST_WEST_HEATER_SHAKER_MM, } from '@opentrons/shared-data' +import { selectors as labwareIngredSelectors } from '../../../labware-ingred/selectors' +import { + ADAPTER_96_CHANNEL, + getLabwareCompatibleWithAdapter, +} from '../../../utils/labwareModuleCompatibility' +import { i18n } from '../../../localization' import { LabwareSelectionModal } from '../LabwareSelectionModal' +import { + getInitialDeckSetup, + getPermittedTipracks, + getPipetteEntities, +} from '../../../step-forms/selectors' +import { getHas96Channel } from '../../../utils' +import { getCustomLabwareDefsByURI } from '../../../labware-defs/selectors' +jest.mock('../../../utils/labwareModuleCompatibility') +jest.mock('../../../step-forms/selectors') +jest.mock('../../../labware-defs/selectors') jest.mock('../../Hints/useBlockingHint') +jest.mock('../../../utils') +jest.mock('../../../labware-ingred/selectors') jest.mock('@opentrons/shared-data', () => { const actualSharedData = jest.requireActual('@opentrons/shared-data') return { @@ -19,36 +37,104 @@ jest.mock('@opentrons/shared-data', () => { const mockGetIsLabwareAboveHeight = getIsLabwareAboveHeight as jest.MockedFunction< typeof getIsLabwareAboveHeight > - -const render = (props: React.ComponentProps) => { - return renderWithProviders(, { - i18nInstance: i18next, +const mockGetLabwareCompatibleWithAdapter = getLabwareCompatibleWithAdapter as jest.MockedFunction< + typeof getLabwareCompatibleWithAdapter +> +const mockGetInitialDeckSetup = getInitialDeckSetup as jest.MockedFunction< + typeof getInitialDeckSetup +> +const mockSlot = labwareIngredSelectors.selectedAddLabwareSlot as jest.MockedFunction< + typeof labwareIngredSelectors.selectedAddLabwareSlot +> +const mockGetHas96Channel = getHas96Channel as jest.MockedFunction< + typeof getHas96Channel +> +const mockGetPipetteEntities = getPipetteEntities as jest.MockedFunction< + typeof getPipetteEntities +> +const mockGetPermittedTipracks = getPermittedTipracks as jest.MockedFunction< + typeof getPermittedTipracks +> +const mockGetCustomLabwareDefsByURI = getCustomLabwareDefsByURI as jest.MockedFunction< + typeof getCustomLabwareDefsByURI +> +const render = () => { + return renderWithProviders(, { + i18nInstance: i18n, })[0] } +const mockTipUri = 'fixture/fixture_tiprack_1000_ul/1' +const mockPermittedTipracks = [mockTipUri] + describe('LabwareSelectionModal', () => { - let props: React.ComponentProps beforeEach(() => { - props = { - onClose: jest.fn(), - onUploadLabware: jest.fn(), - selectLabware: jest.fn(), - customLabwareDefs: {}, - permittedTipracks: [], - isNextToHeaterShaker: false, - } + mockGetLabwareCompatibleWithAdapter.mockReturnValue([]) + mockGetInitialDeckSetup.mockReturnValue({ + labware: {}, + modules: {}, + pipettes: {}, + additionalEquipmentOnDeck: {}, + }) + mockSlot.mockReturnValue('2') + mockGetHas96Channel.mockReturnValue(false) + mockGetPermittedTipracks.mockReturnValue(mockPermittedTipracks) + mockGetPipetteEntities.mockReturnValue({ + mockPip: { + tiprackLabwareDef: {} as any, + spec: {} as any, + name: 'p1000_single', + id: 'mockId', + tiprackDefURI: mockTipUri, + }, + }) + mockGetCustomLabwareDefsByURI.mockReturnValue({}) }) it('should NOT filter out labware above 57 mm when the slot is NOT next to a heater shaker', () => { - props.isNextToHeaterShaker = false - render(props) + render() expect(mockGetIsLabwareAboveHeight).not.toHaveBeenCalled() }) it('should filter out labware above 57 mm when the slot is next to a heater shaker', () => { - props.isNextToHeaterShaker = true - render(props) + mockGetInitialDeckSetup.mockReturnValue({ + labware: {}, + modules: { + heaterShaker: { + id: 'mockId', + type: 'heaterShakerModuleType', + model: 'heaterShakerModuleV1', + moduleState: {} as any, + slot: '1', + } as any, + }, + pipettes: {}, + additionalEquipmentOnDeck: {}, + }) + render() expect(mockGetIsLabwareAboveHeight).toHaveBeenCalledWith( expect.any(Object), MAX_LABWARE_HEIGHT_EAST_WEST_HEATER_SHAKER_MM ) }) + it('should display only permitted tipracks if the 96-channel is attached', () => { + mockGetHas96Channel.mockReturnValue(true) + mockSlot.mockReturnValue('adapter') + mockGetInitialDeckSetup.mockReturnValue({ + labware: { + adapter: { + id: 'adapter', + labwareDefURI: `opentrons/${ADAPTER_96_CHANNEL}/1`, + slot: 'A2', + def: { parameters: { loadName: ADAPTER_96_CHANNEL } } as any, + }, + }, + modules: {}, + pipettes: {}, + additionalEquipmentOnDeck: {}, + }) + render() + fireEvent.click( + screen.getByText(nestedTextMatcher('adapter compatible labware')) + ) + screen.getByText('Opentrons GEB 1000uL Tiprack') + }) }) diff --git a/protocol-designer/src/components/LabwareSelectionModal/index.ts b/protocol-designer/src/components/LabwareSelectionModal/index.ts deleted file mode 100644 index 7e227953f55..00000000000 --- a/protocol-designer/src/components/LabwareSelectionModal/index.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { connect } from 'react-redux' -import { - getAreSlotsHorizontallyAdjacent, - HEATERSHAKER_MODULE_TYPE, -} from '@opentrons/shared-data' -import { - LabwareSelectionModal as LabwareSelectionModalComponent, - Props as LabwareSelectionModalProps, -} from './LabwareSelectionModal' -import { - closeLabwareSelector, - createContainer, -} from '../../labware-ingred/actions' -import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' -import { - actions as labwareDefActions, - selectors as labwareDefSelectors, -} from '../../labware-defs' -import { selectors as stepFormSelectors, ModuleOnDeck } from '../../step-forms' -import { BaseState, ThunkDispatch } from '../../types' -interface SP { - customLabwareDefs: LabwareSelectionModalProps['customLabwareDefs'] - slot: LabwareSelectionModalProps['slot'] - parentSlot: LabwareSelectionModalProps['parentSlot'] - moduleType: LabwareSelectionModalProps['moduleType'] - permittedTipracks: LabwareSelectionModalProps['permittedTipracks'] - isNextToHeaterShaker: boolean - adapterLoadName?: string -} - -function mapStateToProps(state: BaseState): SP { - const slot = labwareIngredSelectors.selectedAddLabwareSlot(state) || null - // TODO: Ian 2019-10-29 needs revisit to support multiple manualIntervention steps - const modulesById = stepFormSelectors.getInitialDeckSetup(state).modules - const initialModules: ModuleOnDeck[] = Object.keys(modulesById).map( - moduleId => modulesById[moduleId] - ) - const labwareById = stepFormSelectors.getInitialDeckSetup(state).labware - const parentModule = - (slot != null && - initialModules.find(moduleOnDeck => moduleOnDeck.id === slot)) || - null - const parentSlot = parentModule != null ? parentModule.slot : null - const moduleType = parentModule != null ? parentModule.type : null - const isNextToHeaterShaker = initialModules.some( - hardwareModule => - hardwareModule.type === HEATERSHAKER_MODULE_TYPE && - getAreSlotsHorizontallyAdjacent(hardwareModule.slot, parentSlot ?? slot) - ) - const adapterLoadNameOnDeck = Object.values(labwareById) - .filter(labwareOnDeck => slot === labwareOnDeck.id) - .map(labwareOnDeck => labwareOnDeck.def.parameters.loadName)[0] - - return { - customLabwareDefs: labwareDefSelectors.getCustomLabwareDefsByURI(state), - slot, - parentSlot, - moduleType, - isNextToHeaterShaker, - permittedTipracks: stepFormSelectors.getPermittedTipracks(state), - adapterLoadName: adapterLoadNameOnDeck, - } -} - -function mergeProps( - stateProps: SP, - dispatchProps: { - dispatch: ThunkDispatch - } -): LabwareSelectionModalProps { - const dispatch = dispatchProps.dispatch - return { - ...stateProps, - onClose: () => { - dispatch(closeLabwareSelector()) - }, - onUploadLabware: fileChangeEvent => - dispatch(labwareDefActions.createCustomLabwareDef(fileChangeEvent)), - selectLabware: labwareDefURI => { - if (stateProps.slot) { - dispatch( - createContainer({ - slot: stateProps.slot, - labwareDefURI, - }) - ) - } - }, - } -} - -export const LabwareSelectionModal = connect( - mapStateToProps, - // @ts-expect-error(sa, 2021-6-21): TODO: refactor to use hooks api - null, - mergeProps -)(LabwareSelectionModalComponent) diff --git a/protocol-designer/src/components/LiquidPlacementForm/LiquidPlacementForm.tsx b/protocol-designer/src/components/LiquidPlacementForm/LiquidPlacementForm.tsx index 06b87c6e228..7ba0aa965ff 100644 --- a/protocol-designer/src/components/LiquidPlacementForm/LiquidPlacementForm.tsx +++ b/protocol-designer/src/components/LiquidPlacementForm/LiquidPlacementForm.tsx @@ -1,17 +1,27 @@ import * as React from 'react' -import { Formik, FormikProps } from 'formik' -import * as Yup from 'yup' -// TODO: Ian 2018-10-19 move the processors out of steplist (chore) +import { Controller, useForm } from 'react-hook-form' +import isEmpty from 'lodash/isEmpty' +import { useTranslation } from 'react-i18next' +import { useSelector, useDispatch } from 'react-redux' +import assert from 'assert' +import * as wellContentsSelectors from '../../top-selectors/well-contents' import * as fieldProcessors from '../../steplist/fieldLevel/processing' import { DropdownField, - InputField, FormGroup, OutlineButton, DeprecatedPrimaryButton, - Options, + InputField, } from '@opentrons/components' -import { i18n } from '../../localization' +import { deselectAllWells } from '../../well-selection/actions' +import { + removeWellsContents, + setWellContents, +} from '../../labware-ingred/actions' +import { getSelectedWells } from '../../well-selection/selectors' + +import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' + import styles from './LiquidPlacementForm.css' import formStyles from '../forms/forms.css' import stepEditFormStyles from '../StepEditForm/StepEditForm.css' @@ -20,160 +30,220 @@ interface ValidFormValues { selectedLiquidId: string volume: string } - -export interface LiquidPlacementFormValues { +interface LiquidPlacementFormValues { selectedLiquidId?: string | null volume?: string | null } -export interface Props { - commonSelectedLiquidId?: string | null - commonSelectedVolume?: number | null - liquidSelectionOptions: Options - selectedWellsMaxVolume: number - showForm: boolean +export const LiquidPlacementForm = (): JSX.Element | null => { + const { t } = useTranslation(['form', 'button', 'application']) + const selectedWellGroups = useSelector(getSelectedWells) + const selectedWells = Object.keys(selectedWellGroups) + const showForm = !isEmpty(selectedWellGroups) + const dispatch = useDispatch() + const labwareId = useSelector(labwareIngredSelectors.getSelectedLabwareId) + const liquidLocations = useSelector( + labwareIngredSelectors.getLiquidsByLabwareId + ) + const commonSelectedLiquidId = useSelector( + wellContentsSelectors.getSelectedWellsCommonIngredId + ) + const commonSelectedVolume = useSelector( + wellContentsSelectors.getSelectedWellsCommonVolume + ) + const selectedWellsMaxVolume = useSelector( + wellContentsSelectors.getSelectedWellsMaxVolume + ) + const liquidSelectionOptions = useSelector( + labwareIngredSelectors.getLiquidSelectionOptions + ) - cancelForm: () => unknown - clearWells: (() => unknown | null) | null - saveForm: (liquidPlacementFormValues: LiquidPlacementFormValues) => unknown -} + const selectionHasLiquids = Boolean( + labwareId && + liquidLocations[labwareId] && + Object.keys(selectedWellGroups).some( + well => liquidLocations[labwareId][well] + ) + ) -export class LiquidPlacementForm extends React.Component { - getInitialValues: () => ValidFormValues = () => { - const { commonSelectedLiquidId, commonSelectedVolume } = this.props + const getInitialValues: () => ValidFormValues = () => { return { selectedLiquidId: commonSelectedLiquidId || '', - volume: commonSelectedVolume != null ? String(commonSelectedVolume) : '', + volume: + commonSelectedVolume != null ? commonSelectedVolume.toString() : '', } } - getValidationSchema: () => Yup.Schema< - | { - selectedLiquidId: string - volume: number - } - | undefined, - any - > = () => { - const { selectedWellsMaxVolume } = this.props - return Yup.object().shape({ - selectedLiquidId: Yup.string().required( - i18n.t('form.generic.error.required', { - name: i18n.t('form.liquid_placement.liquid'), - }) - ), - volume: Yup.number() - .nullable() - .required( - i18n.t('form.generic.error.required', { - name: i18n.t('form.liquid_placement.volume'), - }) - ) - .moreThan(0, i18n.t('form.generic.error.more_than_zero')) - .max( - selectedWellsMaxVolume, - i18n.t('form.liquid_placement.volume_exceeded', { - volume: selectedWellsMaxVolume, - }) - ), - }) - } + const { + handleSubmit, + watch, + control, + setValue, + formState: { errors, touchedFields }, + } = useForm({ + defaultValues: getInitialValues(), + }) + + const selectedLiquidId = watch('selectedLiquidId') + const volume = watch('volume') - handleCancelForm: () => void = () => { - this.props.cancelForm() + const handleCancelForm = (): void => { + dispatch(deselectAllWells()) } - handleClearWells: () => void = () => { - this.props.clearWells && this.props.clearWells() + const handleClearWells: () => void = () => { + if (labwareId && selectedWells && selectionHasLiquids) { + if (global.confirm(t('application:are_you_sure'))) { + dispatch( + removeWellsContents({ + labwareId: labwareId, + wells: selectedWells, + }) + ) + } + } } - handleChangeVolume: ( - setFieldValue: (fieldName: string, value: unknown) => unknown - ) => (e: React.ChangeEvent) => void = setFieldValue => e => { + const handleChangeVolume: ( + e: React.ChangeEvent + ) => void = e => { const value: string | null | undefined = e.currentTarget.value const masked = fieldProcessors.composeMaskers( fieldProcessors.maskToFloat, fieldProcessors.onlyPositiveNumbers, fieldProcessors.trimDecimals(1) - )(value) - setFieldValue('volume', masked) + )(value) as string + setValue('volume', masked) + } + + const handleSaveForm = (values: LiquidPlacementFormValues): void => { + const volume = Number(values.volume) + const { selectedLiquidId } = values + assert( + labwareId != null, + 'when saving liquid placement form, expected a selected labware ID' + ) + assert( + selectedWells && selectedWells.length > 0, + `when saving liquid placement form, expected selected wells to be array with length > 0 but got ${String( + selectedWells + )}` + ) + assert( + selectedLiquidId != null, + `when saving liquid placement form, expected selectedLiquidId to be non-nullsy but got ${String( + selectedLiquidId + )}` + ) + assert( + volume > 0, + `when saving liquid placement form, expected volume > 0, got ${volume}` + ) + + if (labwareId != null && selectedLiquidId != null) { + dispatch( + setWellContents({ + liquidGroupId: selectedLiquidId, + labwareId: labwareId, + wells: selectedWells || [], + volume: Number(values.volume), + }) + ) + } } - handleSubmit: (values: LiquidPlacementFormValues) => void = values => { - this.props.saveForm(values) + const handleSaveSubmit: ( + values: LiquidPlacementFormValues + ) => void = values => { + handleSaveForm(values) } - render(): React.ReactNode | null { - const { liquidSelectionOptions, showForm } = this.props - if (!showForm) return null - return ( -
    - - {({ - handleBlur, - handleChange, - handleSubmit, - errors, - setFieldValue, - touched, - values, - }: FormikProps) => ( -
    -
    - - - - - - -
    - -
    - - {i18n.t('button.clear_wells')} - - - {i18n.t('button.cancel')} - - - {i18n.t('button.save')} - -
    -
    - )} -
    -
    - ) + if (!showForm) return null + + let volumeErrors: string | null = null + if (touchedFields.volume) { + if (volume == null || volume === '0') { + volumeErrors = t('generic.error.more_than_zero') + } else if (parseInt(volume) > selectedWellsMaxVolume) { + volumeErrors = t('liquid_placement.volume_exceeded', { + volume: selectedWellsMaxVolume, + }) + } } + + return ( +
    +
    +
    + + ( + + )} + /> + + + ( + + )} + /> + +
    + +
    + + {t('button:clear_wells')} + + + {t('button:cancel')} + + + {t('button:save')} + +
    +
    +
    + ) } diff --git a/protocol-designer/src/components/LiquidPlacementForm/index.ts b/protocol-designer/src/components/LiquidPlacementForm/index.ts deleted file mode 100644 index 9b140447f8e..00000000000 --- a/protocol-designer/src/components/LiquidPlacementForm/index.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { connect } from 'react-redux' -import assert from 'assert' -import isEmpty from 'lodash/isEmpty' -import { - removeWellsContents, - setWellContents, -} from '../../labware-ingred/actions' -import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' -import * as wellContentsSelectors from '../../top-selectors/well-contents' -import { getSelectedWells } from '../../well-selection/selectors' -import { deselectAllWells } from '../../well-selection/actions' -import { - LiquidPlacementForm as LiquidPlacementFormComponent, - Props as LiquidPlacementFormProps, - LiquidPlacementFormValues, -} from './LiquidPlacementForm' -import { Dispatch } from 'redux' -import { BaseState } from '../../types' -type SP = Omit< - LiquidPlacementFormProps & { - _labwareId?: string | null - _selectedWells?: string[] | null - _selectionHasLiquids: boolean - }, - 'cancelForm' | 'clearWells' | 'saveForm' -> - -function mapStateToProps(state: BaseState): SP { - const selectedWells = getSelectedWells(state) - - const _labwareId = labwareIngredSelectors.getSelectedLabwareId(state) - - const liquidLocations = labwareIngredSelectors.getLiquidsByLabwareId(state) - - const _selectionHasLiquids = Boolean( - _labwareId && - liquidLocations[_labwareId] && - Object.keys(selectedWells).some(well => liquidLocations[_labwareId][well]) - ) - - return { - commonSelectedLiquidId: wellContentsSelectors.getSelectedWellsCommonIngredId( - state - ), - commonSelectedVolume: wellContentsSelectors.getSelectedWellsCommonVolume( - state - ), - liquidSelectionOptions: labwareIngredSelectors.getLiquidSelectionOptions( - state - ), - showForm: !isEmpty(selectedWells), - selectedWellsMaxVolume: wellContentsSelectors.getSelectedWellsMaxVolume( - state - ), - _labwareId, - _selectedWells: Object.keys(selectedWells), - _selectionHasLiquids, - } -} - -function mergeProps( - stateProps: SP, - dispatchProps: { - dispatch: Dispatch - } -): LiquidPlacementFormProps { - const { - _labwareId, - _selectedWells, - _selectionHasLiquids, - ...passThruProps - } = stateProps - const { dispatch } = dispatchProps - const clearWells = - _labwareId && _selectedWells && _selectionHasLiquids - ? () => { - // TODO: Ian 2018-10-22 replace with modal later on if we like this UX - if ( - global.confirm( - 'Are you sure you want to remove liquids from all selected wells?' - ) - ) { - dispatch( - removeWellsContents({ - labwareId: _labwareId, - wells: _selectedWells, - }) - ) - } - } - : null - return { - ...passThruProps, - cancelForm: () => dispatch(deselectAllWells()), - clearWells, - saveForm: (values: LiquidPlacementFormValues) => { - const { selectedLiquidId } = values - const volume = Number(values.volume) - assert( - _labwareId != null, - 'when saving liquid placement form, expected a selected labware ID' - ) - assert( - _selectedWells && _selectedWells.length > 0, - `when saving liquid placement form, expected selected wells to be array with length > 0 but got ${String( - _selectedWells - )}` - ) - assert( - selectedLiquidId != null, - `when saving liquid placement form, expected selectedLiquidId to be non-nullsy but got ${String( - selectedLiquidId - )}` - ) - assert( - volume > 0, - `when saving liquid placement form, expected volume > 0, got ${volume}` - ) - - if (_labwareId != null && selectedLiquidId != null) { - dispatch( - setWellContents({ - liquidGroupId: selectedLiquidId, - labwareId: _labwareId, - wells: _selectedWells || [], - volume: Number(values.volume), - }) - ) - } - }, - } -} - -export const LiquidPlacementForm = connect( - mapStateToProps, - // @ts-expect-error(sa, 2021-6-21): TODO: refactor to use hooks api - null, - mergeProps -)(LiquidPlacementFormComponent) diff --git a/protocol-designer/src/components/LiquidPlacementModal.css b/protocol-designer/src/components/LiquidPlacementModal.css index 1eaf4b4303d..c267b35460d 100644 --- a/protocol-designer/src/components/LiquidPlacementModal.css +++ b/protocol-designer/src/components/LiquidPlacementModal.css @@ -9,7 +9,7 @@ @apply (--absolute-fill); background-color: rgba(0, 0, 0, 0.9); - z-index: 1; + z-index: 4; /* make up lost space for overlay */ height: 103%; diff --git a/protocol-designer/src/components/LiquidPlacementModal.tsx b/protocol-designer/src/components/LiquidPlacementModal.tsx index e3558a58ec4..da6724e5d33 100644 --- a/protocol-designer/src/components/LiquidPlacementModal.tsx +++ b/protocol-designer/src/components/LiquidPlacementModal.tsx @@ -1,139 +1,81 @@ -import assert from 'assert' import * as React from 'react' -import { connect } from 'react-redux' +import assert from 'assert' +import { useDispatch, useSelector } from 'react-redux' import cx from 'classnames' import isEmpty from 'lodash/isEmpty' import { WellGroup, WELL_LABEL_OPTIONS } from '@opentrons/components' + import { wellFillFromWellContents, SelectableLabware, } from '../components/labware' -import { LiquidPlacementForm } from '../components/LiquidPlacementForm' -import { WellSelectionInstructions } from './WellSelectionInstructions' - import { selectors } from '../labware-ingred/selectors' import { selectors as stepFormSelectors } from '../step-forms' import * as wellContentsSelectors from '../top-selectors/well-contents' import { getSelectedWells } from '../well-selection/selectors' import { selectWells, deselectWells } from '../well-selection/actions' +import { LiquidPlacementForm } from './LiquidPlacementForm/LiquidPlacementForm' +import { WellSelectionInstructions } from './WellSelectionInstructions' import styles from './LiquidPlacementModal.css' -import { Dispatch } from 'redux' -import { LabwareDefinition2 } from '@opentrons/shared-data' -import { BaseState } from '../types' -import { ContentsByWell } from '../labware-ingred/types' -import { WellIngredientNames } from '../steplist' - -interface SP { - selectedWells: WellGroup - wellContents: ContentsByWell - labwareDef?: LabwareDefinition2 | null - liquidNamesById: WellIngredientNames - liquidDisplayColors: string[] -} - -interface DP { - selectWells: (wellGroup: WellGroup) => unknown - deselectWells: (wellGroup: WellGroup) => unknown -} - -type Props = SP & DP - -interface State { - highlightedWells: WellGroup -} - -class LiquidPlacementModalComponent extends React.Component { - state = { highlightedWells: {} } - constructor(props: Props) { - super(props) - this.state = { highlightedWells: {} } - } - - updateHighlightedWells = (wells: WellGroup): void => { - this.setState({ highlightedWells: wells }) - } - - render(): JSX.Element { - const { labwareDef, selectedWells, liquidDisplayColors } = this.props - - return ( -
    - - - {labwareDef && ( -
    - -
    - )} - - -
    - ) - } -} - -const mapStateToProps = (state: BaseState): SP => { - const labwareId = selectors.getSelectedLabwareId(state) - const selectedWells = getSelectedWells(state) +export function LiquidPlacementModal(): JSX.Element { + const [highlightedWells, setHighlightedWells] = React.useState< + WellGroup | {} + >({}) + const labwareId = useSelector(selectors.getSelectedLabwareId) + const selectedWells = useSelector(getSelectedWells) + const dispatch = useDispatch() + const labwareEntities = useSelector(stepFormSelectors.getLabwareEntities) + const allWellContents = useSelector( + wellContentsSelectors.getWellContentsAllLabware + ) + const liquidNamesById = useSelector(selectors.getLiquidNamesById) + const liquidDisplayColors = useSelector(selectors.getLiquidDisplayColors) if (labwareId == null) { assert( false, 'LiquidPlacementModal: No labware is selected, and no labwareId was given to LiquidPlacementModal' ) - return { - selectedWells: {}, - wellContents: null, - labwareDef: null, - liquidNamesById: {}, - liquidDisplayColors: [], - } } - const labwareDef = stepFormSelectors.getLabwareEntities(state)[labwareId]?.def - let wellContents: ContentsByWell = null - - // selection for deck setup: shows initial state of liquids - wellContents = wellContentsSelectors.getWellContentsAllLabware(state)[ - labwareId - ] - - return { - selectedWells, - wellContents, - labwareDef, - liquidNamesById: selectors.getLiquidNamesById(state), - liquidDisplayColors: selectors.getLiquidDisplayColors(state), - } + const labwareDef = labwareEntities[labwareId]?.def + const wellContents = allWellContents[labwareId] + + return ( +
    + + + {labwareDef && ( +
    + dispatch(selectWells(wells))} + deselectWells={(wells: WellGroup) => dispatch(deselectWells(wells))} + updateHighlightedWells={(wells: WellGroup) => + setHighlightedWells(wells) + } + ingredNames={liquidNamesById} + wellContents={wellContents} + nozzleType={null} + /> +
    + )} + + +
    + ) } - -const mapDispatchToProps = (dispatch: Dispatch): DP => ({ - deselectWells: wells => dispatch(deselectWells(wells)), - selectWells: wells => dispatch(selectWells(wells)), -}) - -export const LiquidPlacementModal = connect( - mapStateToProps, - mapDispatchToProps -)(LiquidPlacementModalComponent) diff --git a/protocol-designer/src/components/LiquidsPage/LiquidEditForm.tsx b/protocol-designer/src/components/LiquidsPage/LiquidEditForm.tsx index 44418c4482e..8bdd1f1bb30 100644 --- a/protocol-designer/src/components/LiquidsPage/LiquidEditForm.tsx +++ b/protocol-designer/src/components/LiquidsPage/LiquidEditForm.tsx @@ -1,8 +1,9 @@ import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { Controller, useForm } from 'react-hook-form' +import { yupResolver } from '@hookform/resolvers/yup' import { useSelector } from 'react-redux' -import { Field, Formik, FormikProps } from 'formik' import * as Yup from 'yup' -import { i18n } from '../../localization' import { swatchColors } from '../swatchColors' import { Card, @@ -14,8 +15,8 @@ import { Flex, JUSTIFY_END, TYPOGRAPHY, - COLORS, } from '@opentrons/components' +import { DEPRECATED_WHALE_GREY } from '@opentrons/shared-data' import { selectors } from '../../labware-ingred/selectors' import styles from './LiquidEditForm.css' import formStyles from '../forms/forms.css' @@ -48,17 +49,10 @@ function checkColor(hex: string): boolean { return luminance < 0.1 || luminance > 0.9 } -const INVALID_DISPLAY_COLORS = ['#000000', '#ffffff', COLORS.whaleGrey] +const INVALID_DISPLAY_COLORS = ['#000000', '#ffffff', DEPRECATED_WHALE_GREY] -export const liquidEditFormSchema: Yup.Schema< - { name: string; description: string; serialize: boolean } | undefined, - any -> = Yup.object().shape({ - name: Yup.string().required( - i18n.t('form.generic.error.required', { - name: i18n.t('form.liquid_edit.name'), - }) - ), +export const liquidEditFormSchema: any = Yup.object().shape({ + name: Yup.string().required('liquid name is required'), displayColor: Yup.string().test( 'disallowed-color', 'Invalid display color', @@ -80,7 +74,7 @@ export function LiquidEditForm(props: Props): JSX.Element { const selectedLiquid = useSelector(selectors.getSelectedLiquidGroupState) const nextGroupId = useSelector(selectors.getNextLiquidGroupId) const liquidId = selectedLiquid.liquidGroupId ?? nextGroupId - + const { t } = useTranslation(['form', 'button']) const initialValues: LiquidEditFormValues = { name: props.name || '', displayColor: props.displayColor ?? swatchColors(liquidId), @@ -88,119 +82,133 @@ export function LiquidEditForm(props: Props): JSX.Element { serialize: props.serialize || false, } + const { + handleSubmit, + formState: { errors, isDirty, touchedFields }, + control, + watch, + setValue, + } = useForm({ + defaultValues: initialValues, + resolver: yupResolver(liquidEditFormSchema), + }) + const name = watch('name') + const description = watch('description') + + const handleLiquidEdits = (values: LiquidEditFormValues): void => { + saveForm({ + name: values.name, + displayColor: values.displayColor, + description: values.description || null, + serialize: values.serialize || false, + }) + } + return ( - { - saveForm({ - name: values.name, - displayColor: values.displayColor, - description: values.description || null, - serialize: values.serialize || false, - }) - }} - > - {({ - handleChange, - handleBlur, - handleSubmit, - setFieldValue, - dirty, - errors, - isValid, - touched, - values, - }: FormikProps) => { - return ( - -
    -
    -
    - {i18n.t('form.liquid_edit.details')} -
    -
    - - - - - - - - { - setFieldValue('displayColor', color) - }} - /> - -
    - - {errors.displayColor != null ? errors.displayColor : null} - -
    -
    -
    - {i18n.t('form.liquid_edit.serialize_title')} -
    -

    - {i18n.t('form.liquid_edit.serialize_explanation')} -

    - -
    + + +
    +
    {t('liquid_edit.details')}
    +
    + + ( + + )} + /> + + + ( + + )} + /> + + + ( + { + setValue('displayColor', color) + }} + /> + )} + /> + +
    + + {errors.displayColor != null ? errors.displayColor : null} + +
    +
    +
    + {t('liquid_edit.serialize_title')} +
    +

    + {t('liquid_edit.serialize_explanation')} +

    + ( + ) => + field.onChange(e) + } + /> + )} + /> +
    -
    - - {i18n.t('button.delete')} - - - {i18n.t('button.cancel')} - - - {i18n.t('button.save')} - -
    - -
    - ) - }} -
    +
    + + {t('button:delete')} + + + {t('button:cancel')} + + + {t('button:save')} + +
    + + ) } diff --git a/protocol-designer/src/components/LiquidsPage/index.tsx b/protocol-designer/src/components/LiquidsPage/index.tsx index 0db89d5dc86..13c8c4392c9 100644 --- a/protocol-designer/src/components/LiquidsPage/index.tsx +++ b/protocol-designer/src/components/LiquidsPage/index.tsx @@ -1,105 +1,70 @@ import * as React from 'react' -import { connect } from 'react-redux' +import { useDispatch, useSelector } from 'react-redux' import assert from 'assert' -import { LiquidEditForm } from './LiquidEditForm' -import { LiquidsPageInfo } from './LiquidsPageInfo' import * as labwareIngredActions from '../../labware-ingred/actions' import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' +import { LiquidEditForm } from './LiquidEditForm' +import { LiquidsPageInfo } from './LiquidsPageInfo' -import { LiquidGroup } from '../../labware-ingred/types' -import { BaseState, ThunkDispatch } from '../../types' - -type Props = React.ComponentProps -interface WrapperProps { - showForm: boolean - formKey: string - formProps: Props -} - -type SP = LiquidGroup & { - _liquidGroupId?: string | null - showForm: boolean - canDelete: Props['canDelete'] -} +import type { LiquidGroup } from '../../labware-ingred/types' +import type { ThunkDispatch } from '../../types' -function LiquidEditFormWrapper(props: WrapperProps): JSX.Element { - const { showForm, formKey, formProps } = props - return showForm ? ( - - ) : ( - +export function LiquidsPage(): JSX.Element { + const dispatch = useDispatch>() + const selectedLiquidGroupState = useSelector( + labwareIngredSelectors.getSelectedLiquidGroupState ) -} - -function mapStateToProps(state: BaseState): SP { - const selectedLiquidGroupState = labwareIngredSelectors.getSelectedLiquidGroupState( - state + const allIngredientGroupFields = useSelector( + labwareIngredSelectors.allIngredientGroupFields ) - const _liquidGroupId = + + const liquidGroupId = selectedLiquidGroupState && selectedLiquidGroupState.liquidGroupId - const allIngredientGroupFields = labwareIngredSelectors.allIngredientGroupFields( - state - ) - const selectedIngredFields = _liquidGroupId - ? allIngredientGroupFields[_liquidGroupId] - : {} + const selectedIngredFields = + liquidGroupId != null ? allIngredientGroupFields[liquidGroupId] : null const showForm = Boolean( selectedLiquidGroupState.liquidGroupId || selectedLiquidGroupState.newLiquidGroup ) + const formKey = liquidGroupId || '__new_form__' + + const deleteLiquidGroup = (): void => { + if (liquidGroupId != null) + dispatch(labwareIngredActions.deleteLiquidGroup(liquidGroupId)) + } + const cancelForm = (): void => { + dispatch(labwareIngredActions.deselectLiquidGroup()) + } + + const saveForm = (formData: LiquidGroup): void => { + dispatch( + labwareIngredActions.editLiquidGroup({ + ...formData, + liquidGroupId: liquidGroupId, + }) + ) + } assert( - !(_liquidGroupId && !selectedIngredFields), + !(liquidGroupId && !selectedIngredFields), `Expected selected liquid group "${String( - _liquidGroupId + liquidGroupId )}" to have fields in allIngredientGroupFields` ) - return { - _liquidGroupId, - canDelete: _liquidGroupId != null, - showForm, - // @ts-expect-error(sa, 2021-6-22): name might not exist - name: selectedIngredFields.name, - // @ts-expect-error(sa, 2021-6-22): description might not exist - description: selectedIngredFields.description, - // @ts-expect-error(sh, 2022-6-28): displayColor might not exist - displayColor: selectedIngredFields.displayColor, - // @ts-expect-error(sa, 2021-6-22): serialize might not exist - serialize: selectedIngredFields.serialize, - } -} - -function mergeProps( - stateProps: SP, - dispatchProps: { dispatch: ThunkDispatch } -): WrapperProps { - const { dispatch } = dispatchProps - const { showForm, _liquidGroupId, ...passThruFormProps } = stateProps - - return { - showForm, - formKey: _liquidGroupId || '__new_form__', - formProps: { - ...passThruFormProps, - deleteLiquidGroup: () => - _liquidGroupId && - dispatch(labwareIngredActions.deleteLiquidGroup(_liquidGroupId)), - cancelForm: () => dispatch(labwareIngredActions.deselectLiquidGroup()), - saveForm: (formData: LiquidGroup) => - dispatch( - labwareIngredActions.editLiquidGroup({ - ...formData, - liquidGroupId: _liquidGroupId, - }) - ), - }, - } + return showForm ? ( + + ) : ( + + ) } - -export const LiquidsPage = connect( - mapStateToProps, - // @ts-expect-error(sa, 2021-6-21): TODO: refactor to use hooks api - null, - mergeProps -)(LiquidEditFormWrapper) diff --git a/protocol-designer/src/components/LiquidsSidebar/index.tsx b/protocol-designer/src/components/LiquidsSidebar/index.tsx index 83578c4022e..d8b17b0452a 100644 --- a/protocol-designer/src/components/LiquidsSidebar/index.tsx +++ b/protocol-designer/src/components/LiquidsSidebar/index.tsx @@ -1,36 +1,34 @@ import * as React from 'react' -import { connect } from 'react-redux' -import { i18n } from '../../localization' +import { useTranslation } from 'react-i18next' +import { useDispatch, useSelector } from 'react-redux' import { DeprecatedPrimaryButton, SidePanel, truncateString, } from '@opentrons/components' +import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' +import * as labwareIngredActions from '../../labware-ingred/actions' import { PDTitledList } from '../lists' import { swatchColors } from '../swatchColors' -import listButtonStyles from '../listButtons.css' -import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' -import { OrderedLiquids } from '../../labware-ingred/types' -import * as labwareIngredActions from '../../labware-ingred/actions' -import { BaseState, ThunkDispatch } from '../../types' +import type { ThunkDispatch } from '../../types' import styles from './styles.css' +import listButtonStyles from '../listButtons.css' -interface SP { - liquids: OrderedLiquids - selectedLiquid?: string | null -} - -interface DP { - createNewLiquid: () => unknown - selectLiquid: (liquidId: string) => unknown -} - -type Props = SP & DP +export function LiquidsSidebar(): JSX.Element { + const { t } = useTranslation('button') + const selectedLiquidGroup = useSelector( + labwareIngredSelectors.getSelectedLiquidGroupState + ) + const liquids = useSelector(labwareIngredSelectors.allIngredientNamesIds) + const dispatch: ThunkDispatch = useDispatch() -function LiquidsSidebarComponent(props: Props): JSX.Element { - const { liquids, selectedLiquid, createNewLiquid, selectLiquid } = props + const selectLiquid = (liquidGroupId: string): void => { + dispatch(labwareIngredActions.selectLiquidGroup(liquidGroupId)) + } + const selectedLiquid = + selectedLiquidGroup && selectedLiquidGroup.liquidGroupId return ( {liquids.map(({ ingredientId, name, displayColor }) => ( @@ -54,34 +52,13 @@ function LiquidsSidebarComponent(props: Props): JSX.Element { /> ))}
    - - {i18n.t('button.new_liquid')} + dispatch(labwareIngredActions.createNewLiquidGroup())} + > + {t('new_liquid')}
    ) } - -function mapStateToProps(state: BaseState): SP { - const selectedLiquidGroup = labwareIngredSelectors.getSelectedLiquidGroupState( - state - ) - return { - liquids: labwareIngredSelectors.allIngredientNamesIds(state), - selectedLiquid: selectedLiquidGroup && selectedLiquidGroup.liquidGroupId, - } -} - -function mapDispatchToProps(dispatch: ThunkDispatch): DP { - return { - selectLiquid: liquidGroupId => - dispatch(labwareIngredActions.selectLiquidGroup(liquidGroupId)), - createNewLiquid: () => - dispatch(labwareIngredActions.createNewLiquidGroup()), - } -} - -export const LiquidsSidebar = connect( - mapStateToProps, - mapDispatchToProps -)(LiquidsSidebarComponent) diff --git a/protocol-designer/src/components/OffDeckLabwareButton.tsx b/protocol-designer/src/components/OffDeckLabwareButton.tsx new file mode 100644 index 00000000000..c537e499bfc --- /dev/null +++ b/protocol-designer/src/components/OffDeckLabwareButton.tsx @@ -0,0 +1,37 @@ +import * as React from 'react' +import { useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' +import { + DeprecatedPrimaryButton, + Flex, + POSITION_ABSOLUTE, + POSITION_RELATIVE, + SPACING, +} from '@opentrons/components' +import { getSelectedTerminalItemId } from '../ui/steps' +import { OffDeckLabwareSlideout } from './OffDeckLabwareSlideout' + +export const OffDeckLabwareButton = (): JSX.Element => { + const selectedTerminalItemId = useSelector(getSelectedTerminalItemId) + const { t } = useTranslation('button') + const [showSlideout, setShowSlideout] = React.useState(false) + + return ( + + + setShowSlideout(true)}> + {t('edit_off_deck')} + + + {showSlideout ? ( + setShowSlideout(false)} + initialSetupTerminalItemId={ + selectedTerminalItemId === '__initial_setup__' + } + /> + ) : null} + + ) +} diff --git a/protocol-designer/src/components/OffDeckLabwareSlideout.tsx b/protocol-designer/src/components/OffDeckLabwareSlideout.tsx new file mode 100644 index 00000000000..c48479129a5 --- /dev/null +++ b/protocol-designer/src/components/OffDeckLabwareSlideout.tsx @@ -0,0 +1,182 @@ +import * as React from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { css } from 'styled-components' +import { useTranslation } from 'react-i18next' +import { + Tooltip, + DeprecatedPrimaryButton, + useHoverTooltip, + Flex, + COLORS, + Icon, + SPACING, + Text, + DIRECTION_COLUMN, + BORDERS, + LabwareRender, + RobotWorkSpace, + LabwareNameOverlay, + RobotCoordsForeignDiv, + ALIGN_CENTER, + JUSTIFY_CENTER, + TYPOGRAPHY, + truncateString, + POSITION_ABSOLUTE, +} from '@opentrons/components' +import { getLabwareDisplayName } from '@opentrons/shared-data' +import { openAddLabwareModal } from '../labware-ingred/actions' +import { getLabwareEntities } from '../step-forms/selectors' +import { selectors } from '../labware-ingred/selectors' +import { getAllWellContentsForActiveItem } from '../top-selectors/well-contents' +import { getRobotStateAtActiveItem } from '../top-selectors/labware-locations' +import { getLabwareNicknamesById } from '../ui/labware/selectors' +import { EditLabwareOffDeck } from './DeckSetup/LabwareOverlays/EditLabwareOffDeck' +import { BrowseLabware } from './DeckSetup/LabwareOverlays/BrowseLabware' +import { Slideout } from '../atoms/Slideout' +import { wellFillFromWellContents } from './labware' + +interface OffDeckLabwareSlideoutProps { + initialSetupTerminalItemId: boolean + isExpanded: boolean + onCloseClick: () => void +} + +export const OffDeckLabwareSlideout = ( + props: OffDeckLabwareSlideoutProps +): JSX.Element => { + const { t } = useTranslation(['deck', 'button', 'tooltip']) + const [targetProps, tooltipProps] = useHoverTooltip() + const dispatch = useDispatch() + const disabled = props.initialSetupTerminalItemId === false + const robotState = useSelector(getRobotStateAtActiveItem) + const labwareEntities = useSelector(getLabwareEntities) + const allWellContentsForActiveItem = useSelector( + getAllWellContentsForActiveItem + ) + const liquidDisplayColors = useSelector(selectors.getLiquidDisplayColors) + const labwareNickNames = useSelector(getLabwareNicknamesById) + + const offDeckEntries = + robotState?.labware != null + ? Object.entries(robotState?.labware).filter( + ([key, value]) => value.slot === 'offDeck' + ) + : null + const offDeck = + offDeckEntries != null && offDeckEntries.length > 0 + ? Object.fromEntries(offDeckEntries) + : null + + return ( + + dispatch(openAddLabwareModal({ slot: 'offDeck' }))} + marginTop={SPACING.spacing16} + marginRight={SPACING.spacing16} + disabled={disabled} + > + {t('button:add_off_deck')} + + {disabled ? ( + + {t(`tooltip:disabled_off_deck`)} + + ) : null} +
    + } + > + {offDeck == null ? ( + + + {t('off_deck.slideout_empty_state')} + + ) : ( + Object.keys(offDeck).map(labwareId => { + const labwareNickName = labwareNickNames[labwareId] + const truncatedNickName = + labwareNickName != null + ? truncateString(labwareNickName, 75, 25) + : null + const wellContents = + allWellContentsForActiveItem != null + ? allWellContentsForActiveItem[labwareId] + : null + const definition = + labwareEntities[labwareId] != null + ? labwareEntities[labwareId].def + : null + return definition != null ? ( + + {() => ( + <> + + + + {disabled ? ( +
    + +
    + ) : ( + + )} +
    + + )} +
    + ) : null + }) + )} + + ) +} diff --git a/protocol-designer/src/components/ProtocolEditor.tsx b/protocol-designer/src/components/ProtocolEditor.tsx index ef963ec03f1..e483d6d448a 100644 --- a/protocol-designer/src/components/ProtocolEditor.tsx +++ b/protocol-designer/src/components/ProtocolEditor.tsx @@ -4,15 +4,15 @@ import { DragDropContext } from 'react-dnd' import MouseBackEnd from 'react-dnd-mouse-backend' import { ComputingSpinner } from '../components/ComputingSpinner' import { ConnectedNav } from '../containers/ConnectedNav' -import { ConnectedSidebar } from '../containers/ConnectedSidebar' +import { Sidebar } from '../containers/ConnectedSidebar' import { ConnectedTitleBar } from '../containers/ConnectedTitleBar' -import { ConnectedMainPanel } from '../containers/ConnectedMainPanel' +import { MainPanel } from '../containers/ConnectedMainPanel' import { PortalRoot as MainPageModalPortalRoot } from '../components/portals/MainPageModalPortal' import { MAIN_CONTENT_FORCED_SCROLL_CLASSNAME } from '../ui/steps/utils' import { PrereleaseModeIndicator } from './PrereleaseModeIndicator' import { PortalRoot as TopPortalRoot } from './portals/TopPortal' -import { FileUploadMessageModal } from './modals/FileUploadMessageModal' -import { LabwareUploadMessageModal } from './modals/LabwareUploadMessageModal' +import { FileUploadMessageModal } from './modals/FileUploadMessageModal/FileUploadMessageModal' +import { LabwareUploadMessageModal } from './modals/LabwareUploadMessageModal/LabwareUploadMessageModal' import { GateModal } from './modals/GateModal' import { AnnouncementModal } from './modals/AnnouncementModal' import styles from './ProtocolEditor.css' @@ -30,7 +30,7 @@ function ProtocolEditorComponent(): JSX.Element {
    - +
    @@ -47,7 +47,7 @@ function ProtocolEditorComponent(): JSX.Element { - +
    diff --git a/protocol-designer/src/components/SelectionRect.tsx b/protocol-designer/src/components/SelectionRect.tsx index 251470e135b..3ffe242b17f 100644 --- a/protocol-designer/src/components/SelectionRect.tsx +++ b/protocol-designer/src/components/SelectionRect.tsx @@ -1,55 +1,47 @@ import * as React from 'react' - import styles from './SelectionRect.css' -import { DragRect, GenericRect } from '../collision-types' +import type { DragRect, GenericRect } from '../collision-types' -interface Props { - onSelectionMove?: (e: MouseEvent, arg: GenericRect) => unknown - onSelectionDone?: (e: MouseEvent, arg: GenericRect) => unknown +interface SelectionRectProps { + onSelectionMove?: (e: MouseEvent, arg: GenericRect) => void + onSelectionDone?: (e: MouseEvent, arg: GenericRect) => void svg?: boolean // set true if this is an embedded SVG children?: React.ReactNode originXOffset?: number originYOffset?: number } -interface State { - positions: DragRect | null -} - -export class SelectionRect extends React.Component { - parentRef?: HTMLElement | SVGElement | null - - constructor(props: Props) { - super(props) - this.state = { positions: null } - } - - renderRect(args: DragRect): React.ReactNode { +export function SelectionRect(props: SelectionRectProps): JSX.Element { + const { + onSelectionMove, + onSelectionDone, + svg, + children, + originXOffset = 0, + originYOffset = 0, + } = props + const [positions, setPositions] = React.useState(null) + const parentRef = React.useRef(null) + const renderRect = (args: DragRect): React.ReactNode => { const { xStart, yStart, xDynamic, yDynamic } = args const left = Math.min(xStart, xDynamic) const top = Math.min(yStart, yDynamic) const width = Math.abs(xDynamic - xStart) const height = Math.abs(yDynamic - yStart) - const { originXOffset = 0, originYOffset = 0 } = this.props - if (this.props.svg) { - // calculate ratio btw clientRect bounding box vs svg parent viewBox - // WARNING: May not work right if you're nesting SVGs! - const parentRef = this.parentRef - if (!parentRef) { + + if (svg) { + if (!parentRef.current) { return null } - const clientRect: { + const clientRect: DOMRect = parentRef.current.getBoundingClientRect() + const viewBox: { width: number height: number - left: number - top: number - } = parentRef.getBoundingClientRect() - // @ts-expect-error(sa, 2021-7-1): parentRef.closest might return null - const viewBox: { width: number; height: number } = parentRef.closest( - 'svg' - ).viewBox.baseVal // WARNING: elem.closest() is experiemental - + } = parentRef.current.closest('svg')?.viewBox?.baseVal ?? { + width: 0, + height: 0, + } const xScale = viewBox.width / clientRect.width const yScale = viewBox.height / clientRect.height @@ -77,10 +69,8 @@ export class SelectionRect extends React.Component { ) } - getRect(args: DragRect): GenericRect { + const getRect = (args: DragRect): GenericRect => { const { xStart, yStart, xDynamic, yDynamic } = args - // convert internal rect position to more generic form - // TODO should this be used in renderRect? return { x0: Math.min(xStart, xDynamic), x1: Math.max(xStart, xDynamic), @@ -89,74 +79,72 @@ export class SelectionRect extends React.Component { } } - handleMouseDown: React.MouseEventHandler = e => { - document.addEventListener('mousemove', this.handleDrag) - document.addEventListener('mouseup', this.handleMouseUp) - this.setState({ - positions: { - xStart: e.clientX, - xDynamic: e.clientX, - yStart: e.clientY, - yDynamic: e.clientY, - }, - }) - } - - handleDrag: (e: MouseEvent) => void = e => { - if (this.state.positions) { - const nextRect = { - ...this.state.positions, - xDynamic: e.clientX, - yDynamic: e.clientY, + const handleDrag = (e: MouseEvent): void => { + setPositions(prevPositions => { + if (prevPositions) { + const nextRect = { + ...prevPositions, + xDynamic: e.clientX, + yDynamic: e.clientY, + } + const rect = getRect(nextRect) + onSelectionMove && onSelectionMove(e, rect) + + return nextRect } - this.setState({ positions: nextRect }) - - const rect = this.getRect(nextRect) - this.props.onSelectionMove && this.props.onSelectionMove(e, rect) - } + return prevPositions + }) } - handleMouseUp: (e: MouseEvent) => void = e => { + const handleMouseUp = (e: MouseEvent): void => { if (!(e instanceof MouseEvent)) { return } - document.removeEventListener('mousemove', this.handleDrag) - document.removeEventListener('mouseup', this.handleMouseUp) - - const finalRect = this.state.positions && this.getRect(this.state.positions) - - // clear the rectangle - this.setState({ positions: null }) - + const finalRect = positions && getRect(positions) + setPositions(prevPositions => { + return prevPositions === positions ? null : prevPositions + }) // call onSelectionDone callback with {x0, x1, y0, y1} of final selection rectangle - this.props.onSelectionDone && - finalRect && - this.props.onSelectionDone(e, finalRect) + onSelectionDone && finalRect && onSelectionDone(e, finalRect) } - render(): React.ReactNode { - const { svg, children } = this.props - - return svg ? ( - { - this.parentRef = ref - }} - > - {children} - {this.state.positions && this.renderRect(this.state.positions)} - - ) : ( -
    { - this.parentRef = ref - }} - > - {this.state.positions && this.renderRect(this.state.positions)} - {children} -
    - ) + const handleMouseDown: React.MouseEventHandler = e => { + setPositions({ + xStart: e.clientX, + xDynamic: e.clientX, + yStart: e.clientY, + yDynamic: e.clientY, + }) } + + React.useEffect(() => { + document.addEventListener('mousemove', handleDrag) + document.addEventListener('mouseup', handleMouseUp) + return () => { + document.removeEventListener('mousemove', handleDrag) + document.removeEventListener('mouseup', handleMouseUp) + } + }, [handleDrag, handleMouseUp]) + + return svg ? ( + { + parentRef.current = ref + }} + > + {children} + {positions && renderRect(positions)} + + ) : ( +
    { + parentRef.current = ref + }} + > + {positions && renderRect(positions)} + {children} +
    + ) } diff --git a/protocol-designer/src/components/SettingsPage/FeatureFlagCard/FeatureFlagCard.tsx b/protocol-designer/src/components/SettingsPage/FeatureFlagCard/FeatureFlagCard.tsx index fab5720c11e..7e7a65215ac 100644 --- a/protocol-designer/src/components/SettingsPage/FeatureFlagCard/FeatureFlagCard.tsx +++ b/protocol-designer/src/components/SettingsPage/FeatureFlagCard/FeatureFlagCard.tsx @@ -1,27 +1,38 @@ -import sortBy from 'lodash/sortBy' import * as React from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' +import sortBy from 'lodash/sortBy' import { ContinueModal, Card, ToggleButton } from '@opentrons/components' -import { i18n } from '../../../localization' import { resetScrollElements } from '../../../ui/steps/utils' +import { + userFacingFlags, + FlagTypes, + actions as featureFlagActions, + selectors as featureFlagSelectors, +} from '../../../feature-flags' import { Portal } from '../../portals/MainPageModalPortal' import styles from '../SettingsPage.css' import modalStyles from '../../modals/modal.css' -import { userFacingFlags, Flags, FlagTypes } from '../../../feature-flags' -export interface Props { - flags: Flags - setFeatureFlags: (flags: Flags) => unknown -} +export function FeatureFlagCard(): JSX.Element { + const flags = useSelector(featureFlagSelectors.getFeatureFlagData) + const dispatch = useDispatch() -export const FeatureFlagCard = (props: Props): JSX.Element => { const [modalFlagName, setModalFlagName] = React.useState( null ) + const { t } = useTranslation(['modal', 'card', 'feature_flags']) + + const setFeatureFlags = ( + flags: Partial> + ): void => { + dispatch(featureFlagActions.setFeatureFlags(flags)) + } - const prereleaseModeEnabled = props.flags.PRERELEASE_MODE === true + const prereleaseModeEnabled = flags.PRERELEASE_MODE === true // @ts-expect-error(sa, 2021-6-21): Object.keys not smart enough to take keys from props.flags - const allFlags: FlagTypes[] = sortBy(Object.keys(props.flags)) + const allFlags: FlagTypes[] = sortBy(Object.keys(flags)) const userFacingFlagNames = allFlags.filter(flagName => userFacingFlags.includes(flagName) @@ -35,20 +46,18 @@ export const FeatureFlagCard = (props: Props): JSX.Element => { const RICH_DESCRIPTIONS: Partial> = { OT_PD_ALLOW_ALL_TIPRACKS: ( <> -

    {i18n.t(`feature_flags.${flag}.description`)}

    +

    {t(`feature_flags:${flag}.description`)}

    ), OT_PD_DISABLE_MODULE_RESTRICTIONS: ( <> -

    {i18n.t(`feature_flags.${flag}.description_1`)}

    -

    {i18n.t(`feature_flags.${flag}.description_2`)}

    +

    {t(`feature_flags:${flag}.description_1`)}

    +

    {t(`feature_flags:${flag}.description_2`)}

    ), } return ( - RICH_DESCRIPTIONS[flag] || ( -

    {i18n.t(`feature_flags.${flag}.description`)}

    - ) + RICH_DESCRIPTIONS[flag] ||

    {t(`feature_flags:${flag}.description`)}

    ) } @@ -56,11 +65,11 @@ export const FeatureFlagCard = (props: Props): JSX.Element => {

    - {i18n.t(`feature_flags.${flagName}.title`)} + {t(`feature_flags:${flagName}.title`)}

    { resetScrollElements() setModalFlagName(flagName) @@ -86,7 +95,7 @@ export const FeatureFlagCard = (props: Props): JSX.Element => { let flagSwitchDirection: string = 'on' if (modalFlagName) { - const isFlagOn: boolean | null | undefined = props.flags[modalFlagName] + const isFlagOn: boolean | null | undefined = flags[modalFlagName] flagSwitchDirection = isFlagOn ? 'off' : 'on' } return ( @@ -96,37 +105,33 @@ export const FeatureFlagCard = (props: Props): JSX.Element => { setModalFlagName(null)} onContinueClick={() => { - props.setFeatureFlags({ - [modalFlagName as string]: !props.flags[modalFlagName], + setFeatureFlags({ + [modalFlagName as string]: !flags[modalFlagName], }) setModalFlagName(null) }} >

    - {i18n.t( - `modal.experimental_feature_warning.${flagSwitchDirection}.body1` - )} + {t(`experimental_feature_warning.${flagSwitchDirection}.body1`)}

    - {i18n.t( - `modal.experimental_feature_warning.${flagSwitchDirection}.body2` - )} + {t(`experimental_feature_warning.${flagSwitchDirection}.body2`)}

    )} - +
    {userFacingFlagRows.length > 0 ? userFacingFlagRows : noFlagsFallback}
    {prereleaseModeEnabled && ( - +
    {prereleaseFlagRows}
    )} diff --git a/protocol-designer/src/components/SettingsPage/FeatureFlagCard/index.ts b/protocol-designer/src/components/SettingsPage/FeatureFlagCard/index.ts deleted file mode 100644 index 034aba2e859..00000000000 --- a/protocol-designer/src/components/SettingsPage/FeatureFlagCard/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { connect } from 'react-redux' -import { - FeatureFlagCard as FeatureFlagCardComponent, - Props as FeatureFlagCardProps, -} from './FeatureFlagCard' -import { - actions as featureFlagActions, - selectors as featureFlagSelectors, -} from '../../../feature-flags' -import { Dispatch } from 'redux' -import { BaseState } from '../../../types' -interface SP { - flags: FeatureFlagCardProps['flags'] -} -interface DP { - setFeatureFlags: FeatureFlagCardProps['setFeatureFlags'] -} - -const mapStateToProps = (state: BaseState): SP => ({ - flags: featureFlagSelectors.getFeatureFlagData(state), -}) - -const mapDispatchToProps = (dispatch: Dispatch): DP => ({ - setFeatureFlags: flags => dispatch(featureFlagActions.setFeatureFlags(flags)), -}) - -export const FeatureFlagCard = connect( - mapStateToProps, - mapDispatchToProps -)(FeatureFlagCardComponent) diff --git a/protocol-designer/src/components/SettingsPage/SettingsApp.tsx b/protocol-designer/src/components/SettingsPage/SettingsApp.tsx index 4f0855531b8..a1c26ae6c21 100644 --- a/protocol-designer/src/components/SettingsPage/SettingsApp.tsx +++ b/protocol-designer/src/components/SettingsPage/SettingsApp.tsx @@ -1,6 +1,6 @@ import * as React from 'react' -import { connect } from 'react-redux' -import { i18n } from '../../localization' +import { useDispatch, useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' import { Card, OutlineButton, @@ -16,38 +16,30 @@ import { selectors as tutorialSelectors, } from '../../tutorial' import { OLDEST_MIGRATEABLE_VERSION } from '../../load-file/migration' -import { FeatureFlagCard } from './FeatureFlagCard' -import styles from './SettingsPage.css' -import { BaseState, ThunkDispatch } from '../../types' +import { FeatureFlagCard } from './FeatureFlagCard/FeatureFlagCard' -interface Props { - canClearHintDismissals: boolean - hasOptedIn: boolean | null - restoreHints: () => unknown - toggleOptedIn: () => unknown -} +import styles from './SettingsPage.css' -interface SP { - canClearHintDismissals: Props['canClearHintDismissals'] - hasOptedIn: Props['hasOptedIn'] -} +export function SettingsApp(): JSX.Element { + const dispatch = useDispatch() + const hasOptedIn = useSelector(analyticsSelectors.getHasOptedIn) + const canClearHintDismissals = useSelector( + tutorialSelectors.getCanClearHintDismissals + ) + const _toggleOptedIn = hasOptedIn + ? analyticsActions.optOut + : analyticsActions.optIn -function SettingsAppComponent(props: Props): JSX.Element { - const { - canClearHintDismissals, - hasOptedIn, - restoreHints, - toggleOptedIn, - } = props + const { t } = useTranslation(['card', 'application', 'button']) return ( <>
    - +
    {/* TODO: BC 2019-02-26 add release notes link here, when there are release notes */} @@ -56,40 +48,40 @@ function SettingsAppComponent(props: Props): JSX.Element {
    - +
    - {i18n.t('card.body.restore_hints')} + {t('body.restore_hints')} + dispatch(tutorialActions.clearAllHintDismissals()) + } > {canClearHintDismissals - ? i18n.t('button.restore') - : i18n.t('button.restored')} + ? t('button:restore') + : t('button:restored')}
    - +
    -

    - {i18n.t('card.toggle.share_session')} -

    +

    {t('toggle.share_session')}

    dispatch(_toggleOptedIn())} />

    - {i18n.t('card.body.reason_for_collecting_data')}{' '} - {i18n.t('card.body.data_collected_is_internal')}. + {t('body.reason_for_collecting_data')}{' '} + {t('body.data_collected_is_internal')}.

    @@ -100,34 +92,3 @@ function SettingsAppComponent(props: Props): JSX.Element { ) } - -function mapStateToProps(state: BaseState): SP { - return { - hasOptedIn: analyticsSelectors.getHasOptedIn(state), - canClearHintDismissals: tutorialSelectors.getCanClearHintDismissals(state), - } -} - -function mergeProps( - stateProps: SP, - dispatchProps: { dispatch: ThunkDispatch } -): Props { - const { dispatch } = dispatchProps - const { hasOptedIn } = stateProps - - const _toggleOptedIn = hasOptedIn - ? analyticsActions.optOut - : analyticsActions.optIn - return { - ...stateProps, - toggleOptedIn: () => dispatch(_toggleOptedIn()), - restoreHints: () => dispatch(tutorialActions.clearAllHintDismissals()), - } -} - -export const SettingsApp = connect( - mapStateToProps, - // @ts-expect-error(sa, 2021-6-21): TODO: refactor to use hooks api - null, - mergeProps -)(SettingsAppComponent) diff --git a/protocol-designer/src/components/SettingsPage/SettingsSidebar.tsx b/protocol-designer/src/components/SettingsPage/SettingsSidebar.tsx index ccfc06cc34e..e1546e78dd4 100644 --- a/protocol-designer/src/components/SettingsPage/SettingsSidebar.tsx +++ b/protocol-designer/src/components/SettingsPage/SettingsSidebar.tsx @@ -1,43 +1,21 @@ import * as React from 'react' +import { useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' import { SidePanel } from '@opentrons/components' -import { connect } from 'react-redux' - -import { BaseState, ThunkDispatch } from '../../types' -import { actions, selectors, Page } from '../../navigation' -import { i18n } from '../../localization' +import { selectors } from '../../navigation' import { PDTitledList } from '../lists' import styles from './SettingsPage.css' -interface SP { - currentPage: Page -} -interface DP { - makeNavigateToPage: (page: Page) => () => unknown +export const SettingsSidebar = (): JSX.Element => { + const currentPage = useSelector(selectors.getCurrentPage) + const { t } = useTranslation('nav') + return ( + + + + ) } -type Props = SP & DP - -const SettingsSidebarComponent = (props: Props): JSX.Element => ( - - - {/* */} - -) - -const STP = (state: BaseState): SP => ({ - currentPage: selectors.getCurrentPage(state), -}) - -const DTP = (dispatch: ThunkDispatch): DP => ({ - makeNavigateToPage: (pageName: Page) => () => - dispatch(actions.navigateToPage(pageName)), -}) - -export const SettingsSidebar = connect(STP, DTP)(SettingsSidebarComponent) diff --git a/protocol-designer/src/components/SettingsPage/index.tsx b/protocol-designer/src/components/SettingsPage/index.tsx index 74a55b434fa..475ba23946c 100644 --- a/protocol-designer/src/components/SettingsPage/index.tsx +++ b/protocol-designer/src/components/SettingsPage/index.tsx @@ -1,27 +1,17 @@ import * as React from 'react' -import { connect } from 'react-redux' +import { useSelector } from 'react-redux' -import { BaseState } from '../../types' -import { selectors, Page } from '../../navigation' +import { selectors } from '../../navigation' import { SettingsApp } from './SettingsApp' export { SettingsSidebar } from './SettingsSidebar' -interface Props { - currentPage: Page -} - -const SettingsPageComponent = (props: Props): JSX.Element => { - switch (props.currentPage) { +export function SettingsPage(): JSX.Element { + const currentPage = useSelector(selectors.getCurrentPage) + switch (currentPage) { // TODO: Ian 2019-08-21 when we have other pages, put them here case 'settings-app': default: return } } - -const STP = (state: BaseState): Props => ({ - currentPage: selectors.getCurrentPage(state), -}) - -export const SettingsPage = connect(STP)(SettingsPageComponent) diff --git a/protocol-designer/src/components/StepCreationButton.tsx b/protocol-designer/src/components/StepCreationButton.tsx index 53af78e40e0..aa67c849bdb 100644 --- a/protocol-designer/src/components/StepCreationButton.tsx +++ b/protocol-designer/src/components/StepCreationButton.tsx @@ -1,5 +1,6 @@ import * as React from 'react' import { useDispatch, useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' import { Tooltip, DeprecatedPrimaryButton, @@ -14,7 +15,6 @@ import { TEMPERATURE_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, } from '@opentrons/shared-data' -import { i18n } from '../localization' import { actions as stepsActions, getIsMultiSelectMode } from '../ui/steps' import { selectors as stepFormSelectors, @@ -27,12 +27,14 @@ import { import { Portal } from './portals/MainPageModalPortal' import { stepIconsByType, StepType } from '../form-types' import styles from './listButtons.css' +import { ThunkDispatch } from 'redux-thunk' +import { BaseState } from '../types' interface StepButtonComponentProps { children: React.ReactNode expanded: boolean disabled: boolean - setExpanded: (expanded: boolean) => unknown + setExpanded: (expanded: boolean) => void } // TODO: Ian 2019-01-17 move out to centralized step info file - see #2926 @@ -40,6 +42,7 @@ interface StepButtonComponentProps { export const StepCreationButtonComponent = ( props: StepButtonComponentProps ): JSX.Element => { + const { t } = useTranslation(['tooltip', 'button']) const { children, expanded, setExpanded, disabled } = props const [targetProps, tooltipProps] = useHoverTooltip({ placement: TOOLTIP_TOP, @@ -52,16 +55,14 @@ export const StepCreationButtonComponent = ( {...targetProps} > {disabled && ( - - {i18n.t(`tooltip.disabled_step_creation`)} - + {t(`disabled_step_creation`)} )} setExpanded(!expanded)} disabled={disabled} > - {i18n.t('button.add_step')} + {t('button:add_step')}
    {expanded && children}
    @@ -70,17 +71,18 @@ export const StepCreationButtonComponent = ( } export interface StepButtonItemProps { - onClick: () => unknown + onClick: () => void stepType: StepType } export function StepButtonItem(props: StepButtonItemProps): JSX.Element { const { onClick, stepType } = props + const { t } = useTranslation(['tooltip', 'application']) const [targetProps, tooltipProps] = useHoverTooltip({ placement: TOOLTIP_RIGHT, strategy: TOOLTIP_FIXED, }) - const tooltipMessage = i18n.t(`tooltip.step_description.${stepType}`) + const tooltipMessage = t(`step_description.${stepType}`) return ( <>
    @@ -88,7 +90,7 @@ export function StepButtonItem(props: StepButtonItemProps): JSX.Element { onClick={onClick} iconName={stepIconsByType[stepType]} > - {i18n.t(`application.stepType.${stepType}`, stepType)} + {t(`application:stepType.${stepType}`, stepType)}
    {tooltipMessage} @@ -131,13 +133,12 @@ export const StepCreationButton = (): JSX.Element => { thermocycler: getIsModuleOnDeck(modules, THERMOCYCLER_MODULE_TYPE), heaterShaker: getIsModuleOnDeck(modules, HEATERSHAKER_MODULE_TYPE), } - const [expanded, setExpanded] = React.useState(false) const [ enqueuedStepType, setEnqueuedStepType, ] = React.useState(null) - const dispatch = useDispatch() + const dispatch = useDispatch>() const addStep = ( stepType: StepType @@ -175,7 +176,7 @@ export const StepCreationButton = (): JSX.Element => { setEnqueuedStepType(null) } }} - > + /> )} { handleSave, canSave, } = props - + const { t } = useTranslation('button') return (
    - {i18n.t('button.delete')} + {t('delete')} - {i18n.t('button.notes')} + {t('notes')}
    @@ -41,14 +41,14 @@ export const ButtonRow = (props: ButtonRowProps): JSX.Element => { className={styles.form_button} onClick={handleClose} > - {i18n.t('button.close')} + {t('close')} - {i18n.t('button.save')} + {t('save')}
    diff --git a/protocol-designer/src/components/StepEditForm/FormAlerts.ts b/protocol-designer/src/components/StepEditForm/FormAlerts.ts deleted file mode 100644 index 36d19cb0e7b..00000000000 --- a/protocol-designer/src/components/StepEditForm/FormAlerts.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { connect } from 'react-redux' -import { Props, Alerts } from '../alerts/Alerts' -import { - actions as dismissActions, - selectors as dismissSelectors, -} from '../../dismiss' -import { getSelectedStepId } from '../../ui/steps' -import { selectors as stepFormSelectors } from '../../step-forms' -import { - getVisibleFormErrors, - getVisibleFormWarnings, - getVisibleProfileFormLevelErrors, -} from './utils' -import { Dispatch } from 'redux' -import { ProfileItem, StepIdType } from '../../form-types' -import { StepFieldName } from '../../steplist/fieldLevel' -import { BaseState } from '../../types' -import { ProfileFormError } from '../../steplist/formLevel/profileErrors' - -/* TODO: BC 2018-09-13 move to src/components/alerts and adapt and use src/components/alerts/Alerts - * see #1814 for reference - */ -interface SP { - errors: Props['errors'] - warnings: Props['warnings'] - stepId?: StepIdType | null | undefined -} -interface OP { - focusedField: StepFieldName | null - dirtyFields: StepFieldName[] -} - -const mapStateToProps = (state: BaseState, ownProps: OP): SP => { - const { focusedField, dirtyFields } = ownProps - const visibleWarnings = getVisibleFormWarnings({ - focusedField, - dirtyFields, - errors: dismissSelectors.getFormWarningsForSelectedStep(state), - }) - const formLevelErrors = stepFormSelectors.getFormLevelErrorsForUnsavedForm( - state - ) - const visibleErrors = getVisibleFormErrors({ - focusedField, - dirtyFields, - errors: formLevelErrors, - }) - // deal with special-case dynamic field form-level errors - const unsavedForm = stepFormSelectors.getHydratedUnsavedForm(state) - const profileItemsById: Record | null | undefined = - unsavedForm?.profileItemsById - let visibleDynamicFieldFormErrors: ProfileFormError[] = [] - - if (profileItemsById != null) { - const dynamicFieldFormErrors = stepFormSelectors.getDynamicFieldFormErrorsForUnsavedForm( - state - ) - visibleDynamicFieldFormErrors = getVisibleProfileFormLevelErrors({ - focusedField, - dirtyFields, - errors: dynamicFieldFormErrors, - profileItemsById, - }) - } - - return { - errors: [ - ...visibleErrors.map(error => ({ - title: error.title, - description: error.body || null, - })), - ...visibleDynamicFieldFormErrors.map(error => ({ - title: error.title, - description: error.body || null, - })), - ], - warnings: visibleWarnings.map(warning => ({ - title: warning.title, - description: warning.body || null, - dismissId: warning.type, - })), - stepId: getSelectedStepId(state), - } -} - -const mergeProps = ( - stateProps: SP, - dispatchProps: { - dispatch: Dispatch - } -): Props => { - const { stepId } = stateProps - const { dispatch } = dispatchProps - return { - ...stateProps, - dismissWarning: (dismissId: string) => { - if (stepId) - dispatch( - dismissActions.dismissFormWarning({ - type: dismissId, - stepId, - }) - ) - }, - } -} - -export const FormAlerts = connect( - mapStateToProps, - // @ts-expect-error(sa, 2021-6-21): TODO: refactor to use hooks api - null, - mergeProps -)(Alerts) diff --git a/protocol-designer/src/components/StepEditForm/StepEditForm.css b/protocol-designer/src/components/StepEditForm/StepEditForm.css index f3887070fe6..d81af1efce0 100644 --- a/protocol-designer/src/components/StepEditForm/StepEditForm.css +++ b/protocol-designer/src/components/StepEditForm/StepEditForm.css @@ -151,6 +151,16 @@ text-transform: uppercase; } +.section_header_text_column { + flex: 1; + max-width: 20rem; + color: #666; + letter-spacing: 1px; + font-size: var(--fs-body-2); + font-weight: var(--fw-semibold); + text-transform: uppercase; +} + .path_option { width: 2.275rem; height: 1.55rem; diff --git a/protocol-designer/src/components/StepEditForm/StepEditFormComponent.tsx b/protocol-designer/src/components/StepEditForm/StepEditFormComponent.tsx index 109bfdbae67..6f146047e73 100644 --- a/protocol-designer/src/components/StepEditForm/StepEditFormComponent.tsx +++ b/protocol-designer/src/components/StepEditForm/StepEditFormComponent.tsx @@ -13,7 +13,7 @@ import { ThermocyclerForm, HeaterShakerForm, } from './forms' -import { FormAlerts } from './FormAlerts' +import { Alerts } from '../alerts/Alerts' import { ButtonRow } from './ButtonRow' import formStyles from '../forms/forms.css' import styles from './StepEditForm.css' @@ -82,8 +82,11 @@ export const StepEditFormComponent = (props: Props): JSX.Element => { {showMoreOptionsModal && ( )} - {/* @ts-expect-error(ce, 2021-06-22) getting into the weeds of `connect` and props and not sure what is going on */} - +
    ) => { updateValue(e.currentTarget.value) }} diff --git a/protocol-designer/src/components/StepEditForm/fields/ChangeTipField/index.tsx b/protocol-designer/src/components/StepEditForm/fields/ChangeTipField/index.tsx index 758f6838a4d..44dfa8d625b 100644 --- a/protocol-designer/src/components/StepEditForm/fields/ChangeTipField/index.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/ChangeTipField/index.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { useTranslation } from 'react-i18next' import { FormGroup, SelectField, @@ -6,7 +7,6 @@ import { useHoverTooltip, TOOLTIP_FIXED, } from '@opentrons/components' -import { i18n } from '../../../../localization' import { getDisabledChangeTipOptions, DisabledChangeTipArgs, @@ -34,7 +34,7 @@ export const ChangeTipField = (props: Props): JSX.Element => { updateValue, value, } = props - + const { t } = useTranslation('form') const disabledOptions = getDisabledChangeTipOptions({ aspirateWells, dispenseWells, @@ -49,7 +49,7 @@ export const ChangeTipField = (props: Props): JSX.Element => { return ( { const { value } = props + const { t } = useTranslation('form') const [targetProps, tooltipProps] = useHoverTooltip({ placement: 'bottom-start', strategy: TOOLTIP_FIXED, @@ -78,12 +79,10 @@ const ChangeTipOptionLabel = (props: LabelProps): JSX.Element => { return ( <>
    - {i18n.t(`form.step_edit_form.field.change_tip.option.${value}`)} + {t(`step_edit_form.field.change_tip.option.${value}`)}
    - {i18n.t( - `form.step_edit_form.field.change_tip.option_tooltip.${value}` - )} + {t(`step_edit_form.field.change_tip.option_tooltip.${value}`)}
    diff --git a/protocol-designer/src/components/StepEditForm/fields/Configure96ChannelField.tsx b/protocol-designer/src/components/StepEditForm/fields/Configure96ChannelField.tsx new file mode 100644 index 00000000000..3e4561080ef --- /dev/null +++ b/protocol-designer/src/components/StepEditForm/fields/Configure96ChannelField.tsx @@ -0,0 +1,92 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { useSelector } from 'react-redux' +import { ALL, COLUMN } from '@opentrons/shared-data' +import { + FormGroup, + SelectField, + Tooltip, + TOOLTIP_FIXED, + useHoverTooltip, +} from '@opentrons/components' +import { getInitialDeckSetup } from '../../../step-forms/selectors' +import { StepFormDropdown } from './StepFormDropdownField' +import styles from '../StepEditForm.css' + +export function Configure96ChannelField( + props: Omit, 'options'> +): JSX.Element { + const { t } = useTranslation('form') + const { value: dropdownItem, name, updateValue } = props + const deckSetup = useSelector(getInitialDeckSetup) + const tipracks = Object.values(deckSetup.labware).filter( + labware => labware.def.parameters.isTiprack + ) + const tipracksNotOnAdapter = tipracks.filter( + tiprack => deckSetup.labware[tiprack.slot] == null + ) + + const options = [ + { name: 'all', value: ALL }, + { + name: 'column', + value: COLUMN, + isDisabled: tipracksNotOnAdapter.length === 0, + }, + ] + + const [selectedValue, setSelectedValue] = React.useState( + dropdownItem || options[0].value + ) + React.useEffect(() => { + updateValue(selectedValue) + }, [selectedValue]) + + return ( + + { + updateValue(value) + setSelectedValue(value) + }} + formatOptionLabel={({ value, isDisabled }) => ( + + )} + /> + + ) +} + +interface OptionLabelProps { + value: string + disabled?: boolean +} + +const OptionLabel = (props: OptionLabelProps): JSX.Element => { + const { value, disabled } = props + const [targetProps, tooltipProps] = useHoverTooltip({ + placement: 'bottom-start', + strategy: TOOLTIP_FIXED, + }) + const { t } = useTranslation('form') + return ( + <> +
    + {t(`step_edit_form.field.nozzles.option.${value}`)} + {disabled ? ( + +
    + {t(`step_edit_form.field.nozzles.option_tooltip.${value}`)} +
    +
    + ) : null} +
    + + ) +} diff --git a/protocol-designer/src/components/StepEditForm/fields/DelayFields.tsx b/protocol-designer/src/components/StepEditForm/fields/DelayFields.tsx index 8a82c779662..e5d03e5c7ef 100644 --- a/protocol-designer/src/components/StepEditForm/fields/DelayFields.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/DelayFields.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { i18n } from '../../../localization' +import { useTranslation } from 'react-i18next' import { TextField } from './TextField' import { CheckboxRowField } from './CheckboxRowField' import { TipPositionField } from './TipPositionField' @@ -23,17 +23,17 @@ export const DelayFields = (props: DelayFieldProps): JSX.Element => { propsForFields, labwareId, } = props - + const { t } = useTranslation(['form', 'application']) return ( {tipPositionFieldName && ( { /> ) } - -interface SP { - disposalDestinationOptions: Options - maxDisposalVolume?: number | null -} -interface OP { - aspirate_airGap_checkbox?: boolean | null - aspirate_airGap_volume?: string | null +interface DisposalVolumeFieldProps { path: PathOption pipette: string | null propsForFields: FieldPropsByName stepType: StepType volume: string | null + aspirate_airGap_checkbox?: boolean | null + aspirate_airGap_volume?: string | null } -type Props = SP & OP -const DisposalVolumeFieldComponent = (props: Props): JSX.Element => { - const { propsForFields } = props +export const DisposalVolumeField = ( + props: DisposalVolumeFieldProps +): JSX.Element => { + const { + path, + stepType, + volume, + pipette, + propsForFields, + aspirate_airGap_checkbox, + aspirate_airGap_volume, + } = props + const { t } = useTranslation(['application', 'form']) + + const disposalOptions = useSelector(uiLabwareSelectors.getDisposalOptions) + const pipetteEntities = useSelector(stepFormSelectors.getPipetteEntities) + const blowoutLocationOptions = getBlowoutLocationOptionsForForm({ + path, + stepType, + }) + const maxDisposalVolume = getMaxDisposalVolumeForMultidispense( + { + aspirate_airGap_checkbox, + aspirate_airGap_volume, + path, + pipette, + volume, + }, + pipetteEntities + ) + const disposalDestinationOptions = [ + ...disposalOptions, + ...blowoutLocationOptions, + ] - const { maxDisposalVolume } = props const volumeBoundsCaption = maxDisposalVolume != null - ? `max ${maxDisposalVolume} ${i18n.t('application.units.microliter')}` + ? `max ${maxDisposalVolume} ${t('units.microliter')}` : null const volumeField = ( @@ -68,7 +92,7 @@ const DisposalVolumeFieldComponent = (props: Props): JSX.Element => { {...propsForFields.disposalVolume_volume} caption={volumeBoundsCaption} className={cx(styles.small_field, styles.orphan_field)} - units={i18n.t('application.units.microliter')} + units={t('units.microliter')} />
    ) @@ -76,7 +100,7 @@ const DisposalVolumeFieldComponent = (props: Props): JSX.Element => { const { value, updateValue } = propsForFields.disposalVolume_checkbox return ( - + <>
    {
    ) : null} @@ -106,43 +130,3 @@ const DisposalVolumeFieldComponent = (props: Props): JSX.Element => {
    ) } -const mapSTP = (state: BaseState, ownProps: OP): SP => { - const { - aspirate_airGap_checkbox, - aspirate_airGap_volume, - path, - pipette, - stepType, - volume, - } = ownProps - - const blowoutLocationOptions = getBlowoutLocationOptionsForForm({ - path, - stepType, - }) - - const disposalLabwareOptions = uiLabwareSelectors.getDisposalLabwareOptions( - state - ) - - const maxDisposalVolume = getMaxDisposalVolumeForMultidispense( - { - aspirate_airGap_checkbox, - aspirate_airGap_volume, - path, - pipette, - volume, - }, - stepFormSelectors.getPipetteEntities(state) - ) - - return { - maxDisposalVolume, - disposalDestinationOptions: [ - ...disposalLabwareOptions, - ...blowoutLocationOptions, - ], - } -} - -export const DisposalVolumeField = connect(mapSTP)(DisposalVolumeFieldComponent) diff --git a/protocol-designer/src/components/StepEditForm/fields/DropTipField/index.tsx b/protocol-designer/src/components/StepEditForm/fields/DropTipField/index.tsx new file mode 100644 index 00000000000..0448d348430 --- /dev/null +++ b/protocol-designer/src/components/StepEditForm/fields/DropTipField/index.tsx @@ -0,0 +1,62 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { useSelector } from 'react-redux' +import { DropdownField, DropdownOption, FormGroup } from '@opentrons/components' +import { getAdditionalEquipmentEntities } from '../../../../step-forms/selectors' +import { StepFormDropdown } from '../StepFormDropdownField' +import styles from '../../StepEditForm.css' + +export function DropTipField( + props: Omit, 'options'> +): JSX.Element { + const { + value: dropdownItem, + name, + onFieldBlur, + onFieldFocus, + updateValue, + } = props + const { t } = useTranslation('form') + const additionalEquipment = useSelector(getAdditionalEquipmentEntities) + const wasteChute = Object.values(additionalEquipment).find( + aE => aE.name === 'wasteChute' + ) + const trashBin = Object.values(additionalEquipment).find( + aE => aE.name === 'trashBin' + ) + const wasteChuteOption: DropdownOption = { + name: 'Waste Chute', + value: wasteChute?.id ?? '', + } + const trashOption: DropdownOption = { + name: 'Trash Bin', + value: trashBin?.id ?? '', + } + + const options: DropdownOption[] = [] + if (wasteChute != null) options.push(wasteChuteOption) + if (trashBin != null) options.push(trashOption) + + React.useEffect(() => { + if (additionalEquipment[String(dropdownItem)] == null) { + updateValue(null) + } + }, [dropdownItem]) + return ( + + ) => { + updateValue(e.currentTarget.value) + }} + /> + + ) +} diff --git a/protocol-designer/src/components/StepEditForm/fields/FlowRateField/FlowRateInput.tsx b/protocol-designer/src/components/StepEditForm/fields/FlowRateField/FlowRateInput.tsx index 07ea4d10e8c..eb7e733468c 100644 --- a/protocol-designer/src/components/StepEditForm/fields/FlowRateField/FlowRateInput.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/FlowRateField/FlowRateInput.tsx @@ -1,19 +1,18 @@ import * as React from 'react' import round from 'lodash/round' +import { useTranslation } from 'react-i18next' import { AlertModal, FormGroup, RadioGroup, InputField, } from '@opentrons/components' -import { i18n } from '../../../../localization' import { Portal } from '../../../portals/MainPageModalPortal' import modalStyles from '../../../modals/modal.css' import stepFormStyles from '../../StepEditForm.css' import styles from './FlowRateInput.css' import { FieldProps } from '../../types' -const DEFAULT_LABEL = i18n.t('form.step_edit_form.field.flow_rate.label') const DECIMALS_ALLOWED = 1 /** When flow rate is falsey (including 0), it means 'use default' */ @@ -47,6 +46,8 @@ export const FlowRateInput = (props: FlowRateInputProps): JSX.Element => { name, pipetteDisplayName, } = props + const { t } = useTranslation(['form', 'application']) + const DEFAULT_LABEL = t('step_edit_form.field.flow_rate.label') const initialState: State = { isPristine: true, @@ -140,7 +141,7 @@ export const FlowRateInput = (props: FlowRateInputProps): JSX.Element => { isIndeterminate={isIndeterminate && modalFlowRate === null} name={`${name}_customFlowRate`} onChange={handleChangeNumber} - units={i18n.t('application.units.microliterPerSec')} + units={t('application:units.microliterPerSec')} value={`${modalFlowRate || ''}`} /> ) @@ -179,8 +180,8 @@ export const FlowRateInput = (props: FlowRateInputProps): JSX.Element => { onChange={handleChangeRadio} options={[ { - name: `${defaultFlowRate || '?'} ${i18n.t( - 'application.units.microliterPerSec' + name: `${defaultFlowRate || '?'} ${t( + 'application:units.microliterPerSec' )} (default)`, value: 'default', }, @@ -205,7 +206,7 @@ export const FlowRateInput = (props: FlowRateInputProps): JSX.Element => { name={name} onClick={openModal} readOnly - units={i18n.t('application.units.microliterPerSec')} + units={t('application:units.microliterPerSec')} value={props.value ? String(props.value) : 'default'} />
    diff --git a/protocol-designer/src/components/StepEditForm/fields/FlowRateField/index.tsx b/protocol-designer/src/components/StepEditForm/fields/FlowRateField/index.tsx index 4a3080c01cb..89cf6a43e69 100644 --- a/protocol-designer/src/components/StepEditForm/fields/FlowRateField/index.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/FlowRateField/index.tsx @@ -1,9 +1,8 @@ import * as React from 'react' import { FlowRateInput, FlowRateInputProps } from './FlowRateInput' -import { connect } from 'react-redux' +import { useSelector } from 'react-redux' import { selectors as stepFormSelectors } from '../../../../step-forms' import { FieldProps } from '../../types' -import { BaseState } from '../../../../types' interface OP extends FieldProps { pipetteId?: string | null @@ -12,33 +11,13 @@ interface OP extends FieldProps { label?: FlowRateInputProps['label'] } -interface SP { - innerKey: string - defaultFlowRate?: number | null - minFlowRate: number - maxFlowRate: number - pipetteDisplayName: string -} - -interface Props extends FlowRateInputProps { - innerKey: string -} - // Add a key to force re-constructing component when values change -function FlowRateInputWithKey(props: Props): JSX.Element { - const { innerKey, ...otherProps } = props - return -} - -function mapStateToProps(state: BaseState, ownProps: OP): SP { - const { flowRateType, pipetteId, name } = ownProps - - const pipette = - pipetteId != null - ? stepFormSelectors.getPipetteEntities(state)[pipetteId] - : null +export function FlowRateField(props: OP): JSX.Element { + const { pipetteId, flowRateType, value, ...passThruProps } = props + const pipetteEntities = useSelector(stepFormSelectors.getPipetteEntities) + const pipette = pipetteId != null ? pipetteEntities[pipetteId] : null const pipetteDisplayName = pipette ? pipette.spec.displayName : 'pipette' - + const innerKey = `${name}:${String(value || 0)}` let defaultFlowRate if (pipette) { if (flowRateType === 'aspirate') { @@ -48,30 +27,16 @@ function mapStateToProps(state: BaseState, ownProps: OP): SP { } } - // force each field to have a new instance created when value is changed - const innerKey = `${name}:${String(ownProps.value || 0)}` - - return { - innerKey, - defaultFlowRate, - minFlowRate: 0, - // NOTE: since we only have rule-of-thumb, max is entire volume in 1 second - maxFlowRate: pipette ? pipette.spec.maxVolume : Infinity, - pipetteDisplayName, - } -} - -const mergeProps = ( - stateProps: SP, - _dispatchProps: null, - ownProps: OP -): Props => { - const { pipetteId, ...passThruProps } = ownProps - return { ...stateProps, ...passThruProps } + return ( + + ) } - -export const FlowRateField = connect( - mapStateToProps, - null, - mergeProps -)(FlowRateInputWithKey) diff --git a/protocol-designer/src/components/StepEditForm/fields/LabwareField.ts b/protocol-designer/src/components/StepEditForm/fields/LabwareField.ts deleted file mode 100644 index 049e59ba612..00000000000 --- a/protocol-designer/src/components/StepEditForm/fields/LabwareField.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { connect } from 'react-redux' -import { selectors as uiLabwareSelectors } from '../../../ui/labware' -import { StepFormDropdown } from './StepFormDropdownField' -import type { Options } from '@opentrons/components' -import type { BaseState } from '../../../types' - -interface SP { - options: Options -} - -const mapSTP = (state: BaseState): SP => ({ - options: uiLabwareSelectors.getLabwareOptions(state), -}) - -export const LabwareField = connect(mapSTP)(StepFormDropdown) diff --git a/protocol-designer/src/components/StepEditForm/fields/LabwareField.tsx b/protocol-designer/src/components/StepEditForm/fields/LabwareField.tsx new file mode 100644 index 00000000000..75756800ac5 --- /dev/null +++ b/protocol-designer/src/components/StepEditForm/fields/LabwareField.tsx @@ -0,0 +1,19 @@ +import * as React from 'react' +import { useSelector } from 'react-redux' +import { + getDisposalOptions, + getLabwareOptions, +} from '../../../ui/labware/selectors' +import { StepFormDropdown } from './StepFormDropdownField' +import type { FieldProps } from '../types' + +export const LabwareField = (props: FieldProps): JSX.Element => { + const disposalOptions = useSelector(getDisposalOptions) + const options = useSelector(getLabwareOptions) + const allOptions = + props.name === 'dispense_labware' + ? [...options, ...disposalOptions] + : [...options] + + return +} diff --git a/protocol-designer/src/components/StepEditForm/fields/LabwareLocationField/index.tsx b/protocol-designer/src/components/StepEditForm/fields/LabwareLocationField/index.tsx index 1879c63a317..072f7fa5e02 100644 --- a/protocol-designer/src/components/StepEditForm/fields/LabwareLocationField/index.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/LabwareLocationField/index.tsx @@ -1,7 +1,10 @@ import * as React from 'react' import { useSelector } from 'react-redux' -import { getModuleDisplayName, WASTE_CHUTE_SLOT } from '@opentrons/shared-data' -import { i18n } from '../../../../localization' +import { useTranslation } from 'react-i18next' +import { + getModuleDisplayName, + WASTE_CHUTE_CUTOUT, +} from '@opentrons/shared-data' import { getAdditionalEquipmentEntities, getLabwareEntities, @@ -9,7 +12,7 @@ import { } from '../../../../step-forms/selectors' import { getRobotStateAtActiveItem, - getUnocuppiedLabwareLocationOptions, + getUnoccupiedLabwareLocationOptions, } from '../../../../top-selectors/labware-locations' import { getHasWasteChute } from '../../../labware' import { StepFormDropdown } from '../StepFormDropdownField' @@ -19,6 +22,7 @@ export function LabwareLocationField( useGripper: boolean } & { canSave: boolean } & { labware: string } ): JSX.Element { + const { t } = useTranslation('form') const { labware, useGripper, value } = props const labwareEntities = useSelector(getLabwareEntities) const robotState = useSelector(getRobotStateAtActiveItem) @@ -33,11 +37,12 @@ export function LabwareLocationField( useGripper && hasWasteChute && !isLabwareOffDeck let unoccupiedLabwareLocationsOptions = - useSelector(getUnocuppiedLabwareLocationOptions) ?? [] + useSelector(getUnoccupiedLabwareLocationOptions) ?? [] if (isLabwareOffDeck && hasWasteChute) { unoccupiedLabwareLocationsOptions = unoccupiedLabwareLocationsOptions.filter( - option => option.value !== 'offDeck' && option.value !== WASTE_CHUTE_SLOT + option => + option.value !== 'offDeck' && option.value !== WASTE_CHUTE_CUTOUT ) } else if (useGripper || isLabwareOffDeck) { unoccupiedLabwareLocationsOptions = unoccupiedLabwareLocationsOptions.filter( @@ -75,10 +80,10 @@ export function LabwareLocationField( {...props} errorToShow={ !props.canSave && bothFieldsSelected - ? i18n.t( - 'form.step_edit_form.labwareLabel.errors.labwareSlotIncompatible', - { labwareName: labwareDisplayName, slot: locationString } - ) + ? t('step_edit_form.labwareLabel.errors.labwareSlotIncompatible', { + labwareName: labwareDisplayName, + slot: locationString, + }) : undefined } options={unoccupiedLabwareLocationsOptions} diff --git a/protocol-designer/src/components/StepEditForm/fields/MixFields.tsx b/protocol-designer/src/components/StepEditForm/fields/MixFields.tsx index 1ebfcd8b8d8..d6384ff9be6 100644 --- a/protocol-designer/src/components/StepEditForm/fields/MixFields.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/MixFields.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { i18n } from '../../../localization' +import { useTranslation } from 'react-i18next' import { CheckboxRowField, TextField } from './' import { FieldPropsByName } from '../types' import styles from '../StepEditForm.css' @@ -10,6 +10,7 @@ export const MixFields = (props: { volumeFieldName: string timesFieldName: string }): JSX.Element => { + const { t } = useTranslation(['form', 'application']) const { propsForFields, checkboxFieldName, @@ -20,18 +21,18 @@ export const MixFields = (props: { return ( ) diff --git a/protocol-designer/src/components/StepEditForm/fields/PathField/Path.tsx b/protocol-designer/src/components/StepEditForm/fields/PathField/PathField.tsx similarity index 75% rename from protocol-designer/src/components/StepEditForm/fields/PathField/Path.tsx rename to protocol-designer/src/components/StepEditForm/fields/PathField/PathField.tsx index d8108997074..de5a6b2901b 100644 --- a/protocol-designer/src/components/StepEditForm/fields/PathField/Path.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/PathField/PathField.tsx @@ -1,13 +1,19 @@ import * as React from 'react' +import { useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' import cx from 'classnames' import { FormGroup, Tooltip, useHoverTooltip } from '@opentrons/components' -import { i18n } from '../../../../localization' +import { selectors as stepFormSelectors } from '../../../../step-forms' import SINGLE_IMAGE from '../../../../images/path_single_transfers.svg' import MULTI_DISPENSE_IMAGE from '../../../../images/path_multi_dispense.svg' import MULTI_ASPIRATE_IMAGE from '../../../../images/path_multi_aspirate.svg' import { PathOption } from '../../../../form-types' import { FieldProps } from '../../types' -import { DisabledPathMap, ValuesForPath } from './getDisabledPathMap' +import { + DisabledPathMap, + getDisabledPathMap, + ValuesForPath, +} from './getDisabledPathMap' import styles from '../../StepEditForm.css' const PATH_ANIMATION_IMAGES = { @@ -31,10 +37,7 @@ const ALL_PATH_OPTIONS: Array<{ name: PathOption; image: string }> = [ }, ] -type PathFieldProps = FieldProps & - ValuesForPath & { - disabledPathMap: DisabledPathMap - } +type PathFieldProps = FieldProps & ValuesForPath interface ButtonProps { children?: React.ReactNode @@ -57,11 +60,11 @@ const PathButton = (buttonProps: ButtonProps): JSX.Element => { subtitle, } = buttonProps const [targetProps, tooltipProps] = useHoverTooltip() - + const { t } = useTranslation('form') const tooltip = (
    - {i18n.t(`form.step_edit_form.field.path.title.${path}`)} + {t(`step_edit_form.field.path.title.${path}`)}
    { - const { disabledPathMap, value, updateValue } = props +export const PathField = (props: PathFieldProps): JSX.Element => { + const { + aspirate_airGap_checkbox, + aspirate_airGap_volume, + aspirate_wells, + changeTip, + dispense_wells, + pipette, + volume, + value, + updateValue, + } = props + const { t } = useTranslation('form') + const pipetteEntities = useSelector(stepFormSelectors.getPipetteEntities) + const disabledPathMap = getDisabledPathMap( + { + aspirate_airGap_checkbox, + aspirate_airGap_volume, + aspirate_wells, + changeTip, + dispense_wells, + pipette, + volume, + }, + pipetteEntities, + t + ) return (
      diff --git a/protocol-designer/src/components/StepEditForm/fields/PathField/getDisabledPathMap.ts b/protocol-designer/src/components/StepEditForm/fields/PathField/getDisabledPathMap.ts index a07c072d39d..f478e69fbb2 100644 --- a/protocol-designer/src/components/StepEditForm/fields/PathField/getDisabledPathMap.ts +++ b/protocol-designer/src/components/StepEditForm/fields/PathField/getDisabledPathMap.ts @@ -1,4 +1,3 @@ -import { i18n } from '../../../../localization' import { getWellRatio } from '../../../../steplist/utils' import { getPipetteCapacity } from '../../../../pipettes/pipetteData' import { @@ -19,7 +18,8 @@ export interface ValuesForPath { } export function getDisabledPathMap( values: ValuesForPath, - pipetteEntities: PipetteEntities + pipetteEntities: PipetteEntities, + t: any ): DisabledPathMap { const { aspirate_airGap_checkbox, @@ -36,15 +36,15 @@ export function getDisabledPathMap( if (changeTip === 'perDest') { disabledPathMap = { ...disabledPathMap, - multiDispense: i18n.t( - 'form.step_edit_form.field.path.subtitle.incompatible_with_per_dest' + multiDispense: t( + 'step_edit_form.field.path.subtitle.incompatible_with_per_dest' ), } } else if (changeTip === 'perSource') { disabledPathMap = { ...disabledPathMap, - multiAspirate: i18n.t( - 'form.step_edit_form.field.path.subtitle.incompatible_with_per_source' + multiAspirate: t( + 'step_edit_form.field.path.subtitle.incompatible_with_per_source' ), } } @@ -70,18 +70,14 @@ export function getDisabledPathMap( if (!withinCapacityForMultiDispense) { disabledPathMap = { ...disabledPathMap, - multiDispense: i18n.t( - 'form.step_edit_form.field.path.subtitle.volume_too_high' - ), + multiDispense: t('step_edit_form.field.path.subtitle.volume_too_high'), } } if (!withinCapacityForMultiAspirate) { disabledPathMap = { ...disabledPathMap, - multiAspirate: i18n.t( - 'form.step_edit_form.field.path.subtitle.volume_too_high' - ), + multiAspirate: t('step_edit_form.field.path.subtitle.volume_too_high'), } } @@ -89,26 +85,18 @@ export function getDisabledPathMap( if (wellRatio === '1:many') { disabledPathMap = { ...disabledPathMap, - multiAspirate: i18n.t( - 'form.step_edit_form.field.path.subtitle.only_many_to_1' - ), + multiAspirate: t('step_edit_form.field.path.subtitle.only_many_to_1'), } } else if (wellRatio === 'many:1') { disabledPathMap = { ...disabledPathMap, - multiDispense: i18n.t( - 'form.step_edit_form.field.path.subtitle.only_1_to_many' - ), + multiDispense: t('step_edit_form.field.path.subtitle.only_1_to_many'), } } else { disabledPathMap = { ...disabledPathMap, - multiAspirate: i18n.t( - 'form.step_edit_form.field.path.subtitle.only_many_to_1' - ), - multiDispense: i18n.t( - 'form.step_edit_form.field.path.subtitle.only_1_to_many' - ), + multiAspirate: t('step_edit_form.field.path.subtitle.only_many_to_1'), + multiDispense: t('step_edit_form.field.path.subtitle.only_1_to_many'), } } return disabledPathMap diff --git a/protocol-designer/src/components/StepEditForm/fields/PathField/index.ts b/protocol-designer/src/components/StepEditForm/fields/PathField/index.ts deleted file mode 100644 index 8f22db5cbd3..00000000000 --- a/protocol-designer/src/components/StepEditForm/fields/PathField/index.ts +++ /dev/null @@ -1,41 +0,0 @@ -import * as React from 'react' -import { connect } from 'react-redux' -import { Path } from './Path' -import { selectors as stepFormSelectors } from '../../../../step-forms' -import { getDisabledPathMap } from './getDisabledPathMap' -import { BaseState } from '../../../../types' -type Props = React.ComponentProps -interface SP { - disabledPathMap: Props['disabledPathMap'] -} -type OP = Omit - -function mapSTP(state: BaseState, ownProps: OP): SP { - const { - aspirate_airGap_checkbox, - aspirate_airGap_volume, - aspirate_wells, - changeTip, - dispense_wells, - pipette, - volume, - } = ownProps - const pipetteEntities = stepFormSelectors.getPipetteEntities(state) - const disabledPathMap = getDisabledPathMap( - { - aspirate_airGap_checkbox, - aspirate_airGap_volume, - aspirate_wells, - changeTip, - dispense_wells, - pipette, - volume, - }, - pipetteEntities - ) - return { - disabledPathMap, - } -} - -export const PathField = connect(mapSTP, () => ({}))(Path) diff --git a/protocol-designer/src/components/StepEditForm/fields/PipetteField.tsx b/protocol-designer/src/components/StepEditForm/fields/PipetteField.tsx index 9308cc1baaa..1917c057bb9 100644 --- a/protocol-designer/src/components/StepEditForm/fields/PipetteField.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/PipetteField.tsx @@ -1,34 +1,25 @@ import * as React from 'react' -import { connect } from 'react-redux' -import { FormGroup, DropdownField, Options } from '@opentrons/components' -import { i18n } from '../../../localization' +import { useTranslation } from 'react-i18next' +import { useSelector } from 'react-redux' +import { FormGroup, DropdownField } from '@opentrons/components' import { selectors as stepFormSelectors } from '../../../step-forms' -import { BaseState } from '../../../types' import styles from '../StepEditForm.css' import { FieldProps } from '../types' -type OP = FieldProps - -interface SP { - pipetteOptions: Options -} - -type Props = OP & SP - -const PipetteFieldSTP = (state: BaseState, ownProps: OP): SP => ({ - pipetteOptions: stepFormSelectors.getEquippedPipetteOptions(state), -}) - -export const PipetteField = connect(PipetteFieldSTP)((props: Props) => { +export const PipetteField = (props: FieldProps): JSX.Element => { const { onFieldBlur, onFieldFocus, updateValue, value } = props + const pipetteOptions = useSelector( + stepFormSelectors.getEquippedPipetteOptions + ) + const { t } = useTranslation('form') return ( { /> ) -}) +} diff --git a/protocol-designer/src/components/StepEditForm/fields/ProfileItemRows.tsx b/protocol-designer/src/components/StepEditForm/fields/ProfileItemRows.tsx index 86098c63b26..aad87182787 100644 --- a/protocol-designer/src/components/StepEditForm/fields/ProfileItemRows.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/ProfileItemRows.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' import cx from 'classnames' import { @@ -11,7 +12,6 @@ import { TOOLTIP_TOP, TOOLTIP_TOP_END, } from '@opentrons/components' -import { i18n } from '../../../localization' import * as steplistActions from '../../../steplist/actions' import { PROFILE_CYCLE, @@ -51,7 +51,7 @@ interface ProfileCycleRowProps { export const ProfileCycleRow = (props: ProfileCycleRowProps): JSX.Element => { const { cycleItem, focusHandlers, stepOffset } = props const dispatch = useDispatch() - + const { t } = useTranslation(['tooltip', 'application']) const addStepToCycle = (): void => { dispatch(steplistActions.addProfileStep({ cycleId: cycleItem.id })) } @@ -108,7 +108,7 @@ export const ProfileCycleRow = (props: ProfileCycleRowProps): JSX.Element => { name="repetitions" focusHandlers={focusHandlers} profileItem={cycleItem} - units={i18n.t('application.units.cycles')} + units={t('application:units.cycles')} className={cx(styles.small_field, styles.cycles_field)} updateValue={(name, value) => dispatch( @@ -122,7 +122,7 @@ export const ProfileCycleRow = (props: ProfileCycleRowProps): JSX.Element => {
    )} - {i18n.t('tooltip.profile.add_step_to_cycle')} + {t('profile.add_step_to_cycle')}
    + Step @@ -130,7 +130,7 @@ export const ProfileCycleRow = (props: ProfileCycleRowProps): JSX.Element => {
    - {i18n.t('tooltip.profile.delete_cycle')} + {t('profile.delete_cycle')}
    @@ -149,7 +149,7 @@ export interface ProfileItemRowsProps { export const ProfileItemRows = (props: ProfileItemRowsProps): JSX.Element => { const { orderedProfileItems, profileItemsById } = props - + const { t } = useTranslation(['tooltip', 'form']) const dispatch = useDispatch() const addProfileCycle = (): void => { dispatch(steplistActions.addProfileCycle(null)) @@ -205,28 +205,20 @@ export const ProfileItemRows = (props: ProfileItemRowsProps): JSX.Element => {
    )} {rows} - - {i18n.t('tooltip.profile.add_step')} - - - {i18n.t('tooltip.profile.add_cycle')} - + {t('profile.add_step')} + {t('profile.add_cycle')}
    - {i18n.t( - 'form.step_edit_form.field.thermocyclerProfile.add_step_button' - )} + {t('form:step_edit_form.field.thermocyclerProfile.add_step_button')} - {i18n.t( - 'form.step_edit_form.field.thermocyclerProfile.add_cycle_button' - )} + {t('form:step_edit_form.field.thermocyclerProfile.add_cycle_button')}
    @@ -297,6 +289,7 @@ interface ProfileStepRowProps { const ProfileStepRow = (props: ProfileStepRowProps): JSX.Element => { const { focusHandlers, profileStepItem, isCycle } = props + const { t } = useTranslation(['application', 'tooltip']) const dispatch = useDispatch() const updateStepFieldValue = (name: string, value: unknown): void => { @@ -319,9 +312,9 @@ const ProfileStepRow = (props: ProfileStepRowProps): JSX.Element => { ] as const const units: Record = { title: null, - temperature: i18n.t('application.units.degrees'), - durationMinutes: i18n.t('application.units.minutes'), - durationSeconds: i18n.t('application.units.seconds'), + temperature: t('units.degrees'), + durationMinutes: t('units.minutes'), + durationSeconds: t('units.seconds'), } const [targetProps, tooltipProps] = useHoverTooltip({ placement: TOOLTIP_TOP, @@ -357,9 +350,7 @@ const ProfileStepRow = (props: ProfileStepRowProps): JSX.Element => { className={cx({ [styles.cycle_step_delete]: isCycle })} {...targetProps} > - - {i18n.t('tooltip.profile.delete_step')} - + {t('tooltip:profile.delete_step')}
    diff --git a/protocol-designer/src/components/StepEditForm/fields/StepFormDropdownField.tsx b/protocol-designer/src/components/StepEditForm/fields/StepFormDropdownField.tsx index 6f3a1a3fac9..2a2f2a21e18 100644 --- a/protocol-designer/src/components/StepEditForm/fields/StepFormDropdownField.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/StepFormDropdownField.tsx @@ -1,9 +1,9 @@ import * as React from 'react' import { DropdownField, Options } from '@opentrons/components' import cx from 'classnames' -import styles from '../StepEditForm.css' import { StepFieldName } from '../../../steplist/fieldLevel' -import { FieldProps } from '../types' +import styles from '../StepEditForm.css' +import type { FieldProps } from '../types' export interface StepFormDropdownProps extends FieldProps { options: Options diff --git a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/TipPositionModal.tsx b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/TipPositionModal.tsx index 78e51347010..50f4567907c 100644 --- a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/TipPositionModal.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/TipPositionModal.tsx @@ -1,5 +1,6 @@ import * as React from 'react' import cx from 'classnames' +import { useTranslation } from 'react-i18next' import round from 'lodash/round' import { AlertModal, @@ -10,7 +11,6 @@ import { OutlineButton, RadioGroup, } from '@opentrons/components' -import { i18n } from '../../../../localization' import { Portal } from '../../../portals/MainPageModalPortal' import modalStyles from '../../../modals/modal.css' import { TipPositionZAxisViz } from './TipPositionZAxisViz' @@ -45,13 +45,14 @@ const getErrorText = (args: { maxMmFromBottom: number minMmFromBottom: number isPristine: boolean + t: any }): string | null => { - const { errors, minMmFromBottom, maxMmFromBottom, isPristine } = args + const { errors, minMmFromBottom, maxMmFromBottom, isPristine, t } = args if (errors.includes(TOO_MANY_DECIMALS)) { - return i18n.t('modal.tip_position.errors.TOO_MANY_DECIMALS') + return t('tip_position.errors.TOO_MANY_DECIMALS') } else if (!isPristine && errors.includes(OUT_OF_BOUNDS)) { - return i18n.t('modal.tip_position.errors.OUT_OF_BOUNDS', { + return t('tip_position.errors.OUT_OF_BOUNDS', { minMmFromBottom, maxMmFromBottom, }) @@ -89,7 +90,7 @@ const getErrors = (args: { export const TipPositionModal = (props: Props): JSX.Element => { const { isIndeterminate, name, wellDepthMm } = props - + const { t } = useTranslation(['modal', 'button']) const defaultMmFromBottom = utils.getDefaultMmFromBottom({ name, wellDepthMm, @@ -135,6 +136,7 @@ export const TipPositionModal = (props: Props): JSX.Element => { maxMmFromBottom, minMmFromBottom, isPristine, + t, }) const handleDone = (): void => { @@ -234,10 +236,10 @@ export const TipPositionModal = (props: Props): JSX.Element => { { onCloseClick={handleCancel} >
    -

    {i18n.t('modal.tip_position.title')}

    -

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

    +

    {t('tip_position.title')}

    +

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

    diff --git a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/index.tsx b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/index.tsx index 8511142856e..54cc63213b6 100644 --- a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/index.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/index.tsx @@ -1,5 +1,6 @@ import * as React from 'react' -import { connect } from 'react-redux' +import { useTranslation } from 'react-i18next' +import { useSelector } from 'react-redux' import { FormGroup, InputField, @@ -12,53 +13,64 @@ import { getIsTouchTipField, getIsDelayPositionField, } from '../../../../form-types' -import { i18n } from '../../../../localization' import { selectors as stepFormSelectors } from '../../../../step-forms' +import { TipPositionModal } from './TipPositionModal' +import { getDefaultMmFromBottom } from './utils' import stepFormStyles from '../../StepEditForm.css' import styles from './TipPositionInput.css' -import { TipPositionModal } from './TipPositionModal' -import { getDefaultMmFromBottom } from './utils' -import { BaseState } from '../../../../types' -import { FieldProps } from '../../types' +import type { FieldProps } from '../../types' -interface OP extends FieldProps { +interface TipPositionFieldProps extends FieldProps { labwareId?: string | null className?: string } -interface SP { - mmFromBottom: number | null - wellDepthMm: number -} +export function TipPositionField(props: TipPositionFieldProps): JSX.Element { + const { + disabled, + name, + tooltipContent, + updateValue, + isIndeterminate, + labwareId, + } = props + const { t } = useTranslation('application') + const [targetProps, tooltipProps] = useHoverTooltip() + const [isModalOpen, setModalOpen] = React.useState(false) + const labwareEntities = useSelector(stepFormSelectors.getLabwareEntities) + const labwareDef = + labwareId != null && labwareEntities[labwareId] != null + ? labwareEntities[labwareId].def + : null -type Props = OP & SP + let wellDepthMm = 0 + if (labwareDef != null) { + // NOTE: only taking depth of first well in labware def, UI not currently equipped for multiple depths + const firstWell = labwareDef.wells.A1 + if (firstWell) { + wellDepthMm = getWellsDepth(labwareDef, ['A1']) + } + } -function TipPositionInput(props: Props): JSX.Element { - const [isModalOpen, setModalOpen] = React.useState(false) + if (wellDepthMm === 0 && labwareId != null && labwareDef != null) { + console.error( + `expected to find the well depth mm with labwareId ${labwareId} but could not` + ) + } const handleOpen = (): void => { - if (props.wellDepthMm) { + if (wellDepthMm) { setModalOpen(true) } } const handleClose = (): void => { setModalOpen(false) } - - const { - disabled, - name, - mmFromBottom, - tooltipContent, - wellDepthMm, - updateValue, - isIndeterminate, - } = props - const isTouchTipField = getIsTouchTipField(name) const isDelayPositionField = getIsDelayPositionField(name) - let value: number | string = '' + let value: string | number = '0' + const mmFromBottom = typeof value === 'number' ? value : null if (wellDepthMm !== null) { // show default value for field in parens if no mmFromBottom value is selected value = @@ -66,9 +78,6 @@ function TipPositionInput(props: Props): JSX.Element { ? mmFromBottom : getDefaultMmFromBottom({ name, wellDepthMm }) } - - const [targetProps, tooltipProps] = useHoverTooltip() - return ( <> {tooltipContent} @@ -95,7 +104,7 @@ function TipPositionInput(props: Props): JSX.Element { onClick={handleOpen} value={String(value)} isIndeterminate={isIndeterminate} - units={i18n.t('application.units.millimeter')} + units={t('units.millimeter')} id={`TipPositionField_${name}`} /> @@ -111,13 +120,14 @@ interface WrapperProps { targetProps: UseHoverTooltipTargetProps } -const Wrapper = (props: WrapperProps): JSX.Element => - props.isTouchTipField || props.isDelayPositionField ? ( +const Wrapper = (props: WrapperProps): JSX.Element => { + const { t } = useTranslation('form') + return props.isTouchTipField || props.isDelayPositionField ? (
    {props.children}
    ) : ( @@ -125,24 +135,4 @@ const Wrapper = (props: WrapperProps): JSX.Element => ) - -const mapSTP = (state: BaseState, ownProps: OP): SP => { - const { labwareId, value } = ownProps - - let wellDepthMm = 0 - if (labwareId != null) { - const labwareDef = stepFormSelectors.getLabwareEntities(state)[labwareId] - .def - - // NOTE: only taking depth of first well in labware def, UI not currently equipped for multiple depths - const firstWell = labwareDef.wells.A1 - if (firstWell) wellDepthMm = getWellsDepth(labwareDef, ['A1']) - } - - return { - wellDepthMm, - mmFromBottom: typeof value === 'number' ? value : null, - } } - -export const TipPositionField = connect(mapSTP, () => ({}))(TipPositionInput) diff --git a/protocol-designer/src/components/StepEditForm/fields/VolumeField.tsx b/protocol-designer/src/components/StepEditForm/fields/VolumeField.tsx index 0d1ba73efa2..773cba3f7e2 100644 --- a/protocol-designer/src/components/StepEditForm/fields/VolumeField.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/VolumeField.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { useTranslation } from 'react-i18next' import { FormGroup, Tooltip, @@ -6,7 +7,6 @@ import { TOOLTIP_TOP, TOOLTIP_FIXED, } from '@opentrons/components' -import { i18n } from '../../../localization' import { getFieldDefaultTooltip } from '../utils' import { TextField } from './TextField' import { StepType } from '../../../form-types' @@ -19,6 +19,7 @@ type Props = FieldProps & { className: string } export const VolumeField = (props: Props): JSX.Element => { + const { t } = useTranslation(['tooltip', 'application']) const { stepType, label, className, ...propsForVolumeField } = props const [targetProps, tooltipProps] = useHoverTooltip({ placement: TOOLTIP_TOP, @@ -28,13 +29,13 @@ export const VolumeField = (props: Props): JSX.Element => { return (
    - {getFieldDefaultTooltip(propsForVolumeField.name)} + {getFieldDefaultTooltip(propsForVolumeField.name, t)}
    diff --git a/protocol-designer/src/components/StepEditForm/fields/WellOrderField/WellOrderModal.tsx b/protocol-designer/src/components/StepEditForm/fields/WellOrderField/WellOrderModal.tsx index e7d1c701c7e..e2e09a2ea03 100644 --- a/protocol-designer/src/components/StepEditForm/fields/WellOrderField/WellOrderModal.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/WellOrderField/WellOrderModal.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import cx from 'classnames' -import { i18n } from '../../../../localization' +import { useTranslation } from 'react-i18next' import { Portal } from '../../../portals/MainPageModalPortal' import { Modal, @@ -9,12 +9,12 @@ import { FormGroup, DropdownField, } from '@opentrons/components' -import modalStyles from '../../../modals/modal.css' -import { WellOrderOption } from '../../../../form-types' - import { WellOrderViz } from './WellOrderViz' -import styles from './WellOrderInput.css' +import type { WellOrderOption } from '../../../../form-types' + +import modalStyles from '../../../modals/modal.css' import stepEditStyles from '../../StepEditForm.css' +import styles from './WellOrderInput.css' const DEFAULT_FIRST: WellOrderOption = 't2b' const DEFAULT_SECOND: WellOrderOption = 'l2r' @@ -44,51 +44,63 @@ interface State { secondValue: WellOrderOption } -export const ResetButton = (props: { onClick: () => void }): JSX.Element => ( - - {i18n.t('button.reset')} - -) - -export const CancelButton = (props: { onClick: () => void }): JSX.Element => ( - - {i18n.t('button.cancel')} - -) - -export const DoneButton = (props: { onClick: () => void }): JSX.Element => ( - - {i18n.t('button.done')} - -) - -export class WellOrderModal extends React.Component< - WellOrderModalProps, - State -> { - constructor(props: WellOrderModalProps) { - super(props) - const { - initialFirstValue, - initialSecondValue, - } = this.getInitialFirstValues() - this.state = { - firstValue: initialFirstValue, - secondValue: initialSecondValue, - } - } +export const ResetButton = (props: { onClick: () => void }): JSX.Element => { + const { t } = useTranslation('button') + return ( + + {t('reset')} + + ) +} - getInitialFirstValues: () => { +export const CancelButton = (props: { onClick: () => void }): JSX.Element => { + const { t } = useTranslation('button') + + return ( + + {t('cancel')} + + ) +} +export const DoneButton = (props: { onClick: () => void }): JSX.Element => { + const { t } = useTranslation('button') + + return ( + + {t('done')} + + ) +} + +export const WellOrderModal = ( + props: WellOrderModalProps +): JSX.Element | null => { + const { t } = useTranslation(['form', 'modal']) + const { + isOpen, + closeModal, + firstName, + secondName, + updateValues, + firstValue, + secondValue, + } = props + const getInitialFirstValues: () => { initialFirstValue: WellOrderOption initialSecondValue: WellOrderOption } = () => { - const { firstValue, secondValue } = this.props if (firstValue == null || secondValue == null) { return { initialFirstValue: DEFAULT_FIRST, @@ -101,140 +113,133 @@ export class WellOrderModal extends React.Component< } } - applyChanges: () => void = () => { - this.props.updateValues(this.state.firstValue, this.state.secondValue) + const [wellOrder, setWellOrder] = React.useState({ + firstValue: DEFAULT_FIRST, + secondValue: DEFAULT_SECOND, + }) + + React.useEffect(() => { + if (firstValue != null && secondValue != null) { + setWellOrder({ + firstValue: firstValue, + secondValue: secondValue, + }) + } + }, [firstValue, secondValue]) + + const applyChanges = (): void => { + updateValues(wellOrder.firstValue, wellOrder.secondValue) } - handleReset: () => void = () => { - this.setState( - { firstValue: DEFAULT_FIRST, secondValue: DEFAULT_SECOND }, - this.applyChanges - ) - this.props.closeModal() + const handleReset = (): void => { + setWellOrder({ firstValue: DEFAULT_FIRST, secondValue: DEFAULT_SECOND }) + applyChanges() + closeModal() } - handleCancel: () => void = () => { - const { - initialFirstValue, - initialSecondValue, - } = this.getInitialFirstValues() - this.setState({ + const handleCancel = (): void => { + const { initialFirstValue, initialSecondValue } = getInitialFirstValues() + setWellOrder({ firstValue: initialFirstValue, secondValue: initialSecondValue, }) - this.props.closeModal() + closeModal() } - handleDone: () => void = () => { - this.applyChanges() - this.props.closeModal() + const handleDone = (): void => { + applyChanges() + closeModal() } - makeOnChange: ( - ordinality: 'first' | 'second' - ) => ( + const makeOnChange = (ordinality: 'first' | 'second') => ( event: React.ChangeEvent - ) => void = ordinality => event => { + ): void => { const { value } = event.currentTarget // @ts-expect-error (ce, 2021-06-22) missing one prop or the other let nextState: State = { [`${ordinality}Value`]: value } if (ordinality === 'first') { if ( VERTICAL_VALUES.includes(value as WellOrderOption) && - VERTICAL_VALUES.includes(this.state.secondValue) + VERTICAL_VALUES.includes(wellOrder.secondValue) ) { nextState = { ...nextState, secondValue: HORIZONTAL_VALUES[0] } } else if ( HORIZONTAL_VALUES.includes(value as WellOrderOption) && - HORIZONTAL_VALUES.includes(this.state.secondValue) + HORIZONTAL_VALUES.includes(wellOrder.secondValue) ) { nextState = { ...nextState, secondValue: VERTICAL_VALUES[0] } } } - this.setState(nextState) + setWellOrder(nextState) } - isSecondOptionDisabled: (wellOrderOption: WellOrderOption) => boolean = ( - value: WellOrderOption - ) => { - if (VERTICAL_VALUES.includes(this.state.firstValue)) { + const isSecondOptionDisabled = (value: WellOrderOption): boolean => { + if (VERTICAL_VALUES.includes(wellOrder.firstValue)) { return VERTICAL_VALUES.includes(value) - } else if (HORIZONTAL_VALUES.includes(this.state.firstValue)) { + } else if (HORIZONTAL_VALUES.includes(wellOrder.firstValue)) { return HORIZONTAL_VALUES.includes(value) } else { return false } } - render(): React.ReactNode | null { - if (!this.props.isOpen) return null - - const { firstValue, secondValue } = this.state - const { firstName, secondName } = this.props - - return ( - - -
    -

    {i18n.t('modal.well_order.title')}

    -

    {i18n.t('modal.well_order.body')}

    -
    -
    - -
    - ({ - value, - name: i18n.t( - `form.step_edit_form.field.well_order.option.${value}` - ), - }))} - /> - - {i18n.t('modal.well_order.then')} - - ({ - value, - name: i18n.t( - `form.step_edit_form.field.well_order.option.${value}` - ), - disabled: this.isSecondOptionDisabled(value), - }))} - /> -
    -
    - - - -
    -
    - -
    - - + if (!isOpen) return null + + return ( + + +
    +

    {t('modal:well_order.title')}

    +

    {t('modal:well_order.body')}

    +
    +
    + +
    + ({ + value, + name: t(`step_edit_form.field.well_order.option.${value}`), + }))} + /> + + {t('modal:well_order.then')} + + ({ + value, + name: t(`step_edit_form.field.well_order.option.${value}`), + disabled: isSecondOptionDisabled(value), + }))} + />
    +
    + + + +
    +
    + +
    + +
    - - - ) - } +
    +
    +
    + ) } diff --git a/protocol-designer/src/components/StepEditForm/fields/WellOrderField/index.tsx b/protocol-designer/src/components/StepEditForm/fields/WellOrderField/index.tsx index 62e6587177f..f3867dae2ed 100644 --- a/protocol-designer/src/components/StepEditForm/fields/WellOrderField/index.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/WellOrderField/index.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { useTranslation } from 'react-i18next' import { css } from 'styled-components' import { FormGroup, @@ -10,7 +11,6 @@ import { C_LIGHT_GRAY, } from '@opentrons/components' import cx from 'classnames' -import { i18n } from '../../../../localization' import ZIG_ZAG_IMAGE from '../../../../images/zig_zag_icon.svg' import { WellOrderModal } from './WellOrderModal' import stepEditStyles from '../../StepEditForm.css' @@ -39,6 +39,7 @@ export const WellOrderField = (props: WellOrderFieldProps): JSX.Element => { updateFirstWellOrder, updateSecondWellOrder, } = props + const { t } = useTranslation(['form', 'modal']) const [isModalOpen, setModalOpen] = React.useState(false) const handleOpen = (): void => { @@ -85,20 +86,10 @@ export const WellOrderField = (props: WellOrderFieldProps): JSX.Element => { return ( <> - {i18n.t('form.step_edit_form.field.well_order.label')} + {t('step_edit_form.field.well_order.label')}
    - {firstValue != null && secondValue != null ? ( { secondValue )}`} > - {i18n.t('form.step_edit_form.field.well_order.mixed')} + {t('step_edit_form.field.well_order.mixed')} )}
    + ) } diff --git a/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionField.tsx b/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionField.tsx new file mode 100644 index 00000000000..0ba354a2a0a --- /dev/null +++ b/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionField.tsx @@ -0,0 +1,112 @@ +import * as React from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' +import { FormGroup, InputField } from '@opentrons/components' +import { ALL, COLUMN } from '@opentrons/shared-data' +import { + actions as stepsActions, + getSelectedStepId, + getWellSelectionLabwareKey, +} from '../../../../ui/steps' +import { selectors as stepFormSelectors } from '../../../../step-forms' +import { Portal } from '../../../portals/MainPageModalPortal' +import { WellSelectionModal } from './WellSelectionModal' +import styles from '../../StepEditForm.css' + +import type { NozzleType } from '../../../../types' +import type { FieldProps } from '../../types' + +export type Props = FieldProps & { + nozzles: string | null + pipetteId?: string | null + labwareId?: string | null +} + +export const WellSelectionField = (props: Props): JSX.Element => { + const { t } = useTranslation('form') + const { + nozzles, + labwareId, + pipetteId, + onFieldFocus, + value: selectedWells, + updateValue, + onFieldBlur, + name, + disabled, + errorToShow, + } = props + const dispatch = useDispatch() + const stepId = useSelector(getSelectedStepId) + const pipetteEntities = useSelector(stepFormSelectors.getPipetteEntities) + const wellSelectionLabwareKey = useSelector(getWellSelectionLabwareKey) + const primaryWellCount = Array.isArray(selectedWells) + ? selectedWells.length.toString() + : undefined + const pipette = pipetteId != null ? pipetteEntities[pipetteId] : null + const is8Channel = pipette != null ? pipette.spec.channels === 8 : false + + let nozzleType: NozzleType | null = null + if (pipette !== null && is8Channel) { + nozzleType = '8-channel' + } else if (nozzles === COLUMN) { + nozzleType = COLUMN + } else if (nozzles === ALL) { + nozzleType = ALL + } + + const getModalKey = (): string => { + return `${String(stepId)}${name}${pipetteId || 'noPipette'}${ + labwareId || 'noLabware' + }` + } + + const onOpen = (key: string): void => { + dispatch(stepsActions.setWellSelectionLabwareKey(key)) + } + const handleOpen = (): void => { + if (onFieldFocus) { + onFieldFocus() + } + if (labwareId && pipetteId) { + onOpen(getModalKey()) + } + } + + const handleClose = (): void => { + if (onFieldBlur) { + onFieldBlur() + } + dispatch(stepsActions.clearWellSelectionLabwareKey()) + } + + const modalKey = getModalKey() + const label = + nozzleType === '8-channel' || nozzleType === COLUMN + ? t('step_edit_form.wellSelectionLabel.columns') + : t('step_edit_form.wellSelectionLabel.wells') + return ( + + + + + + + ) +} diff --git a/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionInput.tsx b/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionInput.tsx deleted file mode 100644 index 6d2bc74c57f..00000000000 --- a/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionInput.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import * as React from 'react' -import { connect } from 'react-redux' -import { FormGroup, InputField } from '@opentrons/components' -import { i18n } from '../../../../localization' -import { WellSelectionModal } from './WellSelectionModal' -import { Portal } from '../../../portals/MainPageModalPortal' -import { - actions as stepsActions, - getSelectedStepId, - getWellSelectionLabwareKey, -} from '../../../../ui/steps' -import styles from '../../StepEditForm.css' - -import { Dispatch } from 'redux' -import { StepIdType } from '../../../../form-types' -import { BaseState } from '../../../../types' -import { FieldProps } from '../../types' - -export interface SP { - stepId?: StepIdType | null - wellSelectionLabwareKey?: string | null -} - -export interface DP { - onOpen: (val: string) => unknown - onClose: () => unknown -} - -export type OP = FieldProps & { - primaryWellCount?: number - isMulti?: boolean | null - pipetteId?: string | null - labwareId?: string | null -} - -export type Props = OP & SP & DP - -export class WellSelectionInputComponent extends React.Component { - handleOpen = (): void => { - const { labwareId, pipetteId, onFieldFocus } = this.props - - if (onFieldFocus) { - onFieldFocus() - } - if (labwareId && pipetteId) { - this.props.onOpen(this.getModalKey()) - } - } - - handleClose = (): void => { - const { onFieldBlur, onClose } = this.props - if (onFieldBlur) { - onFieldBlur() - } - onClose() - } - - getModalKey = (): string => { - const { name, pipetteId, labwareId, stepId } = this.props - return `${String(stepId)}${name}${pipetteId || 'noPipette'}${ - labwareId || 'noLabware' - }` - } - - render(): JSX.Element { - const modalKey = this.getModalKey() - const label = this.props.isMulti - ? i18n.t('form.step_edit_form.wellSelectionLabel.columns') - : i18n.t('form.step_edit_form.wellSelectionLabel.wells') - return ( - - - - - - - ) - } -} - -const mapStateToProps = (state: BaseState): SP => ({ - stepId: getSelectedStepId(state), - wellSelectionLabwareKey: getWellSelectionLabwareKey(state), -}) -const mapDispatchToProps = (dispatch: Dispatch): DP => ({ - onOpen: key => dispatch(stepsActions.setWellSelectionLabwareKey(key)), - onClose: () => dispatch(stepsActions.clearWellSelectionLabwareKey()), -}) - -export const WellSelectionInput = connect( - mapStateToProps, - mapDispatchToProps -)(WellSelectionInputComponent) diff --git a/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionModal.tsx b/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionModal.tsx index 74ccc23e29d..7db677b5da4 100644 --- a/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionModal.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionModal.tsx @@ -17,41 +17,44 @@ import { } from '@opentrons/shared-data' import { arrayToWellGroup } from '../../../../utils' -import { WellSelectionInstructions } from '../../../WellSelectionInstructions' -import { SelectableLabware, wellFillFromWellContents } from '../../../labware' - import * as wellContentsSelectors from '../../../../top-selectors/well-contents' import { selectors } from '../../../../labware-ingred/selectors' import { selectors as stepFormSelectors } from '../../../../step-forms' -import { ContentsByWell } from '../../../../labware-ingred/types' -import { WellIngredientNames } from '../../../../steplist/types' -import { StepFieldName } from '../../../../form-types' +import { WellSelectionInstructions } from '../../../WellSelectionInstructions' +import { SelectableLabware, wellFillFromWellContents } from '../../../labware' + +import type { ContentsByWell } from '../../../../labware-ingred/types' +import type { WellIngredientNames } from '../../../../steplist/types' +import type { StepFieldName } from '../../../../form-types' +import type { NozzleType } from '../../../../types' import styles from './WellSelectionModal.css' import modalStyles from '../../../modals/modal.css' interface WellSelectionModalProps { isOpen: boolean - labwareId?: string | null name: StepFieldName onCloseClick: (e?: React.MouseEvent) => unknown - pipetteId?: string | null value: unknown updateValue: (val: unknown | null | undefined) => void + nozzleType?: NozzleType | null + labwareId?: string | null + pipetteId?: string | null } interface WellSelectionModalComponentProps { deselectWells: (wellGroup: WellGroup) => unknown + nozzleType: NozzleType | null handleSave: () => unknown highlightedWells: WellGroup ingredNames: WellIngredientNames - labwareDef?: LabwareDefinition2 | null onCloseClick: (e?: React.MouseEvent) => unknown - pipetteSpec?: PipetteNameSpecs | null selectedPrimaryWells: WellGroup selectWells: (wellGroup: WellGroup) => unknown updateHighlightedWells: (wellGroup: WellGroup) => unknown wellContents: ContentsByWell + labwareDef?: LabwareDefinition2 | null + pipetteSpec?: PipetteNameSpecs | null } const WellSelectionModalComponent = ( @@ -69,6 +72,7 @@ const WellSelectionModalComponent = ( selectWells, wellContents, updateHighlightedWells, + nozzleType, } = props const liquidDisplayColors = useSelector(selectors.getLiquidDisplayColors) @@ -107,7 +111,7 @@ const WellSelectionModalComponent = ( selectWells={selectWells} deselectWells={deselectWells} updateHighlightedWells={updateHighlightedWells} - pipetteChannels={pipetteSpec ? pipetteSpec.channels : null} + nozzleType={nozzleType} ingredNames={ingredNames} wellContents={wellContents} /> @@ -121,9 +125,15 @@ const WellSelectionModalComponent = ( export const WellSelectionModal = ( props: WellSelectionModalProps ): JSX.Element | null => { - const { isOpen, labwareId, onCloseClick, pipetteId } = props + const { + isOpen, + labwareId, + onCloseClick, + pipetteId, + nozzleType = null, + updateValue, + } = props const wellFieldData = props.value - // selector data const allWellContentsForStep = useSelector( wellContentsSelectors.getAllWellContentsForActiveItem @@ -161,7 +171,7 @@ export const WellSelectionModal = ( const handleSave = (): void => { const sortedWells = Object.keys(selectedPrimaryWells).sort(sortWells) - props.updateValue(sortedWells) + updateValue(sortedWells) onCloseClick() } @@ -176,6 +186,7 @@ export const WellSelectionModal = ( ingredNames, labwareDef, onCloseClick, + nozzleType, pipetteSpec: pipette?.spec, selectWells, selectedPrimaryWells, diff --git a/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/index.ts b/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/index.ts deleted file mode 100644 index 134b30aae81..00000000000 --- a/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/index.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { connect } from 'react-redux' -import { - WellSelectionInput, - Props as WellSelectionInputProps, - DP, -} from './WellSelectionInput' -import { selectors as stepFormSelectors } from '../../../../step-forms' -import { BaseState } from '../../../../types' -import { FieldProps } from '../../types' - -type Props = Omit< - JSX.LibraryManagedAttributes< - typeof WellSelectionInput, - WellSelectionInputProps - >, - keyof DP -> -type OP = FieldProps & { - labwareId?: string | null - pipetteId?: string | null -} -interface SP { - isMulti: Props['isMulti'] - primaryWellCount: Props['primaryWellCount'] -} - -const mapStateToProps = (state: BaseState, ownProps: OP): SP => { - const { pipetteId } = ownProps - const selectedWells = ownProps.value - const pipette = - pipetteId && stepFormSelectors.getPipetteEntities(state)[pipetteId] - const isMulti = pipette ? pipette.spec.channels > 1 : false - return { - primaryWellCount: Array.isArray(selectedWells) - ? selectedWells.length - : undefined, - isMulti, - } -} - -function mergeProps(stateProps: SP, _dispatchProps: null, ownProps: OP): Props { - const { - disabled, - errorToShow, - labwareId, - name, - onFieldBlur, - onFieldFocus, - pipetteId, - updateValue, - value, - } = ownProps - return { - disabled, - errorToShow, - isMulti: stateProps.isMulti, - labwareId, - name, - onFieldBlur, - onFieldFocus, - pipetteId, - primaryWellCount: stateProps.primaryWellCount, - updateValue, - value, - } -} - -export const WellSelectionField = connect( - mapStateToProps, - null, - mergeProps -)(WellSelectionInput) diff --git a/protocol-designer/src/components/StepEditForm/fields/__tests__/DelayFields.test.tsx b/protocol-designer/src/components/StepEditForm/fields/__tests__/DelayFields.test.tsx index 02d3ab6b7d5..9a114b98546 100644 --- a/protocol-designer/src/components/StepEditForm/fields/__tests__/DelayFields.test.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/__tests__/DelayFields.test.tsx @@ -1,263 +1,3 @@ -import _fixture_96_plate from '@opentrons/shared-data/labware/fixtures/2/fixture_96_plate.json' -import { LabwareDefinition2 } from '@opentrons/shared-data' -import React from 'react' -import { Provider } from 'react-redux' -import { mount } from 'enzyme' -import ApplicationText from '../../../../localization/en/application.json' -import * as stepFormSelectors from '../../../../step-forms/selectors' -import { CheckboxRowField, TextField, TipPositionField } from '../../fields' -import { DelayFields, DelayFieldProps } from '../DelayFields' - -jest.mock('../../../../step-forms/selectors') - -const fixture96Plate = _fixture_96_plate as LabwareDefinition2 - -const getUnsavedFormMock = stepFormSelectors.getUnsavedForm as jest.MockedFunction< - typeof stepFormSelectors.getUnsavedForm -> - -const getLabwareEntitiesMock = stepFormSelectors.getLabwareEntities as jest.MockedFunction< - typeof stepFormSelectors.getLabwareEntities -> - -const mockStore = { - dispatch: jest.fn(), - subscribe: jest.fn(), - getState: () => ({}), -} - -beforeEach(() => { - getUnsavedFormMock.mockReturnValue({ - id: 'stepId', - stepType: 'moveLiquid', - }) - - getLabwareEntitiesMock.mockReturnValue({ - labware123asp: { - id: 'labware123asp', - // @ts-expect-error (ce, 2021-06-21) need to stub labwareDefURI. see createFile.test.ts for an example - labwareDefURI: fixture96Plate.labwareDefURI, - def: fixture96Plate, - }, - labware123disp: { - id: 'labware123disp', - // @ts-expect-error (ce, 2021-06-21) need to stub labwareDefURI. see createFile.test.ts for an example - labwareDefURI: fixture96Plate.labwareDefURI, - def: fixture96Plate, - }, - labware123: { - id: 'labware123', - // @ts-expect-error (ce, 2021-06-21) need to stub labwareDefURI. see createFile.test.ts for an example - labwareDefURI: fixture96Plate.labwareDefURI, - def: fixture96Plate, - }, - }) -}) - -afterEach(() => { - jest.resetAllMocks() -}) - describe('DelayFields', () => { - const render = (_props: DelayFieldProps) => - mount(, { - wrappingComponent: Provider, - wrappingComponentProps: { store: mockStore }, - }) - - describe('Aspirate Delay', () => { - let props: DelayFieldProps - beforeEach(() => { - props = { - checkboxFieldName: 'aspirate_delay_checkbox', - secondsFieldName: 'aspirate_delay_seconds', - labwareId: 'labware123asp', - propsForFields: { - aspirate_delay_checkbox: { - onFieldFocus: jest.fn() as any, - onFieldBlur: jest.fn() as any, - errorToShow: null, - disabled: false, - name: 'aspirate_delay_checkbox', - updateValue: jest.fn() as any, - value: true, - tooltipContent: 'tooltip for aspirate_delay_checkbox', - }, - aspirate_delay_seconds: { - onFieldFocus: jest.fn() as any, - onFieldBlur: jest.fn() as any, - errorToShow: null, - disabled: false, - name: 'aspirate_delay_seconds', - updateValue: jest.fn() as any, - value: '1', - }, - preWetTip: { - onFieldFocus: jest.fn() as any, - onFieldBlur: jest.fn() as any, - errorToShow: null, - disabled: false, - name: 'preWetTip', - updateValue: jest.fn() as any, - value: true, - }, - aspirate_mmFromBottom: { - onFieldFocus: jest.fn() as any, - onFieldBlur: jest.fn() as any, - errorToShow: null, - disabled: false, - name: 'aspirate_mmFromBottom', - updateValue: jest.fn() as any, - value: true, - }, - aspirate_delay_mmFromBottom: { - onFieldFocus: jest.fn() as any, - onFieldBlur: jest.fn() as any, - errorToShow: null, - disabled: false, - name: 'aspirate_delay_mmFromBottom', - updateValue: jest.fn() as any, - value: true, - }, - }, - } - }) - - it('should render an aspirate delay field with a tip position field', () => { - props = { - ...props, - tipPositionFieldName: 'aspirate_mmFromBottom', - } - - const wrapper = render(props) - const checkboxField = wrapper.find(CheckboxRowField) - expect(checkboxField.prop('name')).toBe(props.checkboxFieldName) - expect(checkboxField.prop('label')).toBe('delay') - expect(checkboxField.prop('tooltipContent')).toBe( - `tooltip for ${props.checkboxFieldName}` - ) - - const secondsField = wrapper.find(TextField) - expect(secondsField.is(TextField)).toBe(true) - expect(secondsField.prop('name')).toBe(props.secondsFieldName) - expect(secondsField.prop('units')).toBe(ApplicationText.units.seconds) - - const tipPosField = wrapper.find(TipPositionField) - expect(tipPosField.is(TipPositionField)).toBe(true) - expect(tipPosField.prop('name')).toBe(props.tipPositionFieldName) - }) - - it('should render an aspirate delay field WITHOUT a tip position field', () => { - const wrapper = render(props) - - const checkboxField = wrapper.find(CheckboxRowField) - expect(checkboxField.prop('name')).toBe(props.checkboxFieldName) - expect(checkboxField.prop('label')).toBe('delay') - expect(checkboxField.prop('tooltipContent')).toBe( - `tooltip for ${props.checkboxFieldName}` - ) - const secondsField = wrapper.find(TextField) - expect(secondsField.is(TextField)).toBe(true) - expect(secondsField.prop('name')).toBe(props.secondsFieldName) - expect(secondsField.prop('units')).toBe(ApplicationText.units.seconds) - - expect(wrapper.find(TipPositionField).length).toBe(0) - }) - }) - - describe('Dispense Delay', () => { - let props: DelayFieldProps - beforeEach(() => { - props = { - checkboxFieldName: 'dispense_delay_checkbox', - secondsFieldName: 'dispense_delay_seconds', - labwareId: 'labware123disp', - propsForFields: { - dispense_delay_checkbox: { - onFieldFocus: jest.fn() as any, - onFieldBlur: jest.fn() as any, - errorToShow: null, - disabled: false, - name: 'dispense_delay_checkbox', - updateValue: jest.fn() as any, - value: true, - tooltipContent: 'tooltip for dispense_delay_checkbox', - }, - dispense_delay_seconds: { - onFieldFocus: jest.fn() as any, - onFieldBlur: jest.fn() as any, - errorToShow: null, - disabled: false, - name: 'dispense_delay_seconds', - updateValue: jest.fn() as any, - value: '1', - }, - preWetTip: { - onFieldFocus: jest.fn() as any, - onFieldBlur: jest.fn() as any, - errorToShow: null, - disabled: false, - name: 'preWetTip', - updateValue: jest.fn() as any, - value: true, - }, - dispense_mmFromBottom: { - onFieldFocus: jest.fn() as any, - onFieldBlur: jest.fn() as any, - errorToShow: null, - disabled: false, - name: 'dispense_mmFromBottom', - updateValue: jest.fn() as any, - value: true, - }, - dispense_delay_mmFromBottom: { - onFieldFocus: jest.fn() as any, - onFieldBlur: jest.fn() as any, - errorToShow: null, - disabled: false, - name: 'dispense_delay_mmFromBottom', - updateValue: jest.fn() as any, - value: true, - }, - }, - } - }) - - it('should render a dispense delay field with a tip position field', () => { - props = { ...props, tipPositionFieldName: 'dispense_delay_mmFromBottom' } - const wrapper = render(props) - - const checkboxField = wrapper.find(CheckboxRowField) - expect(checkboxField.prop('name')).toBe(props.checkboxFieldName) - expect(checkboxField.prop('label')).toBe('delay') - expect(checkboxField.prop('tooltipContent')).toBe( - `tooltip for ${props.checkboxFieldName}` - ) - const secondsField = wrapper.find(TextField) - expect(secondsField.is(TextField)).toBe(true) - expect(secondsField.prop('name')).toBe(props.secondsFieldName) - expect(secondsField.prop('units')).toBe(ApplicationText.units.seconds) - - const tipPosField = wrapper.find(TipPositionField) - expect(tipPosField.is(TipPositionField)).toBe(true) - expect(tipPosField.prop('name')).toBe(props.tipPositionFieldName) - }) - - it('should render an dispense delay field WITHOUT a tip position field', () => { - const wrapper = render(props) - - const checkboxField = wrapper.find(CheckboxRowField) - expect(checkboxField.prop('name')).toBe(props.checkboxFieldName) - expect(checkboxField.prop('label')).toBe('delay') - expect(checkboxField.prop('tooltipContent')).toBe( - `tooltip for ${props.checkboxFieldName}` - ) - const secondsField = wrapper.find(TextField) - expect(secondsField.is(TextField)).toBe(true) - expect(secondsField.prop('name')).toBe(props.secondsFieldName) - expect(secondsField.prop('units')).toBe(ApplicationText.units.seconds) - - expect(wrapper.find(TipPositionField).length).toBe(0) - }) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/protocol-designer/src/components/StepEditForm/fields/__tests__/WellOrderField.test.tsx b/protocol-designer/src/components/StepEditForm/fields/__tests__/WellOrderField.test.tsx index ccdc171d18b..254ab65b807 100644 --- a/protocol-designer/src/components/StepEditForm/fields/__tests__/WellOrderField.test.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/__tests__/WellOrderField.test.tsx @@ -1,81 +1,3 @@ -import React from 'react' -import { mount } from 'enzyme' -import { act } from 'react-dom/test-utils' -import { WellOrderField, WellOrderFieldProps } from '../WellOrderField' -import { - WellOrderModal, - CancelButton, - ResetButton, - WellOrderModalProps, -} from '../WellOrderField/WellOrderModal' - describe('WellOrderField', () => { - const render = (_props: WellOrderFieldProps) => - mount() - - let props: WellOrderFieldProps - beforeEach(() => { - props = { - prefix: 'aspirate', - firstValue: null, - secondValue: null, - firstName: 'example_wellOrder_first', - secondName: 'example_wellOrder_second', - updateFirstWellOrder: jest.fn(), - updateSecondWellOrder: jest.fn(), - } - }) - - describe('WellOrderModal', () => { - it('should call correct updater fns passed in', () => { - const wrapper = render(props) - const wellOrderModal = wrapper.find(WellOrderModal) - act(() => { - wellOrderModal.prop('updateValues')('l2r', 't2b') - }) - expect(props.updateFirstWellOrder).toHaveBeenCalledWith('l2r') - expect(props.updateSecondWellOrder).toHaveBeenCalledWith('t2b') - }) - it('should NOT update on cancel', () => { - const wellOrderModalProps: WellOrderModalProps = { - prefix: 'aspirate', - closeModal: jest.fn(), - isOpen: true, - updateValues: jest.fn(), - firstValue: 'l2r', - secondValue: 't2b', - firstName: 'firstName', - secondName: 'secondName', - } - const wrapper = mount() - const wellOrderModal = wrapper.find(WellOrderModal) - const cancelButton = wellOrderModal.find(CancelButton) - act(() => { - cancelButton.prop('onClick')() - }) - expect(wellOrderModalProps.updateValues).not.toHaveBeenCalled() - }) - it('should update to default values on reset', () => { - const wellOrderModalProps: WellOrderModalProps = { - prefix: 'aspirate', - closeModal: jest.fn(), - isOpen: true, - updateValues: jest.fn(), - firstValue: 'l2r', - secondValue: 't2b', - firstName: 'firstName', - secondName: 'secondName', - } - const wrapper = mount() - const wellOrderModal = wrapper.find(WellOrderModal) - const resetButton = wellOrderModal.find(ResetButton) - act(() => { - resetButton.prop('onClick')() - }) - expect(wellOrderModalProps.updateValues).toHaveBeenCalledWith( - 't2b', - 'l2r' - ) - }) - }) + it.todo('replace deprecated enzyme test') }) diff --git a/protocol-designer/src/components/StepEditForm/fields/__tests__/makeSingleEditFieldProps.test.ts b/protocol-designer/src/components/StepEditForm/fields/__tests__/makeSingleEditFieldProps.test.ts index bb998523130..08c4e8c3ed6 100644 --- a/protocol-designer/src/components/StepEditForm/fields/__tests__/makeSingleEditFieldProps.test.ts +++ b/protocol-designer/src/components/StepEditForm/fields/__tests__/makeSingleEditFieldProps.test.ts @@ -5,7 +5,7 @@ import { } from '../../../../steplist/formLevel' import { getFieldErrors } from '../../../../steplist/fieldLevel' import * as stepEditFormUtils from '../../utils' -import { FormData } from '../../../../form-types' +import { HydratedFormdata } from '../../../../form-types' jest.mock('../../../../steplist/formLevel') jest.mock('../../../../steplist/fieldLevel') @@ -59,7 +59,7 @@ describe('makeSingleEditFieldProps', () => { } getDisabledFieldsMock.mockImplementation( - (form: FormData): Set => { + (form: HydratedFormdata): Set => { expect(form).toBe(formData) const disabled = new Set() disabled.add('disabled_field') @@ -101,7 +101,9 @@ describe('makeSingleEditFieldProps', () => { const result = makeSingleEditFieldProps( focusHandlers, formData, - handleChangeFormInput + handleChangeFormInput, + formData, + [] ) expect(result).toEqual({ some_field: { diff --git a/protocol-designer/src/components/StepEditForm/fields/index.ts b/protocol-designer/src/components/StepEditForm/fields/index.ts index f7c0bd240a4..b59231db01a 100644 --- a/protocol-designer/src/components/StepEditForm/fields/index.ts +++ b/protocol-designer/src/components/StepEditForm/fields/index.ts @@ -13,7 +13,7 @@ export { DisposalVolumeField } from './DisposalVolumeField' export { FlowRateField } from './FlowRateField' export { LabwareField } from './LabwareField' export { LabwareLocationField } from './LabwareLocationField' -export { PathField } from './PathField' +export { PathField } from './PathField/PathField' export { PipetteField } from './PipetteField' export { ProfileItemRows } from './ProfileItemRows' export { StepFormDropdown } from './StepFormDropdownField' @@ -21,4 +21,4 @@ export { TipPositionField } from './TipPositionField' export { ToggleRowField } from './ToggleRowField' export { VolumeField } from './VolumeField' export { WellOrderField } from './WellOrderField' -export { WellSelectionField } from './WellSelectionField' +export { WellSelectionField } from './WellSelectionField/WellSelectionField' diff --git a/protocol-designer/src/components/StepEditForm/fields/makeSingleEditFieldProps.ts b/protocol-designer/src/components/StepEditForm/fields/makeSingleEditFieldProps.ts index 7daf2a4abca..6390828958d 100644 --- a/protocol-designer/src/components/StepEditForm/fields/makeSingleEditFieldProps.ts +++ b/protocol-designer/src/components/StepEditForm/fields/makeSingleEditFieldProps.ts @@ -23,14 +23,18 @@ export const showFieldErrors = ({ export const makeSingleEditFieldProps = ( focusHandlers: FocusHandlers, formData: FormData, - handleChangeFormInput: (name: string, value: unknown) => void + handleChangeFormInput: (name: string, value: unknown) => void, + hydratedForm: { [key: string]: any }, // TODO: create real HydratedFormData type + t: any ): FieldPropsByName => { const { dirtyFields, blur, focusedField, focus } = focusHandlers const fieldNames: string[] = Object.keys( getDefaultsForStepType(formData.stepType) ) return fieldNames.reduce((acc, name) => { - const disabled = formData ? getDisabledFields(formData).has(name) : false + const disabled = hydratedForm + ? getDisabledFields(hydratedForm).has(name) + : false const value = formData ? formData[name] : null const showErrors = showFieldErrors({ name, @@ -53,10 +57,11 @@ export const makeSingleEditFieldProps = ( focus(name) } - const defaultTooltip = getFieldDefaultTooltip(name) + const defaultTooltip = getFieldDefaultTooltip(name, t) const disabledTooltip = getSingleSelectDisabledTooltip( name, - formData.stepType + formData.stepType, + t ) const fieldProps: FieldProps = { disabled, diff --git a/protocol-designer/src/components/StepEditForm/forms/AspDispSection.tsx b/protocol-designer/src/components/StepEditForm/forms/AspDispSection.tsx index 299fb987d5a..b6e3ce679b5 100644 --- a/protocol-designer/src/components/StepEditForm/forms/AspDispSection.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/AspDispSection.tsx @@ -1,6 +1,6 @@ import * as React from 'react' +import { useTranslation } from 'react-i18next' import { IconButton, Tooltip, useHoverTooltip } from '@opentrons/components' -import { i18n } from '../../../localization' import styles from '../StepEditForm.css' interface Props { @@ -14,6 +14,7 @@ interface Props { export const AspDispSection = (props: Props): JSX.Element => { const { children, className, collapsed, toggleCollapsed, prefix } = props const [targetProps, tooltipProps] = useHoverTooltip() + const { t } = useTranslation('tooltip') return ( // @ts-expect-error(sa, 2021-7-2): className might be null
    @@ -23,7 +24,7 @@ export const AspDispSection = (props: Props): JSX.Element => { {...tooltipProps} key={collapsed ? 'collapsed' : 'expanded'} // NOTE: without this key, the IconButton will not re-render unless clicked > - {i18n.t('tooltip.advanced_settings')} + {t('advanced_settings')}
    { const [targetLatchProps, tooltipLatchProps] = useHoverTooltip({ placement: TOOLTIP_BOTTOM, }) + const { t } = useTranslation(['application', 'form']) const { propsForFields, formData } = props return (
    - {i18n.t('application.stepType.heaterShaker')} + {t('stepType.heaterShaker')} {
    {formData.setHeaterShakerTemperature === true && ( @@ -67,26 +68,24 @@ export const HeaterShakerForm = (props: StepFormProps): JSX.Element | null => { styles.small_field, styles.toggle_temperature_field )} - units={i18n.t('application.units.degrees')} + units={t('units.degrees')} /> )}
    {formData.setShake === true && ( @@ -96,25 +95,23 @@ export const HeaterShakerForm = (props: StepFormProps): JSX.Element | null => { styles.small_field, styles.toggle_temperature_field )} - units={i18n.t('application.units.rpm')} + units={t('units.rpm')} /> )}
    @@ -126,19 +123,19 @@ export const HeaterShakerForm = (props: StepFormProps): JSX.Element | null => { tooltipPlacement={TOOLTIP_BOTTOM} {...propsForFields.heaterShakerSetTimer} className={styles.small_field} - label={i18n.t( - 'form.step_edit_form.field.heaterShaker.timer.heaterShakerSetTimer' + label={t( + 'form:step_edit_form.field.heaterShaker.timer.heaterShakerSetTimer' )} > diff --git a/protocol-designer/src/components/StepEditForm/forms/MagnetForm.tsx b/protocol-designer/src/components/StepEditForm/forms/MagnetForm.tsx index 7f4029b510d..1f013e43259 100644 --- a/protocol-designer/src/components/StepEditForm/forms/MagnetForm.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/MagnetForm.tsx @@ -1,11 +1,11 @@ -import cx from 'classnames' import * as React from 'react' +import cx from 'classnames' +import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { FormGroup } from '@opentrons/components' import { MAGNETIC_MODULE_V1 } from '@opentrons/shared-data' import { selectors as uiModuleSelectors } from '../../../ui/modules' import { selectors as stepFormSelectors } from '../../../step-forms' -import { i18n } from '../../../localization' import { maskField } from '../../../steplist/fieldLevel' import { TextField, RadioGroupField } from '../fields' import styles from '../StepEditForm.css' @@ -16,6 +16,7 @@ export const MagnetForm = (props: StepFormProps): JSX.Element => { const moduleLabwareOptions = useSelector( uiModuleSelectors.getMagneticLabwareOptions ) + const { t } = useTranslation(['application', 'form']) const moduleEntities = useSelector(stepFormSelectors.getModuleEntities) const { magnetAction, moduleId } = props.formData @@ -39,28 +40,26 @@ export const MagnetForm = (props: StepFormProps): JSX.Element => {
    - {i18n.t('application.stepType.magnet')} + {t('stepType.magnet')}

    {moduleOption}

    { {...propsForFields.magnetAction} options={[ { - name: i18n.t( - 'form.step_edit_form.field.magnetAction.options.disengage' - ), + name: t('step_edit_form.field.magnetAction.options.disengage'), value: 'disengage', }, ]} @@ -79,7 +76,7 @@ export const MagnetForm = (props: StepFormProps): JSX.Element => { {magnetAction === 'engage' && ( { const [collapsed, setCollapsed] = React.useState(true) + const pipettes = useSelector(getPipetteEntities) + const { t } = useTranslation(['application', 'form']) const { propsForFields, formData } = props + const is96Channel = + propsForFields.pipette.value != null && + pipettes[String(propsForFields.pipette.value)].name === 'p1000_96' const toggleCollapsed = (): void => setCollapsed(prevCollapsed => !prevCollapsed) @@ -37,31 +46,29 @@ export const MixForm = (props: StepFormProps): JSX.Element => { return (
    - - {i18n.t('application.stepType.mix')} - + {t('stepType.mix')}
    + {is96Channel ? ( + + ) : null} - +
    @@ -70,6 +77,11 @@ export const MixForm = (props: StepFormProps): JSX.Element => { {...propsForFields.wells} labwareId={formData.labware} pipetteId={formData.pipette} + nozzles={ + propsForFields.nozzles?.value != null + ? String(propsForFields.nozzles.value) + : null + } />
    @@ -116,7 +128,7 @@ export const MixForm = (props: StepFormProps): JSX.Element => { propsForFields.mix_wellOrder_second.updateValue } prefix="mix" - label={i18n.t('form.step_edit_form.field.well_order.label')} + label={t('form:step_edit_form.field.well_order.label')} firstValue={formData.mix_wellOrder_first} secondValue={formData.mix_wellOrder_second} firstName={'mix_wellOrder_first'} @@ -161,7 +173,7 @@ export const MixForm = (props: StepFormProps): JSX.Element => { { { )}
    - - {i18n.t('form.step_edit_form.section.sterility')} + + {t('form:step_edit_form.section.sterility')} + + + {t('form:step_edit_form.section.dropTip')}
    @@ -208,6 +223,9 @@ export const MixForm = (props: StepFormProps): JSX.Element => { stepType={formData.stepType} />
    +
    + +
    ) diff --git a/protocol-designer/src/components/StepEditForm/forms/MoveLabwareForm/index.tsx b/protocol-designer/src/components/StepEditForm/forms/MoveLabwareForm/index.tsx index c37dd75e6bb..7db25aceb46 100644 --- a/protocol-designer/src/components/StepEditForm/forms/MoveLabwareForm/index.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/MoveLabwareForm/index.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { ALIGN_CENTER, @@ -10,7 +11,6 @@ import { TOOLTIP_FIXED, useHoverTooltip, } from '@opentrons/components' -import { i18n } from '../../../../localization' import { LabwareField, LabwareLocationField, @@ -27,6 +27,7 @@ import type { StepFormProps } from '../../types' export const MoveLabwareForm = (props: StepFormProps): JSX.Element => { const { propsForFields } = props + const { t } = useTranslation(['application', 'form', 'tooltip']) const robotType = useSelector(getRobotType) const canSave = useSelector(getCurrentFormCanBeSaved) const additionalEquipment = useSelector(getAdditionalEquipment) @@ -41,12 +42,12 @@ export const MoveLabwareForm = (props: StepFormProps): JSX.Element => {
    - {i18n.t('application.stepType.moveLabware')} + {t('stepType.moveLabware')}
    @@ -59,9 +60,7 @@ export const MoveLabwareForm = (props: StepFormProps): JSX.Element => { > {!isGripperAttached ? ( - {i18n.t( - 'tooltip.step_fields.moveLabware.disabled.gripper_not_used' - )} + {t('tooltip:step_fields.moveLabware.disabled.gripper_not_used')} ) : null}
    @@ -69,7 +68,7 @@ export const MoveLabwareForm = (props: StepFormProps): JSX.Element => {
    @@ -79,7 +78,7 @@ export const MoveLabwareForm = (props: StepFormProps): JSX.Element => {
    ( @@ -36,7 +35,23 @@ const makeAddFieldNamePrefix = (prefix: string) => ( ): StepFieldName => `${prefix}_${fieldName}` export const SourceDestFields = (props: SourceDestFieldsProps): JSX.Element => { - const { className, formData, prefix, propsForFields, allLabware } = props + const { className, formData, prefix, propsForFields } = props + const { t } = useTranslation(['form', 'application']) + const additionalEquipmentEntities = useSelector( + getAdditionalEquipmentEntities + ) + const isWasteChuteSelected = + propsForFields.dispense_labware?.value != null + ? additionalEquipmentEntities[ + String(propsForFields.dispense_labware.value) + ]?.name === 'wasteChute' + : false + const isTrashBinSelected = + propsForFields.dispense_labware?.value != null + ? additionalEquipmentEntities[ + String(propsForFields.dispense_labware.value) + ]?.name === 'trashBin' + : false const addFieldNamePrefix = makeAddFieldNamePrefix(prefix) const getDelayFields = (): JSX.Element => ( @@ -55,6 +70,9 @@ export const SourceDestFields = (props: SourceDestFieldsProps): JSX.Element => { /> ) + const hideWellOrderField = + prefix === 'dispense' && (isWasteChuteSelected || isTrashBinSelected) + const getMixFields = (): JSX.Element => ( { ] } /> - + {hideWellOrderField ? null : ( + + )}
    {prefix === 'aspirate' && ( - + <> {getMixFields()} {getDelayFields()} - + )} {prefix === 'dispense' && ( - + <> {getDelayFields()} {getMixFields()} - + )} { {prefix === 'dispense' && ( { )}
    diff --git a/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestHeaders.tsx b/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestHeaders.tsx index 2ea71a88aa6..fe079ef015c 100644 --- a/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestHeaders.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestHeaders.tsx @@ -1,11 +1,13 @@ import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { useSelector } from 'react-redux' import { FormGroup } from '@opentrons/components' -import { i18n } from '../../../../localization' +import { getAdditionalEquipmentEntities } from '../../../../step-forms/selectors' +import { StepFieldName } from '../../../../steplist/fieldLevel' import { LabwareField, WellSelectionField } from '../../fields' import { AspDispSection } from '../AspDispSection' -import { StepFieldName } from '../../../../steplist/fieldLevel' -import { FormData } from '../../../../form-types' -import { FieldPropsByName } from '../../types' +import type { FormData } from '../../../../form-types' +import type { FieldPropsByName } from '../../types' import styles from '../../StepEditForm.css' @@ -31,8 +33,16 @@ export const SourceDestHeaders = (props: Props): JSX.Element => { propsForFields, formData, } = props + const { t } = useTranslation('form') const addFieldNamePrefix = makeAddFieldNamePrefix(prefix) - const labwareLabel = i18n.t(`form.step_edit_form.labwareLabel.${prefix}`) + const additionalEquipmentEntities = useSelector( + getAdditionalEquipmentEntities + ) + const labwareLabel = t(`step_edit_form.labwareLabel.${prefix}`) + const trashOrLabwareId = formData[addFieldNamePrefix('labware')] + const isDisposalLocation = + additionalEquipmentEntities[trashOrLabwareId]?.name === 'wasteChute' || + additionalEquipmentEntities[trashOrLabwareId]?.name === 'trashBin' return ( @@ -40,11 +50,14 @@ export const SourceDestHeaders = (props: Props): JSX.Element => { - + {isDisposalLocation ? null : ( + + )}
    ) diff --git a/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/index.tsx b/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/index.tsx index 269eec894b7..a9613a09969 100644 --- a/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/index.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/index.tsx @@ -1,8 +1,8 @@ import * as React from 'react' +import { useTranslation } from 'react-i18next' import cx from 'classnames' import { useSelector } from 'react-redux' -import { i18n } from '../../../../localization' -import { getLabwareDefsByURI } from '../../../../labware-defs/selectors' +import { getPipetteEntities } from '../../../../step-forms/selectors' import { VolumeField, PipetteField, @@ -10,35 +10,43 @@ import { DisposalVolumeField, PathField, } from '../../fields' +import { Configure96ChannelField } from '../../fields/Configure96ChannelField' +import { DropTipField } from '../../fields/DropTipField' import styles from '../../StepEditForm.css' -import { StepFormProps } from '../../types' import { SourceDestFields } from './SourceDestFields' import { SourceDestHeaders } from './SourceDestHeaders' +import type { StepFormProps } from '../../types' // TODO: BC 2019-01-25 instead of passing path from here, put it in connect fields where needed // or question if it even needs path export const MoveLiquidForm = (props: StepFormProps): JSX.Element => { const [collapsed, _setCollapsed] = React.useState(true) - const allLabware = useSelector(getLabwareDefsByURI) - + const pipettes = useSelector(getPipetteEntities) + const { t } = useTranslation(['application', 'form']) const toggleCollapsed = (): void => _setCollapsed(!collapsed) const { propsForFields, formData } = props const { stepType, path } = formData + const is96Channel = + propsForFields.pipette.value != null && + pipettes[String(propsForFields.pipette.value)].name === 'p1000_96' return (
    - {i18n.t('application.stepType.moveLiquid')} + {t('stepType.moveLiquid')}
    + {is96Channel ? ( + + ) : null} @@ -72,21 +80,19 @@ export const MoveLiquidForm = (props: StepFormProps): JSX.Element => { prefix="aspirate" propsForFields={propsForFields} formData={formData} - allLabware={allLabware} />
    )}
    - {i18n.t('form.step_edit_form.section.sterility&motion')} + {t('form:step_edit_form.section.sterility&motion')}
    @@ -123,6 +129,14 @@ export const MoveLiquidForm = (props: StepFormProps): JSX.Element => { )}
    +
    + + {t('form:step_edit_form.section.dropTip')} + +
    +
    + +
    ) } diff --git a/protocol-designer/src/components/StepEditForm/forms/PauseForm.tsx b/protocol-designer/src/components/StepEditForm/forms/PauseForm.tsx index df69ca108c7..eb2b141114e 100644 --- a/protocol-designer/src/components/StepEditForm/forms/PauseForm.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/PauseForm.tsx @@ -1,8 +1,7 @@ import * as React from 'react' +import { useTranslation } from 'react-i18next' import cx from 'classnames' import { useSelector } from 'react-redux' -import { selectors as uiModuleSelectors } from '../../../ui/modules' - import { FormGroup, useHoverTooltip, @@ -10,7 +9,8 @@ import { TOOLTIP_BOTTOM, TOOLTIP_FIXED, } from '@opentrons/components' -import { i18n } from '../../../localization' + +import { selectors as uiModuleSelectors } from '../../../ui/modules' import { PAUSE_UNTIL_RESUME, PAUSE_UNTIL_TIME, @@ -18,14 +18,16 @@ import { } from '../../../constants' import { TextField, RadioGroupField, StepFormDropdown } from '../fields' import { getSingleSelectDisabledTooltip } from '../utils' -import styles from '../StepEditForm.css' -import { StepFormProps } from '../types' +import type { StepFormProps } from '../types' + +import styles from '../StepEditForm.css' export const PauseForm = (props: StepFormProps): JSX.Element => { const tempModuleLabwareOptions = useSelector( uiModuleSelectors.getTemperatureLabwareOptions ) + const { t } = useTranslation(['tooltip', 'application', 'form']) const heaterShakerModuleLabwareOptions = useSelector( uiModuleSelectors.getHeaterShakerLabwareOptions @@ -59,7 +61,7 @@ export const PauseForm = (props: StepFormProps): JSX.Element => {
    - {i18n.t('application.stepType.pause')} + {t('application:stepType.pause')}
    @@ -70,8 +72,8 @@ export const PauseForm = (props: StepFormProps): JSX.Element => { {...propsForFields.pauseAction} options={[ { - name: i18n.t( - 'form.step_edit_form.field.pauseAction.options.untilResume' + name: t( + 'form:step_edit_form.field.pauseAction.options.untilResume' ), value: PAUSE_UNTIL_RESUME, }, @@ -83,8 +85,8 @@ export const PauseForm = (props: StepFormProps): JSX.Element => { {...propsForFields.pauseAction} options={[ { - name: i18n.t( - 'form.step_edit_form.field.pauseAction.options.untilTime' + name: t( + 'form:step_edit_form.field.pauseAction.options.untilTime' ), value: PAUSE_UNTIL_TIME, }, @@ -96,24 +98,28 @@ export const PauseForm = (props: StepFormProps): JSX.Element => {
    )} {pauseUntilModuleEnabled ? null : ( - {getSingleSelectDisabledTooltip('wait_until_temp', 'pauseAction')} + {getSingleSelectDisabledTooltip( + 'wait_until_temp', + 'pauseAction', + t + )} )}
    @@ -125,8 +131,8 @@ export const PauseForm = (props: StepFormProps): JSX.Element => { })} options={[ { - name: i18n.t( - 'form.step_edit_form.field.pauseAction.options.untilTemperature' + name: t( + 'form:step_edit_form.field.pauseAction.options.untilTemperature' ), value: PAUSE_UNTIL_TEMP, }, @@ -136,8 +142,8 @@ export const PauseForm = (props: StepFormProps): JSX.Element => { {pauseAction === PAUSE_UNTIL_TEMP && (
    { />
    @@ -165,7 +169,7 @@ export const PauseForm = (props: StepFormProps): JSX.Element => { {/* TODO: Ian 2019-03-25 consider making this a component eg `TextAreaField.js` if used anywhere else */}
  • -`; - -exports[`TitledList renders TitledList with children correctly 1`] = ` -
    -
    -

    - foo -

    -
    -
      -
    1. - Woop -
    2. -
    -
    -`; - -exports[`TitledList renders TitledList with onMouseEnter & onMouseLeave correctly 1`] = ` -
    -
    -

    - foo -

    -
    -
    -`; - -exports[`TitledList renders TitledList with optional icon correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
    -
    - -

    - foo -

    -
    -
    -`; - -exports[`TitledList renders TitledList without icon correctly 1`] = ` -
    -
    -

    - foo -

    -
    -
    -`; - -exports[`TitledList renders collapsed TitledList correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
    -
    -

    - foo -

    -
    - -
    -
    -
    -`; - -exports[`TitledList renders expanded TitledList correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
    -
    -

    - foo -

    -
    - -
    -
    - - Description - -
      -
    1. - 1 -
    2. -
    3. - 2 -
    4. -
    -
    -`; diff --git a/components/src/__tests__/__snapshots__/modals.test.tsx.snap b/components/src/__tests__/__snapshots__/modals.test.tsx.snap deleted file mode 100644 index 152475ea201..00000000000 --- a/components/src/__tests__/__snapshots__/modals.test.tsx.snap +++ /dev/null @@ -1,412 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`modals AlertModal renders correctly 1`] = ` -.c0 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - background-color: rgba(0,0,0,0.9); - position: fixed; - z-index: 1; - top: 0; - right: 0; - bottom: 0; - left: 0; -} - -.c1.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
    -
    -
    -
    -
    - - heading -
    -
    - children -
    -
    - - -
    -
    -
    -
    -`; - -exports[`modals ContinueModal renders correctly 1`] = ` -.c0 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - background-color: rgba(0,0,0,0.9); - position: fixed; - z-index: 1; - top: 0; - right: 0; - bottom: 0; - left: 0; -} - -
    -
    -
    -
    - children -
    -
    - - -
    -
    -
    -`; - -exports[`modals Modal renders correctly 1`] = ` -.c0 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - background-color: rgba(0,0,0,0.9); - position: fixed; - z-index: 1; - top: 0; - right: 0; - bottom: 0; - left: 0; -} - -
    -
    -
    -
    - children -
    -
    -
    -`; - -exports[`modals Modal renders correctly with optional heading 1`] = ` -.c0 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - background-color: rgba(0,0,0,0.9); - position: fixed; - z-index: 1; - top: 0; - right: 0; - bottom: 0; - left: 0; -} - -
    -
    -
    -
    -

    - Heading Visible -

    - children -
    -
    -
    -`; - -exports[`modals ModalPage renders correctly 1`] = ` -.c0 { - min-width: 0; -} - -.c1 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - background-color: rgba(0,0,0,0.9); - position: fixed; - z-index: 1; - top: 0; - right: 0; - bottom: 0; - left: 0; -} - -.c2.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
    -
    -
    - -

    - Title -

    - - | - -

    - Subtitle -

    -
    -
    - children -
    -
    -`; - -exports[`modals Overlay renders correctly 1`] = ` -.c0 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - background-color: rgba(0,0,0,0.9); - position: fixed; - z-index: 1; - top: 0; - right: 0; - bottom: 0; - left: 0; -} - -
    -`; - -exports[`modals SpinnerModalPage renders correctly 1`] = ` -.c1 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - background-color: rgba(0,0,0,0.9); - position: fixed; - z-index: 1; - top: 0; - right: 0; - bottom: 0; - left: 0; -} - -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
    -
    - -

    - Title -

    - - | - -

    - Subtitle -

    -
    -
    -
    -
    - -

    -

    -
    -
    -`; diff --git a/components/src/__tests__/__snapshots__/slotmap.test.tsx.snap b/components/src/__tests__/__snapshots__/slotmap.test.tsx.snap deleted file mode 100644 index 90ca7cff619..00000000000 --- a/components/src/__tests__/__snapshots__/slotmap.test.tsx.snap +++ /dev/null @@ -1,475 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`SlotMap renders correctly with collision warning 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -`; - -exports[`SlotMap renders correctly with error 1`] = ` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -`; - -exports[`SlotMap renders correctly with error and collision warning 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -`; - -exports[`SlotMap renders correctly without collision warnings or errors 1`] = ` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -`; diff --git a/components/src/__tests__/__snapshots__/structure.test.tsx.snap b/components/src/__tests__/__snapshots__/structure.test.tsx.snap deleted file mode 100644 index f91ee51257d..00000000000 --- a/components/src/__tests__/__snapshots__/structure.test.tsx.snap +++ /dev/null @@ -1,261 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Card renders Card correctly 1`] = ` -.c0 { - font-size: 0.875rem; - position: relative; - overflow: visible; - box-shadow: 0 1px 2px 0 rgba(0,0,0,0.33); -} - -.c1 { - font-size: 1.125rem; - font-weight: 600; - color: #4a4a4a; - font-weight: 400; - margin: 0; - padding: 1rem 1rem 0; - text-transform: capitalize; -} - -
    -

    - title -

    - children children children -
    -`; - -exports[`LabeledValue renders LabeledValue correctly 1`] = ` -
    -

    - Label - : -

    -

    - Value -

    -
    -`; - -exports[`PageTabs renders PageTabs correctly 1`] = ` - -`; - -exports[`Pill renders Pill correctly 1`] = ` - - Blue - -`; - -exports[`Pill renders Pill correctly with inverted text 1`] = ` - - Blue - -`; - -exports[`Splash renders correctly with custom props 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
    - -
    -`; - -exports[`Splash renders correctly with no props 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
    - -
    -`; - -exports[`TitleBar renders TitleBar with back button correctly 1`] = ` -.c0.spin { - -webkit-animation: GLFYz 0.8s steps(8) infinite; - animation: GLFYz 0.8s steps(8) infinite; - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; -} - -
    - -

    - foo -

    - - | - -

    - bar -

    -
    -`; - -exports[`TitleBar renders TitleBar with rightNode and its ReactNode as a string 1`] = ` -
    -

    - foo -

    -
    - foo bar -
    -
    -`; - -exports[`TitleBar renders TitleBar with subtitle correctly 1`] = ` -
    -

    - foo -

    - - | - -

    - bar -

    -
    -`; - -exports[`TitleBar renders TitleBar without subtitle correctly 1`] = ` -
    -

    - foo -

    -
    -`; diff --git a/components/src/__tests__/alerts.test.tsx b/components/src/__tests__/alerts.test.tsx deleted file mode 100644 index 761691706f2..00000000000 --- a/components/src/__tests__/alerts.test.tsx +++ /dev/null @@ -1,65 +0,0 @@ -// button component tests -import * as React from 'react' -import Renderer from 'react-test-renderer' - -import { AlertItem } from '..' - -describe('alerts', () => { - const onCloseClick = jest.fn() - - afterEach(() => { - jest.resetAllMocks() - }) - - it('creates an alert with close button', () => { - const button = Renderer.create( - - ).root.findByType('button') - - expect(button.props.className).toMatch('close') - button.props.onClick() - expect(onCloseClick).toHaveBeenCalled() - }) - - it('success alert renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('warning alert renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('warning alert onCloseClick renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('warning alert with message body renders correctly', () => { - const tree = Renderer.create( - -

    Title

    -
    - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) diff --git a/components/src/__tests__/buttons.test.tsx b/components/src/__tests__/buttons.test.tsx deleted file mode 100644 index 651a665052e..00000000000 --- a/components/src/__tests__/buttons.test.tsx +++ /dev/null @@ -1,172 +0,0 @@ -// button component tests -import React from 'react' -import Renderer from 'react-test-renderer' - -import { - Button, - FlatButton, - DeprecatedPrimaryButton, - OutlineButton, - IconButton, -} from '..' - -describe('buttons', () => { - const onClick = jest.fn() - - afterEach(() => { - jest.resetAllMocks() - }) - - it('creates a button with props', () => { - const button = Renderer.create( - - ).root.findByType('button') - - button.props.onClick() - expect(button.props.className).toMatch(/\bclass\b/) - expect(button.props.title).toBe('title') - expect(button.props.disabled).toBe(false) - expect(onClick).toHaveBeenCalled() - }) - - it('disabled sets onClick to undefined', () => { - const button = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('Button with iconName renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('DeprecatedPrimaryButton renders correctly', () => { - const tree = Renderer.create( - - children - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('DeprecatedPrimaryButton with iconName renders correctly', () => { - const tree = Renderer.create( - - children - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('FlatButton renders correctly', () => { - const tree = Renderer.create( - - children - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('FlatButton with iconName renders correctly', () => { - const tree = Renderer.create( - - children - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('OutlineButton renders correctly', () => { - const tree = Renderer.create( - - children - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('Inverted OutlineButton renders correctly', () => { - const tree = Renderer.create( - - children - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('OutlineButton with iconName renders correctly', () => { - const tree = Renderer.create( - - children - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('IconButton renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) diff --git a/components/src/__tests__/forms.test.tsx b/components/src/__tests__/forms.test.tsx deleted file mode 100644 index cef7aa72c1d..00000000000 --- a/components/src/__tests__/forms.test.tsx +++ /dev/null @@ -1,151 +0,0 @@ -// form component tests -import React from 'react' -import Renderer from 'react-test-renderer' - -import { - DeprecatedCheckboxField, - DropdownField, - FormGroup, - InputField, - RadioGroup, -} from '..' - -describe('DeprecatedCheckboxField', () => { - it('renders correctly when unchecked', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders correctly when checked', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) - -describe('DropdownField', () => { - it('renders correctly with a value', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders correctly with a falsey value', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) - -describe('FormGroup', () => { - it('renders correctly', () => { - const tree = Renderer.create( - -
    Hey test here
    -
    More test here
    -
    - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) - -describe('InputField', () => { - it('renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) - -describe('RadioGroup', () => { - it('renders correctly with no checked value', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders correctly with checked value', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders correctly inline', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) diff --git a/components/src/__tests__/icons.test.tsx b/components/src/__tests__/icons.test.tsx deleted file mode 100644 index 69627c31056..00000000000 --- a/components/src/__tests__/icons.test.tsx +++ /dev/null @@ -1,36 +0,0 @@ -// icon components tests -import React from 'react' -import Renderer from 'react-test-renderer' - -import { Icon, NotificationIcon } from '..' - -import { ICON_DATA_BY_NAME } from '../icons/icon-data' -import type { IconName } from '../icons' - -const icons = Object.keys(ICON_DATA_BY_NAME) as IconName[] - -describe('icons', () => { - icons.forEach(icon => - it(`${icon} renders correctly`, () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - ) -}) - -describe('Notification Icon', () => { - it('NotificationIcon renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) diff --git a/components/src/__tests__/instrument-diagram.test.tsx b/components/src/__tests__/instrument-diagram.test.tsx deleted file mode 100644 index 104d450bdbf..00000000000 --- a/components/src/__tests__/instrument-diagram.test.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import React from 'react' -import Renderer from 'react-test-renderer' - -import { InstrumentDiagram, InstrumentGroup } from '..' - -// TODO(bc, 2021-03-03): unit test this component and split out InstrumentDiagram from InstrumentGroup - -describe('InstrumentDiagram', () => { - it('Single-channel renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('Multi-channel renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('Single-channel GEN2 renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('Multi-channel GEN2 renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('single-channel FLEX renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('eight-channel FLEX renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('96-channel GEN1 renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) - -describe('InstrumentGroup', () => { - it('Renders correctly', () => { - const tree = Renderer.create( - - ).toJSON() - - expect(tree).toMatchSnapshot() - }) -}) diff --git a/components/src/__tests__/lists.test.tsx b/components/src/__tests__/lists.test.tsx deleted file mode 100644 index c6b340256e5..00000000000 --- a/components/src/__tests__/lists.test.tsx +++ /dev/null @@ -1,148 +0,0 @@ -// list and list item components tests -import React from 'react' -import { MemoryRouter } from 'react-router-dom' -import Renderer from 'react-test-renderer' - -import { SidePanelGroup, TitledList, ListItem } from '..' - -describe('TitledList', () => { - it('adds an h3 with the title', () => { - const heading = Renderer.create( - - ).root.findByType('h3') - - expect(heading).toBeDefined() - expect(heading.children).toEqual(['hello']) - }) - - it('adds an optional svg icon to title', () => { - const icon = Renderer.create( - - ).root.findByType('svg') - - expect(icon).toBeDefined() - }) - - it('renders TitledList without icon correctly', () => { - const tree = Renderer.create().toJSON() - - expect(tree).toMatchSnapshot() - }) - - it('renders TitledList with children correctly', () => { - const tree = Renderer.create( - -